Skip to content

Commit

Permalink
Soloseng/L2-epoch-manager-enabler-test (#11311)
Browse files Browse the repository at this point in the history
* WIP inheritance issues ?

* fixing compilation

* removed mento from UsingRegistryV2 in 08

* using local precompile handler

* fixed unit test inheritance conflicts

* removed shadowed var

* passing devchain e2e

* passing migration test

* override Utils08 setup and cleanup

* change Utils08 filename

* passing devchain

* reorg TestWithUtils08

* Passing L2 epochManagerEnabler test

* renamed to force update

* using capital letter
  • Loading branch information
soloseng authored Jan 24, 2025
1 parent 29bea9d commit 388a65a
Show file tree
Hide file tree
Showing 8 changed files with 165 additions and 90 deletions.
89 changes: 76 additions & 13 deletions packages/protocol/test-sol/TestWithUtils08.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@ pragma solidity >=0.5.13 <0.9.0;
import { Test as ForgeTest } from "@lib/celo-foundry-8/lib/forge-std/src/Test.sol";
import { TestConstants } from "@test-sol/constants.sol";
import { PrecompileHandler } from "@test-sol/utils/PrecompileHandler.sol";
import { IEpochManagerEnablerMock } from "@test-sol/unit/common/interfaces/IEpochManagerEnablerMock.sol";
import { EpochManagerEnablerMock } from "@test-sol/mocks/EpochManagerEnablerMock.sol";

import "@celo-contracts/common/interfaces/IRegistry.sol";
import { IAccounts } from "@celo-contracts/common/interfaces/IAccounts.sol";

import "@celo-contracts-8/common/mocks/EpochManager_WithMocks.sol";
import "@celo-contracts-8/common/IsL2Check.sol";
Expand All @@ -14,15 +17,24 @@ contract TestWithUtils08 is ForgeTest, TestConstants, IsL2Check, PrecompilesOver
IRegistry registry;
PrecompileHandler ph;
EpochManager_WithMocks public epochManager;
EpochManagerEnablerMock epochManagerEnabler;

IAccounts accountsContract;
IEpochManagerEnablerMock epochManagerEnablerMockInterface;

address accountsAddress;
address mockOracleAddress;

address public epochManagerEnabler;
uint256 public constant secondsInOneBlock = 5;
uint256 numberValidators = 100;
uint256 l2EpochDuration = DAY;

function setUp() public virtual {
ph = new PrecompileHandler();
ph.setEpochSize(L1_BLOCK_IN_EPOCH);
setupRegistry();
epochManagerEnabler = actor("EpochManagerEnabler");
registry.setAddressFor(EpochManagerEnablerContract, epochManagerEnabler);
setupAccounts();
setupEpochManagerEnabler();
setupEpochManager();
}

Expand All @@ -31,12 +43,27 @@ contract TestWithUtils08 is ForgeTest, TestConstants, IsL2Check, PrecompilesOver
registry = IRegistry(REGISTRY_ADDRESS);
}

function setupAccounts() public {
accountsAddress = actor("accountsAddress");
deployCodeTo("Accounts.sol", abi.encode(false), accountsAddress);
accountsContract = IAccounts(accountsAddress);
registry.setAddressFor(AccountsContract, accountsAddress);
}

function setupEpochManager() public {
epochManager = new EpochManager_WithMocks();

mockOracleAddress = actor("oracle");
registry.setAddressFor(SortedOraclesContract, mockOracleAddress);
epochManager.initialize(REGISTRY_ADDRESS, l2EpochDuration);
registry.setAddressFor(EpochManagerContract, address(epochManager));
}

function setupEpochManagerEnabler() public {
epochManagerEnabler = new EpochManagerEnablerMock();
epochManagerEnabler.initialize(REGISTRY_ADDRESS);
registry.setAddressFor(EpochManagerEnablerContract, address(epochManagerEnabler));
}

function timeTravel(uint256 timeDelta) public {
vm.warp(block.timestamp + timeDelta);
}
Expand All @@ -45,11 +72,11 @@ contract TestWithUtils08 is ForgeTest, TestConstants, IsL2Check, PrecompilesOver
vm.roll(block.number + blockDelta);
}

function travelEpochL1() public {
uint256 blocksInEpoch = 17280;
function travelNEpochL1(uint256 n) public {
uint256 blocksInEpoch = L1_BLOCK_IN_EPOCH;
uint256 timeDelta = blocksInEpoch * 5;
blockTravel(blocksInEpoch);
timeTravel(timeDelta);
blockTravel(n * blocksInEpoch);
timeTravel(n * timeDelta);
}

// XXX: this function only increases the block number and timestamp, but does not actually change epoch.
Expand All @@ -64,7 +91,7 @@ contract TestWithUtils08 is ForgeTest, TestConstants, IsL2Check, PrecompilesOver
if (isL2()) {
travelNL2Epoch(n);
} else {
travelEpochL1();
travelNEpochL1(n);
}
}

