feature(RewardsStreamerMP): add compound function and track rewards accrued by each vault

This commit is contained in:
Andrea Franz
2025-02-20 12:15:56 +01:00
committed by r4bbit
parent 3455068e3c
commit 58f43d07ce
8 changed files with 200 additions and 121 deletions

View File

@@ -4,13 +4,13 @@
+=======================================================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| 7556342 | 36018 | | | | |
| 7666577 | 36531 | | | | |
|-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| | | | | | |
|-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| run | 6624542 | 6624542 | 6624542 | 6624542 | 71 |
| run | 6727468 | 6727468 | 6727468 | 6727468 | 71 |
╰-----------------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯
╭---------------------------------------------------------+-----------------+-----+--------+-----+---------╮
@@ -32,13 +32,13 @@
+=========================================================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| 3461701 | 16940 | | | | |
| 3571899 | 17453 | | | | |
|-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| | | | | | |
|-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
| run | 2957193 | 2957193 | 2957193 | 2957193 | 3 |
| run | 3060029 | 3060029 | 3060029 | 3060029 | 3 |
╰-------------------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯
╭------------------------------------------------------+-----------------+--------+--------+--------+---------╮
@@ -46,7 +46,7 @@
+=============================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| 3141752 | 14501 | | | | |
| 3251948 | 15014 | | | | |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| | | | | | |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
@@ -54,81 +54,83 @@
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| MAX_LOCKUP_PERIOD | 382 | 382 | 382 | 382 | 4 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| MAX_MULTIPLIER | 306 | 306 | 306 | 306 | 10 |
| MAX_MULTIPLIER | 328 | 328 | 328 | 328 | 10 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| MIN_LOCKUP_PERIOD | 308 | 308 | 308 | 308 | 15 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| compound | 115931 | 115931 | 115931 | 115931 | 1 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| emergencyModeEnabled | 2420 | 2420 | 2420 | 2420 | 7 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| enableEmergencyMode | 2529 | 20011 | 25488 | 25488 | 8 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| getAccountTotalMaxMP | 3155 | 3155 | 3155 | 3155 | 1 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| getAccountTotalStakedBalance | 15195 | 15195 | 15195 | 15195 | 1 |
| getAccountTotalStakedBalance | 15130 | 15130 | 15130 | 15130 | 1 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| getAccountVaults | 5247 | 5247 | 5247 | 5247 | 4 |
| getAccountVaults | 5269 | 5269 | 5269 | 5269 | 4 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| getStakedBalance | 2596 | 2596 | 2596 | 2596 | 1 |
| getStakedBalance | 2618 | 2618 | 2618 | 2618 | 1 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| getVault | 1790 | 1816 | 1790 | 3790 | 76 |
| getVault | 1958 | 1958 | 1958 | 1958 | 76 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| initialize | 115589 | 115589 | 115589 | 115589 | 71 |
| initialize | 115611 | 115611 | 115611 | 115611 | 71 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| lastRewardTime | 362 | 1362 | 1362 | 2362 | 2 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| leave | 87987 | 87987 | 87987 | 87987 | 1 |
| leave | 95475 | 95475 | 95475 | 95475 | 1 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| lock | 14216 | 44002 | 43883 | 89590 | 260 |
| lock | 14216 | 52150 | 52082 | 93689 | 260 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| migrateToVault | 13541 | 62634 | 15747 | 158614 | 3 |
| migrateToVault | 13541 | 72222 | 15747 | 187379 | 3 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| mpBalanceOf | 956 | 2600 | 2358 | 7102 | 8 |
| mpBalanceOf | 978 | 2424 | 2380 | 7124 | 12 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| mpBalanceOfAccount | 10308 | 10308 | 10308 | 10308 | 1 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| mpStakedOf | 646 | 868 | 646 | 2646 | 9 |
| mpStakedOf | 668 | 821 | 668 | 2668 | 13 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| proxiableUUID | 409 | 409 | 409 | 409 | 3 |
| proxiableUUID | 342 | 342 | 342 | 342 | 3 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| registerVault | 2562 | 74426 | 74983 | 74983 | 284 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardEndTime | 429 | 1429 | 1429 | 2429 | 2 |
| rewardEndTime | 362 | 1362 | 1362 | 2362 | 2 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardStartTime | 407 | 1407 | 1407 | 2407 | 2 |
| rewardStartTime | 429 | 1429 | 1429 | 2429 | 2 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| rewardsBalanceOf | 2091 | 3244 | 3897 | 4091 | 8 |
| rewardsBalanceOf | 2324 | 3578 | 4130 | 6324 | 12 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| setReward | 2628 | 59084 | 87073 | 107033 | 7 |
| setReward | 2628 | 56527 | 62853 | 107033 | 8 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| setTrustedCodehash | 24199 | 24199 | 24199 | 24199 | 71 |
| setTrustedCodehash | 24221 | 24221 | 24221 | 24221 | 71 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| stake | 2659 | 223430 | 226360 | 246845 | 326 |
| stake | 2681 | 227094 | 230009 | 250494 | 326 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMP | 755 | 1201 | 1201 | 1647 | 4 |
| totalMP | 777 | 1223 | 1223 | 1669 | 6 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMPAccrued | 428 | 428 | 428 | 428 | 84 |
| totalMPAccrued | 362 | 362 | 362 | 362 | 84 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMPStaked | 384 | 384 | 384 | 384 | 4 |
| totalMPStaked | 406 | 406 | 406 | 406 | 6 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| totalMaxMP | 362 | 362 | 362 | 362 | 84 |
| totalMaxMP | 384 | 384 | 384 | 384 | 84 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| totalRewardsAccrued | 362 | 362 | 362 | 362 | 3 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| totalRewardsSupply | 971 | 1873 | 1752 | 6711 | 32 |
| totalRewardsSupply | 971 | 1850 | 1752 | 6711 | 34 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| totalShares | 615 | 615 | 615 | 615 | 4 |
| totalShares | 637 | 637 | 637 | 637 | 6 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| totalStaked | 363 | 363 | 363 | 363 | 89 |
| totalStaked | 385 | 385 | 385 | 385 | 91 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| unstake | 68784 | 72563 | 72179 | 76376 | 13 |
| unstake | 72817 | 79724 | 79601 | 83798 | 13 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| updateGlobalState | 15809 | 27308 | 29200 | 29200 | 20 |
| updateGlobalState | 15798 | 27297 | 29189 | 29189 | 20 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| updateVaultMP | 11729 | 17638 | 18295 | 18295 | 20 |
| updateVaultMP | 29950 | 35859 | 36516 | 36516 | 20 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| upgradeToAndCall | 3203 | 7910 | 8482 | 10903 | 5 |
| upgradeToAndCall | 3225 | 7892 | 8437 | 10925 | 5 |
|------------------------------------------------------+-----------------+--------+--------+--------+---------|
| vaultShares | 889 | 1139 | 889 | 2889 | 8 |
| vaultShares | 889 | 1055 | 889 | 2889 | 12 |
╰------------------------------------------------------+-----------------+--------+--------+--------+---------╯
╭----------------------------------------+-----------------+--------+--------+--------+---------╮
@@ -148,25 +150,25 @@
|----------------------------------------+-----------------+--------+--------+--------+---------|
| initialize | 98005 | 98005 | 98005 | 98005 | 284 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| leave | 12167 | 124589 | 66128 | 353935 | 4 |
| leave | 12167 | 126461 | 69872 | 353935 | 4 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| lock | 12097 | 59269 | 59332 | 105038 | 261 |
| lock | 12097 | 67386 | 67531 | 109137 | 261 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| migrateToVault | 29012 | 89332 | 31218 | 207768 | 3 |
| migrateToVault | 29012 | 98921 | 31218 | 236533 | 3 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| owner | 377 | 397 | 377 | 2377 | 289 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| register | 12654 | 78038 | 78572 | 78572 | 284 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| stake | 12077 | 278470 | 282341 | 302826 | 327 |
| stake | 12077 | 282122 | 285990 | 306475 | 327 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| stakeManager | 367 | 367 | 367 | 367 | 283 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| trustStakeManager | 7577 | 7577 | 7577 | 7577 | 1 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| unstake | 12054 | 97129 | 103289 | 107486 | 14 |
| unstake | 12054 | 103779 | 110711 | 114908 | 14 |
|----------------------------------------+-----------------+--------+--------+--------+---------|
| withdraw | 20683 | 20683 | 20683 | 20683 | 1 |
| withdraw | 20705 | 20705 | 20705 | 20705 | 1 |
╰----------------------------------------+-----------------+--------+--------+--------+---------╯
╭----------------------------------------------------+-----------------+------+--------+--------+---------╮
@@ -180,7 +182,7 @@
|----------------------------------------------------+-----------------+------+--------+--------+---------|
| Function Name | Min | Avg | Median | Max | # Calls |
|----------------------------------------------------+-----------------+------+--------+--------+---------|
| fallback | 733 | 7270 | 855 | 133415 | 520 |
| fallback | 735 | 8052 | 833 | 142290 | 548 |
|----------------------------------------------------+-----------------+------+--------+--------+---------|
| implementation | 343 | 2340 | 2343 | 2343 | 894 |
╰----------------------------------------------------+-----------------+------+--------+--------+---------╯
@@ -348,7 +350,7 @@
+====================================================================================================================================+
| Deployment Cost | Deployment Size | | | | |
|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
| 1039056 | 4641 | | | | |
| 1041456 | 4652 | | | | |
|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
| | | | | | |
|-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|

