feat(StakeManager): allow for setting rewards when pending period

During testing, we've run into the scenario where we set some rewards
for a certain period, but realized that the amount that was set was
incorrect.

Updating the rewards is not possible when a reward period is pending.
This commit changes that, such that it adds the new rewards to the
remaining ones and extends the reward period accordingly.
This commit is contained in:
r4bbit
2025-08-25 13:26:54 +02:00
parent 1f9e9f678c
commit 70c2ade983
4 changed files with 166 additions and 73 deletions

View File

@@ -10,7 +10,7 @@
|-------------------------------------------------------------------------------------------+-----------------+-------+--------+--------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|-------------------------------------------------------------------------------------------+-----------------+-------+--------+--------+---------|
| fallback | 5145 | 65021 | 33119 | 193478 | 3520 |
| fallback | 5145 | 65188 | 33119 | 193548 | 3529 |
╰-------------------------------------------------------------------------------------------+-----------------+-------+--------+--------+---------╯
╭-----------------------------------------------------+-----------------+---------+---------+---------+---------╮
@@ -24,7 +24,7 @@
|-----------------------------------------------------+-----------------+---------+---------+---------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|-----------------------------------------------------+-----------------+---------+---------+---------+---------|
| run | 4666141 | 4666141 | 4666141 | 4666141 | 180 |
| run | 4666141 | 4666141 | 4666141 | 4666141 | 183 |
╰-----------------------------------------------------+-----------------+---------+---------+---------+---------╯
╭-----------------------------------------------------------+-----------------+---------+---------+---------+---------╮
@@ -60,13 +60,13 @@
+=============================================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|-------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| 8323525 | 39701 | | | | |
| 8331360 | 39736 | | | | |
|-------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| | | | | | |
|-------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|-------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| run | 7263905 | 7263905 | 7263905 | 7263905 | 88 |
| run | 7270921 | 7270921 | 7270921 | 7270921 | 91 |
╰-------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯
╭---------------------------------------------------------+-----------------+------+--------+------+---------╮
@@ -80,7 +80,7 @@
|---------------------------------------------------------+-----------------+------+--------+------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|---------------------------------------------------------+-----------------+------+--------+------+---------|
| activeNetworkConfig | 455 | 2043 | 455 | 4455 | 476 |
| activeNetworkConfig | 455 | 2038 | 455 | 4455 | 485 |
╰---------------------------------------------------------+-----------------+------+--------+------+---------╯
╭---------------------------------------------------------------------+-----------------+---------+---------+---------+---------╮
@@ -88,13 +88,13 @@
+===============================================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|---------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| 5895538 | 28363 | | | | |
| 5903371 | 28398 | | | | |
|---------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| | | | | | |
|---------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|---------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| runWithAdminAndProxy | 3304282 | 3304282 | 3304282 | 3304282 | 3 |
| runWithAdminAndProxy | 3311298 | 3311298 | 3311298 | 3311298 | 3 |
╰---------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯
╭------------------------------+-----------------+--------+--------+--------+---------╮
@@ -118,13 +118,13 @@
|------------------------------+-----------------+--------+--------+--------+---------|
| accountSlashAmount | 2611 | 2611 | 2611 | 2611 | 2 |
|------------------------------+-----------------+--------+--------+--------+---------|
| addRewardDistributor | 29975 | 63542 | 70903 | 70903 | 294 |
| addRewardDistributor | 29975 | 63617 | 70903 | 70903 | 297 |
|------------------------------+-----------------+--------+--------+--------+---------|
| allowance | 573 | 573 | 573 | 573 | 8 |
|------------------------------+-----------------+--------+--------+--------+---------|
| approve | 453 | 453 | 453 | 453 | 8 |
|------------------------------+-----------------+--------+--------+--------+---------|
| balanceOf | 17795 | 28159 | 28160 | 28233 | 287 |
| balanceOf | 17795 | 28157 | 28160 | 28233 | 287 |
|------------------------------+-----------------+--------+--------+--------+---------|
| calculateSlashAmount | 2763 | 2801 | 2804 | 2804 | 774 |
|------------------------------+-----------------+--------+--------+--------+---------|
@@ -134,7 +134,7 @@
|------------------------------+-----------------+--------+--------+--------+---------|
| hasRole | 2754 | 2754 | 2754 | 2754 | 4 |
|------------------------------+-----------------+--------+--------+--------+---------|
| initialize | 116796 | 116796 | 116796 | 116796 | 180 |
| initialize | 116796 | 116796 | 116796 | 116796 | 183 |
|------------------------------+-----------------+--------+--------+--------+---------|
| mint | 4869 | 50370 | 51342 | 51342 | 551 |
|------------------------------+-----------------+--------+--------+--------+---------|
@@ -142,9 +142,9 @@
|------------------------------+-----------------+--------+--------+--------+---------|
| rewardDistributorSlashAmount | 2781 | 2781 | 2781 | 2781 | 1 |
|------------------------------+-----------------+--------+--------+--------+---------|
| setReward | 4845 | 144102 | 166754 | 166754 | 319 |
| setReward | 4845 | 143549 | 166824 | 166824 | 325 |
|------------------------------+-----------------+--------+--------+--------+---------|
| slash | 4803 | 103578 | 85757 | 123125 | 520 |
| slash | 4803 | 103656 | 85757 | 123125 | 520 |
|------------------------------+-----------------+--------+--------+--------+---------|
| slashedAmountOf | 17682 | 28099 | 28120 | 28120 | 516 |
|------------------------------+-----------------+--------+--------+--------+---------|
@@ -210,7 +210,7 @@
+===================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| 3509773 | 16260 | | | | |
| 3517605 | 16295 | | | | |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| | | | | | |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
@@ -232,15 +232,15 @@
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| getAccountVaults | 5230 | 5230 | 5230 | 5230 | 4 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| getVault | 13653 | 13653 | 13653 | 13653 | 4182 |
| getVault | 13653 | 13653 | 13653 | 13653 | 4180 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| initialize | 92774 | 92774 | 92774 | 92774 | 88 |
| initialize | 92774 | 92774 | 92774 | 92774 | 91 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| lastRewardTime | 2407 | 2407 | 2407 | 2407 | 2 |
| lastRewardTime | 2407 | 2407 | 2407 | 2407 | 3 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| leave | 66358 | 66358 | 66358 | 66358 | 2 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| lock | 7096 | 40159 | 43888 | 62877 | 1034 |
| lock | 7096 | 40188 | 43888 | 62877 | 1034 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| migrateToVault | 9229 | 57567 | 16864 | 187311 | 4 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
@@ -252,47 +252,49 @@
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| proxiableUUID | 364 | 364 | 364 | 364 | 3 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| registerVault | 2605 | 74457 | 75037 | 75037 | 361 |
| registerVault | 2605 | 74476 | 75037 | 75037 | 373 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardEndTime | 2364 | 2364 | 2364 | 2364 | 2 |
| rewardAmount | 2405 | 2405 | 2405 | 2405 | 4 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardStartTime | 2386 | 2386 | 2386 | 2386 | 2 |
| rewardEndTime | 2364 | 2364 | 2364 | 2364 | 4 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardsBalanceOf | 20317 | 24410 | 25930 | 26151 | 268 |
| rewardStartTime | 2386 | 2386 | 2386 | 2386 | 4 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardsBalanceOf | 20317 | 24431 | 25930 | 26151 | 268 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardsBalanceOfAccount | 62242 | 62242 | 62242 | 62242 | 1 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| setReward | 2508 | 105565 | 107076 | 107076 | 265 |
| setReward | 2508 | 104812 | 107146 | 107146 | 271 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| setRewardsSupplier | 26809 | 26809 | 26809 | 26809 | 88 |
| setRewardsSupplier | 26809 | 26809 | 26809 | 26809 | 91 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| setTrustedCodehash | 24171 | 24171 | 24171 | 24171 | 88 |
| setTrustedCodehash | 24171 | 24171 | 24171 | 24171 | 91 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| stake | 2713 | 125321 | 57926 | 213584 | 2667 |
| stake | 2713 | 123088 | 57926 | 213584 | 2667 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMP | 6827 | 8279 | 8279 | 9732 | 6 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMPAccrued | 2407 | 2407 | 2407 | 2407 | 4162 |
| totalMPAccrued | 2407 | 2407 | 2407 | 2407 | 4160 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMPStaked | 2363 | 2363 | 2363 | 2363 | 4165 |
| totalMPStaked | 2363 | 2363 | 2363 | 2363 | 4163 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMaxMP | 2429 | 2429 | 2429 | 2429 | 4162 |
| totalMaxMP | 2429 | 2429 | 2429 | 2429 | 4160 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalRewardsAccrued | 2407 | 2407 | 2407 | 2407 | 3 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalRewardsSupply | 6759 | 11071 | 11814 | 11925 | 290 |
| totalRewardsSupply | 6759 | 11080 | 11814 | 11925 | 290 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalShares | 4619 | 4619 | 4619 | 4619 | 6 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| totalStaked | 2408 | 2408 | 2408 | 2408 | 4168 |
| totalStaked | 2408 | 2408 | 2408 | 2408 | 4166 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| unstake | 36868 | 39344 | 36894 | 76663 | 258 |
| unstake | 36868 | 39288 | 36894 | 76663 | 263 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| updateAccount | 347651 | 347651 | 347651 | 347651 | 1 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| updateGlobalState | 15809 | 25865 | 29219 | 29219 | 8 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| updateVault | 31936 | 34446 | 31936 | 110567 | 1024 |
| updateVault | 31936 | 34014 | 31936 | 110567 | 1022 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| upgradeTo | 10323 | 10939 | 10323 | 12789 | 4 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
@@ -316,27 +318,27 @@
|----------------------------------------+-----------------+--------+--------+--------+---------|
| emergencyExit | 15023 | 31463 | 31461 | 48561 | 263 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| initialize | 70212 | 70212 | 70212 | 70212 | 374 |
| initialize | 70212 | 70212 | 70212 | 70212 | 386 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| leave | 43439 | 145443 | 89216 | 359902 | 4 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| lock | 21526 | 54657 | 58318 | 80340 | 1034 |
| lock | 21526 | 54670 | 58318 | 80340 | 1034 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| lockUntil | 2363 | 2363 | 2363 | 2363 | 3819 |
| lockUntil | 2363 | 2363 | 2363 | 2363 | 3817 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| migrateFromVault | 24497 | 24497 | 24497 | 24497 | 1 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| migrateToVault | 21723 | 78456 | 29358 | 233387 | 4 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| owner | 402 | 434 | 402 | 2402 | 369 |
| owner | 402 | 433 | 402 | 2402 | 381 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| register | 3354 | 79838 | 83167 | 83167 | 374 |
| register | 3354 | 79942 | 83167 | 83167 | 386 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| stake | 2636 | 167931 | 72429 | 288304 | 2673 |
| stake | 2636 | 164779 | 72429 | 288304 | 2673 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| stakeManager | 347 | 347 | 347 | 347 | 360 |
| stakeManager | 347 | 347 | 347 | 347 | 372 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| unstake(uint256) | 4655 | 52505 | 51424 | 106772 | 272 |
| unstake(uint256) | 4655 | 53356 | 51424 | 106772 | 272 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| unstake(uint256,address) | 2630 | 2630 | 2630 | 2630 | 1 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
@@ -358,7 +360,7 @@
|----------------------------------------------------+-----------------+-------+--------+--------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|----------------------------------------------------+-----------------+-------+--------+--------+---------|
| fallback | 5230 | 12829 | 7353 | 374028 | 23163 |
| fallback | 5230 | 12811 | 7353 | 374028 | 23163 |
╰----------------------------------------------------+-----------------+-------+--------+--------+---------╯
╭--------------------------------------------+-----------------+--------+--------+--------+---------╮
@@ -372,7 +374,7 @@
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| createVault | 145330 | 221994 | 225143 | 225143 | 373 |
| createVault | 145330 | 222092 | 225143 | 225143 | 385 |
|--------------------------------------------+-----------------+--------+--------+--------+---------|
| vaultImplementation | 2345 | 2345 | 2345 | 2345 | 1 |
╰--------------------------------------------+-----------------+--------+--------+--------+---------╯
@@ -464,7 +466,7 @@
|-------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| setTotalKarmaShares | 43589 | 43589 | 43589 | 43589 | 48 |
|-------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| setUserKarmaShare | 24210 | 44032 | 44134 | 44266 | 531 |
| setUserKarmaShare | 24210 | 44107 | 44134 | 44266 | 531 |
|-------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
| totalRewardsSupply | 2324 | 2324 | 2324 | 2324 | 48 |
╰-------------------------------------------------------------------+-----------------+-------+--------+-------+---------╯
@@ -508,11 +510,11 @@
|---------------------------------------------+-----------------+-------+--------+-------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|---------------------------------------------+-----------------+-------+--------+-------+---------|
| approve | 29075 | 31546 | 29183 | 46259 | 2676 |
| approve | 29075 | 31610 | 29183 | 46259 | 2688 |
|---------------------------------------------+-----------------+-------+--------+-------+---------|
| balanceOf | 2561 | 2561 | 2561 | 2561 | 4966 |
| balanceOf | 2561 | 2561 | 2561 | 2561 | 4964 |
|---------------------------------------------+-----------------+-------+--------+-------+---------|
| mint | 33964 | 37264 | 34072 | 68248 | 2688 |
| mint | 33964 | 37343 | 34072 | 68248 | 2700 |
╰---------------------------------------------+-----------------+-------+--------+-------+---------╯
╭-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------╮