Expand All @@ -91,15 +118,51 @@ contract TestWithUtils08 is ForgeTest, TestConstants, IsL2Check, PrecompilesOver
return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
}

function whenL2WithEpochManagerInitialization() internal {
uint256 l1EpochNumber = getEpochNumber();
function _registerAndElectValidatorsForL2() internal {
address enablerAddr = registry.getAddressFor(EPOCH_MANAGER_ENABLER_REGISTRY_ID);
epochManagerEnablerMockInterface = IEpochManagerEnablerMock(enablerAddr);

address[] memory _elected = new address[](2);
_elected[0] = actor("validator");
_elected[1] = actor("otherValidator");

vm.prank(_elected[0]);
accountsContract.createAccount();
epochManagerEnablerMockInterface.addValidator(_elected[0]);

vm.prank(_elected[1]);
accountsContract.createAccount();
epochManagerEnablerMockInterface.addValidator(_elected[1]);

for (uint256 i = 2; i < numberValidators; i++) {
vm.prank(vm.addr(i + 1));
accountsContract.createAccount();

epochManagerEnablerMockInterface.addValidator(vm.addr(i + 1));
}
travelNEpochL1(2);
}

function whenL2WithEpochManagerInitialization() internal {
_registerAndElectValidatorsForL2();

epochManagerEnabler.captureEpochAndValidators();

whenL2();

epochManagerEnabler.initEpochManager();
}

function whenL2WithoutEpochManagerInitialization() internal {
_registerAndElectValidatorsForL2();

epochManagerEnablerMockInterface.captureEpochAndValidators();

whenL2();
}
function whenL2WithoutEpochCapture() internal {
_registerAndElectValidatorsForL2();

whenL2();
vm.prank(epochManagerEnabler);
epochManager.initializeSystem(l1EpochNumber, block.number, _elected);
}
}
1 change: 1 addition & 0 deletions packages/protocol/test-sol/constants.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ contract TestConstants {
uint256 public constant MONTH = 30 * DAY_IN_SECONDS;
uint256 constant WEEK = 7 * DAY_IN_SECONDS;
uint256 public constant YEAR = 365 * DAY_IN_SECONDS;
uint256 public constant L1_BLOCK_IN_EPOCH = 17280;
uint256 public constant L2_BLOCK_IN_EPOCH = 43200;

// Contract names
Expand Down
25 changes: 13 additions & 12 deletions packages/protocol/test-sol/devchain/e2e/common/EpochManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ contract E2E_EpochManager is ECDSAHelper08, Devchain {
}

address epochManagerOwner;
address epochManagerEnablerAddress;
address[] firstElected;

uint256 epochDuration;
Expand All @@ -39,9 +40,11 @@ contract E2E_EpochManager is ECDSAHelper08, Devchain {

EnumerableSet.AddressSet internal electedGroupsHelper;

function setUp() public virtual override(Devchain, TestWithUtils08) {
function setUp() public virtual override(TestWithUtils08, Devchain) {
epochManagerOwner = Ownable(address(epochManagerContract)).owner();
epochManagerEnabler = registryContract.getAddressForOrDie(EPOCH_MANAGER_ENABLER_REGISTRY_ID);
epochManagerEnablerAddress = registryContract.getAddressForOrDie(
EPOCH_MANAGER_ENABLER_REGISTRY_ID
);
firstElected = getValidators().getRegisteredValidators();

epochDuration = epochManagerContract.epochDuration();
Expand All @@ -67,10 +70,8 @@ contract E2E_EpochManager is ECDSAHelper08, Devchain {
}

address[] memory registeredValidators = getValidators().getRegisteredValidators();
travelEpochL1();
travelEpochL1();
travelEpochL1();
travelEpochL1();
travelNEpochL1(4);

for (uint256 i = 0; i < registeredValidators.length; i++) {
(, , address validatorGroup, , ) = getValidators().getValidator(registeredValidators[i]);
if (getElection().getPendingVotesForGroup(validatorGroup) == 0) {
Expand Down Expand Up @@ -319,7 +320,7 @@ contract E2E_EpochManager_InitializeSystem is E2E_EpochManager {
}

function test_ShouldInitializeSystem() public {
vm.prank(epochManagerEnabler);
vm.prank(epochManagerEnablerAddress);
epochManagerContract.initializeSystem(42, 43, firstElected);

assertEq(epochManagerContract.firstKnownEpoch(), 42);
Expand All @@ -340,7 +341,7 @@ contract E2E_EpochManager_GetCurrentEpoch is E2E_EpochManager {
}

function test_ReturnExpectedValues() public {
vm.prank(epochManagerEnabler);
vm.prank(epochManagerEnablerAddress);
epochManagerContract.initializeSystem(42, 43, firstElected);

assertEq(epochManagerContract.firstKnownEpoch(), 42);
Expand Down Expand Up @@ -384,7 +385,7 @@ contract E2E_EpochManager_StartNextEpochProcess is E2E_EpochManager {

vm.stopPrank();

vm.prank(epochManagerEnabler);
vm.prank(epochManagerEnablerAddress);
epochManagerContract.initializeSystem(1, 1, firstElected);
}

Expand Down Expand Up @@ -437,7 +438,7 @@ contract E2E_EpochManager_FinishNextEpochProcess is E2E_EpochManager {
activateValidators();
whenL2();

vm.prank(epochManagerEnabler);
vm.prank(epochManagerEnablerAddress);
epochManagerContract.initializeSystem(1, 1, firstElected);

validatorsArray = getValidators().getRegisteredValidators();
Expand Down Expand Up @@ -583,7 +584,7 @@ contract E2E_GasTest_Setup is E2E_EpochManager {
activateValidators();
whenL2();

vm.prank(epochManagerEnabler);
vm.prank(epochManagerEnablerAddress);
epochManagerContract.initializeSystem(1, 1, firstElected);

validatorsArray = getValidators().getRegisteredValidators();
Expand Down Expand Up @@ -736,7 +737,7 @@ contract E2E_FinishNextEpochProcess_Split is E2E_GasTest_Setup {
activateValidators();
whenL2();

vm.prank(epochManagerEnabler);
vm.prank(epochManagerEnablerAddress);
epochManagerContract.initializeSystem(1, 1, firstElected);

validatorsArray = getValidators().getRegisteredValidators();
Expand Down
17 changes: 7 additions & 10 deletions packages/protocol/test-sol/devchain/migration/Migration.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,9 @@ contract RegistryIntegrationTest is IntegrationTest, MigrationsConstants {

contract EpochManagerIntegrationTest is IntegrationTest, MigrationsConstants {
ICeloToken celoToken;
IAccounts accountsContract;
IValidators validatorsContract;
IEpochManager epochManagerContract;
IEpochManagerEnabler epochManagerEnablerContrtact;
IEpochManagerEnabler epochManagerEnablerContract;
IScoreManager scoreManager;
IElection election;
ICeloUnreleasedTreasury celoUnreleasedTreasury;
Expand Down Expand Up @@ -189,17 +188,15 @@ contract EpochManagerIntegrationTest is IntegrationTest, MigrationsConstants {
celoToken.mint(randomAddress, L1_MINTED_CELO_SUPPLY - RESERVE_BALANCE); // mint outstanding l1 supply before L2.

epochManagerContract = IEpochManager(registry.getAddressForStringOrDie("EpochManager"));
epochManagerEnablerContrtact = IEpochManagerEnabler(
epochManagerEnablerContract = IEpochManagerEnabler(
registry.getAddressForStringOrDie("EpochManagerEnabler")
);
}

function activateValidators() public {
address[] memory registeredValidators = validatorsContract.getRegisteredValidators();
travelEpochL1();
travelEpochL1();
travelEpochL1();
travelEpochL1();
travelNEpochL1(4);

for (uint256 i = 0; i < registeredValidators.length; i++) {
(, , address validatorGroup, , ) = validatorsContract.getValidator(registeredValidators[i]);
if (election.getPendingVotesForGroup(validatorGroup) == 0) {
Expand All @@ -224,7 +221,7 @@ contract EpochManagerIntegrationTest is IntegrationTest, MigrationsConstants {

uint256 l1EpochNumber = IPrecompiles(address(validatorsContract)).getEpochNumber();

vm.prank(address(epochManagerEnablerContrtact));
vm.prank(address(epochManagerEnablerContract));
epochManagerContract.initializeSystem(l1EpochNumber, block.number, validatorsList);

vm.expectRevert("Epoch is not ready to start");
Expand All @@ -234,7 +231,7 @@ contract EpochManagerIntegrationTest is IntegrationTest, MigrationsConstants {
function test_Reverts_whenAlreadyInitialized() public {
_MockL2Migration(validatorsList);

vm.prank(address(epochManagerEnablerContrtact));
vm.prank(address(epochManagerEnablerContract));
vm.expectRevert("Epoch system already initialized");
epochManagerContract.initializeSystem(100, block.number, firstElected);
}
Expand Down Expand Up @@ -281,7 +278,7 @@ contract EpochManagerIntegrationTest is IntegrationTest, MigrationsConstants {
whenL2();
_setValidatorL2Score();

vm.prank(address(epochManagerEnablerContrtact));
vm.prank(address(epochManagerEnablerContract));

epochManagerContract.initializeSystem(l1EpochNumber, block.number, firstElected);
}
Expand Down
21 changes: 10 additions & 11 deletions packages/protocol/test-sol/unit/common/EpochManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ contract EpochManagerTest is TestWithUtils08 {
address communityRewardFund;
address reserveAddress;
address scoreManagerAddress;
address accountsAddress;

uint256 firstEpochNumber = 100;
uint256 firstEpochBlock = 100;
Expand Down Expand Up @@ -147,13 +146,13 @@ contract EpochManagerTest is TestWithUtils08 {

election.setElectedValidators(members);

vm.prank(epochManagerEnabler);
vm.prank(address(epochManagerEnabler));
epochManagerContract.initializeSystem(firstEpochNumber, firstEpochBlock, firstElected);

travelNL2Epoch(1);
}

function _travelAndProcess_N_L2Epoch(uint256 n) internal {
function _travelAndProcess_N_L2Epoch(uint256 n) public {
for (uint256 i = 0; i < n; i++) {
travelNL2Epoch(1);
epochManagerContract.startNextEpochProcess();
Expand Down Expand Up @@ -201,7 +200,7 @@ contract EpochManagerTest_initialize is EpochManagerTest {

contract EpochManagerTest_initializeSystem is EpochManagerTest {
function test_processCanBeStarted() public virtual {
vm.prank(epochManagerEnabler);
vm.prank(address(epochManagerEnabler));
epochManagerContract.initializeSystem(firstEpochNumber, firstEpochBlock, firstElected);
(
uint256 _firstEpochBlock,
Expand All @@ -219,9 +218,9 @@ contract EpochManagerTest_initializeSystem is EpochManagerTest {
}

function test_Reverts_processCannotBeStartedAgain() public virtual {
vm.prank(epochManagerEnabler);
vm.prank(address(epochManagerEnabler));
epochManagerContract.initializeSystem(firstEpochNumber, firstEpochBlock, firstElected);
vm.prank(epochManagerEnabler);
vm.prank(address(epochManagerEnabler));
vm.expectRevert("Epoch system already initialized");
epochManagerContract.initializeSystem(firstEpochNumber, firstEpochBlock, firstElected);
}
Expand All @@ -239,7 +238,7 @@ contract EpochManagerTest_startNextEpochProcess is EpochManagerTest {
}

function test_Reverts_WhenEndOfEpochHasNotBeenReached() public {
vm.prank(epochManagerEnabler);
vm.prank(address(epochManagerEnabler));
epochManagerContract.initializeSystem(firstEpochNumber, firstEpochBlock, firstElected);

vm.expectRevert("Epoch is not ready to start");
Expand Down Expand Up @@ -405,7 +404,7 @@ contract EpochManagerTest_sendValidatorPayment is EpochManagerTest {
members[1] = validator2;
validators.setMembers(group, members);

vm.prank(epochManagerEnabler);
vm.prank(address(epochManagerEnabler));
epochManagerContract.initializeSystem(firstEpochNumber, firstEpochBlock, firstElected);

stableToken.mint(address(epochManagerContract), paymentAmount * 2);
Expand Down Expand Up @@ -547,7 +546,7 @@ contract EpochManagerTest_finishNextEpochProcess is EpochManagerTest {
members[1] = validator4;
validators.setMembers(group2, members);

vm.prank(epochManagerEnabler);
vm.prank(address(epochManagerEnabler));
initializeEpochManagerSystem();

elected = epochManagerContract.getElectedAccounts();
Expand Down Expand Up @@ -679,7 +678,7 @@ contract EpochManagerTest_setToProcessGroups is EpochManagerTest {
members[1] = validator4;
validators.setMembers(group2, members);

vm.prank(epochManagerEnabler);
vm.prank(address(epochManagerEnabler));
initializeEpochManagerSystem();

elected = epochManagerContract.getElectedAccounts();
Expand Down Expand Up @@ -782,7 +781,7 @@ contract EpochManagerTest_processGroup is EpochManagerTest {
members[1] = validator4;
validators.setMembers(group2, members);

vm.prank(epochManagerEnabler);
vm.prank(address(epochManagerEnabler));
initializeEpochManagerSystem();

elected = epochManagerContract.getElectedAccounts();
Expand Down
Loading

0 comments on commit 388a65a

Please sign in to comment.