View File

@@ -1,80 +1,81 @@
CompoundTest:test_RevertWhenInsufficientMPBalance() (gas: 392198)
EmergencyExitTest:test_CannotEnableEmergencyModeTwice() (gas: 93568)
EmergencyExitTest:test_CannotLeaveBeforeEmergencyMode() (gas: 351668)
EmergencyExitTest:test_EmergencyExitBasic() (gas: 439395)
EmergencyExitTest:test_EmergencyExitMultipleUsers() (gas: 753437)
EmergencyExitTest:test_EmergencyExitToAlternateAddress() (gas: 447258)
EmergencyExitTest:test_EmergencyExitWithLock() (gas: 446630)
EmergencyExitTest:test_EmergencyExitWithRewards() (gas: 432088)
EmergencyExitTest:test_CannotLeaveBeforeEmergencyMode() (gas: 355317)
EmergencyExitTest:test_EmergencyExitBasic() (gas: 443230)
EmergencyExitTest:test_EmergencyExitMultipleUsers() (gas: 761579)
EmergencyExitTest:test_EmergencyExitToAlternateAddress() (gas: 451115)
EmergencyExitTest:test_EmergencyExitWithLock() (gas: 450279)
EmergencyExitTest:test_EmergencyExitWithRewards() (gas: 435715)
EmergencyExitTest:test_OnlyOwnerCanEnableEmergencyMode() (gas: 39493)
IntegrationTest:testStakeFoo() (gas: 1341293)
LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 6889549)
LeaveTest:test_RevertWhenStakeManagerIsTrusted() (gas: 348794)
LeaveTest:test_TrustNewStakeManager() (gas: 6952473)
LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1000, μ: 397163, ~: 397188)
LockTest:test_LockFailsWithNoStake() (gas: 106803)
LockTest:test_LockFailsWithZero() (gas: 366096)
LockTest:test_LockWithoutPriorLock() (gas: 456143)
LockTest:test_RevertWhenVaultToLockIsEmpty() (gas: 106782)
MaliciousUpgradeTest:test_UpgradeStackOverflowStakeManager() (gas: 1811075)
MathTest:test_CalcAbsoluteMaxTotalMP() (gas: 4996)
IntegrationTest:testStakeFoo() (gas: 1369116)
LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 7111046)
LeaveTest:test_RevertWhenStakeManagerIsTrusted() (gas: 352443)
LeaveTest:test_TrustNewStakeManager() (gas: 7169318)
LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1000, μ: 408967, ~: 408992)
LockTest:test_LockFailsWithNoStake() (gas: 114530)
LockTest:test_LockFailsWithZero() (gas: 369745)
LockTest:test_LockWithoutPriorLock() (gas: 464286)
LockTest:test_RevertWhenVaultToLockIsEmpty() (gas: 114554)
MaliciousUpgradeTest:test_UpgradeStackOverflowStakeManager() (gas: 1817124)
MathTest:test_CalcAbsoluteMaxTotalMP() (gas: 4974)
MathTest:test_CalcAccrueMP() (gas: 8013)
MathTest:test_CalcBonusMP() (gas: 18644)
MathTest:test_CalcBonusMP() (gas: 18622)
MathTest:test_CalcInitialMP() (gas: 5375)
MathTest:test_CalcMaxAccruedMP() (gas: 4642)
MathTest:test_CalcMaxAccruedMP() (gas: 4665)
MathTest:test_CalcMaxTotalMP() (gas: 19411)
MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 841857)
MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 853661)
NFTMetadataGeneratorSVGTest:testGenerateMetadata() (gas: 85934)
NFTMetadataGeneratorSVGTest:testSetImageStrings() (gas: 58332)
NFTMetadataGeneratorSVGTest:testSetImageStringsRevert() (gas: 35804)
NFTMetadataGeneratorURLTest:testGenerateMetadata() (gas: 102512)
NFTMetadataGeneratorURLTest:testSetBaseURL() (gas: 49555)
NFTMetadataGeneratorURLTest:testSetBaseURLRevert() (gas: 35979)
RewardsStreamerMP_RewardsTest:testRewardsBalanceOf() (gas: 942573)
RewardsStreamerMP_RewardsTest:testSetRewards() (gas: 162374)
RewardsStreamerMP_RewardsTest:testSetRewards_RevertsBadAmount() (gas: 39429)
RewardsStreamerMP_RewardsTest:testSetRewards_RevertsBadDuration() (gas: 39407)
RewardsStreamerMP_RewardsTest:testSetRewards_RevertsNotAuthorized() (gas: 39442)
RewardsStreamerMP_RewardsTest:testTotalRewardsSupply() (gas: 669055)
StakeTest:test_StakeMultipleAccounts() (gas: 582358)
StakeTest:test_StakeMultipleAccountsAndRewards() (gas: 588328)
StakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 928970)
StakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 597095)
StakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 619050)
StakeTest:test_StakeOneAccount() (gas: 328363)
StakeTest:test_StakeOneAccountAndRewards() (gas: 334354)
StakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 560041)
StakeTest:test_StakeOneAccountReachingMPLimit() (gas: 548135)
StakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 348481)
StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 349021)
StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 349088)
StakeVaultMigrationTest:testMigrateToVault() (gas: 886769)
StakeVaultMigrationTest:test_RevertWhenMigrationVaultNotEmpty() (gas: 645316)
StakeVaultMigrationTest:test_RevertWhenNotOwnerOfMigrationVault() (gas: 68080)
RewardsStreamerMP_RewardsTest:testRewardsBalanceOf() (gas: 1238414)
RewardsStreamerMP_RewardsTest:testSetRewards() (gas: 162313)
RewardsStreamerMP_RewardsTest:testSetRewards_RevertsBadAmount() (gas: 39435)
RewardsStreamerMP_RewardsTest:testSetRewards_RevertsBadDuration() (gas: 39413)
RewardsStreamerMP_RewardsTest:testSetRewards_RevertsNotAuthorized() (gas: 39448)
RewardsStreamerMP_RewardsTest:testTotalRewardsSupply() (gas: 672884)
StakeTest:test_StakeMultipleAccounts() (gas: 590521)
StakeTest:test_StakeMultipleAccountsAndRewards() (gas: 596470)
StakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 1010834)
StakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 604843)
StakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 626843)
StakeTest:test_StakeOneAccount() (gas: 332198)
StakeTest:test_StakeOneAccountAndRewards() (gas: 338167)
StakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 600482)
StakeTest:test_StakeOneAccountReachingMPLimit() (gas: 588576)
StakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 352108)
StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 352648)
StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 352759)
StakeVaultMigrationTest:testMigrateToVault() (gas: 936140)
StakeVaultMigrationTest:test_RevertWhenMigrationVaultNotEmpty() (gas: 648987)
StakeVaultMigrationTest:test_RevertWhenNotOwnerOfMigrationVault() (gas: 68015)
StakingTokenTest:testStakeToken() (gas: 13140)
TrustedCodehashAccessTest:test_RevertWhenProxyCloneCodehashNotTrusted() (gas: 2027115)
UnstakeTest:test_StakeMultipleAccounts() (gas: 582335)
UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 588350)
UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 928947)
UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 597072)
UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 619072)
UnstakeTest:test_StakeOneAccount() (gas: 328363)
UnstakeTest:test_StakeOneAccountAndRewards() (gas: 334376)
UnstakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 560063)
UnstakeTest:test_StakeOneAccountReachingMPLimit() (gas: 548179)
UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 348481)
UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 349043)
UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 349132)
UnstakeTest:test_UnstakeBonusMPAndAccuredMP() (gas: 606844)
UnstakeTest:test_UnstakeMultipleAccounts() (gas: 803003)
UnstakeTest:test_UnstakeMultipleAccountsAndRewards() (gas: 905643)
UnstakeTest:test_UnstakeOneAccount() (gas: 547721)
UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 561507)
UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 470312)
UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 589781)
UpgradeTest:test_RevertWhenNotOwner() (gas: 3218904)
UpgradeTest:test_UpgradeStakeManager() (gas: 6783436)
VaultRegistrationTest:test_VaultRegistration() (gas: 62242)
WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 364360)
TrustedCodehashAccessTest:test_RevertWhenProxyCloneCodehashNotTrusted() (gas: 2027137)
UnstakeTest:test_StakeMultipleAccounts() (gas: 590498)
UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 596514)
UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 1010811)
UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 604842)
UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 626820)
UnstakeTest:test_StakeOneAccount() (gas: 332198)
UnstakeTest:test_StakeOneAccountAndRewards() (gas: 338145)
UnstakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 600526)
UnstakeTest:test_StakeOneAccountReachingMPLimit() (gas: 588575)
UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 352063)
UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 352670)
UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 352759)
UnstakeTest:test_UnstakeBonusMPAndAccuredMP() (gas: 636683)
UnstakeTest:test_UnstakeMultipleAccounts() (gas: 823694)
UnstakeTest:test_UnstakeMultipleAccountsAndRewards() (gas: 930932)
UnstakeTest:test_UnstakeOneAccount() (gas: 563618)
UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 587541)
UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 481733)
UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 618996)
UpgradeTest:test_RevertWhenNotOwner() (gas: 3329279)
UpgradeTest:test_UpgradeStakeManager() (gas: 7000238)
VaultRegistrationTest:test_VaultRegistration() (gas: 62330)
WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 368053)
XPNFTTokenTest:testApproveNotAllowed() (gas: 10500)
XPNFTTokenTest:testGetApproved() (gas: 10523)
XPNFTTokenTest:testIsApprovedForAll() (gas: 10698)