View File

@@ -16,15 +16,15 @@ EmergencyExitTest:test_EmergencyExitToAlternateAddress() (gas: 495287)
EmergencyExitTest:test_EmergencyExitWithLock() (gas: 446582)
EmergencyExitTest:test_EmergencyExitWithRewards() (gas: 500965)
EmergencyExitTest:test_OnlyOwnerCanEnableEmergencyMode() (gas: 39109)
FuzzTests:testFuzz_AccrueMP(uint128,uint64,uint64) (runs: 1024, μ: 581604, ~: 545120)
FuzzTests:testFuzz_AccrueMP_Relock(uint128,uint64,uint64,uint64) (runs: 1024, μ: 802844, ~: 769362)
FuzzTests:testFuzz_EmergencyExit(uint256,uint256) (runs: 1007, μ: 593693, ~: 593595)
FuzzTests:testFuzz_Lock(uint256,uint64) (runs: 1025, μ: 992626, ~: 993766)
FuzzTests:testFuzz_Relock(uint256,uint64,uint64) (runs: 1025, μ: 592561, ~: 566387)
FuzzTests:testFuzz_Rewards(uint256,uint256,uint256,uint16,uint16) (runs: 1001, μ: 645371, ~: 647577)
FuzzTests:testFuzz_Stake(uint256,uint64) (runs: 1025, μ: 377229, ~: 342206)
FuzzTests:testFuzz_Unstake(uint128,uint64,uint16,uint128) (runs: 1024, μ: 794426, ~: 772803)
FuzzTests:testFuzz_UpdateVault(uint128,uint64,uint64) (runs: 1024, μ: 581627, ~: 545143)
FuzzTests:testFuzz_AccrueMP(uint128,uint64,uint64) (runs: 1006, μ: 577225, ~: 545120)
FuzzTests:testFuzz_AccrueMP_Relock(uint128,uint64,uint64,uint64) (runs: 1006, μ: 799196, ~: 769362)
FuzzTests:testFuzz_EmergencyExit(uint256,uint256) (runs: 1000, μ: 593689, ~: 593595)
FuzzTests:testFuzz_Lock(uint256,uint64) (runs: 1006, μ: 992812, ~: 993766)
FuzzTests:testFuzz_Relock(uint256,uint64,uint64) (runs: 1006, μ: 589634, ~: 566387)
FuzzTests:testFuzz_Rewards(uint256,uint256,uint256,uint16,uint16) (runs: 1000, μ: 645421, ~: 647647)
FuzzTests:testFuzz_Stake(uint256,uint64) (runs: 1006, μ: 370738, ~: 342204)
FuzzTests:testFuzz_Unstake(uint128,uint64,uint16,uint128) (runs: 1006, μ: 794558, ~: 772791)
FuzzTests:testFuzz_UpdateVault(uint128,uint64,uint64) (runs: 1006, μ: 577248, ~: 545143)
IntegrationTest:testStakeFoo() (gas: 2389875)
KarmaNFTTest:testApproveNotAllowed() (gas: 10507)
KarmaNFTTest:testGetApproved() (gas: 10531)
@@ -63,9 +63,9 @@ KarmaTiersTest:test_Revert_When_TiersNotStartingAtZero() (gas: 37667)
KarmaTiersTest:test_Revert_When_UpdateTiersCalledByNonOwner() (gas: 36642)
KarmaTiersTest:test_Success_When_LastTierIsUnlimited() (gas: 242295)
KarmaTiersTest:test_Success_When_TiersAreContiguous() (gas: 336294)
LeaveTest:test_LeaveShouldKeepFundsLockedInStakeVault() (gas: 9717501)
LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 9812124)
LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1025, μ: 396949, ~: 396973)
LeaveTest:test_LeaveShouldKeepFundsLockedInStakeVault() (gas: 9732359)
LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 9826983)
LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1006, μ: 396949, ~: 396973)
LockTest:test_LockFailsWithNoStake() (gas: 85767)
LockTest:test_LockFailsWithZero() (gas: 358576)
LockTest:test_LockMultipleTimesExceedMaxLock() (gas: 736448)
@@ -129,7 +129,7 @@ SetRewardTest:test_RevertWhen_SenderIsNotOperator() (gas: 61893)
SlashAmountOfTest:testAddKarmaDistributorOnlyAdmin() (gas: 438224)
SlashAmountOfTest:testBalanceOf() (gas: 456642)
SlashAmountOfTest:testBalanceOfWithNoSystemTotalKarma() (gas: 83783)
SlashAmountOfTest:testFuzz_SlashAmountOf(uint256,uint256,uint256) (runs: 1004, μ: 408220, ~: 409081)
SlashAmountOfTest:testFuzz_SlashAmountOf(uint256,uint256,uint256) (runs: 1002, μ: 408298, ~: 409081)
SlashAmountOfTest:testMintOnlyAdmin() (gas: 429075)
SlashAmountOfTest:testRemoveKarmaDistributorOnlyOwner() (gas: 163437)
SlashAmountOfTest:testRemoveUnknownKarmaDistributor() (gas: 41654)
@@ -139,7 +139,7 @@ SlashAmountOfTest:test_SlashAmountOf() (gas: 327608)
SlashTest:testAddKarmaDistributorOnlyAdmin() (gas: 438270)
SlashTest:testBalanceOf() (gas: 456648)
SlashTest:testBalanceOfWithNoSystemTotalKarma() (gas: 83827)
SlashTest:testFuzz_Slash(uint256) (runs: 1025, μ: 280205, ~: 280146)
SlashTest:testFuzz_Slash(uint256) (runs: 1006, μ: 280204, ~: 280146)
SlashTest:testMintOnlyAdmin() (gas: 429131)
SlashTest:testRemoveKarmaDistributorOnlyOwner() (gas: 163461)
SlashTest:testRemoveRewardDistributorShouldReduceSlashAmount() (gas: 610762)
@@ -150,12 +150,15 @@ SlashTest:test_RevertWhen_KarmaBalanceIsInvalid() (gas: 71550)
SlashTest:test_RevertWhen_SenderIsNotDefaultAdminOrSlasher() (gas: 43232)
SlashTest:test_Slash() (gas: 428385)
SlashTest:test_SlashRemainingBalanceIfBalanceIsLow() (gas: 251800)
StakeManager_RewardsTest:testRewardsBalanceOf() (gas: 2745571)
StakeManager_RewardsTest:testSetRewards() (gas: 278063)
StakeManager_RewardsTest:testSetRewards_RevertsBadAmount() (gas: 63800)
StakeManager_RewardsTest:testSetRewards_RevertsBadDuration() (gas: 103558)
StakeManager_RewardsTest:testRewardsBalanceOf() (gas: 2745733)
StakeManager_RewardsTest:testSetRewards() (gas: 278133)
StakeManager_RewardsTest:testSetRewardsAccumulatesRemainingRewards() (gas: 384056)
StakeManager_RewardsTest:testSetRewardsAfterPeriodEndedNoAccumulation() (gas: 304755)
StakeManager_RewardsTest:testSetRewardsWithPartialElapsedTime() (gas: 302941)
StakeManager_RewardsTest:testSetRewards_RevertsBadAmount() (gas: 61675)
StakeManager_RewardsTest:testSetRewards_RevertsBadDuration() (gas: 101433)
StakeManager_RewardsTest:testSetRewards_RevertsNotAuthorized() (gas: 39367)
StakeManager_RewardsTest:testTotalRewardsSupply() (gas: 1297734)
StakeManager_RewardsTest:testTotalRewardsSupply() (gas: 1297874)
StakeTest:test_StakeMultipleAccounts() (gas: 699422)
StakeTest:test_StakeMultipleAccountsAndRewards() (gas: 754392)
StakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 1357071)
@@ -212,7 +215,7 @@ UnstakeTest:test_UnstakeOneAccount() (gas: 769214)
UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 731845)
UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 686049)
UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 712558)
UpdateVaultTest:test_UpdateAccount() (gas: 2583507)
UpgradeTest:test_RevertWhenNotOwner() (gas: 3586110)
UpgradeTest:test_UpgradeStakeManager() (gas: 9658332)
UpdateVaultTest:test_UpdateAccount() (gas: 2583577)
UpgradeTest:test_RevertWhenNotOwner() (gas: 3593950)
UpgradeTest:test_UpgradeStakeManager() (gas: 9673190)
VaultRegistrationTest:test_VaultRegistration() (gas: 90138)

