diff --git a/.gas-report b/.gas-report index 378f2a8..cb015d5 100644 --- a/.gas-report +++ b/.gas-report @@ -46,13 +46,13 @@ +=======================================================================================================================================+ | Deployment Cost | Deployment Size | | | | | |-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| -| 8426081 | 40179 | | | | | +| 8381426 | 39972 | | | | | |-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| | | | | | | | |-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| | Function Name | Min | Avg | Median | Max | # Calls | |-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| -| run | 7344553 | 7344553 | 7344553 | 7344553 | 92 | +| run | 7303079 | 7303079 | 7303079 | 7303079 | 92 | ╰-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯ ╭---------------------------------------------------------+-----------------+-----+--------+-----+---------╮ @@ -74,13 +74,13 @@ +=========================================================================================================================================+ | Deployment Cost | Deployment Size | | | | | |-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| -| 5876550 | 28270 | | | | | +| 5831915 | 28063 | | | | | |-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| | | | | | | | |-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| | Function Name | Min | Avg | Median | Max | # Calls | |-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------| -| runWithAdminAndProxy | 3307416 | 3307416 | 3307416 | 3307416 | 3 | +| runWithAdminAndProxy | 3265942 | 3265942 | 3265942 | 3265942 | 3 | ╰-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯ ╭------------------------------+-----------------+--------+--------+--------+---------╮ @@ -162,7 +162,7 @@ +=============================================================================================================+ | Deployment Cost | Deployment Size | | | | | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| 3513565 | 16276 | | | | | +| 3468937 | 16069 | | | | | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | | | | | | | |------------------------------------------------------+-----------------+--------+--------+--------+---------| @@ -172,7 +172,7 @@ |------------------------------------------------------+-----------------+--------+--------+--------+---------| | MAX_MULTIPLIER | 263 | 263 | 263 | 263 | 20 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| MIN_LOCKUP_PERIOD | 309 | 309 | 309 | 309 | 15 | +| MIN_LOCKUP_PERIOD | 331 | 331 | 331 | 331 | 15 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | emergencyModeEnabled | 2421 | 2421 | 2421 | 2421 | 263 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| @@ -184,71 +184,71 @@ |------------------------------------------------------+-----------------+--------+--------+--------+---------| | getAccountVaults | 5230 | 5230 | 5230 | 5230 | 4 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| getVault | 1970 | 7418 | 1970 | 17970 | 4182 | +| getVault | 1823 | 6577 | 1823 | 15823 | 4181 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | initialize | 92752 | 92752 | 92752 | 92752 | 92 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | lastRewardTime | 407 | 1407 | 1407 | 2407 | 2 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| leave | 94998 | 94998 | 94998 | 94998 | 1 | +| leave | 88837 | 88837 | 88837 | 88837 | 1 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| lock | 7040 | 45107 | 48575 | 90631 | 1034 | +| lock | 7040 | 42377 | 45950 | 84893 | 1034 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| migrateToVault | 13570 | 72911 | 15777 | 189386 | 3 | +| migrateToVault | 13570 | 63656 | 15777 | 161622 | 3 | +|------------------------------------------------------+-----------------+--------+--------+--------+---------| +| mpAccruedOf | 629 | 629 | 629 | 629 | 20 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | mpBalanceOf | 917 | 2361 | 2316 | 7063 | 12 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | mpBalanceOfAccount | 6210 | 8283 | 8283 | 10356 | 2 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| mpStakedOf | 606 | 701 | 606 | 2606 | 21 | -|------------------------------------------------------+-----------------+--------+--------+--------+---------| | proxiableUUID | 342 | 342 | 342 | 342 | 3 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| registerVault | 2561 | 74414 | 74992 | 74992 | 362 | +| registerVault | 2583 | 74436 | 75014 | 75014 | 362 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| rewardEndTime | 407 | 1407 | 1407 | 2407 | 2 | +| rewardEndTime | 429 | 1429 | 1429 | 2429 | 2 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| rewardStartTime | 430 | 1430 | 1430 | 2430 | 2 | +| rewardStartTime | 364 | 1364 | 1364 | 2364 | 2 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| rewardsBalanceOf | 2273 | 3477 | 3886 | 6273 | 268 | +| rewardsBalanceOf | 2295 | 3505 | 3908 | 6295 | 268 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | rewardsBalanceOfAccount | 10220 | 10220 | 10220 | 10220 | 1 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | setReward | 2508 | 105565 | 107076 | 107076 | 265 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| setRewardsSupplier | 26853 | 26853 | 26853 | 26853 | 87 | +| setRewardsSupplier | 26875 | 26875 | 26875 | 26875 | 87 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| setTrustedCodehash | 24216 | 24216 | 24216 | 24216 | 92 | +| setTrustedCodehash | 24238 | 24238 | 24238 | 24238 | 92 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| stake | 2639 | 140781 | 62283 | 248368 | 2668 | +| stake | 2639 | 129409 | 59967 | 225838 | 2668 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| stakedBalanceOf | 2600 | 2600 | 2600 | 2600 | 1 | +| stakedBalanceOf | 2622 | 2622 | 2622 | 2622 | 1 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | totalMP | 805 | 1257 | 1257 | 1710 | 6 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| totalMPAccrued | 385 | 1069 | 385 | 2385 | 4162 | +| totalMPAccrued | 385 | 1067 | 385 | 2385 | 4161 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| totalMPStaked | 429 | 1112 | 429 | 2429 | 4165 | +| totalMPStaked | 429 | 1111 | 429 | 2429 | 4164 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| totalMaxMP | 407 | 1091 | 407 | 2407 | 4162 | +| totalMaxMP | 407 | 1089 | 407 | 2407 | 4161 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | totalRewardsAccrued | 407 | 407 | 407 | 407 | 3 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| totalRewardsSupply | 998 | 1624 | 1792 | 6737 | 290 | +| totalRewardsSupply | 998 | 1627 | 1792 | 6737 | 290 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| totalShares | 662 | 662 | 662 | 662 | 6 | +| totalShares | 597 | 597 | 597 | 597 | 6 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| totalStaked | 408 | 1091 | 408 | 2408 | 4169 | +| totalStaked | 408 | 1089 | 408 | 2408 | 4168 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| unstake | 41572 | 44532 | 41598 | 80836 | 269 | +| unstake | 38969 | 41819 | 38995 | 75006 | 269 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| updateAccount | 368128 | 368128 | 368128 | 368128 | 1 | +| updateAccount | 347677 | 347677 | 347677 | 347677 | 1 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | updateGlobalState | 15820 | 25876 | 29230 | 29230 | 8 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| updateVault | 34573 | 37053 | 34573 | 115695 | 1024 | +| updateVault | 31948 | 34247 | 31948 | 110579 | 1023 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| -| upgradeTo | 10257 | 10873 | 10257 | 12723 | 4 | +| upgradeTo | 10279 | 10895 | 10279 | 12745 | 4 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| | upgradeToAndCall | 3228 | 3228 | 3228 | 3228 | 1 | |------------------------------------------------------+-----------------+--------+--------+--------+---------| @@ -272,25 +272,25 @@ |----------------------------------------+-----------------+--------+--------+--------+---------| | initialize | 97660 | 97660 | 97660 | 97660 | 362 | |----------------------------------------+-----------------+--------+--------+--------+---------| -| leave | 12161 | 126408 | 69597 | 354278 | 4 | +| leave | 12161 | 124868 | 66517 | 354279 | 4 | |----------------------------------------+-----------------+--------+--------+--------+---------| -| lock | 12091 | 60526 | 64041 | 106094 | 1035 | +| lock | 12091 | 57799 | 61416 | 100356 | 1035 | |----------------------------------------+-----------------+--------+--------+--------+---------| -| migrateToVault | 29058 | 99593 | 31265 | 238456 | 3 | +| migrateToVault | 29058 | 90338 | 31265 | 210692 | 3 | |----------------------------------------+-----------------+--------+--------+--------+---------| | owner | 379 | 411 | 379 | 2379 | 370 | |----------------------------------------+-----------------+--------+--------+--------+---------| -| register | 12696 | 78061 | 78622 | 78622 | 362 | +| register | 12718 | 78083 | 78644 | 78644 | 362 | |----------------------------------------+-----------------+--------+--------+--------+---------| -| stake | 12071 | 174725 | 77776 | 303936 | 2669 | +| stake | 12071 | 163418 | 75460 | 281406 | 2669 | |----------------------------------------+-----------------+--------+--------+--------+---------| | stakeManager | 369 | 369 | 369 | 369 | 361 | |----------------------------------------+-----------------+--------+--------+--------+---------| | trustStakeManager | 7580 | 7580 | 7580 | 7580 | 1 | |----------------------------------------+-----------------+--------+--------+--------+---------| -| unstake | 12048 | 60951 | 57041 | 111858 | 270 | +| unstake | 12048 | 58306 | 54438 | 106028 | 270 | |----------------------------------------+-----------------+--------+--------+--------+---------| -| withdraw | 20711 | 20711 | 20711 | 20711 | 1 | +| withdraw | 20733 | 20733 | 20733 | 20733 | 1 | ╰----------------------------------------+-----------------+--------+--------+--------+---------╯ ╭----------------------------------------------------+-----------------+------+--------+--------+---------╮ @@ -304,7 +304,7 @@ |----------------------------------------------------+-----------------+------+--------+--------+---------| | Function Name | Min | Avg | Median | Max | # Calls | |----------------------------------------------------+-----------------+------+--------+--------+---------| -| fallback | 708 | 6605 | 2454 | 394505 | 23163 | +| fallback | 708 | 6324 | 2301 | 374054 | 23156 | |----------------------------------------------------+-----------------+------+--------+--------+---------| | implementation | 346 | 2345 | 2346 | 2346 | 4344 | ╰----------------------------------------------------+-----------------+------+--------+--------+---------╯ @@ -320,7 +320,7 @@ |--------------------------------------------+-----------------+--------+--------+--------+---------| | Function Name | Min | Avg | Median | Max | # Calls | |--------------------------------------------+-----------------+--------+--------+--------+---------| -| createVault | 230946 | 247667 | 248046 | 248046 | 361 | +| createVault | 230968 | 247689 | 248068 | 248068 | 361 | ╰--------------------------------------------+-----------------+--------+--------+--------+---------╯ ╭------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------╮ @@ -402,7 +402,7 @@ +==================================================================================================+ | Deployment Cost | Deployment Size | | | | | |---------------------------------------------+-----------------+-------+--------+-------+---------| -| 770657 | 3987 | | | | | +| 770741 | 3987 | | | | | |---------------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |---------------------------------------------+-----------------+-------+--------+-------+---------| @@ -410,7 +410,7 @@ |---------------------------------------------+-----------------+-------+--------+-------+---------| | approve | 29075 | 31479 | 29183 | 46259 | 2664 | |---------------------------------------------+-----------------+-------+--------+-------+---------| -| balanceOf | 561 | 1350 | 561 | 2561 | 4956 | +| balanceOf | 561 | 1348 | 561 | 2561 | 4955 | |---------------------------------------------+-----------------+-------+--------+-------+---------| | mint | 33964 | 37108 | 34072 | 68248 | 2673 | ╰---------------------------------------------+-----------------+-------+--------+-------+---------╯ @@ -426,7 +426,7 @@ |-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------| | Function Name | Min | Avg | Median | Max | # Calls | |-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------| -| leave | 26 | 161075 | 161075 | 322247 | 334 | +| leave | 29 | 161076 | 161076 | 322248 | 334 | |-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------| | proxiableUUID | 308 | 308 | 308 | 308 | 1 | ╰-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------╯ diff --git a/.gas-snapshot b/.gas-snapshot index a4d2ed8..05b90f2 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,21 +1,21 @@ EmergencyExitTest:test_CannotEnableEmergencyModeTwice() (gas: 93554) -EmergencyExitTest:test_CannotLeaveBeforeEmergencyMode() (gas: 357702) -EmergencyExitTest:test_EmergencyExitBasic() (gas: 450413) -EmergencyExitTest:test_EmergencyExitMultipleUsers() (gas: 776284) -EmergencyExitTest:test_EmergencyExitToAlternateAddress() (gas: 455942) -EmergencyExitTest:test_EmergencyExitWithLock() (gas: 453031) -EmergencyExitTest:test_EmergencyExitWithRewards() (gas: 440921) +EmergencyExitTest:test_CannotLeaveBeforeEmergencyMode() (gas: 335172) +EmergencyExitTest:test_EmergencyExitBasic() (gas: 426892) +EmergencyExitTest:test_EmergencyExitMultipleUsers() (gas: 729239) +EmergencyExitTest:test_EmergencyExitToAlternateAddress() (gas: 432421) +EmergencyExitTest:test_EmergencyExitWithLock() (gas: 430501) +EmergencyExitTest:test_EmergencyExitWithRewards() (gas: 418391) EmergencyExitTest:test_OnlyOwnerCanEnableEmergencyMode() (gas: 39176) -FuzzTests:testFuzz_AccrueMP(uint128,uint64,uint64) (runs: 1003, μ: 391761, ~: 358391) -FuzzTests:testFuzz_AccrueMP_Relock(uint128,uint64,uint64,uint64) (runs: 1003, μ: 493828, ~: 461619) -FuzzTests:testFuzz_EmergencyExit(uint256,uint256) (runs: 1002, μ: 519049, ~: 510169) -FuzzTests:testFuzz_Lock(uint256,uint64) (runs: 1004, μ: 776285, ~: 775635) -FuzzTests:testFuzz_Relock(uint256,uint64,uint64) (runs: 1004, μ: 395664, ~: 374421) -FuzzTests:testFuzz_Rewards(uint256,uint256,uint256,uint16,uint16) (runs: 1000, μ: 617159, ~: 618464) -FuzzTests:testFuzz_Stake(uint256,uint64) (runs: 1004, μ: 297458, ~: 268424) -FuzzTests:testFuzz_Unstake(uint128,uint64,uint16,uint128) (runs: 1003, μ: 497858, ~: 466515) -FuzzTests:testFuzz_UpdateVault(uint128,uint64,uint64) (runs: 1003, μ: 391784, ~: 358414) -IntegrationTest:testStakeFoo() (gas: 1438852) +FuzzTests:testFuzz_AccrueMP(uint128,uint64,uint64) (runs: 1003, μ: 373311, ~: 342639) +FuzzTests:testFuzz_AccrueMP_Relock(uint128,uint64,uint64,uint64) (runs: 1003, μ: 473961, ~: 444755) +FuzzTests:testFuzz_EmergencyExit(uint256,uint256) (runs: 1002, μ: 495554, ~: 486579) +FuzzTests:testFuzz_Lock(uint256,uint64) (runs: 1004, μ: 726451, ~: 725709) +FuzzTests:testFuzz_Relock(uint256,uint64,uint64) (runs: 1004, μ: 385583, ~: 362897) +FuzzTests:testFuzz_Rewards(uint256,uint256,uint256,uint16,uint16) (runs: 1000, μ: 594627, ~: 595934) +FuzzTests:testFuzz_Stake(uint256,uint64) (runs: 1004, μ: 287630, ~: 260823) +FuzzTests:testFuzz_Unstake(uint128,uint64,uint16,uint128) (runs: 1003, μ: 479272, ~: 448228) +FuzzTests:testFuzz_UpdateVault(uint128,uint64,uint64) (runs: 1003, μ: 373334, ~: 342662) +IntegrationTest:testStakeFoo() (gas: 1362727) KarmaNFTTest:testApproveNotAllowed() (gas: 10507) KarmaNFTTest:testGetApproved() (gas: 10531) KarmaNFTTest:testIsApprovedForAll() (gas: 10705) @@ -44,83 +44,83 @@ KarmaTest:testRemoveKarmaDistributorOnlyOwner() (gas: 88798) KarmaTest:testRemoveUnknownKarmaDistributor() (gas: 41398) KarmaTest:testTotalSupply() (gas: 331725) KarmaTest:testTransfersNotAllowed() (gas: 40241) -LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 9674621) -LeaveTest:test_RevertWhenStakeManagerIsTrusted() (gas: 354861) -LeaveTest:test_TrustNewStakeManager() (gas: 9725694) -LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1004, μ: 408039, ~: 408063) -LockTest:test_LockFailsWithNoStake() (gas: 91490) -LockTest:test_LockFailsWithZero() (gas: 364923) -LockTest:test_LockMultipleTimesExceedMaxLock() (gas: 663872) -LockTest:test_LockWithPriorLock() (gas: 597786) -LockTest:test_LockWithoutPriorLock() (gas: 473473) -LockTest:test_RevertWhenVaultToLockIsEmpty() (gas: 91490) -MaliciousUpgradeTest:test_UpgradeStackOverflowStakeManager() (gas: 2014624) +LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 9561246) +LeaveTest:test_RevertWhenStakeManagerIsTrusted() (gas: 332331) +LeaveTest:test_TrustNewStakeManager() (gas: 9616988) +LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1004, μ: 382885, ~: 382908) +LockTest:test_LockFailsWithNoStake() (gas: 88865) +LockTest:test_LockFailsWithZero() (gas: 342393) +LockTest:test_LockMultipleTimesExceedMaxLock() (gas: 624582) +LockTest:test_LockWithPriorLock() (gas: 560665) +LockTest:test_LockWithoutPriorLock() (gas: 443152) +LockTest:test_RevertWhenVaultToLockIsEmpty() (gas: 88865) +MaliciousUpgradeTest:test_UpgradeStackOverflowStakeManager() (gas: 1992117) MathTest:test_CalcAbsoluteMaxTotalMP() (gas: 5240) MathTest:test_CalcAccrueMP() (gas: 8599) -MathTest:test_CalcBonusMP() (gas: 19200) +MathTest:test_CalcBonusMP() (gas: 19244) MathTest:test_CalcInitialMP() (gas: 5836) MathTest:test_CalcMaxAccruedMP() (gas: 4886) -MathTest:test_CalcMaxTotalMP() (gas: 19984) -MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 867034) +MathTest:test_CalcMaxTotalMP() (gas: 20006) +MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 799444) NFTMetadataGeneratorSVGTest:testGenerateMetadata() (gas: 92580) NFTMetadataGeneratorSVGTest:testSetImageStrings() (gas: 60081) NFTMetadataGeneratorSVGTest:testSetImageStringsRevert() (gas: 35891) NFTMetadataGeneratorURLTest:testGenerateMetadata() (gas: 108341) NFTMetadataGeneratorURLTest:testSetBaseURL() (gas: 50631) NFTMetadataGeneratorURLTest:testSetBaseURLRevert() (gas: 36066) -RewardsStreamerMP_RewardsTest:testRewardsBalanceOf() (gas: 1329190) -RewardsStreamerMP_RewardsTest:testSetRewards() (gas: 224702) +RewardsStreamerMP_RewardsTest:testRewardsBalanceOf() (gas: 1274873) +RewardsStreamerMP_RewardsTest:testSetRewards() (gas: 224614) RewardsStreamerMP_RewardsTest:testSetRewards_RevertsBadAmount() (gas: 61280) RewardsStreamerMP_RewardsTest:testSetRewards_RevertsBadDuration() (gas: 101038) -RewardsStreamerMP_RewardsTest:testSetRewards_RevertsNotAuthorized() (gas: 39322) -RewardsStreamerMP_RewardsTest:testTotalRewardsSupply() (gas: 762937) -StakeTest:test_StakeMultipleAccounts() (gas: 602123) -StakeTest:test_StakeMultipleAccountsAndRewards() (gas: 610639) -StakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 1013731) -StakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 612398) -StakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 634532) -StakeTest:test_StakeMultipleTimesDoesNotExceedsMaxMP() (gas: 1587229) -StakeTest:test_StakeMultipleTimesWithLockIncreaseAtSameBlock() (gas: 605167) -StakeTest:test_StakeMultipleTimesWithLockZeroAfterMaxLock() (gas: 1181314) -StakeTest:test_StakeOneAccount() (gas: 339269) -StakeTest:test_StakeOneAccountAndRewards() (gas: 347824) -StakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 651167) -StakeTest:test_StakeOneAccountReachingMPLimit() (gas: 535665) -StakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 357244) -StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 357862) -StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 357907) -StakeVaultMigrationTest:testMigrateToVault() (gas: 925756) -StakeVaultMigrationTest:test_RevertWhenMigrationVaultNotEmpty() (gas: 650952) +RewardsStreamerMP_RewardsTest:testSetRewards_RevertsNotAuthorized() (gas: 39367) +RewardsStreamerMP_RewardsTest:testTotalRewardsSupply() (gas: 740407) +StakeTest:test_StakeMultipleAccounts() (gas: 555080) +StakeTest:test_StakeMultipleAccountsAndRewards() (gas: 563572) +StakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 942163) +StakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 567360) +StakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 589494) +StakeTest:test_StakeMultipleTimesDoesNotExceedsMaxMP() (gas: 1507716) +StakeTest:test_StakeMultipleTimesWithLockIncreaseAtSameBlock() (gas: 574936) +StakeTest:test_StakeMultipleTimesWithLockZeroAfterMaxLock() (gas: 1113666) +StakeTest:test_StakeOneAccount() (gas: 315747) +StakeTest:test_StakeOneAccountAndRewards() (gas: 324302) +StakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 616419) +StakeTest:test_StakeOneAccountReachingMPLimit() (gas: 503409) +StakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 334714) +StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 335354) +StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 335399) +StakeVaultMigrationTest:testMigrateToVault() (gas: 875821) +StakeVaultMigrationTest:test_RevertWhenMigrationVaultNotEmpty() (gas: 628444) StakeVaultMigrationTest:test_RevertWhenNotOwnerOfMigrationVault() (gas: 68087) StakeVaultTest:testOwner() (gas: 15262) StakingTokenTest:testOwner() (gas: 15262) StakingTokenTest:testStakeToken() (gas: 13144) -TrustedCodehashAccessTest:test_RevertWhenProxyCloneCodehashNotTrusted() (gas: 2023446) -UnstakeTest:test_StakeMultipleAccounts() (gas: 602102) -UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 610594) -UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 1013775) -UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 612464) -UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 634531) -UnstakeTest:test_StakeMultipleTimesDoesNotExceedsMaxMP() (gas: 1587285) -UnstakeTest:test_StakeMultipleTimesWithLockIncreaseAtSameBlock() (gas: 605189) -UnstakeTest:test_StakeMultipleTimesWithLockZeroAfterMaxLock() (gas: 1181325) -UnstakeTest:test_StakeOneAccount() (gas: 339269) -UnstakeTest:test_StakeOneAccountAndRewards() (gas: 347823) -UnstakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 651166) -UnstakeTest:test_StakeOneAccountReachingMPLimit() (gas: 535645) -UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 357266) -UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 357862) -UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 357907) -UnstakeTest:test_UnstakeBonusMPAndAccuredMP() (gas: 606469) -UnstakeTest:test_UnstakeMultipleAccounts() (gas: 846340) -UnstakeTest:test_UnstakeMultipleAccountsAndRewards() (gas: 961440) -UnstakeTest:test_UnstakeOneAccount() (gas: 577982) -UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 577933) -UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 498234) -UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 594073) -UpdateVaultTest:test_UpdateAccount() (gas: 2501398) -UpgradeTest:test_RevertWhenNotOwner() (gas: 3589969) -UpgradeTest:test_UpgradeStakeManager() (gas: 9561860) +TrustedCodehashAccessTest:test_RevertWhenProxyCloneCodehashNotTrusted() (gas: 2023468) +UnstakeTest:test_StakeMultipleAccounts() (gas: 555059) +UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 563616) +UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 942207) +UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 567426) +UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 589493) +UnstakeTest:test_StakeMultipleTimesDoesNotExceedsMaxMP() (gas: 1507772) +UnstakeTest:test_StakeMultipleTimesWithLockIncreaseAtSameBlock() (gas: 574891) +UnstakeTest:test_StakeMultipleTimesWithLockZeroAfterMaxLock() (gas: 1113677) +UnstakeTest:test_StakeOneAccount() (gas: 315747) +UnstakeTest:test_StakeOneAccountAndRewards() (gas: 324301) +UnstakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 616418) +UnstakeTest:test_StakeOneAccountReachingMPLimit() (gas: 503389) +UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 334736) +UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 335354) +UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 335399) +UnstakeTest:test_UnstakeBonusMPAndAccuredMP() (gas: 572145) +UnstakeTest:test_UnstakeMultipleAccounts() (gas: 794627) +UnstakeTest:test_UnstakeMultipleAccountsAndRewards() (gas: 905041) +UnstakeTest:test_UnstakeOneAccount() (gas: 543645) +UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 543156) +UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 467580) +UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 560332) +UpdateVaultTest:test_UpdateAccount() (gas: 2391077) +UpgradeTest:test_RevertWhenNotOwner() (gas: 3545293) +UpgradeTest:test_UpgradeStakeManager() (gas: 9453155) VaultRegistrationTest:test_VaultRegistration() (gas: 63138) WithdrawTest:testOwner() (gas: 15296) -WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 370487) \ No newline at end of file +WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 347979) \ No newline at end of file diff --git a/certora/specs/RewardsStreamerMP.spec b/certora/specs/RewardsStreamerMP.spec index a35e2cd..9dc5453 100644 --- a/certora/specs/RewardsStreamerMP.spec +++ b/certora/specs/RewardsStreamerMP.spec @@ -7,7 +7,7 @@ methods { function ERC20A.allowance(address, address) external returns(uint256) envfree; function ERC20A.totalSupply() external returns(uint256) envfree; function totalStaked() external returns (uint256) envfree; - function vaultData(address) external returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256) envfree; + function vaultData(address) external returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) envfree; function lastMPUpdatedTime() external returns (uint256) envfree; function updateGlobalState() external; function updateVault(address vaultAddress) external; @@ -31,19 +31,19 @@ hook Sstore vaultData[KEY address vault].stakedBalance uint256 newValue (uint256 function getVaultMaxMP(address vault) returns uint256 { uint256 maxMP; - _, _, _, maxMP, _, _, _, _ = streamer.vaultData(vault); + _, _, _, maxMP, _, _, _ = streamer.vaultData(vault); return maxMP; } function getVaultMPAccrued(address vault) returns uint256 { uint256 vaultMPAccrued; - _, _, vaultMPAccrued, _, _, _, _, _ = streamer.vaultData(vault); + _, _, vaultMPAccrued, _, _, _, _ = streamer.vaultData(vault); return vaultMPAccrued; } function getVaultLockUntil(address vault) returns uint256 { uint256 lockUntil; - _, _, _, _, _, lockUntil, _, _ = streamer.vaultData(vault); + _, _, _, _, _, lockUntil, _ = streamer.vaultData(vault); return lockUntil; } diff --git a/certora/specs/shared.spec b/certora/specs/shared.spec index a5d2bd8..504952b 100644 --- a/certora/specs/shared.spec +++ b/certora/specs/shared.spec @@ -2,7 +2,7 @@ using RewardsStreamerMP as streamer; function getVaultStakedBalance(address vault) returns uint256 { uint256 stakedBalance; - stakedBalance, _, _, _, _, _, _, _ = streamer.vaultData(vault); + stakedBalance, _, _, _, _, _, _ = streamer.vaultData(vault); return stakedBalance; } diff --git a/src/RewardsStreamerMP.sol b/src/RewardsStreamerMP.sol index 9720d01..d2c4228 100644 --- a/src/RewardsStreamerMP.sol +++ b/src/RewardsStreamerMP.sol @@ -33,7 +33,6 @@ contract RewardsStreamerMP is uint256 maxMP; uint256 lastMPUpdateTime; uint256 lockUntil; - uint256 mpStaked; uint256 rewardsAccrued; } @@ -199,7 +198,6 @@ contract RewardsStreamerMP is } vault.mpAccrued += _deltaMpTotal; - vault.mpStaked += _deltaMpTotal; totalMPAccrued += _deltaMpTotal; vault.maxMP += _deltaMPMax; @@ -232,7 +230,6 @@ contract RewardsStreamerMP is // Update account state vault.lockUntil = newLockEnd; vault.mpAccrued += deltaMp; - vault.mpStaked += deltaMp; vault.maxMP += deltaMp; // Update global state @@ -279,7 +276,7 @@ contract RewardsStreamerMP is vault.lastMPUpdateTime = 0; } - emit AccountLeft(msg.sender); + emit VaultLeft(msg.sender); } /** @@ -380,7 +377,6 @@ contract RewardsStreamerMP is // migrate vault data to new vault newVault.stakedBalance = oldVault.stakedBalance; newVault.rewardIndex = oldVault.rewardIndex; - newVault.mpStaked = oldVault.mpStaked; newVault.mpAccrued = oldVault.mpAccrued; newVault.maxMP = oldVault.maxMP; newVault.lastMPUpdateTime = oldVault.lastMPUpdateTime; @@ -411,20 +407,21 @@ contract RewardsStreamerMP is function _updateVault(address vaultAddress, bool forceMPUpdate) internal { VaultData storage vault = vaultData[vaultAddress]; - uint256 accruedMP = _vaultPendingMP(vault); - if (accruedMP > 0 || forceMPUpdate) { - vault.mpAccrued += accruedMP; - vault.lastMPUpdateTime = block.timestamp; - } + // first accrue pending rewards for the work done so far uint256 rewardsAccrued = _vaultPendingRewards(vault); vault.rewardsAccrued += rewardsAccrued; vault.rewardIndex = lastRewardIndex; - uint256 mpToStake = vault.mpAccrued - vault.mpStaked; - vault.mpStaked += mpToStake; - totalMPStaked += mpToStake; - emit Compound(vaultAddress, mpToStake); + // then accrue pending MPs + uint256 accruedMP = _vaultPendingMP(vault); + if (accruedMP > 0 || forceMPUpdate) { + vault.mpAccrued += accruedMP; + vault.lastMPUpdateTime = block.timestamp; + totalMPStaked += accruedMP; + } + + emit VaultUpdated(vaultAddress, rewardsAccrued, accruedMP); } function _updateRewardIndex() internal { @@ -452,13 +449,7 @@ contract RewardsStreamerMP is vault.rewardIndex = lastRewardIndex; vault.mpAccrued -= _deltaMpTotal; - // A vault's "staked" MP will be reduced if the accrued MP is less than the staked MP. - // This is because the accrued MP represents the vault's total MP - if (vault.mpAccrued < vault.mpStaked) { - totalMPStaked -= vault.mpStaked - vault.mpAccrued; - vault.mpStaked = vault.mpAccrued; - } - + totalMPStaked -= _deltaMpTotal; totalMPAccrued -= _deltaMpTotal; totalMaxMP -= _deltaMpMax; totalStaked -= amount; @@ -474,7 +465,7 @@ contract RewardsStreamerMP is function _vaultShares(address vaultAddress) internal view returns (uint256) { VaultData storage vault = vaultData[vaultAddress]; - return vault.stakedBalance + vault.mpStaked; + return vault.stakedBalance + vault.mpAccrued; } function _totalMP() internal view returns (uint256) { @@ -572,7 +563,7 @@ contract RewardsStreamerMP is uint256 newRewardIndex; (, newRewardIndex) = _rewardIndex(); - uint256 accountShares = vault.stakedBalance + vault.mpStaked; + uint256 accountShares = vault.stakedBalance + vault.mpAccrued; uint256 deltaRewardIndex = newRewardIndex - vault.rewardIndex; return (accountShares * deltaRewardIndex) / SCALE_FACTOR; @@ -666,12 +657,11 @@ contract RewardsStreamerMP is } /** - * @notice Returns staked multiplier points of a vault. - * @return Staked multiplier points of the vault. + * @notice Returns the accrued multiplier points of a vault. + * @return Accrued multiplier points of the vault. */ - function mpStakedOf(address vaultAddress) external view returns (uint256) { - VaultData storage vault = vaultData[vaultAddress]; - return vault.mpStaked; + function mpAccruedOf(address vaultAddress) external view returns (uint256) { + return vaultData[vaultAddress].mpAccrued; } /** diff --git a/src/interfaces/IStakeManager.sol b/src/interfaces/IStakeManager.sol index 0ad5f14..2153f28 100644 --- a/src/interfaces/IStakeManager.sol +++ b/src/interfaces/IStakeManager.sol @@ -47,9 +47,9 @@ interface IStakeManager is ITrustedCodehashAccess, IStakeConstants { /// @notice Emitted when emergency mode is enabled. event EmergencyModeEnabled(); /// @notice Emitted when an account leaves the system - event AccountLeft(address indexed vault); - /// @notice Emited when accounts compound their MP - event Compound(address indexed vault, uint256 amount); + event VaultLeft(address indexed vault); + /// @notice Emited when accounts update their vaults + event VaultUpdated(address indexed vault, uint256 rewardsAccrued, uint256 mpAccrued); function registerVault() external; function stake(uint256 _amount, uint256 _seconds) external; diff --git a/test/RewardsStreamerMP.t.sol b/test/RewardsStreamerMP.t.sol index a658f6e..418be21 100644 --- a/test/RewardsStreamerMP.t.sol +++ b/test/RewardsStreamerMP.t.sol @@ -102,7 +102,6 @@ contract RewardsStreamerMPTest is StakeMath, Test { uint256 stakedBalance; uint256 vaultBalance; uint256 rewardIndex; - uint256 mpStaked; uint256 mpAccrued; uint256 maxMP; uint256 rewardsAccrued; @@ -113,7 +112,6 @@ contract RewardsStreamerMPTest is StakeMath, Test { assertEq(vaultData.stakedBalance, p.stakedBalance, "wrong account staked balance"); assertEq(stakingToken.balanceOf(p.account), p.vaultBalance, "wrong vault balance"); - assertEq(vaultData.mpStaked, p.mpStaked, "wrong account MP staked"); assertEq(vaultData.mpAccrued, p.mpAccrued, "wrong account MP accrued"); assertEq(vaultData.maxMP, p.maxMP, "wrong account max MP"); assertEq(vaultData.rewardsAccrued, p.rewardsAccrued, "wrong account rewards accrued"); @@ -131,7 +129,6 @@ contract RewardsStreamerMPTest is StakeMath, Test { stakingToken.balanceOf(p.account), p.vaultBalance, string(abi.encodePacked(text, "wrong vault balance")) ); // assertEq(vaultData.accountRewardIndex, p.rewardIndex, "wrong account reward index"); - assertEq(vaultData.mpStaked, p.mpStaked, string(abi.encodePacked(text, "wrong account MP staked"))); assertEq(vaultData.mpAccrued, p.mpAccrued, string(abi.encodePacked(text, "wrong account MP accrued"))); assertEq(vaultData.maxMP, p.maxMP, string(abi.encodePacked(text, "wrong account max MP"))); assertEq( @@ -332,7 +329,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 10e18, vaultBalance: 10e18, rewardIndex: 0, - mpStaked: 10e18, mpAccrued: 10e18, maxMP: 50e18, rewardsAccrued: 0 @@ -361,7 +357,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 10e18, vaultBalance: 10e18, rewardIndex: 0, - mpStaked: 10e18, mpAccrued: 10e18, maxMP: 50e18, rewardsAccrued: 0 @@ -375,7 +370,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 30e18, rewardIndex: 0, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -405,7 +399,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 10e18, vaultBalance: 10e18, rewardIndex: 0, - mpStaked: 10e18, mpAccrued: 10e18, maxMP: 50e18, rewardsAccrued: 0 @@ -419,7 +412,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 30e18, rewardIndex: 0, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -467,7 +459,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 0e18, vaultBalance: 0e18, rewardIndex: 10e18, - mpStaked: 0e18, mpAccrued: 0e18, maxMP: 0e18, rewardsAccrued: 0 @@ -481,7 +472,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 30e18, rewardIndex: 0, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -510,7 +500,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 0e18, vaultBalance: 0e18, rewardIndex: 10e18, - mpStaked: 0e18, mpAccrued: 0e18, maxMP: 0e18, rewardsAccrued: 0 @@ -524,7 +513,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 30e18, rewardIndex: 0, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -538,7 +526,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 30e18, rewardIndex: 10e18, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -568,7 +555,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 0e18, vaultBalance: 0e18, rewardIndex: 10e18, - mpStaked: 0e18, mpAccrued: 0e18, maxMP: 0e18, rewardsAccrued: 0 @@ -582,7 +568,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 30e18, rewardIndex: 0, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -596,7 +581,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 30e18, rewardIndex: 10e18, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -626,7 +610,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 0e18, vaultBalance: 0e18, rewardIndex: 10e18, - mpStaked: 0, mpAccrued: 0, maxMP: 0, rewardsAccrued: 0 @@ -647,7 +630,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 0e18, vaultBalance: 0e18, rewardIndex: 17_407_407_407_407_407_407, - mpStaked: 0, mpAccrued: 0, maxMP: 0, rewardsAccrued: 0 @@ -661,7 +643,6 @@ contract IntegrationTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 30e18, rewardIndex: 10e18, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -697,7 +678,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: 10e18, vaultBalance: 10e18, rewardIndex: 0, - mpStaked: 10e18, mpAccrued: 10e18, maxMP: 50e18, rewardsAccrued: 0 @@ -727,7 +707,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: 10e18, vaultBalance: 10e18, rewardIndex: 0, - mpStaked: 10e18, mpAccrued: 10e18, maxMP: 50e18, rewardsAccrued: 0 @@ -859,7 +838,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: totalMPAccrued, mpAccrued: totalMPAccrued, // accountMP == totalMPAccrued because only one account is staking maxMP: totalMaxMP, rewardsAccrued: 0 @@ -894,7 +872,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: totalMPAccrued, mpAccrued: totalMPAccrued, // accountMP == totalMPAccrued because only one account is staking maxMP: totalMaxMP, rewardsAccrued: 0 @@ -928,7 +905,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: totalMPAccrued, mpAccrued: totalMPAccrued, // accountMP == totalMPAccrued because only one account is staking maxMP: totalMaxMP, // maxMP == totalMaxMP because only one account is staking rewardsAccrued: 0 @@ -960,7 +936,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: totalMaxMP, mpAccrued: totalMaxMP, maxMP: totalMaxMP, rewardsAccrued: 0 @@ -1104,7 +1079,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: 10e18, vaultBalance: 10e18, rewardIndex: 0, - mpStaked: 10e18, mpAccrued: 10e18, maxMP: 50e18, rewardsAccrued: 0 @@ -1118,7 +1092,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 30e18, rewardIndex: 0, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -1152,7 +1125,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: 10e18, vaultBalance: 10e18, rewardIndex: 0, - mpStaked: 10e18, mpAccrued: 10e18, maxMP: 50e18, rewardsAccrued: 0 @@ -1166,7 +1138,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 30e18, rewardIndex: 0, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -1295,7 +1266,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: params.aliceStakeAmount, vaultBalance: params.aliceStakeAmount, rewardIndex: 0, - mpStaked: aliceMP, mpAccrued: aliceMP, maxMP: aliceMaxMP, rewardsAccrued: 0 @@ -1308,7 +1278,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: params.bobStakeAmount, vaultBalance: params.bobStakeAmount, rewardIndex: 0, - mpStaked: bobMP, mpAccrued: bobMP, maxMP: bobMaxMP, rewardsAccrued: 0 @@ -1348,7 +1317,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: params.aliceStakeAmount, vaultBalance: params.aliceStakeAmount, rewardIndex: 0, - mpStaked: aliceMP + aliceExpectedMPIncrease, mpAccrued: aliceMP + aliceExpectedMPIncrease, maxMP: aliceMaxMP, rewardsAccrued: 0 @@ -1361,7 +1329,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: params.bobStakeAmount, vaultBalance: params.bobStakeAmount, rewardIndex: 0, - mpStaked: bobMPAccrued, mpAccrued: bobMPAccrued, maxMP: bobMaxMP, rewardsAccrued: 0 @@ -1401,7 +1368,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: params.aliceStakeAmount, vaultBalance: params.aliceStakeAmount, rewardIndex: 0, - mpStaked: aliceMPAccrued, mpAccrued: aliceMPAccrued, maxMP: aliceMaxMP, rewardsAccrued: 0 @@ -1414,7 +1380,6 @@ contract StakeTest is RewardsStreamerMPTest { stakedBalance: params.bobStakeAmount, vaultBalance: params.bobStakeAmount, rewardIndex: 0, - mpStaked: bobMPAccrued, mpAccrued: bobMPAccrued, maxMP: bobMaxMP, rewardsAccrued: 0 @@ -1452,7 +1417,6 @@ contract UnstakeTest is StakeTest { stakedBalance: 2e18, vaultBalance: 2e18, rewardIndex: 0, - mpStaked: 2e18, mpAccrued: 2e18, maxMP: 10e18, rewardsAccrued: 0 @@ -1582,7 +1546,6 @@ contract UnstakeTest is StakeTest { stakedBalance: 2e18, vaultBalance: 2e18, rewardIndex: 50e18, // alice reward index has been updated - mpStaked: 2e18, mpAccrued: 2e18, maxMP: 10e18, rewardsAccrued: 0 @@ -1712,7 +1675,6 @@ contract UnstakeTest is StakeTest { stakedBalance: 0, vaultBalance: 0, rewardIndex: 0, - mpStaked: 0, mpAccrued: 0, maxMP: 0, rewardsAccrued: 0 @@ -1726,7 +1688,6 @@ contract UnstakeTest is StakeTest { stakedBalance: 20e18, vaultBalance: 20e18, rewardIndex: 0, - mpStaked: 20e18, mpAccrued: 20e18, maxMP: 100e18, rewardsAccrued: 0 @@ -1759,7 +1720,6 @@ contract UnstakeTest is StakeTest { stakedBalance: 0, vaultBalance: 0, rewardIndex: 125e17, - mpStaked: 0, mpAccrued: 0, maxMP: 0, rewardsAccrued: 0 @@ -1787,7 +1747,6 @@ contract UnstakeTest is StakeTest { stakedBalance: 20e18, vaultBalance: 20e18, rewardIndex: 125e17, - mpStaked: 20e18, mpAccrued: 20e18, maxMP: 100e18, rewardsAccrued: 0 @@ -1815,7 +1774,6 @@ contract UnstakeTest is StakeTest { stakedBalance: 0, vaultBalance: 0, rewardIndex: 125e17, - mpStaked: 0, mpAccrued: 0, maxMP: 0, rewardsAccrued: 0 @@ -1845,7 +1803,6 @@ contract LockTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP, mpAccrued: initialAccountMP, maxMP: initialMaxMP, rewardsAccrued: 0 @@ -1866,7 +1823,6 @@ contract LockTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP + expectedBonusMP, mpAccrued: initialAccountMP + expectedBonusMP, maxMP: initialMaxMP + expectedBonusMP, rewardsAccrued: 0 @@ -1885,7 +1841,6 @@ contract LockTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP + expectedBonusMP, mpAccrued: initialAccountMP + expectedBonusMP, maxMP: initialMaxMP + expectedBonusMP, rewardsAccrued: 0 @@ -1909,7 +1864,6 @@ contract LockTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP, mpAccrued: initialAccountMP, maxMP: initialMaxMP, rewardsAccrued: 0 @@ -1930,7 +1884,6 @@ contract LockTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP + expectedBonusMP, mpAccrued: initialAccountMP + expectedBonusMP, maxMP: initialMaxMP + expectedBonusMP, rewardsAccrued: 0 @@ -1955,7 +1908,6 @@ contract LockTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP, mpAccrued: initialAccountMP, maxMP: initialMaxMP, rewardsAccrued: 0 @@ -1976,7 +1928,6 @@ contract LockTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP + expectedBonusMP, mpAccrued: initialAccountMP + expectedBonusMP, maxMP: initialMaxMP + expectedBonusMP, rewardsAccrued: 0 @@ -1997,7 +1948,6 @@ contract LockTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP + expectedBonusMP + (initialAccountMP * 4), mpAccrued: initialAccountMP + expectedBonusMP + (initialAccountMP * 4), maxMP: initialMaxMP + expectedBonusMP, rewardsAccrued: 0 @@ -2093,7 +2043,6 @@ contract EmergencyExitTest is RewardsStreamerMPTest { stakedBalance: 10e18, vaultBalance: 0, rewardIndex: 0, - mpStaked: 10e18, mpAccrued: 10e18, maxMP: 50e18, rewardsAccrued: 0 @@ -2196,7 +2145,6 @@ contract EmergencyExitTest is RewardsStreamerMPTest { stakedBalance: 10e18, vaultBalance: 0, rewardIndex: 0, - mpStaked: 10e18, mpAccrued: 10e18, maxMP: 50e18, rewardsAccrued: 0 @@ -2210,7 +2158,6 @@ contract EmergencyExitTest is RewardsStreamerMPTest { stakedBalance: 30e18, vaultBalance: 0, rewardIndex: 0, - mpStaked: 30e18, mpAccrued: 30e18, maxMP: 150e18, rewardsAccrued: 0 @@ -2245,7 +2192,6 @@ contract EmergencyExitTest is RewardsStreamerMPTest { stakedBalance: 10e18, vaultBalance: 0, rewardIndex: 0, - mpStaked: 10e18, mpAccrued: 10e18, maxMP: 50e18, rewardsAccrued: 0 @@ -2363,7 +2309,6 @@ contract LeaveTest is RewardsStreamerMPTest { stakedBalance: 0, vaultBalance: 0, rewardIndex: 0, - mpStaked: 0, mpAccrued: 0, maxMP: 0, rewardsAccrued: 0 @@ -2534,12 +2479,11 @@ contract RewardsStreamerMP_RewardsTest is RewardsStreamerMPTest { assertEq(streamer.totalRewardsSupply(), 0); assertEq(streamer.totalMP(), 100e18); assertEq(streamer.mpBalanceOf(vaults[alice]), 100e18); - assertEq(streamer.mpStakedOf(vaults[alice]), 100e18); + assertEq(streamer.mpAccruedOf(vaults[alice]), 100e18); assertEq(streamer.vaultShares(vaults[alice]), 200e18); assertEq(streamer.rewardsBalanceOf(vaults[alice]), 0); assertEq(streamer.mpBalanceOf(vaults[bob]), 0); - assertEq(streamer.mpStakedOf(vaults[bob]), 0); - assertEq(streamer.mpStakedOf(vaults[bob]), 0); + assertEq(streamer.mpAccruedOf(vaults[bob]), 0); assertEq(streamer.vaultShares(vaults[bob]), 0); assertEq(streamer.rewardsBalanceOf(vaults[bob]), 0); @@ -2553,11 +2497,11 @@ contract RewardsStreamerMP_RewardsTest is RewardsStreamerMPTest { // totalMP: 200 + 50 accrued by Alice (not stake yet) assertEq(streamer.totalMP(), 250e18); assertEq(streamer.mpBalanceOf(vaults[alice]), 150e18); - assertEq(streamer.mpStakedOf(vaults[alice]), 100e18); + assertEq(streamer.mpAccruedOf(vaults[alice]), 100e18); assertEq(streamer.vaultShares(vaults[alice]), 200e18); assertEq(streamer.rewardsBalanceOf(vaults[alice]), 500e18); assertEq(streamer.mpBalanceOf(vaults[bob]), 100e18); - assertEq(streamer.mpStakedOf(vaults[bob]), 100e18); + assertEq(streamer.mpAccruedOf(vaults[bob]), 100e18); assertEq(streamer.vaultShares(vaults[bob]), 200e18); assertEq(streamer.rewardsBalanceOf(vaults[bob]), 0); @@ -2569,11 +2513,11 @@ contract RewardsStreamerMP_RewardsTest is RewardsStreamerMPTest { assertEq(streamer.totalRewardsSupply(), 1000e18); assertEq(streamer.totalMP(), 350e18); assertEq(streamer.mpBalanceOf(vaults[alice]), 200e18); - assertEq(streamer.mpStakedOf(vaults[alice]), 100e18); + assertEq(streamer.mpAccruedOf(vaults[alice]), 100e18); assertEq(streamer.vaultShares(vaults[alice]), 200e18); assertEq(streamer.rewardsBalanceOf(vaults[alice]), 750e18); assertEq(streamer.mpBalanceOf(vaults[bob]), 150e18); - assertEq(streamer.mpStakedOf(vaults[bob]), 100e18); + assertEq(streamer.mpAccruedOf(vaults[bob]), 100e18); assertEq(streamer.vaultShares(vaults[bob]), 200e18); assertEq(streamer.rewardsBalanceOf(vaults[bob]), 250e18); @@ -2585,11 +2529,11 @@ contract RewardsStreamerMP_RewardsTest is RewardsStreamerMPTest { assertEq(streamer.totalRewardsSupply(), 1000e18); assertEq(streamer.totalMP(), 550e18); assertEq(streamer.mpBalanceOf(vaults[alice]), 300e18); - assertEq(streamer.mpStakedOf(vaults[alice]), 100e18); + assertEq(streamer.mpAccruedOf(vaults[alice]), 100e18); assertEq(streamer.vaultShares(vaults[alice]), 200e18); assertEq(streamer.rewardsBalanceOf(vaults[alice]), 750e18); assertEq(streamer.mpBalanceOf(vaults[bob]), 250e18); - assertEq(streamer.mpStakedOf(vaults[bob]), 100e18); + assertEq(streamer.mpAccruedOf(vaults[bob]), 100e18); assertEq(streamer.vaultShares(vaults[bob]), 200e18); assertEq(streamer.rewardsBalanceOf(vaults[bob]), 250e18); @@ -2601,11 +2545,11 @@ contract RewardsStreamerMP_RewardsTest is RewardsStreamerMPTest { assertEq(streamer.totalRewardsSupply(), 1000e18); assertEq(streamer.totalMP(), 550e18); assertEq(streamer.mpBalanceOf(vaults[alice]), 300e18); - assertEq(streamer.mpStakedOf(vaults[alice]), 300e18); + assertEq(streamer.mpAccruedOf(vaults[alice]), 300e18); assertEq(streamer.vaultShares(vaults[alice]), 400e18); assertEq(streamer.rewardsBalanceOf(vaults[alice]), 750e18); assertEq(streamer.mpBalanceOf(vaults[bob]), 250e18); - assertEq(streamer.mpStakedOf(vaults[bob]), 100e18); + assertEq(streamer.mpAccruedOf(vaults[bob]), 100e18); assertEq(streamer.vaultShares(vaults[bob]), 200e18); assertEq(streamer.rewardsBalanceOf(vaults[bob]), 250e18); @@ -2619,11 +2563,11 @@ contract RewardsStreamerMP_RewardsTest is RewardsStreamerMPTest { assertEq(streamer.totalRewardsSupply(), 1600e18); assertEq(streamer.totalMP(), 750e18); assertEq(streamer.mpBalanceOf(vaults[alice]), 400e18); - assertEq(streamer.mpStakedOf(vaults[alice]), 300e18); + assertEq(streamer.mpAccruedOf(vaults[alice]), 300e18); assertEq(streamer.vaultShares(vaults[alice]), 400e18); assertEq(streamer.rewardsBalanceOf(vaults[alice]), 1150e18); assertEq(streamer.mpBalanceOf(vaults[bob]), 350e18); - assertEq(streamer.mpStakedOf(vaults[bob]), 100e18); + assertEq(streamer.mpAccruedOf(vaults[bob]), 100e18); assertEq(streamer.vaultShares(vaults[bob]), 200e18); assertEq(streamer.rewardsBalanceOf(vaults[bob]), 450e18); } @@ -2725,7 +2669,6 @@ contract StakeVaultMigrationTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP, mpAccrued: initialAccountMP, maxMP: initialMaxMP, rewardsAccrued: 0 @@ -2758,7 +2701,6 @@ contract StakeVaultMigrationTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP * 2, mpAccrued: initialAccountMP * 2, // alice now has twice the amount after a year maxMP: initialMaxMP, rewardsAccrued: 0 @@ -2806,7 +2748,6 @@ contract StakeVaultMigrationTest is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: stakeAmount, rewardIndex: 0, - mpStaked: initialAccountMP * 2, mpAccrued: initialAccountMP * 2, // alice now has twice the amount after a year maxMP: initialMaxMP, rewardsAccrued: 0 @@ -2821,7 +2762,6 @@ contract StakeVaultMigrationTest is RewardsStreamerMPTest { stakedBalance: 0, vaultBalance: 0, rewardIndex: 0, - mpStaked: 0, mpAccrued: 0, maxMP: 0, rewardsAccrued: 0 @@ -2868,10 +2808,10 @@ contract UpdateVaultTest is RewardsStreamerMPTest { vm.warp(vm.getBlockTimestamp() + rewardPeriod); // ensure staked MP haven't changed for alice (yet!) - assertEq(streamer.mpStakedOf(vaults[alice]), stakeAmount); - assertEq(streamer.mpStakedOf(vault2), stakeAmount); - assertEq(streamer.mpStakedOf(vault3), stakeAmount); - assertEq(streamer.mpStakedOf(vault4), stakeAmount); + assertEq(streamer.mpAccruedOf(vaults[alice]), stakeAmount); + assertEq(streamer.mpAccruedOf(vault2), stakeAmount); + assertEq(streamer.mpAccruedOf(vault3), stakeAmount); + assertEq(streamer.mpAccruedOf(vault4), stakeAmount); // compound alice's MP streamer.updateAccount(alice); @@ -2879,10 +2819,10 @@ contract UpdateVaultTest is RewardsStreamerMPTest { uint256 expectedMPIncreasePerVault = _accrueMP(stakeAmount, rewardPeriod); // ensure alice's staked MP have been compounded - assertEq(streamer.mpStakedOf(vaults[alice]), stakeAmount + expectedMPIncreasePerVault); - assertEq(streamer.mpStakedOf(vault2), stakeAmount + expectedMPIncreasePerVault); - assertEq(streamer.mpStakedOf(vault3), stakeAmount + expectedMPIncreasePerVault); - assertEq(streamer.mpStakedOf(vault4), stakeAmount + expectedMPIncreasePerVault); + assertEq(streamer.mpAccruedOf(vaults[alice]), stakeAmount + expectedMPIncreasePerVault); + assertEq(streamer.mpAccruedOf(vault2), stakeAmount + expectedMPIncreasePerVault); + assertEq(streamer.mpAccruedOf(vault3), stakeAmount + expectedMPIncreasePerVault); + assertEq(streamer.mpAccruedOf(vault4), stakeAmount + expectedMPIncreasePerVault); uint256 tolerance = 1000; assertApproxEqAbs(streamer.rewardsBalanceOfAccount(alice), rewards, tolerance, "Reward balance mismatch"); @@ -2942,7 +2882,6 @@ contract FuzzTests is RewardsStreamerMPTest { stakingToken.balanceOf(p.account), p.vaultBalance, string(abi.encodePacked(text, "wrong vault balance")) ); // assertEq(vaultData.accountRewardIndex, p.rewardIndex, "wrong account reward index"); - assertEq(vaultData.mpStaked, p.mpStaked, string(abi.encodePacked(text, "wrong account MP staked"))); assertEq(vaultData.mpAccrued, p.mpAccrued, string(abi.encodePacked(text, "wrong account MP accrued"))); assertEq(vaultData.maxMP, p.maxMP, string(abi.encodePacked(text, "wrong account max MP"))); assertEq( @@ -3005,18 +2944,6 @@ contract FuzzTests is RewardsStreamerMPTest { expectedRevert = FuzzTests__UndefinedError.selector; } - function _expectUpdateVault(address account) internal { - CheckVaultParams storage expectedAccountParams = expectedAccountState[account]; - uint256 mpCompounded = expectedAccountParams.mpAccrued - expectedAccountParams.mpStaked; - if (mpCompounded == 0) { - expectedRevert = IStakeManager.StakingManager__InsufficientBalance.selector; - } else { - expectedRevert = NO_REVERT; - } - expectedAccountParams.mpStaked += mpCompounded; - expectedSystemState.totalMPStaked += mpCompounded; - } - function _expectUnstake(address account, uint256 amount) internal { if (amount == 0) { expectedRevert = StakeMath.StakeMath__InvalidAmount.selector; @@ -3042,7 +2969,6 @@ contract FuzzTests is RewardsStreamerMPTest { expectedAccountParams.vaultBalance -= amount; expectedSystemState.stakingBalance -= amount; expectedSystemState.totalStaked -= amount; - expectedAccountParams.mpStaked -= expectedReducedMP; expectedSystemState.totalMPStaked -= expectedReducedMP; expectedAccountParams.mpAccrued -= expectedReducedMP; expectedSystemState.totalMPAccrued -= expectedReducedMP; @@ -3056,6 +2982,9 @@ contract FuzzTests is RewardsStreamerMPTest { uint256 rawAccruedMP = _accrueMP(expectedAccountParams.vaultBalance, accruedTime); expectedAccountParams.mpAccrued = Math.min(expectedAccountParams.mpAccrued + rawAccruedMP, expectedAccountParams.maxMP); + expectedSystemState.totalMPStaked = + Math.min(expectedSystemState.totalMPStaked + rawAccruedMP, expectedSystemState.totalMaxMP); + expectedSystemState.totalMPAccrued = Math.min(expectedSystemState.totalMPAccrued + rawAccruedMP, expectedSystemState.totalMaxMP); } @@ -3093,7 +3022,6 @@ contract FuzzTests is RewardsStreamerMPTest { expectedAccountParams.vaultBalance = stakeAmount; expectedSystemState.stakingBalance += stakeAmount; expectedSystemState.totalStaked += stakeAmount; - expectedAccountParams.mpStaked = stakeAmount + expectedBonusMP; expectedSystemState.totalMPStaked += stakeAmount + expectedBonusMP; expectedAccountParams.mpAccrued = stakeAmount + expectedBonusMP; expectedSystemState.totalMPAccrued += stakeAmount + expectedBonusMP; @@ -3142,7 +3070,6 @@ contract FuzzTests is RewardsStreamerMPTest { expectedSystemState.totalMPStaked += additionalBonusMP; expectedSystemState.totalMPAccrued += additionalBonusMP; expectedSystemState.totalMaxMP += additionalBonusMP; - expectedAccountParams.mpStaked += additionalBonusMP; expectedAccountParams.mpAccrued += additionalBonusMP; expectedAccountParams.maxMP += additionalBonusMP; } @@ -3187,7 +3114,6 @@ contract FuzzTests is RewardsStreamerMPTest { check("Stake: ", alice); _expectAccrue(alice, accruedTime); - _expectUpdateVault(alice); _accrue(alice, accruedTime); check("Accrue: ", alice); } @@ -3199,7 +3125,6 @@ contract FuzzTests is RewardsStreamerMPTest { check("Stake: ", alice); _expectAccrue(alice, accruedTime); - _expectUpdateVault(alice); _accrue(alice, accruedTime); check("Accrue: ", alice); } @@ -3223,7 +3148,6 @@ contract FuzzTests is RewardsStreamerMPTest { check("Stake: ", alice); _expectAccrue(alice, accruedTime); - _expectUpdateVault(alice); _accrue(alice, accruedTime); check("Accrue: ", alice); @@ -3248,12 +3172,10 @@ contract FuzzTests is RewardsStreamerMPTest { if (accruedTime > 0) { _expectAccrue(alice, accruedTime); - _expectUpdateVault(alice); _accrue(alice, accruedTime); check("Accrue: ", alice); } - _expectUpdateVault(alice); _expectUnstake(alice, unstakeAmount); _unstake(alice, unstakeAmount, expectedRevert); check("Unstake: ", alice); @@ -3330,7 +3252,6 @@ contract FuzzTests is RewardsStreamerMPTest { stakedBalance: stakeAmount, vaultBalance: 0, rewardIndex: 0, - mpStaked: stakeAmount + expectedBonusMP, mpAccrued: stakeAmount + expectedBonusMP, maxMP: expectedMaxTotalMP, rewardsAccrued: 0