diff --git a/.gas-snapshot b/.gas-snapshot index ddd9f78e..c79f5f1c 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -449,91 +449,87 @@ StakedEXATest:invariantIndexUpOnly() (runs: 256, calls: 128000, reverts: 0) StakedEXATest:invariantNoDuplicatedReward() (runs: 256, calls: 128000, reverts: 0) StakedEXATest:invariantRewardsUpOnly() (runs: 256, calls: 128000, reverts: 0) StakedEXATest:invariantShareValueIsOne() (runs: 256, calls: 128000, reverts: 0) -StakedEXATest:testAlreadyListedError() (gas: 41740) -StakedEXATest:testAvgIndex(uint256[3],uint256[2]) (runs: 256, μ: 1211447, ~: 1247428) -StakedEXATest:testAvgStartTime(uint256[3],uint256[2]) (runs: 256, μ: 1197754, ~: 1233735) -StakedEXATest:testBalanceOfDeposit(uint80) (runs: 256, μ: 355829, ~: 362889) -StakedEXATest:testBalanceOfWithdraw(uint256) (runs: 256, μ: 60613, ~: 60620) -StakedEXATest:testCanChangeRewardsDurationWhenDisabled() (gas: 168281) -StakedEXATest:testClaimAfterHarvest() (gas: 838729) -StakedEXATest:testClaimAndUnstake() (gas: 1478790) +StakedEXATest:testAlreadyListedError() (gas: 41631) +StakedEXATest:testAvgIndex(uint256[3],uint256[2]) (runs: 256, μ: 1207225, ~: 1246894) +StakedEXATest:testAvgStartTime(uint256[3],uint256[2]) (runs: 256, μ: 1193598, ~: 1233267) +StakedEXATest:testBalanceOfDeposit(uint80) (runs: 256, μ: 355743, ~: 362801) +StakedEXATest:testBalanceOfWithdraw(uint256) (runs: 256, μ: 60525, ~: 60532) +StakedEXATest:testCanChangeRewardsDurationWhenDisabled() (gas: 168192) +StakedEXATest:testClaimAfterHarvest() (gas: 838641) +StakedEXATest:testClaimAndUnstake() (gas: 1478569) StakedEXATest:testClaimAndWithdrawAfterRefTime() (gas: 1086141) -StakedEXATest:testClaimBeforeFirstHarvest() (gas: 540618) -StakedEXATest:testDepositEvent(uint256) (runs: 256, μ: 364687, ~: 364381) -StakedEXATest:testDepositShouldClaim(uint256[2],uint32) (runs: 256, μ: 818907, ~: 742847) -StakedEXATest:testDepositWithdrawAvgStartTimeAndIndex(uint256[3],uint256,uint256[5]) (runs: 256, μ: 1740706, ~: 1799529) -StakedEXATest:testEarnedWithTime(uint256) (runs: 256, μ: 35592, ~: 35875) -StakedEXATest:testEmergencyAdminCanPauseNotUnpause() (gas: 159060) -StakedEXATest:testExcessFactorRange() (gas: 37135) -StakedEXATest:testFinishDistributionEmitEvent() (gas: 402046) -StakedEXATest:testFinishDistributionLetsClaimUnclaimed() (gas: 1506264) -StakedEXATest:testFinishDistributionStopsEmission() (gas: 1485917) -StakedEXATest:testFinishDistributionThatAlreadyFinished() (gas: 436388) +StakedEXATest:testClaimBeforeFirstHarvest() (gas: 540574) +StakedEXATest:testDepositEvent(uint256) (runs: 256, μ: 364784, ~: 364493) +StakedEXATest:testDepositShouldClaim(uint256[2],uint32) (runs: 256, μ: 822860, ~: 742798) +StakedEXATest:testDepositWithdrawAvgStartTimeAndIndex(uint256[3],uint256,uint256[5]) (runs: 256, μ: 1742615, ~: 1799630) +StakedEXATest:testEarnedWithTime(uint256) (runs: 256, μ: 35521, ~: 35809) +StakedEXATest:testEmergencyAdminCanPauseNotUnpause() (gas: 159061) +StakedEXATest:testFinishDistributionEmitEvent() (gas: 402002) +StakedEXATest:testFinishDistributionLetsClaimUnclaimed() (gas: 1506044) +StakedEXATest:testFinishDistributionStopsEmission() (gas: 1485719) +StakedEXATest:testFinishDistributionThatAlreadyFinished() (gas: 436322) StakedEXATest:testFinishDistributionTransfersRemainingToSavings() (gas: 111466) -StakedEXATest:testGrantRevokeEmergencyAdmin() (gas: 107326) -StakedEXATest:testGrantRevokePauser() (gas: 107213) -StakedEXATest:testHandlerClaim(uint8) (runs: 256, μ: 302433, ~: 302433) -StakedEXATest:testHandlerDeposit(uint80) (runs: 256, μ: 800016, ~: 811131) -StakedEXATest:testHandlerHarvest(uint64) (runs: 256, μ: 333455, ~: 332862) -StakedEXATest:testHandlerNotifyRewardAmount(uint64) (runs: 256, μ: 128760, ~: 124447) -StakedEXATest:testHandlerSetDuration(uint32) (runs: 256, μ: 147216, ~: 163950) -StakedEXATest:testHandlerWithdraw(uint256) (runs: 256, μ: 70039, ~: 70046) +StakedEXATest:testGrantRevokeEmergencyAdmin() (gas: 107216) +StakedEXATest:testGrantRevokePauser() (gas: 107235) +StakedEXATest:testHandlerClaim(uint8) (runs: 256, μ: 302701, ~: 302701) +StakedEXATest:testHandlerDeposit(uint80) (runs: 256, μ: 800318, ~: 810889) +StakedEXATest:testHandlerHarvest(uint64) (runs: 256, μ: 333366, ~: 332862) +StakedEXATest:testHandlerNotifyRewardAmount(uint64) (runs: 256, μ: 128714, ~: 124469) +StakedEXATest:testHandlerSetDuration(uint32) (runs: 256, μ: 147177, ~: 163906) +StakedEXATest:testHandlerWithdraw(uint256) (runs: 256, μ: 69995, ~: 70002) StakedEXATest:testHarvest() (gas: 197912) StakedEXATest:testHarvestAmountWithReducedAllowance() (gas: 215330) -StakedEXATest:testHarvestEffectOnRewardData() (gas: 190958) +StakedEXATest:testHarvestEffectOnRewardData() (gas: 190914) StakedEXATest:testHarvestEmitsRewardAmountNotified() (gas: 189043) StakedEXATest:testHarvestZero() (gas: 236747) -StakedEXATest:testInitialValues() (gas: 89162) -StakedEXATest:testInsufficientBalanceError(uint256) (runs: 256, μ: 65339, ~: 65475) -StakedEXATest:testMultipleClaimsVsOne() (gas: 25924766) -StakedEXATest:testMultipleHarvests() (gas: 462138) -StakedEXATest:testNoRewardsAfterPeriod(uint256) (runs: 256, μ: 1561373, ~: 1567865) +StakedEXATest:testInitialValues() (gas: 89074) +StakedEXATest:testInsufficientBalanceError(uint256) (runs: 256, μ: 65328, ~: 65453) +StakedEXATest:testMultipleClaimsVsOne() (gas: 25922257) +StakedEXATest:testMultipleHarvests() (gas: 462094) +StakedEXATest:testNoRewardsAfterPeriod(uint256) (runs: 256, μ: 1561357, ~: 1567513) StakedEXATest:testNotPausingRoleError() (gas: 39503) -StakedEXATest:testNotifyRewardAmount(uint256,uint256) (runs: 256, μ: 131202, ~: 131131) -StakedEXATest:testNotifyRewardWithUnderlyingAsset() (gas: 502167) -StakedEXATest:testOnlyAdminEnableReward() (gas: 1196209) -StakedEXATest:testOnlyAdminFinishDistribution() (gas: 190273) +StakedEXATest:testNotifyRewardAmount(uint256,uint256) (runs: 256, μ: 131151, ~: 131086) +StakedEXATest:testNotifyRewardWithUnderlyingAsset() (gas: 502122) +StakedEXATest:testOnlyAdminEnableReward() (gas: 1195947) +StakedEXATest:testOnlyAdminFinishDistribution() (gas: 190229) StakedEXATest:testOnlyAdminNotifyRewardAmount() (gas: 204586) -StakedEXATest:testOnlyAdminSetProvider() (gas: 143679) -StakedEXATest:testOnlyAdminSetProviderRatio() (gas: 143317) -StakedEXATest:testOnlyAdminSetRewardsDuration() (gas: 152934) -StakedEXATest:testOnlyAdminSetSavings() (gas: 141010) -StakedEXATest:testPausable() (gas: 1156205) -StakedEXATest:testPausableClaim() (gas: 639452) -StakedEXATest:testPausableHarvest() (gas: 344637) -StakedEXATest:testPauserCanPauseUnpause() (gas: 157810) +StakedEXATest:testOnlyAdminSetProvider() (gas: 143570) +StakedEXATest:testOnlyAdminSetProviderRatio() (gas: 143217) +StakedEXATest:testOnlyAdminSetRewardsDuration() (gas: 152956) +StakedEXATest:testOnlyAdminSetSavings() (gas: 140988) +StakedEXATest:testPausable() (gas: 1156228) +StakedEXATest:testPausableClaim() (gas: 639652) +StakedEXATest:testPausableHarvest() (gas: 344615) +StakedEXATest:testPauserCanPauseUnpause() (gas: 157943) StakedEXATest:testPenaltyGrowthRange() (gas: 67189) StakedEXATest:testPenaltyThresholdRange() (gas: 37134) -StakedEXATest:testPermitAndDeposit() (gas: 373442) -StakedEXATest:testRefTimeRange() (gas: 41436) -StakedEXATest:testResetDepositAfterRefTime(uint256) (runs: 256, μ: 1015616, ~: 1015278) -StakedEXATest:testRewardAmountNotifiedEvent(uint256) (runs: 256, μ: 105824, ~: 106665) +StakedEXATest:testPermitAndDeposit() (gas: 373398) +StakedEXATest:testResetDepositAfterRefTime(uint256) (runs: 256, μ: 1015560, ~: 1015260) +StakedEXATest:testRewardAmountNotifiedEvent(uint256) (runs: 256, μ: 105811, ~: 106665) StakedEXATest:testRewardNotListedError() (gas: 1111868) -StakedEXATest:testRewardPaidEvent(uint256,uint256) (runs: 256, μ: 808591, ~: 752582) -StakedEXATest:testRewardsAmounts(uint256) (runs: 256, μ: 1568469, ~: 1568055) -StakedEXATest:testRewardsDurationSetEvent(uint40) (runs: 256, μ: 52051, ~: 52034) -StakedEXATest:testSetDuration(uint256,uint40) (runs: 256, μ: 59013, ~: 59283) -StakedEXATest:testSetExcessFactor() (gas: 81904) -StakedEXATest:testSetMarketOnlyAdmin() (gas: 1264147) -StakedEXATest:testSetMinTime() (gas: 81993) -StakedEXATest:testSetPenaltyGrowth() (gas: 82225) -StakedEXATest:testSetPenaltyThreshold() (gas: 82022) -StakedEXATest:testSetProviderRatioOverOneError() (gas: 37267) -StakedEXATest:testSetProviderZeroAddressError() (gas: 37131) -StakedEXATest:testSetRefTime() (gas: 84032) -StakedEXATest:testSetSavingsZeroAddressError() (gas: 37284) -StakedEXATest:testTotalSupplyDeposit(uint80) (runs: 256, μ: 355322, ~: 362382) -StakedEXATest:testTotalSupplyWithdraw(uint256) (runs: 256, μ: 62061, ~: 62068) -StakedEXATest:testUntransferable(uint80) (runs: 256, μ: 374940, ~: 382901) -StakedEXATest:testWithdrawEvent(uint256) (runs: 256, μ: 521038, ~: 520716) -StakedEXATest:testWithdrawSameAmountRewardsShouldEqual(uint256,uint256) (runs: 256, μ: 1066883, ~: 1132708) -StakedEXATest:testWithdrawWithRewards(uint256) (runs: 256, μ: 874769, ~: 874447) +StakedEXATest:testRewardPaidEvent(uint256,uint256) (runs: 256, μ: 811350, ~: 868991) +StakedEXATest:testRewardsAmounts(uint256) (runs: 256, μ: 1568305, ~: 1567893) +StakedEXATest:testRewardsDurationSetEvent(uint40) (runs: 256, μ: 52052, ~: 52034) +StakedEXATest:testSetDuration(uint256,uint40) (runs: 256, μ: 58997, ~: 59238) +StakedEXATest:testSetMarketOnlyAdmin() (gas: 1264125) +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, μ: 355346, ~: 362404) +StakedEXATest:testTotalSupplyWithdraw(uint256) (runs: 256, μ: 61950, ~: 61957) +StakedEXATest:testUntransferable(uint80) (runs: 256, μ: 374898, ~: 382857) +StakedEXATest:testWithdrawEvent(uint256) (runs: 256, μ: 521026, ~: 520730) +StakedEXATest:testWithdrawSameAmountRewardsShouldEqual(uint256,uint256) (runs: 256, μ: 1070258, ~: 1132756) +StakedEXATest:testWithdrawWithRewards(uint256) (runs: 256, μ: 874713, ~: 874417) StakedEXATest:testZeroRateError() (gas: 59267) -StakingPreviewerTest:testAllClaimable() (gas: 431950) -StakingPreviewerTest:testAllClaimed() (gas: 630932) -StakingPreviewerTest:testAllEarned() (gas: 317080) -StakingPreviewerTest:testAllRewards() (gas: 448808) -StakingPreviewerTest:testStaking() (gas: 502542) +StakingPreviewerTest:testAllClaimable() (gas: 431576) +StakingPreviewerTest:testAllClaimed() (gas: 630910) +StakingPreviewerTest:testAllEarned() (gas: 316706) +StakingPreviewerTest:testAllRewards() (gas: 448258) +StakingPreviewerTest:testStaking() (gas: 501992) SwapperTest:testSwapBasic() (gas: 216831) SwapperTest:testSwapWithAllowance() (gas: 481530) SwapperTest:testSwapWithInaccurateSlippageSendsETHToAccount() (gas: 297968) diff --git a/contracts/StakedEXA.sol b/contracts/StakedEXA.sol index 3462b41a..11801433 100644 --- a/contracts/StakedEXA.sol +++ b/contracts/StakedEXA.sol @@ -50,9 +50,9 @@ contract StakedEXA is /// @notice Minimum time to stake and get rewards. uint256 public minTime; - /// @notice Reference period to stake and get full rewards. + /// @notice Reference period to stake and get full rewards. Not possible to change after initilization. uint256 public refTime; - /// @notice Discount factor for excess exposure. + /// @notice Discount factor for excess exposure. Not possible to change after initilization. uint256 public excessFactor; /// @notice Penalty growth factor. uint256 public penaltyGrowth; @@ -94,9 +94,10 @@ contract StakedEXA is _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + if (p.refTime == 0 || p.refTime <= p.minTime || p.excessFactor > 1e18) revert InvalidRange(); setMinTime(p.minTime); - setRefTime(p.refTime); - setExcessFactor(p.excessFactor); + refTime = p.refTime; + excessFactor = p.excessFactor; setPenaltyGrowth(p.penaltyGrowth); setPenaltyThreshold(p.penaltyThreshold); @@ -492,22 +493,6 @@ contract StakedEXA is emit MinTimeSet(minTime_, msg.sender); } - /// @notice Sets the reference time to stake for full rewards. - /// @param refTime_ The new reference time. - function setRefTime(uint256 refTime_) public onlyRole(DEFAULT_ADMIN_ROLE) { - if (refTime_ < minTime || refTime_ == 0) revert InvalidRange(); - refTime = refTime_; - emit RefTimeSet(refTime_, msg.sender); - } - - /// @notice Sets the excess factor. - /// @param excessFactor_ The new excess factor. - function setExcessFactor(uint256 excessFactor_) public onlyRole(DEFAULT_ADMIN_ROLE) { - if (excessFactor_ > 1e18) revert InvalidRange(); - excessFactor = excessFactor_; - emit ExcessFactorSet(excessFactor_, msg.sender); - } - /// @notice Sets the penalty growth factor. /// @param penaltyGrowth_ The new penalty growth factor. function setPenaltyGrowth(uint256 penaltyGrowth_) public onlyRole(DEFAULT_ADMIN_ROLE) { @@ -557,7 +542,6 @@ contract StakedEXA is return "mode=timestamp"; } - event ExcessFactorSet(uint256 excessFactor, address indexed account); event MarketSet(Market indexed market, address indexed account); event MinTimeSet(uint256 minTime, address indexed account); event PenaltyGrowthSet(uint256 penaltyGrowth, address indexed account); diff --git a/test/StakedEXA.t.sol b/test/StakedEXA.t.sol index 2659513b..485d6cf0 100644 --- a/test/StakedEXA.t.sol +++ b/test/StakedEXA.t.sol @@ -1462,20 +1462,6 @@ contract StakedEXATest is Test { stEXA.notifyRewardAmount(exa, assets); } - function testSetExcessFactor() external { - uint256 factor = 0.7e18; - - address nonAdmin = address(0x1); - vm.prank(nonAdmin); - vm.expectRevert(abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, nonAdmin, 0)); - stEXA.setExcessFactor(factor); - - vm.expectEmit(true, true, true, true, address(stEXA)); - emit StakedEXA.ExcessFactorSet(factor, address(this)); - stEXA.setExcessFactor(factor); - assertEq(stEXA.excessFactor(), factor); - } - function testSetMinTime() external { uint256 time = 1 days; @@ -1518,20 +1504,6 @@ contract StakedEXATest is Test { assertEq(stEXA.penaltyThreshold(), threshold); } - function testSetRefTime() external { - uint256 time = 2 weeks; - - address nonAdmin = address(0x1); - vm.prank(nonAdmin); - vm.expectRevert(abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, nonAdmin, 0)); - stEXA.setRefTime(time); - - vm.expectEmit(true, true, true, true, address(stEXA)); - emit StakedEXA.RefTimeSet(time, address(this)); - stEXA.setRefTime(time); - assertEq(stEXA.refTime(), time); - } - function testResetDepositAfterRefTime(uint256 assets) external { assets = _bound(assets, 1, type(uint80).max); uint256 start = block.timestamp * 1e18; @@ -1583,16 +1555,6 @@ contract StakedEXATest is Test { assertEq(rA.balanceOf(address(this)) - balanceBefore, rClaimable, "balanceBefore != rClaimable"); } - function testRefTimeRange() external { - vm.expectRevert(InvalidRange.selector); - stEXA.setRefTime(minTime - 1); - } - - function testExcessFactorRange() external { - vm.expectRevert(InvalidRange.selector); - stEXA.setExcessFactor(1e18 + 1); - } - function testPenaltyGrowthRange() external { vm.expectRevert(InvalidRange.selector); stEXA.setPenaltyGrowth(100e18 + 1);