View File

@@ -299,10 +299,6 @@ contract StakeManager is
* @param duration The duration of the reward period.
*/
function setReward(uint256 amount, uint256 duration) external onlyRewardsSupplier {
if (rewardEndTime > block.timestamp) {
revert StakeManager__RewardPeriodNotEnded();
}
if (duration == 0) {
revert StakeManager__DurationCannotBeZero();
}
@@ -314,10 +310,19 @@ contract StakeManager is
// this will call updateRewardIndex and update the totalRewardsAccrued
_updateGlobalState();
uint256 remainingRewards = 0;
if (rewardEndTime > block.timestamp) {
uint256 elapsedTime = block.timestamp - rewardStartTime;
uint256 totalDuration = rewardEndTime - rewardStartTime;
uint256 distributedRewards = Math.mulDiv(elapsedTime, rewardAmount, totalDuration);
remainingRewards = rewardAmount - distributedRewards;
}
// in case updateRewardIndex returns earlier,
// we still update the lastRewardTime
lastRewardTime = block.timestamp;
rewardAmount = amount;
rewardAmount = remainingRewards + amount;
rewardStartTime = block.timestamp;
rewardEndTime = block.timestamp + duration;
}

View File

@@ -2395,6 +2395,89 @@ contract StakeManager_RewardsTest is StakeManagerTest {
super.setUp();
}
function testSetRewardsAccumulatesRemainingRewards() public {
// Setup initial reward period
uint256 initialReward = 1000e18;
uint256 duration = 10 days;
uint256 startTime = vm.getBlockTimestamp();
_setRewards(initialReward, duration);
// Verify initial setup
assertEq(streamer.rewardAmount(), initialReward);
assertEq(streamer.rewardStartTime(), startTime);
assertEq(streamer.rewardEndTime(), startTime + duration);
// Advance time to halfway through the reward period
uint256 halfwayTime = startTime + duration / 2;
vm.warp(halfwayTime);
// Set new rewards before the current period ends
uint256 newRewardAmount = 500e18;
uint256 newDuration = 5 days;
_setRewards(newRewardAmount, newDuration);
// Calculate expected remaining rewards from first period
// At halfway point, 50% of rewards should remain
uint256 expectedRemainingRewards = initialReward / 2;
uint256 expectedTotalRewards = expectedRemainingRewards + newRewardAmount;
// Verify the reward amount is accumulated correctly
assertEq(streamer.rewardAmount(), expectedTotalRewards, "Total reward amount should be remaining + new");
assertEq(streamer.rewardStartTime(), halfwayTime, "Start time should be updated");
assertEq(streamer.rewardEndTime(), halfwayTime + newDuration, "End time should be updated");
assertEq(streamer.lastRewardTime(), halfwayTime, "Last reward time should be updated");
}
function testSetRewardsWithPartialElapsedTime() public {
// Setup initial reward period
uint256 initialReward = 1200e18;
uint256 duration = 12 days;
uint256 startTime = vm.getBlockTimestamp();
_setRewards(initialReward, duration);
// Advance time to 1/3 through the reward period (4 days out of 12)
uint256 oneThirdTime = startTime + duration / 3;
vm.warp(oneThirdTime);
// Set new rewards
uint256 newRewardAmount = 800e18;
uint256 newDuration = 8 days;
_setRewards(newRewardAmount, newDuration);
// Calculate expected remaining rewards
// After 1/3 of time, 2/3 of rewards should remain
uint256 expectedRemainingRewards = (initialReward * 2) / 3; // 800e18
uint256 expectedTotalRewards = expectedRemainingRewards + newRewardAmount; // 1600e18
assertEq(streamer.rewardAmount(), expectedTotalRewards, "Should accumulate remaining rewards correctly");
}
function testSetRewardsAfterPeriodEndedNoAccumulation() public {
// Setup initial reward period
uint256 initialReward = 1000e18;
uint256 duration = 10 days;
uint256 startTime = vm.getBlockTimestamp();
_setRewards(initialReward, duration);
// Advance time past the end of the reward period
uint256 afterEndTime = startTime + duration + 1 days;
vm.warp(afterEndTime);
// Set new rewards after the period has ended
uint256 newRewardAmount = 500e18;
uint256 newDuration = 5 days;
_setRewards(newRewardAmount, newDuration);
// Should not accumulate any remaining rewards since period ended
assertEq(streamer.rewardAmount(), newRewardAmount, "Should only use new reward amount when period has ended");
}
function testSetRewards() public {
assertEq(streamer.rewardStartTime(), 0);
assertEq(streamer.rewardEndTime(), 0);