View File

@@ -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) envfree;
function vaultData(address) external returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256) envfree;
function lastMPUpdatedTime() external returns (uint256) envfree;
function updateGlobalState() external;
function updateVaultMP(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;
}

View File

@@ -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;
}

View File

@@ -48,6 +48,7 @@ contract RewardsStreamerMP is
uint256 lastMPUpdateTime;
uint256 lockUntil;
uint256 mpStaked;
uint256 rewardsAccrued;
}
mapping(address vault => VaultData data) public vaultData;
@@ -182,7 +183,7 @@ contract RewardsStreamerMP is
}
_updateGlobalState();
_updateVaultMP(msg.sender, true);
_updateVault(msg.sender, true);
VaultData storage vault = vaultData[msg.sender];
if (vault.lockUntil != 0 && vault.lockUntil > block.timestamp) {
@@ -231,7 +232,7 @@ contract RewardsStreamerMP is
}
_updateGlobalState();
_updateVaultMP(msg.sender, true);
_updateVault(msg.sender, true);
(uint256 deltaMp, uint256 newLockEnd) =
_calculateLock(vault.stakedBalance, vault.maxMP, vault.lockUntil, block.timestamp, lockPeriod);
@@ -265,7 +266,7 @@ contract RewardsStreamerMP is
function _unstake(uint256 amount, VaultData storage vault, address vaultAddress) internal {
_updateGlobalState();
_updateVaultMP(vaultAddress, true);
_updateVault(vaultAddress, true);
(uint256 _deltaMpTotal, uint256 _deltaMpMax) = _calculateUnstake(
vault.stakedBalance, vault.lockUntil, block.timestamp, vault.mpAccrued, vault.maxMP, amount
@@ -276,6 +277,7 @@ contract RewardsStreamerMP is
vault.mpAccrued -= _deltaMpTotal;
if (vault.mpAccrued < vault.mpStaked) {
totalMPStaked -= vault.mpStaked - vault.mpAccrued;
vault.mpStaked = vault.mpAccrued;
totalMPStaked -= vault.mpStaked - vault.mpAccrued;
}
@@ -425,6 +427,23 @@ contract RewardsStreamerMP is
return _vaultShares(vaultAddress);
}
function compound(address vaultAddress) external onlyNotEmergencyMode {
VaultData storage vault = vaultData[vaultAddress];
_updateGlobalState();
_updateVault(vaultAddress, true);
uint256 mpToStake = vault.mpAccrued - vault.mpStaked;
if (mpToStake == 0) {
revert StakingManager__InsufficientBalance();
}
vault.mpStaked += mpToStake;
totalMPStaked += mpToStake;
vault.rewardIndex = rewardIndex;
emit Compound(vaultAddress, mpToStake);
}
function _vaultShares(address vaultAddress) internal view returns (uint256) {
VaultData storage vault = vaultData[vaultAddress];
return vault.stakedBalance + vault.mpStaked;
@@ -470,17 +489,21 @@ contract RewardsStreamerMP is
return deltaMP;
}
function _updateVaultMP(address vaultAddress, bool forceMPUpdate) internal {
function _updateVault(address vaultAddress, bool forceMPUpdate) internal {
VaultData storage vault = vaultData[vaultAddress];
uint256 accruedMP = _getVaultPendingMP(vault);
if (accruedMP > 0 || forceMPUpdate) {
vault.mpAccrued += accruedMP;
vault.lastMPUpdateTime = block.timestamp;
}
uint256 rewardsAccrued = _vaultPendingRewards(vault);
vault.rewardsAccrued += rewardsAccrued;
vault.rewardIndex = rewardIndex;
}
function updateVaultMP(address vaultAddress) external onlyNotEmergencyMode {
_updateVaultMP(vaultAddress, false);
_updateVault(vaultAddress, false);
}
function enableEmergencyMode() external onlyOwner onlyNotEmergencyMode {
@@ -501,11 +524,14 @@ contract RewardsStreamerMP is
}
function rewardsBalanceOf(address vaultAddress) public view returns (uint256) {
VaultData storage vault = vaultData[vaultAddress];
return vault.rewardsAccrued + _vaultPendingRewards(vault);
}
function _vaultPendingRewards(VaultData storage vault) internal view returns (uint256) {
uint256 newRewardIndex;
(, newRewardIndex) = _liveRewardIndex();
VaultData storage vault = vaultData[vaultAddress];
uint256 accountShares = vault.stakedBalance + vault.mpStaked;
uint256 deltaRewardIndex = newRewardIndex - vault.rewardIndex;
@@ -553,7 +579,7 @@ contract RewardsStreamerMP is
}
_updateGlobalState();
_updateVaultMP(msg.sender, true);
_updateVault(msg.sender, true);
VaultData storage oldVault = vaultData[msg.sender];
VaultData storage newVault = vaultData[migrateTo];
@@ -561,10 +587,12 @@ 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;
newVault.lockUntil = oldVault.lockUntil;
newVault.rewardsAccrued = oldVault.rewardsAccrued;
delete vaultData[msg.sender];

View File

@@ -16,6 +16,7 @@ interface IStakeManager is ITrustedCodehashAccess, IStakeConstants {
error StakingManager__MigrationTargetHasFunds();
error StakingManager__Unauthorized();
error StakingManager__DurationCannotBeZero();
error StakingManager__InsufficientBalance();
event VaultRegistered(address indexed vault, address indexed owner);
event VaultMigrated(address indexed from, address indexed to);
@@ -24,6 +25,7 @@ interface IStakeManager is ITrustedCodehashAccess, IStakeConstants {
event Unstaked(address indexed vault, uint256 amount);
event EmergencyModeEnabled();
event AccountLeft(address indexed vault);
event Compound(address indexed vault, uint256 amount);
function registerVault() external;
function stake(uint256 _amount, uint256 _seconds) external;
@@ -31,6 +33,7 @@ interface IStakeManager is ITrustedCodehashAccess, IStakeConstants {
function unstake(uint256 _amount) external;
function leave() external;
function migrateToVault(address migrateTo) external;
function compound(address _vault) external;
function emergencyModeEnabled() external view returns (bool);
function totalStaked() external view returns (uint256);

View File

@@ -122,6 +122,11 @@ contract RewardsStreamerMPTest is StakeMath, Test {
vault.stake(amount, lockupTime);
}
function _compound(address account) public {
StakeVault vault = StakeVault(vaults[account]);
streamer.compound(address(vault));
}
function _unstake(address account, uint256 amount) public {
StakeVault vault = StakeVault(vaults[account]);
vm.prank(account);
@@ -2179,6 +2184,41 @@ contract RewardsStreamerMP_RewardsTest is RewardsStreamerMPTest {
assertEq(streamer.mpStakedOf(vaults[bob]), 100e18);
assertEq(streamer.vaultShares(vaults[bob]), 200e18);
assertEq(streamer.rewardsBalanceOf(vaults[bob]), 250e18);
_compound(alice);
assertEq(streamer.totalStaked(), 200e18);
assertEq(streamer.totalMPStaked(), 400e18);
assertEq(streamer.totalShares(), 600e18);
assertEq(streamer.totalRewardsSupply(), 1000e18);
assertEq(streamer.totalMP(), 550e18);
assertEq(streamer.mpBalanceOf(vaults[alice]), 300e18);
assertEq(streamer.mpStakedOf(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.vaultShares(vaults[bob]), 200e18);
assertEq(streamer.rewardsBalanceOf(vaults[bob]), 250e18);
vm.prank(admin);
streamer.setReward(600e18, year);
vm.warp(initialTime + year * 3);
assertEq(streamer.totalStaked(), 200e18);
assertEq(streamer.totalMPStaked(), 400e18);
assertEq(streamer.totalShares(), 600e18);
assertEq(streamer.totalRewardsSupply(), 1600e18);
assertEq(streamer.totalMP(), 750e18);
assertEq(streamer.mpBalanceOf(vaults[alice]), 400e18);
assertEq(streamer.mpStakedOf(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.vaultShares(vaults[bob]), 200e18);
assertEq(streamer.rewardsBalanceOf(vaults[bob]), 450e18);
}
}

View File

@@ -59,6 +59,11 @@ contract StackOverflowStakeManager is
// implementation
}
// solhint-disable-next-line
function compound(address _vaultAddress) external override {
// implementation
}
function leave() external override {
this.leave();
}