From f6a70fa0d27ae63c4b8b72bdc3c3ab19ce0bcb8b Mon Sep 17 00:00:00 2001 From: itofarina Date: Fri, 26 Jul 2024 15:57:31 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=A6=BA=20staking:=20prevent=20zero=20addr?= =?UTF-8?q?ess=20for=20market?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gas-snapshot | 151 ++++++++++++++++++++-------------------- contracts/StakedEXA.sol | 1 + test/StakedEXA.t.sol | 5 ++ 3 files changed, 82 insertions(+), 75 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index ee924028..3bac0afd 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -460,82 +460,83 @@ StakedEXATest:invariantIndexUpOnly() (runs: 10, calls: 5000, reverts: 0) StakedEXATest:invariantNoDuplicatedReward() (runs: 10, calls: 5000, reverts: 0) StakedEXATest:invariantRewardsUpOnly() (runs: 10, calls: 5000, reverts: 0) StakedEXATest:invariantShareValueIsOne() (runs: 10, calls: 5000, reverts: 0) -StakedEXATest:testAlreadyListedError() (gas: 41631) -StakedEXATest:testAvgIndex(uint256[3],uint256[2]) (runs: 256, μ: 1212986, ~: 1269803) -StakedEXATest:testAvgStartTime(uint256[3],uint256[2]) (runs: 256, μ: 1199359, ~: 1256176) -StakedEXATest:testBalanceOfDeposit(uint80) (runs: 256, μ: 355369, ~: 362414) -StakedEXATest:testBalanceOfWithdraw(uint256) (runs: 256, μ: 60525, ~: 60532) -StakedEXATest:testCanChangeRewardsDurationWhenDisabled() (gas: 168192) -StakedEXATest:testClaimAfterHarvest() (gas: 837867) -StakedEXATest:testClaimAndUnstake() (gas: 1477408) -StakedEXATest:testClaimAndWithdrawAfterRefTime() (gas: 1085367) -StakedEXATest:testClaimBeforeFirstHarvest() (gas: 539800) -StakedEXATest:testDepositEvent(uint256) (runs: 256, μ: 364407, ~: 364130) -StakedEXATest:testDepositShouldClaim(uint256[2],uint32) (runs: 256, μ: 822092, ~: 742024) -StakedEXATest:testDepositWithdrawAvgStartTimeAndIndex(uint256[3],uint256,uint256[5]) (runs: 256, μ: 1741811, ~: 1797695) -StakedEXATest:testEarnedWithTime(uint256) (runs: 256, μ: 35526, ~: 35809) -StakedEXATest:testEmergencyAdminCanPauseNotUnpause() (gas: 159061) -StakedEXATest:testFinishDistributionEmitEvent() (gas: 402002) -StakedEXATest:testFinishDistributionLetsClaimUnclaimed() (gas: 1504496) -StakedEXATest:testFinishDistributionStopsEmission() (gas: 1484171) -StakedEXATest:testFinishDistributionThatAlreadyFinished() (gas: 435935) -StakedEXATest:testFinishDistributionTransfersRemainingToSavings() (gas: 111466) -StakedEXATest:testGrantRevokeEmergencyAdmin() (gas: 107216) -StakedEXATest:testGrantRevokePauser() (gas: 107235) -StakedEXATest:testHandlerClaim(uint8) (runs: 256, μ: 302701, ~: 302701) -StakedEXATest:testHandlerDeposit(uint80) (runs: 256, μ: 799105, ~: 810115) -StakedEXATest:testHandlerHarvest(uint64) (runs: 256, μ: 333630, ~: 332862) -StakedEXATest:testHandlerNotifyRewardAmount(uint64) (runs: 256, μ: 128548, ~: 124457) -StakedEXATest:testHandlerSetDuration(uint32) (runs: 256, μ: 146192, ~: 163906) -StakedEXATest:testHandlerWithdraw(uint256) (runs: 256, μ: 69995, ~: 70002) -StakedEXATest:testHarvest() (gas: 197912) -StakedEXATest:testHarvestAmountWithReducedAllowance() (gas: 215330) -StakedEXATest:testHarvestEffectOnRewardData() (gas: 190914) -StakedEXATest:testHarvestEmitsRewardAmountNotified() (gas: 189043) -StakedEXATest:testHarvestZero() (gas: 236747) -StakedEXATest:testInitialValues() (gas: 89074) -StakedEXATest:testInsufficientBalanceError(uint256) (runs: 256, μ: 65331, ~: 65453) -StakedEXATest:testMultipleClaimsVsOne() (gas: 25921483) -StakedEXATest:testMultipleHarvests() (gas: 462094) -StakedEXATest:testNoRewardsAfterPeriod(uint256) (runs: 256, μ: 1559359, ~: 1565965) +StakedEXATest:testAlreadyListedError() (gas: 41653) +StakedEXATest:testAvgIndex(uint256[3],uint256[2]) (runs: 256, μ: 1205749, ~: 1245918) +StakedEXATest:testAvgStartTime(uint256[3],uint256[2]) (runs: 256, μ: 1192122, ~: 1232291) +StakedEXATest:testBalanceOfDeposit(uint80) (runs: 256, μ: 355392, ~: 362436) +StakedEXATest:testBalanceOfWithdraw(uint256) (runs: 256, μ: 60547, ~: 60554) +StakedEXATest:testCanChangeRewardsDurationWhenDisabled() (gas: 168214) +StakedEXATest:testClaimAfterHarvest() (gas: 837889) +StakedEXATest:testClaimAndUnstake() (gas: 1477430) +StakedEXATest:testClaimAndWithdrawAfterRefTime() (gas: 1085389) +StakedEXATest:testClaimBeforeFirstHarvest() (gas: 539822) +StakedEXATest:testDepositEvent(uint256) (runs: 256, μ: 364280, ~: 363984) +StakedEXATest:testDepositShouldClaim(uint256[2],uint32) (runs: 256, μ: 827538, ~: 742070) +StakedEXATest:testDepositWithdrawAvgStartTimeAndIndex(uint256[3],uint256,uint256[5]) (runs: 256, μ: 1748072, ~: 1798047) +StakedEXATest:testEarnedWithTime(uint256) (runs: 256, μ: 35406, ~: 35700) +StakedEXATest:testEmergencyAdminCanPauseNotUnpause() (gas: 159083) +StakedEXATest:testFinishDistributionEmitEvent() (gas: 402024) +StakedEXATest:testFinishDistributionLetsClaimUnclaimed() (gas: 1504474) +StakedEXATest:testFinishDistributionStopsEmission() (gas: 1484193) +StakedEXATest:testFinishDistributionThatAlreadyFinished() (gas: 435957) +StakedEXATest:testFinishDistributionTransfersRemainingToSavings() (gas: 111488) +StakedEXATest:testGrantRevokeEmergencyAdmin() (gas: 107238) +StakedEXATest:testGrantRevokePauser() (gas: 107257) +StakedEXATest:testHandlerClaim(uint8) (runs: 256, μ: 302723, ~: 302723) +StakedEXATest:testHandlerDeposit(uint80) (runs: 256, μ: 798931, ~: 810004) +StakedEXATest:testHandlerHarvest(uint64) (runs: 256, μ: 333388, ~: 332884) +StakedEXATest:testHandlerNotifyRewardAmount(uint64) (runs: 256, μ: 128793, ~: 124447) +StakedEXATest:testHandlerSetDuration(uint32) (runs: 256, μ: 144441, ~: 163795) +StakedEXATest:testHandlerWithdraw(uint256) (runs: 256, μ: 70017, ~: 70024) +StakedEXATest:testHarvest() (gas: 197934) +StakedEXATest:testHarvestAmountWithReducedAllowance() (gas: 215352) +StakedEXATest:testHarvestEffectOnRewardData() (gas: 190936) +StakedEXATest:testHarvestEmitsRewardAmountNotified() (gas: 188932) +StakedEXATest:testHarvestZero() (gas: 236769) +StakedEXATest:testInitialValues() (gas: 89096) +StakedEXATest:testInsufficientBalanceError(uint256) (runs: 256, μ: 65350, ~: 65475) +StakedEXATest:testMultipleClaimsVsOne() (gas: 25921528) +StakedEXATest:testMultipleHarvests() (gas: 461984) +StakedEXATest:testNoRewardsAfterPeriod(uint256) (runs: 256, μ: 1559522, ~: 1565854) StakedEXATest:testNotPausingRoleError() (gas: 39503) -StakedEXATest:testNotifyRewardAmount(uint256,uint256) (runs: 256, μ: 131126, ~: 131086) -StakedEXATest:testNotifyRewardWithUnderlyingAsset() (gas: 501735) -StakedEXATest:testOnlyAdminEnableReward() (gas: 1198741) -StakedEXATest:testOnlyAdminFinishDistribution() (gas: 190229) -StakedEXATest:testOnlyAdminNotifyRewardAmount() (gas: 204586) -StakedEXATest:testOnlyAdminSetProvider() (gas: 143570) -StakedEXATest:testOnlyAdminSetProviderRatio() (gas: 143217) -StakedEXATest:testOnlyAdminSetRewardsDuration() (gas: 152956) -StakedEXATest:testOnlyAdminSetSavings() (gas: 140988) -StakedEXATest:testPausable() (gas: 1154680) -StakedEXATest:testPausableClaim() (gas: 639265) -StakedEXATest:testPausableHarvest() (gas: 344615) -StakedEXATest:testPauserCanPauseUnpause() (gas: 157943) -StakedEXATest:testPenaltyGrowthRange() (gas: 67189) -StakedEXATest:testPenaltyThresholdRange() (gas: 37134) -StakedEXATest:testPermitAndDeposit() (gas: 373011) -StakedEXATest:testResetDepositAfterRefTime(uint256) (runs: 256, μ: 1014799, ~: 1014530) -StakedEXATest:testRewardAmountNotifiedEvent(uint256) (runs: 256, μ: 105843, ~: 106689) -StakedEXATest:testRewardNotListedError() (gas: 1114662) -StakedEXATest:testRewardPaidEvent(uint256,uint256) (runs: 256, μ: 806813, ~: 749454) -StakedEXATest:testRewardsAmounts(uint256) (runs: 256, μ: 1566774, ~: 1566401) -StakedEXATest:testRewardsDurationSetEvent(uint40) (runs: 256, μ: 52051, ~: 52034) -StakedEXATest:testSetDuration(uint256,uint40) (runs: 256, μ: 58958, ~: 59238) -StakedEXATest:testSetMarketOnlyAdmin() (gas: 1266909) -StakedEXATest:testSetMinTime() (gas: 81971) -StakedEXATest:testSetPenaltyGrowth() (gas: 82247) -StakedEXATest:testSetPenaltyThreshold() (gas: 82066) -StakedEXATest:testSetProviderRatioOverOneError() (gas: 37134) -StakedEXATest:testSetProviderZeroAddressError() (gas: 37153) -StakedEXATest:testSetSavingsZeroAddressError() (gas: 37262) -StakedEXATest:testTotalSupplyDeposit(uint80) (runs: 256, μ: 354972, ~: 362017) -StakedEXATest:testTotalSupplyWithdraw(uint256) (runs: 256, μ: 61950, ~: 61957) -StakedEXATest:testUntransferable(uint80) (runs: 256, μ: 374526, ~: 382470) -StakedEXATest:testWithdrawEvent(uint256) (runs: 256, μ: 520263, ~: 519992) -StakedEXATest:testWithdrawSameAmountRewardsShouldEqual(uint256,uint256) (runs: 256, μ: 1064975, ~: 1131571) -StakedEXATest:testWithdrawWithRewards(uint256) (runs: 256, μ: 873950, ~: 873679) -StakedEXATest:testZeroRateError() (gas: 59267) +StakedEXATest:testNotifyRewardAmount(uint256,uint256) (runs: 256, μ: 131160, ~: 131108) +StakedEXATest:testNotifyRewardWithUnderlyingAsset() (gas: 501757) +StakedEXATest:testOnlyAdminEnableReward() (gas: 1198763) +StakedEXATest:testOnlyAdminFinishDistribution() (gas: 190251) +StakedEXATest:testOnlyAdminNotifyRewardAmount() (gas: 204608) +StakedEXATest:testOnlyAdminSetProvider() (gas: 143592) +StakedEXATest:testOnlyAdminSetProviderRatio() (gas: 143239) +StakedEXATest:testOnlyAdminSetRewardsDuration() (gas: 152845) +StakedEXATest:testOnlyAdminSetSavings() (gas: 141010) +StakedEXATest:testPausable() (gas: 1154702) +StakedEXATest:testPausableClaim() (gas: 639287) +StakedEXATest:testPausableHarvest() (gas: 344660) +StakedEXATest:testPauserCanPauseUnpause() (gas: 157833) +StakedEXATest:testPenaltyGrowthRange() (gas: 67211) +StakedEXATest:testPenaltyThresholdRange() (gas: 37156) +StakedEXATest:testPermitAndDeposit() (gas: 373033) +StakedEXATest:testResetDepositAfterRefTime(uint256) (runs: 256, μ: 1014800, ~: 1014484) +StakedEXATest:testRewardAmountNotifiedEvent(uint256) (runs: 256, μ: 105804, ~: 106687) +StakedEXATest:testRewardNotListedError() (gas: 1114684) +StakedEXATest:testRewardPaidEvent(uint256,uint256) (runs: 256, μ: 807785, ~: 751764) +StakedEXATest:testRewardsAmounts(uint256) (runs: 256, μ: 1566769, ~: 1566367) +StakedEXATest:testRewardsDurationSetEvent(uint40) (runs: 256, μ: 52073, ~: 52056) +StakedEXATest:testSetDuration(uint256,uint40) (runs: 256, μ: 58992, ~: 59260) +StakedEXATest:testSetMarketAddressZero() (gas: 37124) +StakedEXATest:testSetMarketOnlyAdmin() (gas: 1266966) +StakedEXATest:testSetMinTime() (gas: 81993) +StakedEXATest:testSetPenaltyGrowth() (gas: 82136) +StakedEXATest:testSetPenaltyThreshold() (gas: 81958) +StakedEXATest:testSetProviderRatioOverOneError() (gas: 37156) +StakedEXATest:testSetProviderZeroAddressError() (gas: 37175) +StakedEXATest:testSetSavingsZeroAddressError() (gas: 37284) +StakedEXATest:testTotalSupplyDeposit(uint80) (runs: 256, μ: 354885, ~: 361929) +StakedEXATest:testTotalSupplyWithdraw(uint256) (runs: 256, μ: 61972, ~: 61979) +StakedEXATest:testUntransferable(uint80) (runs: 256, μ: 374550, ~: 382492) +StakedEXATest:testWithdrawEvent(uint256) (runs: 256, μ: 520266, ~: 519960) +StakedEXATest:testWithdrawSameAmountRewardsShouldEqual(uint256,uint256) (runs: 256, μ: 1067053, ~: 1131617) +StakedEXATest:testWithdrawWithRewards(uint256) (runs: 256, μ: 873909, ~: 873603) +StakedEXATest:testZeroRateError() (gas: 59289) StakingPreviewerTest:testAllClaimable() (gas: 431357) StakingPreviewerTest:testAllClaimed() (gas: 630691) StakingPreviewerTest:testAllEarned() (gas: 316375) diff --git a/contracts/StakedEXA.sol b/contracts/StakedEXA.sol index b0e964ca..501726d3 100644 --- a/contracts/StakedEXA.sol +++ b/contracts/StakedEXA.sol @@ -459,6 +459,7 @@ contract StakedEXA is /// @notice Sets the market. /// @param market_ The new market. function setMarket(Market market_) public onlyRole(DEFAULT_ADMIN_ROLE) { + if (address(market_) == address(0)) revert ZeroAddress(); market = market_; emit MarketSet(market_, msg.sender); } diff --git a/test/StakedEXA.t.sol b/test/StakedEXA.t.sol index 485d6cf0..53c0414b 100644 --- a/test/StakedEXA.t.sol +++ b/test/StakedEXA.t.sol @@ -1314,6 +1314,11 @@ contract StakedEXATest is Test { assertEq(address(stEXA.market()), address(newMarket)); } + function testSetMarketAddressZero() external { + vm.expectRevert(ZeroAddress.selector); + stEXA.setMarket(Market(address(0))); + } + function testOnlyAdminSetProvider() external { address nonAdmin = address(0x1); address newProvider = address(0x2);