From 9b70ab1fdcd30622a348a5910f0efb5183f14ef0 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Wed, 13 Nov 2024 18:27:42 -0500 Subject: [PATCH 1/6] initial tests --- .../governance/network/EpochRewards.t.sol | 150 +++++++++++++++--- 1 file changed, 130 insertions(+), 20 deletions(-) diff --git a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol index fcf7a551423..3c61403852b 100644 --- a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol +++ b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol @@ -46,8 +46,6 @@ contract EpochRewardsTest is Test, TestConstants, Utils { Reserve reserve; Freezer freezer; - Registry registry; - address caller = address(this); event TargetVotingGoldFractionSet(uint256 fraction); @@ -70,7 +68,8 @@ contract EpochRewardsTest is Test, TestConstants, Utils { mockGoldToken = new GoldTokenMock(); freezer = new Freezer(true); - registry = new Registry(true); + setupRegistry(); + setupEpochManager(); registry.setAddressFor(ElectionContract, address(election)); registry.setAddressFor(SortedOraclesContract, address(mockSortedOracles)); @@ -106,6 +105,13 @@ contract EpochRewardsTest is Test, TestConstants, Utils { } } +contract TransitionToL2AfterL1 is EpochRewardsTest { + function setUp() public { + super.setUp(); + _whenL2(); + } +} + contract EpochRewardsTest_initialize is EpochRewardsTest { function test_ShouldHaveSetOwner() public { assertEq(epochRewards.owner(), caller); @@ -198,6 +204,11 @@ contract EpochRewardsTest_setTargetVotingGoldFraction is EpochRewardsTest { } } +contract EpochRewardsTest_setTargetVotingGoldFraction_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_setTargetVotingGoldFraction +{} + contract EpochRewardsTest_setCommunityRewardFraction is EpochRewardsTest { uint256 newFraction = communityRewardFraction + 1; @@ -244,6 +255,11 @@ contract EpochRewardsTest_setCommunityRewardFraction is EpochRewardsTest { } } +contract EpochRewardsTest_setCommunityRewardFraction_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_setCommunityRewardFraction +{} + contract EpochRewardsTest_setTargetValidatorEpochPayment is EpochRewardsTest { uint256 newPayment = targetValidatorEpochPayment + 1; @@ -281,6 +297,11 @@ contract EpochRewardsTest_setTargetValidatorEpochPayment is EpochRewardsTest { } } +contract EpochRewardsTest_setTargetValidatorEpochPayment_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_setTargetValidatorEpochPayment +{} + contract EpochRewardsTest_setRewardsMultiplierParameters is EpochRewardsTest { uint256 newRewardsMultiplierAdjustmentsUnderspend = rewardsMultiplierAdjustmentsUnderspend + 1; @@ -348,6 +369,11 @@ contract EpochRewardsTest_setRewardsMultiplierParameters is EpochRewardsTest { } } +contract EpochRewardsTest_setRewardsMultiplierParameters_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_setRewardsMultiplierParameters +{} + contract EpochRewardsTest_setTargetVotingYieldParameters is EpochRewardsTest { uint256 newTargetVotingYieldParamsMax = targetVotingYieldParamsMax + 1; uint256 newTargetVotingYieldParamsAdjustmentFactor = targetVotingYieldParamsAdjustmentFactor + 1; @@ -407,6 +433,11 @@ contract EpochRewardsTest_setTargetVotingYieldParameters is EpochRewardsTest { } } +contract EpochRewardsTest_setTargetVotingYieldParameters_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_setTargetVotingYieldParameters +{} + contract EpochRewardsTest_setTargetVotingYield is EpochRewardsTest { uint256 constant newTargetVotingYieldParamsInitial = targetVotingYieldParamsInitial + 1; @@ -437,6 +468,11 @@ contract EpochRewardsTest_setTargetVotingYield is EpochRewardsTest { } } +contract EpochRewardsTest_setTargetVotingYield_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_setTargetVotingYield +{} + contract EpochRewardsTest_getTargetGoldTotalSupply is EpochRewardsTest { function test_ShouldReturn1B_WhenLessThan15YearsSinceGenesis() public { uint256 timeDelta = YEAR * 10; @@ -445,6 +481,11 @@ contract EpochRewardsTest_getTargetGoldTotalSupply is EpochRewardsTest { } } +contract EpochRewardsTest_getTargetGoldTotalSupply_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_getTargetGoldTotalSupply +{} + contract EpochRewardsTest_getTargetVoterRewards is EpochRewardsTest { function test_ShouldReturnAPercentageOfActiveVotes_WhenThereAreActiveVotes() public { uint256 activeVotes = 1000000; @@ -455,16 +496,27 @@ contract EpochRewardsTest_getTargetVoterRewards is EpochRewardsTest { } } +contract EpochRewardsTest_getTargetVoterRewards_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_getTargetVoterRewards +{} + contract EpochRewardsTest_getTargetTotalEpochPaymentsInGold is EpochRewardsTest { function test_ShouldgetTargetTotalEpochPaymentsInGold_WhenExchangeRateIsSet() public { uint256 numberValidators = 100; epochRewards.setNumberValidatorsInCurrentSet(numberValidators); uint256 expected = uint256((targetValidatorEpochPayment * numberValidators) / exchangeRate); + assertEq(epochRewards.getTargetTotalEpochPaymentsInGold(), expected); } } +contract EpochRewardsTest_getTargetTotalEpochPaymentsInGold_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_getTargetTotalEpochPaymentsInGold +{} + contract EpochRewardsTest_getRewardsMultiplier is EpochRewardsTest { uint256 constant timeDelta = YEAR * 10; uint256 expectedTargetTotalSupply; @@ -511,6 +563,11 @@ contract EpochRewardsTest_getRewardsMultiplier is EpochRewardsTest { } } +contract EpochRewardsTest_getRewardsMultiplier_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_getRewardsMultiplier +{} + contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { uint256 constant totalSupply = 6000000 ether; uint256 constant reserveBalance = 1000000 ether; @@ -638,8 +695,13 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { for (uint256 i = 0; i < 600; i++) { // naive time travel: mining takes too long, just repeatedly update target voting yield. One call is one epoch travelled // time travel alone is not enough, updateTargetVotingYield needs to be called - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); + if (isL2()) { + vm.prank(address(epochManager)); + epochRewards.updateTargetVotingYield(); + } else { + vm.prank(address(0)); + epochRewards.updateTargetVotingYield(); + } } (uint256 result, , ) = epochRewards.getTargetVotingYieldParameters(); @@ -654,8 +716,13 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { election.setTotalVotes(totalVotes); // naive time travel: mining takes too long, just repeatedly update target voting yield. One call is one epoch travelled for (uint256 i = 0; i < 800; i++) { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); + if (isL2()) { + vm.prank(address(epochManager)); + epochRewards.updateTargetVotingYield(); + } else { + vm.prank(address(0)); + epochRewards.updateTargetVotingYield(); + } } (uint256 result, , ) = epochRewards.getTargetVotingYieldParameters(); @@ -669,8 +736,13 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { election.setTotalVotes(totalVotes); // naive time travel: mining takes too long, just repeatedly update target voting yield. One call is one epoch travelled for (uint256 i = 0; i < 5; i++) { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); + if (isL2()) { + vm.prank(address(epochManager)); + epochRewards.updateTargetVotingYield(); + } else { + vm.prank(address(0)); + epochRewards.updateTargetVotingYield(); + } } uint256 expected = targetVotingYieldParamsInitial + @@ -689,8 +761,13 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { election.setTotalVotes(totalVotes); // naive time travel: mining takes too long, just repeatedly update target voting yield. One call is one epoch travelled for (uint256 i = 0; i < 5; i++) { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); + if (isL2()) { + vm.prank(address(epochManager)); + epochRewards.updateTargetVotingYield(); + } else { + vm.prank(address(0)); + epochRewards.updateTargetVotingYield(); + } } uint256 expected = targetVotingYieldParamsInitial + @@ -736,8 +813,13 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { uint256 totalVotes = (floatingSupply * (targetVotingGoldFraction - 0.1e24)) / FIXED1; election.setTotalVotes(totalVotes); for (uint256 i = 0; i < 356; i++) { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); + if (isL2()) { + vm.prank(address(epochManager)); + epochRewards.updateTargetVotingYield(); + } else { + vm.prank(address(0)); + epochRewards.updateTargetVotingYield(); + } } uint256 expected = targetVotingYieldParamsInitial + @@ -752,8 +834,13 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { uint256 totalVotes = (floatingSupply * (targetVotingGoldFraction + 0.1e24)) / FIXED1; election.setTotalVotes(totalVotes); for (uint256 i = 0; i < 356; i++) { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); + if (isL2()) { + vm.prank(address(epochManager)); + epochRewards.updateTargetVotingYield(); + } else { + vm.prank(address(0)); + epochRewards.updateTargetVotingYield(); + } } uint256 expected = targetVotingYieldParamsInitial - @@ -764,11 +851,21 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { function mockVotes(uint256 votes) internal { election.setTotalVotes(votes); - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); + if (isL2()) { + vm.prank(address(epochManager)); + epochRewards.updateTargetVotingYield(); + } else { + vm.prank(address(0)); + epochRewards.updateTargetVotingYield(); + } } } +contract EpochRewardsTest_updateTargetVotingYield_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_updateTargetVotingYield +{} + contract EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAndTheActualRemainingSupplyIs10pMoreThanTheTargetRemainingSupplyAfterRewards_calculateTargetEpochRewards is EpochRewardsTest { @@ -845,6 +942,11 @@ contract EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAn } } +contract EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAndTheActualRemainingSupplyIs10pMoreThanTheTargetRemainingSupplyAfterRewards_calculateTargetEpochRewards_L2 is + TransitionToL2AfterL1, + EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAndTheActualRemainingSupplyIs10pMoreThanTheTargetRemainingSupplyAfterRewards_calculateTargetEpochRewards +{} + contract EpochRewardsTest_isReserveLow is EpochRewardsTest { uint256 constant stableBalance = 2397846127684712867321; @@ -963,8 +1065,16 @@ contract EpochRewardsTest_isReserveLow is EpochRewardsTest { // when the contract is frozen function test_ShouldMakeUpdateTargetVotingyieldRevert_WhenTheContractIsFrozen() public { freezer.freeze(address(epochRewards)); - vm.prank(address(0)); - vm.expectRevert("can't call when contract is frozen"); - epochRewards.updateTargetVotingYield(); + if (isL2()) { + vm.prank(address(epochManager)); + vm.expectRevert("can't call when contract is frozen"); + epochRewards.updateTargetVotingYield(); + } else { + vm.prank(address(0)); + vm.expectRevert("can't call when contract is frozen"); + epochRewards.updateTargetVotingYield(); + } } } + +contract EpochRewardsTest_isReserveLow_L2 is TransitionToL2AfterL1, EpochRewardsTest_isReserveLow {} From bb6e81b42b90266391d52d862a1a4d1ef817376d Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Wed, 13 Nov 2024 19:49:29 -0500 Subject: [PATCH 2/6] fixed EpochRewardsTest_getRewardsMultiplier_L2 tests --- .../governance/network/EpochRewards.t.sol | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol index 3c61403852b..90807eb814c 100644 --- a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol +++ b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol @@ -42,10 +42,11 @@ contract EpochRewardsTest is Test, TestConstants, Utils { MockElection election; MockSortedOracles mockSortedOracles; MockStableToken mockStableToken; - GoldTokenMock mockGoldToken; + GoldTokenMock mockCeloToken; Reserve reserve; Freezer freezer; + address celoUnreleasedTreasuryAddress; address caller = address(this); event TargetVotingGoldFractionSet(uint256 fraction); @@ -65,16 +66,25 @@ contract EpochRewardsTest is Test, TestConstants, Utils { election = new MockElection(); mockSortedOracles = new MockSortedOracles(); mockStableToken = new MockStableToken(); - mockGoldToken = new GoldTokenMock(); + + mockCeloToken = new GoldTokenMock(); + mockCeloToken.setRegistry(REGISTRY_ADDRESS); + mockCeloToken.setTotalSupply(L1_MINTED_CELO_SUPPLY); freezer = new Freezer(true); + setupRegistry(); setupEpochManager(); + celoUnreleasedTreasuryAddress = actor("celoUnreleasedTreasury"); + deployCodeTo("CeloUnreleasedTreasury.sol", abi.encode(false), celoUnreleasedTreasuryAddress); + registry.setAddressFor(CeloUnreleasedTreasuryContract, celoUnreleasedTreasuryAddress); + + vm.deal(celoUnreleasedTreasuryAddress, L2_INITIAL_STASH_BALANCE); registry.setAddressFor(ElectionContract, address(election)); registry.setAddressFor(SortedOraclesContract, address(mockSortedOracles)); registry.setAddressFor(StableTokenContract, address(mockStableToken)); - registry.setAddressFor(CeloTokenContract, address(mockGoldToken)); + registry.setAddressFor(CeloTokenContract, address(mockCeloToken)); registry.setAddressFor(FreezerContract, address(freezer)); mockSortedOracles.setMedianRate( @@ -525,6 +535,7 @@ contract EpochRewardsTest_getRewardsMultiplier is EpochRewardsTest { function setUp() public { super.setUp(); + expectedTargetTotalSupply = getExpectedTargetTotalSupply(timeDelta); expectedTargetRemainingSupply = SUPPLY_CAP - expectedTargetTotalSupply; targetEpochReward = @@ -534,7 +545,13 @@ contract EpochRewardsTest_getRewardsMultiplier is EpochRewardsTest { } function test_ShouldReturnOne_WhenTheTargetSupplyIsEqualToTheActualSupplyAfterRewards() public { - mockGoldToken.setTotalSupply(expectedTargetTotalSupply - targetEpochReward); + if (isL2()) { + uint256 celoUnreleasedTreasuryBalance = SUPPLY_CAP - expectedTargetTotalSupply; + vm.deal(celoUnreleasedTreasuryAddress, celoUnreleasedTreasuryBalance - targetEpochReward); + } else { + mockCeloToken.setTotalSupply(expectedTargetTotalSupply - targetEpochReward); + } + assertEq(epochRewards.getRewardsMultiplier(), FIXED1); } @@ -542,8 +559,13 @@ contract EpochRewardsTest_getRewardsMultiplier is EpochRewardsTest { public { uint256 actualRemainingSupply = uint256((expectedTargetRemainingSupply * 11) / 10); - uint256 totalSupply = SUPPLY_CAP - actualRemainingSupply - targetEpochReward; - mockGoldToken.setTotalSupply(totalSupply); + + if (isL2()) { + vm.deal(celoUnreleasedTreasuryAddress, actualRemainingSupply - targetEpochReward); + } else { + uint256 totalSupply = SUPPLY_CAP - actualRemainingSupply - targetEpochReward; + mockCeloToken.setTotalSupply(totalSupply); + } uint256 actual = epochRewards.getRewardsMultiplier(); uint256 expected = uint256((FIXED1 + (rewardsMultiplierAdjustmentsUnderspend / 10))); @@ -554,8 +576,13 @@ contract EpochRewardsTest_getRewardsMultiplier is EpochRewardsTest { public { uint256 actualRemainingSupply = uint256((expectedTargetRemainingSupply * 9) / 10); - uint256 totalSupply = SUPPLY_CAP - actualRemainingSupply - targetEpochReward; - mockGoldToken.setTotalSupply(totalSupply); + + if (isL2()) { + vm.deal(celoUnreleasedTreasuryAddress, actualRemainingSupply - targetEpochReward); + } else { + uint256 totalSupply = SUPPLY_CAP - actualRemainingSupply - targetEpochReward; + mockCeloToken.setTotalSupply(totalSupply); + } uint256 actual = epochRewards.getRewardsMultiplier(); uint256 expected = uint256((FIXED1 - (rewardsMultiplierAdjustmentsOverspend / 10))); @@ -597,7 +624,7 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { 2 * FIXED1 ); - mockGoldToken.setTotalSupply(totalSupply); + mockCeloToken.setTotalSupply(totalSupply); vm.deal(address(reserve), reserveBalance); } @@ -893,7 +920,7 @@ contract EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAn uint256 expectedTargetRemainingSupply = SUPPLY_CAP - expectedTargetTotalSupply; uint256 actualRemainingSupply = (expectedTargetRemainingSupply * 11) / 10; uint256 totalSupply = SUPPLY_CAP - actualRemainingSupply - expectedTargetGoldSupplyIncrease; - mockGoldToken.setTotalSupply(totalSupply); + mockCeloToken.setTotalSupply(totalSupply); expectedMultiplier = (FIXED1 + rewardsMultiplierAdjustmentsUnderspend / 10); validatorReward = (targetValidatorEpochPayment * numberValidators) / exchangeRate; @@ -977,7 +1004,7 @@ contract EpochRewardsTest_isReserveLow is EpochRewardsTest { 2 * FIXED1 ); reserve.addToken(address(mockStableToken)); - mockGoldToken.setTotalSupply(totalSupply); + mockCeloToken.setTotalSupply(totalSupply); mockStableToken.setTotalSupply(stableBalance); } From 78c091a33f6b5fee732db19f56bd5eaacbc1f775 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Thu, 14 Nov 2024 17:00:51 -0500 Subject: [PATCH 3/6] using whenL2 utils contract --- .../governance/network/EpochRewards.t.sol | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol index 90807eb814c..eb2c1b6fb8d 100644 --- a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol +++ b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.5.13; -import "celo-foundry/Test.sol"; import "@celo-contracts/common/Registry.sol"; import "@celo-contracts/common/Freezer.sol"; @@ -13,10 +12,10 @@ import { MockSortedOracles } from "@celo-contracts/stability/test/MockSortedOrac import { MockStableToken } from "@celo-contracts/stability/test/MockStableToken.sol"; import { GoldTokenMock } from "@test-sol/unit/common/GoldTokenMock.sol"; -import { TestConstants } from "@test-sol/constants.sol"; import { Utils } from "@test-sol/utils.sol"; +import "@test-sol/utils/WhenL2.sol"; -contract EpochRewardsTest is Test, TestConstants, Utils { +contract EpochRewardsTest is Utils { uint256 constant targetVotingYieldParamsInitial = 0.00016e24; // 0.00016 uint256 constant targetVotingYieldParamsMax = 0.0005e24; // 0.0005 uint256 constant targetVotingYieldParamsAdjustmentFactor = 1127990000000000000; // 0.00000112799 @@ -61,6 +60,7 @@ contract EpochRewardsTest is Test, TestConstants, Utils { event TargetVotingYieldSet(uint256 target); function setUp() public { + super.setUp(); // Mocked contracts epochRewards = new EpochRewardsMock(); election = new MockElection(); @@ -73,8 +73,8 @@ contract EpochRewardsTest is Test, TestConstants, Utils { freezer = new Freezer(true); - setupRegistry(); - setupEpochManager(); + // setupRegistry(); + // setupEpochManager(); celoUnreleasedTreasuryAddress = actor("celoUnreleasedTreasury"); deployCodeTo("CeloUnreleasedTreasury.sol", abi.encode(false), celoUnreleasedTreasuryAddress); @@ -115,12 +115,9 @@ contract EpochRewardsTest is Test, TestConstants, Utils { } } -contract TransitionToL2AfterL1 is EpochRewardsTest { - function setUp() public { - super.setUp(); - _whenL2(); - } -} +contract EpochRewardsTest_L2 is WhenL2,EpochRewardsTest {} + + contract EpochRewardsTest_initialize is EpochRewardsTest { function test_ShouldHaveSetOwner() public { @@ -215,7 +212,7 @@ contract EpochRewardsTest_setTargetVotingGoldFraction is EpochRewardsTest { } contract EpochRewardsTest_setTargetVotingGoldFraction_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_setTargetVotingGoldFraction {} @@ -266,7 +263,7 @@ contract EpochRewardsTest_setCommunityRewardFraction is EpochRewardsTest { } contract EpochRewardsTest_setCommunityRewardFraction_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_setCommunityRewardFraction {} @@ -308,7 +305,7 @@ contract EpochRewardsTest_setTargetValidatorEpochPayment is EpochRewardsTest { } contract EpochRewardsTest_setTargetValidatorEpochPayment_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_setTargetValidatorEpochPayment {} @@ -380,7 +377,7 @@ contract EpochRewardsTest_setRewardsMultiplierParameters is EpochRewardsTest { } contract EpochRewardsTest_setRewardsMultiplierParameters_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_setRewardsMultiplierParameters {} @@ -444,7 +441,7 @@ contract EpochRewardsTest_setTargetVotingYieldParameters is EpochRewardsTest { } contract EpochRewardsTest_setTargetVotingYieldParameters_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_setTargetVotingYieldParameters {} @@ -479,7 +476,7 @@ contract EpochRewardsTest_setTargetVotingYield is EpochRewardsTest { } contract EpochRewardsTest_setTargetVotingYield_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_setTargetVotingYield {} @@ -492,7 +489,7 @@ contract EpochRewardsTest_getTargetGoldTotalSupply is EpochRewardsTest { } contract EpochRewardsTest_getTargetGoldTotalSupply_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_getTargetGoldTotalSupply {} @@ -507,7 +504,7 @@ contract EpochRewardsTest_getTargetVoterRewards is EpochRewardsTest { } contract EpochRewardsTest_getTargetVoterRewards_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_getTargetVoterRewards {} @@ -523,7 +520,7 @@ contract EpochRewardsTest_getTargetTotalEpochPaymentsInGold is EpochRewardsTest } contract EpochRewardsTest_getTargetTotalEpochPaymentsInGold_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_getTargetTotalEpochPaymentsInGold {} @@ -591,7 +588,7 @@ contract EpochRewardsTest_getRewardsMultiplier is EpochRewardsTest { } contract EpochRewardsTest_getRewardsMultiplier_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_getRewardsMultiplier {} @@ -889,7 +886,7 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { } contract EpochRewardsTest_updateTargetVotingYield_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_updateTargetVotingYield {} @@ -970,7 +967,7 @@ contract EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAn } contract EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAndTheActualRemainingSupplyIs10pMoreThanTheTargetRemainingSupplyAfterRewards_calculateTargetEpochRewards_L2 is - TransitionToL2AfterL1, + EpochRewardsTest_L2, EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAndTheActualRemainingSupplyIs10pMoreThanTheTargetRemainingSupplyAfterRewards_calculateTargetEpochRewards {} @@ -1104,4 +1101,4 @@ contract EpochRewardsTest_isReserveLow is EpochRewardsTest { } } -contract EpochRewardsTest_isReserveLow_L2 is TransitionToL2AfterL1, EpochRewardsTest_isReserveLow {} +contract EpochRewardsTest_isReserveLow_L2 is EpochRewardsTest_L2, EpochRewardsTest_isReserveLow {} From 79d98a7ea063910ad32244373ab26af2868c06a5 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Thu, 14 Nov 2024 17:01:44 -0500 Subject: [PATCH 4/6] removed duplicated test --- .../governance/network/EpochRewards.t.sol | 60 +------------------ 1 file changed, 1 insertion(+), 59 deletions(-) diff --git a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol index eb2c1b6fb8d..f49a547c1d8 100644 --- a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol +++ b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol @@ -115,9 +115,7 @@ contract EpochRewardsTest is Utils { } } -contract EpochRewardsTest_L2 is WhenL2,EpochRewardsTest {} - - +contract EpochRewardsTest_L2 is WhenL2, EpochRewardsTest {} contract EpochRewardsTest_initialize is EpochRewardsTest { function test_ShouldHaveSetOwner() public { @@ -202,13 +200,6 @@ contract EpochRewardsTest_setTargetVotingGoldFraction is EpochRewardsTest { vm.expectRevert("Target voting gold fraction unchanged"); epochRewards.setTargetVotingGoldFraction(targetVotingGoldFraction); } - - function test_Emits_WhenCalledOnL2() public { - _whenL2(); - vm.expectEmit(true, true, true, true); - emit TargetVotingGoldFractionSet(newFraction); - epochRewards.setTargetVotingGoldFraction(newFraction); - } } contract EpochRewardsTest_setTargetVotingGoldFraction_L2 is @@ -253,13 +244,6 @@ contract EpochRewardsTest_setCommunityRewardFraction is EpochRewardsTest { ); epochRewards.setCommunityRewardFraction(communityRewardFraction); } - - function test_Emits_WhenCalledOnL2() public { - _whenL2(); - vm.expectEmit(true, true, true, true); - emit CommunityRewardFractionSet(newFraction); - epochRewards.setCommunityRewardFraction(newFraction); - } } contract EpochRewardsTest_setCommunityRewardFraction_L2 is @@ -295,13 +279,6 @@ contract EpochRewardsTest_setTargetValidatorEpochPayment is EpochRewardsTest { vm.expectRevert("Target validator epoch payment unchanged"); epochRewards.setTargetValidatorEpochPayment(targetValidatorEpochPayment); } - - function test_Emits_WhenCalledOnL2() public { - _whenL2(); - vm.expectEmit(true, true, true, true); - emit TargetValidatorEpochPaymentSet(newPayment); - epochRewards.setTargetValidatorEpochPayment(newPayment); - } } contract EpochRewardsTest_setTargetValidatorEpochPayment_L2 is @@ -359,21 +336,6 @@ contract EpochRewardsTest_setRewardsMultiplierParameters is EpochRewardsTest { rewardsMultiplierAdjustmentsOverspend ); } - - function test_Emits_WhenCalledOnL2() public { - _whenL2(); - vm.expectEmit(true, true, true, true); - emit RewardsMultiplierParametersSet( - rewardsMultiplierMax, - newRewardsMultiplierAdjustmentsUnderspend, - rewardsMultiplierAdjustmentsOverspend - ); - epochRewards.setRewardsMultiplierParameters( - rewardsMultiplierMax, - newRewardsMultiplierAdjustmentsUnderspend, - rewardsMultiplierAdjustmentsOverspend - ); - } } contract EpochRewardsTest_setRewardsMultiplierParameters_L2 is @@ -425,19 +387,6 @@ contract EpochRewardsTest_setTargetVotingYieldParameters is EpochRewardsTest { newTargetVotingYieldParamsAdjustmentFactor ); } - - function test_Emits_WhenCalledOnL2() public { - _whenL2(); - vm.expectEmit(true, true, true, true); - emit TargetVotingYieldParametersSet( - newTargetVotingYieldParamsMax, - newTargetVotingYieldParamsAdjustmentFactor - ); - epochRewards.setTargetVotingYieldParameters( - newTargetVotingYieldParamsMax, - newTargetVotingYieldParamsAdjustmentFactor - ); - } } contract EpochRewardsTest_setTargetVotingYieldParameters_L2 is @@ -466,13 +415,6 @@ contract EpochRewardsTest_setTargetVotingYield is EpochRewardsTest { vm.expectRevert("Ownable: caller is not the owner"); epochRewards.setTargetVotingYield(newTargetVotingYieldParamsInitial); } - - function test_Emits_WhenCalledOnL2() public { - _whenL2(); - vm.expectEmit(true, true, true, true); - emit TargetVotingYieldSet(newTargetVotingYieldParamsInitial); - epochRewards.setTargetVotingYield(newTargetVotingYieldParamsInitial); - } } contract EpochRewardsTest_setTargetVotingYield_L2 is From 3dffcbe2ef3d8d0ab9ef279bb9ff14354804db81 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Thu, 14 Nov 2024 18:01:26 -0500 Subject: [PATCH 5/6] fixed rest of failing tests --- .../unit/common/mocks/MockEpochManager.sol | 7 +- .../governance/network/EpochRewards.t.sol | 106 ++++++++---------- 2 files changed, 52 insertions(+), 61 deletions(-) diff --git a/packages/protocol/test-sol/unit/common/mocks/MockEpochManager.sol b/packages/protocol/test-sol/unit/common/mocks/MockEpochManager.sol index 3013ee926f5..5bc6899bdd0 100644 --- a/packages/protocol/test-sol/unit/common/mocks/MockEpochManager.sol +++ b/packages/protocol/test-sol/unit/common/mocks/MockEpochManager.sol @@ -36,6 +36,7 @@ contract MockEpochManager is IEpochManager { uint256 private currentEpochNumber; address[] public electedAccounts; address[] public electedSigners; + uint256 numberOfElectedAccounts; address public epochManagerEnabler; bool systemInitialized; @@ -95,6 +96,10 @@ contract MockEpochManager is IEpochManager { isProcessingEpoch = _isProcessing; } + function setNumberOfElectedInCurrentSet(uint256 value) external { + numberOfElectedAccounts = value; + } + function getCurrentEpoch() external view returns (uint256, uint256, uint256, uint256) { return getEpochByNumber(currentEpochNumber); } @@ -104,7 +109,7 @@ contract MockEpochManager is IEpochManager { } function numberOfElectedInCurrentSet() external view returns (uint256) { - return electedAccounts.length; + return numberOfElectedAccounts; } function getElectedAccounts() external view returns (address[] memory) { diff --git a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol index f49a547c1d8..375dbc15754 100644 --- a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol +++ b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol @@ -73,9 +73,6 @@ contract EpochRewardsTest is Utils { freezer = new Freezer(true); - // setupRegistry(); - // setupEpochManager(); - celoUnreleasedTreasuryAddress = actor("celoUnreleasedTreasury"); deployCodeTo("CeloUnreleasedTreasury.sol", abi.encode(false), celoUnreleasedTreasuryAddress); registry.setAddressFor(CeloUnreleasedTreasuryContract, celoUnreleasedTreasuryAddress); @@ -108,6 +105,24 @@ contract EpochRewardsTest is Utils { ); } + function _setNumberOfElectedInCurrentSet(uint256 numberValidators) internal { + if (isL2()) { + epochManager.setNumberOfElectedInCurrentSet(numberValidators); + } else { + epochRewards.setNumberValidatorsInCurrentSet(numberValidators); + } + } + + function _updateTargetVotingYieldBasedOnLayer() internal { + if (isL2()) { + vm.prank(address(epochManager)); + epochRewards.updateTargetVotingYield(); + } else { + vm.prank(address(0)); + epochRewards.updateTargetVotingYield(); + } + } + function getExpectedTargetTotalSupply(uint256 timeDelta) internal pure returns (uint256) { uint256 genesisSupply = 600000000 ether; uint256 linearRewards = 200000000 ether; @@ -453,7 +468,7 @@ contract EpochRewardsTest_getTargetVoterRewards_L2 is contract EpochRewardsTest_getTargetTotalEpochPaymentsInGold is EpochRewardsTest { function test_ShouldgetTargetTotalEpochPaymentsInGold_WhenExchangeRateIsSet() public { uint256 numberValidators = 100; - epochRewards.setNumberValidatorsInCurrentSet(numberValidators); + _setNumberOfElectedInCurrentSet(numberValidators); uint256 expected = uint256((targetValidatorEpochPayment * numberValidators) / exchangeRate); @@ -535,9 +550,10 @@ contract EpochRewardsTest_getRewardsMultiplier_L2 is {} contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { - uint256 constant totalSupply = 6000000 ether; + uint256 constant totalSupplyL1 = 6000000 ether; + uint256 constant celoUnreleasedTreasuryBalance = SUPPLY_CAP - totalSupplyL1; uint256 constant reserveBalance = 1000000 ether; - uint256 constant floatingSupply = totalSupply - reserveBalance; + uint256 constant floatingSupply = totalSupplyL1 - reserveBalance; function setUp() public { super.setUp(); @@ -563,7 +579,11 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { 2 * FIXED1 ); - mockCeloToken.setTotalSupply(totalSupply); + if (isL2()) { + vm.deal(celoUnreleasedTreasuryAddress, celoUnreleasedTreasuryBalance); + } else { + mockCeloToken.setTotalSupply(totalSupplyL1); + } vm.deal(address(reserve), reserveBalance); } @@ -661,13 +681,7 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { for (uint256 i = 0; i < 600; i++) { // naive time travel: mining takes too long, just repeatedly update target voting yield. One call is one epoch travelled // time travel alone is not enough, updateTargetVotingYield needs to be called - if (isL2()) { - vm.prank(address(epochManager)); - epochRewards.updateTargetVotingYield(); - } else { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); - } + _updateTargetVotingYieldBasedOnLayer(); } (uint256 result, , ) = epochRewards.getTargetVotingYieldParameters(); @@ -682,13 +696,7 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { election.setTotalVotes(totalVotes); // naive time travel: mining takes too long, just repeatedly update target voting yield. One call is one epoch travelled for (uint256 i = 0; i < 800; i++) { - if (isL2()) { - vm.prank(address(epochManager)); - epochRewards.updateTargetVotingYield(); - } else { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); - } + _updateTargetVotingYieldBasedOnLayer(); } (uint256 result, , ) = epochRewards.getTargetVotingYieldParameters(); @@ -702,13 +710,7 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { election.setTotalVotes(totalVotes); // naive time travel: mining takes too long, just repeatedly update target voting yield. One call is one epoch travelled for (uint256 i = 0; i < 5; i++) { - if (isL2()) { - vm.prank(address(epochManager)); - epochRewards.updateTargetVotingYield(); - } else { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); - } + _updateTargetVotingYieldBasedOnLayer(); } uint256 expected = targetVotingYieldParamsInitial + @@ -727,13 +729,7 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { election.setTotalVotes(totalVotes); // naive time travel: mining takes too long, just repeatedly update target voting yield. One call is one epoch travelled for (uint256 i = 0; i < 5; i++) { - if (isL2()) { - vm.prank(address(epochManager)); - epochRewards.updateTargetVotingYield(); - } else { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); - } + _updateTargetVotingYieldBasedOnLayer(); } uint256 expected = targetVotingYieldParamsInitial + @@ -779,13 +775,7 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { uint256 totalVotes = (floatingSupply * (targetVotingGoldFraction - 0.1e24)) / FIXED1; election.setTotalVotes(totalVotes); for (uint256 i = 0; i < 356; i++) { - if (isL2()) { - vm.prank(address(epochManager)); - epochRewards.updateTargetVotingYield(); - } else { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); - } + _updateTargetVotingYieldBasedOnLayer(); } uint256 expected = targetVotingYieldParamsInitial + @@ -800,13 +790,7 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { uint256 totalVotes = (floatingSupply * (targetVotingGoldFraction + 0.1e24)) / FIXED1; election.setTotalVotes(totalVotes); for (uint256 i = 0; i < 356; i++) { - if (isL2()) { - vm.prank(address(epochManager)); - epochRewards.updateTargetVotingYield(); - } else { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); - } + _updateTargetVotingYieldBasedOnLayer(); } uint256 expected = targetVotingYieldParamsInitial - @@ -817,13 +801,7 @@ contract EpochRewardsTest_updateTargetVotingYield is EpochRewardsTest { function mockVotes(uint256 votes) internal { election.setTotalVotes(votes); - if (isL2()) { - vm.prank(address(epochManager)); - epochRewards.updateTargetVotingYield(); - } else { - vm.prank(address(0)); - epochRewards.updateTargetVotingYield(); - } + _updateTargetVotingYieldBasedOnLayer(); } } @@ -845,7 +823,7 @@ contract EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAn function setUp() public { super.setUp(); - epochRewards.setNumberValidatorsInCurrentSet(numberValidators); + _setNumberOfElectedInCurrentSet(numberValidators); election.setActiveVotes(activeVotes); uint256 expectedTargetTotalEpochPaymentsInGold = (targetValidatorEpochPayment * numberValidators) / exchangeRate; @@ -858,8 +836,16 @@ contract EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAn uint256 expectedTargetTotalSupply = getExpectedTargetTotalSupply(timeDelta); uint256 expectedTargetRemainingSupply = SUPPLY_CAP - expectedTargetTotalSupply; uint256 actualRemainingSupply = (expectedTargetRemainingSupply * 11) / 10; - uint256 totalSupply = SUPPLY_CAP - actualRemainingSupply - expectedTargetGoldSupplyIncrease; - mockCeloToken.setTotalSupply(totalSupply); + + if (isL2()) { + vm.deal( + celoUnreleasedTreasuryAddress, + actualRemainingSupply + expectedTargetGoldSupplyIncrease + ); + } else { + uint256 totalSupply = SUPPLY_CAP - actualRemainingSupply - expectedTargetGoldSupplyIncrease; + mockCeloToken.setTotalSupply(totalSupply); + } expectedMultiplier = (FIXED1 + rewardsMultiplierAdjustmentsUnderspend / 10); validatorReward = (targetValidatorEpochPayment * numberValidators) / exchangeRate; @@ -869,7 +855,7 @@ contract EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAn } function test_ShouldFetchTheExpectedRewardsMultiplier() public { - assertApproxEqRel(epochRewards.getRewardsMultiplier(), expectedMultiplier, 2e13); + assertApproxEqRel(epochRewards.getRewardsMultiplier(), expectedMultiplier, 6e13); } function test_ShouldReturnTheTargetValidatorEpochPaymentTimesTheRewardsMultiplier() public { From f3cc98c082d1b2cf428ad439905ea214c6130e89 Mon Sep 17 00:00:00 2001 From: soloseng <102702451+soloseng@users.noreply.github.com> Date: Thu, 14 Nov 2024 18:30:00 -0500 Subject: [PATCH 6/6] renamed function --- .../test-sol/unit/governance/network/EpochRewards.t.sol | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol index 375dbc15754..fdae1d24742 100644 --- a/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol +++ b/packages/protocol/test-sol/unit/governance/network/EpochRewards.t.sol @@ -105,7 +105,7 @@ contract EpochRewardsTest is Utils { ); } - function _setNumberOfElectedInCurrentSet(uint256 numberValidators) internal { + function _setNumberOfElectedInCurrentSetBaseOnLayer(uint256 numberValidators) internal { if (isL2()) { epochManager.setNumberOfElectedInCurrentSet(numberValidators); } else { @@ -468,10 +468,9 @@ contract EpochRewardsTest_getTargetVoterRewards_L2 is contract EpochRewardsTest_getTargetTotalEpochPaymentsInGold is EpochRewardsTest { function test_ShouldgetTargetTotalEpochPaymentsInGold_WhenExchangeRateIsSet() public { uint256 numberValidators = 100; - _setNumberOfElectedInCurrentSet(numberValidators); + _setNumberOfElectedInCurrentSetBaseOnLayer(numberValidators); uint256 expected = uint256((targetValidatorEpochPayment * numberValidators) / exchangeRate); - assertEq(epochRewards.getTargetTotalEpochPaymentsInGold(), expected); } } @@ -823,7 +822,7 @@ contract EpochRewardsTest_WhenThereAreActiveVotesAStableTokenExchangeRateIsSetAn function setUp() public { super.setUp(); - _setNumberOfElectedInCurrentSet(numberValidators); + _setNumberOfElectedInCurrentSetBaseOnLayer(numberValidators); election.setActiveVotes(activeVotes); uint256 expectedTargetTotalEpochPaymentsInGold = (targetValidatorEpochPayment * numberValidators) / exchangeRate;