mirror of
https://github.com/vacp2p/staking-reward-streamer.git
synced 2026-01-08 20:48:00 -05:00
refactor(StakeManager): move lockUntil into StakeVault
Most of the reasoning has been discussed in #208. Primarily what's happening here is: - `StakeManager.VaultData.lockUntil` has been removed - `StakeVault.lockUntil` has been introduced - `StakeVault.updateLockUntil(uint256 value)` has been introduced - `StakeVault.leave()` performs normal `leave()` action but keeps funds in vault if lockup period hasn't expired - `StakeVault.withdrawFromVault()` has been introduced to withdraw remaining *stake* funds in vault BREAKING CHANGE: - `StakeManager.VaultData.lockUntil` has been removed - `StakeVault.lockUntil` has been introduced - `StakeVault.leave()` performs normal `leave()` action but keeps funds in vault if lockup period hasn't expired Closes #208
This commit is contained in:
108
.gas-report
108
.gas-report
@@ -10,7 +10,7 @@
|
||||
|-------------------------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| Function Name | Min | Avg | Median | Max | # Calls |
|
||||
|-------------------------------------------------------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| fallback | 746 | 135524 | 193312 | 193348 | 498 |
|
||||
| fallback | 746 | 135370 | 193312 | 193348 | 500 |
|
||||
╰-------------------------------------------------------------------------------------------+-----------------+--------+--------+--------+---------╯
|
||||
|
||||
╭-----------------------------------------------------+-----------------+---------+---------+---------+---------╮
|
||||
@@ -24,7 +24,7 @@
|
||||
|-----------------------------------------------------+-----------------+---------+---------+---------+---------|
|
||||
| Function Name | Min | Avg | Median | Max | # Calls |
|
||||
|-----------------------------------------------------+-----------------+---------+---------+---------+---------|
|
||||
| run | 3966846 | 3966846 | 3966846 | 3966846 | 116 |
|
||||
| run | 3966846 | 3966846 | 3966846 | 3966846 | 118 |
|
||||
╰-----------------------------------------------------+-----------------+---------+---------+---------+---------╯
|
||||
|
||||
╭-----------------------------------------------------------+-----------------+---------+---------+---------+---------╮
|
||||
@@ -46,13 +46,13 @@
|
||||
+=============================================================================================================================+
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
|-------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
|
||||
| 8359938 | 39874 | | | | |
|
||||
| 8493016 | 40508 | | | | |
|
||||
|-------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
|
||||
| | | | | | |
|
||||
|-------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
|
||||
| Function Name | Min | Avg | Median | Max | # Calls |
|
||||
|-------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
|
||||
| run | 7299960 | 7299960 | 7299960 | 7299960 | 93 |
|
||||
| run | 7425695 | 7425695 | 7425695 | 7425695 | 95 |
|
||||
╰-------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯
|
||||
|
||||
╭---------------------------------------------------------+-----------------+-----+--------+-----+---------╮
|
||||
@@ -66,7 +66,7 @@
|
||||
|---------------------------------------------------------+-----------------+-----+--------+-----+---------|
|
||||
| Function Name | Min | Avg | Median | Max | # Calls |
|
||||
|---------------------------------------------------------+-----------------+-----+--------+-----+---------|
|
||||
| activeNetworkConfig | 455 | 455 | 455 | 455 | 340 |
|
||||
| activeNetworkConfig | 455 | 455 | 455 | 455 | 346 |
|
||||
╰---------------------------------------------------------+-----------------+-----+--------+-----+---------╯
|
||||
|
||||
╭---------------------------------------------------------------------+-----------------+---------+---------+---------+---------╮
|
||||
@@ -74,13 +74,13 @@
|
||||
+===============================================================================================================================+
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
|---------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
|
||||
| 5871906 | 28253 | | | | |
|
||||
| 6005462 | 28878 | | | | |
|
||||
|---------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
|
||||
| | | | | | |
|
||||
|---------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
|
||||
| Function Name | Min | Avg | Median | Max | # Calls |
|
||||
|---------------------------------------------------------------------+-----------------+---------+---------+---------+---------|
|
||||
| runWithAdminAndProxy | 3282174 | 3282174 | 3282174 | 3282174 | 3 |
|
||||
| runWithAdminAndProxy | 3407494 | 3407494 | 3407494 | 3407494 | 4 |
|
||||
╰---------------------------------------------------------------------+-----------------+---------+---------+---------+---------╯
|
||||
|
||||
╭------------------------------+-----------------+--------+--------+--------+---------╮
|
||||
@@ -96,7 +96,7 @@
|
||||
|------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| acceptOwnership | 12020 | 12020 | 12020 | 12020 | 1 |
|
||||
|------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| addRewardDistributor | 2589 | 65692 | 70586 | 70586 | 150 |
|
||||
| addRewardDistributor | 2589 | 65756 | 70586 | 70586 | 152 |
|
||||
|------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| allowance | 482 | 482 | 482 | 482 | 3 |
|
||||
|------------------------------+-----------------+--------+--------+--------+---------|
|
||||
@@ -106,7 +106,7 @@
|
||||
|------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| getRewardDistributors | 1140 | 3384 | 3384 | 5628 | 6 |
|
||||
|------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| initialize | 95872 | 95872 | 95872 | 95872 | 116 |
|
||||
| initialize | 95872 | 95872 | 95872 | 95872 | 118 |
|
||||
|------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| mint | 2632 | 37628 | 51197 | 51197 | 14 |
|
||||
|------------------------------+-----------------+--------+--------+--------+---------|
|
||||
@@ -162,7 +162,7 @@
|
||||
+===================================================================================================+
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| 3486137 | 16150 | | | | |
|
||||
| 3619677 | 16775 | | | | |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| | | | | | |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
@@ -172,7 +172,7 @@
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| MAX_MULTIPLIER | 263 | 263 | 263 | 263 | 20 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| MIN_LOCKUP_PERIOD | 331 | 331 | 331 | 331 | 15 |
|
||||
| MIN_LOCKUP_PERIOD | 331 | 331 | 331 | 331 | 17 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| emergencyModeEnabled | 2421 | 2421 | 2421 | 2421 | 263 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
@@ -184,17 +184,17 @@
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| getAccountVaults | 5230 | 5230 | 5230 | 5230 | 4 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| getVault | 1823 | 6622 | 1823 | 15823 | 4183 |
|
||||
| getVault | 1653 | 5710 | 1653 | 13653 | 4182 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| initialize | 92752 | 92752 | 92752 | 92752 | 93 |
|
||||
| initialize | 92752 | 92752 | 92752 | 92752 | 95 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| lastRewardTime | 407 | 1407 | 1407 | 2407 | 2 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| leave | 88837 | 88837 | 88837 | 88837 | 1 |
|
||||
| leave | 66348 | 66348 | 66348 | 66348 | 2 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| lock | 7040 | 42317 | 45950 | 84893 | 1034 |
|
||||
| lock | 7040 | 43178 | 46713 | 87964 | 1034 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| migrateToVault | 9294 | 51723 | 16883 | 163832 | 4 |
|
||||
| migrateToVault | 9294 | 53513 | 17021 | 170715 | 4 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| mpAccruedOf | 629 | 629 | 629 | 629 | 20 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
@@ -202,53 +202,53 @@
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| mpBalanceOfAccount | 6210 | 8283 | 8283 | 10356 | 2 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| proxiableUUID | 342 | 342 | 342 | 342 | 3 |
|
||||
| proxiableUUID | 342 | 342 | 342 | 342 | 4 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| registerVault | 2583 | 74442 | 75014 | 75014 | 366 |
|
||||
| registerVault | 2583 | 74547 | 75107 | 75107 | 374 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| rewardEndTime | 429 | 1429 | 1429 | 2429 | 2 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| rewardStartTime | 364 | 1364 | 1364 | 2364 | 2 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| rewardsBalanceOf | 2295 | 3499 | 3908 | 6295 | 268 |
|
||||
| rewardsBalanceOf | 2295 | 3505 | 3908 | 6295 | 268 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| rewardsBalanceOfAccount | 10220 | 10220 | 10220 | 10220 | 1 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| setReward | 2508 | 105565 | 107076 | 107076 | 265 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| setRewardsSupplier | 26875 | 26875 | 26875 | 26875 | 88 |
|
||||
| setRewardsSupplier | 26875 | 26875 | 26875 | 26875 | 90 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| setTrustedCodehash | 24238 | 24238 | 24238 | 24238 | 93 |
|
||||
| setTrustedCodehash | 24238 | 24238 | 24238 | 24238 | 95 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| stake | 2639 | 128634 | 59967 | 225838 | 2668 |
|
||||
| stake | 2639 | 131046 | 60725 | 228623 | 2670 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| stakedBalanceOf | 2622 | 2622 | 2622 | 2622 | 1 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| totalMP | 805 | 1257 | 1257 | 1710 | 6 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| totalMPAccrued | 385 | 1073 | 385 | 2385 | 4163 |
|
||||
| totalMPAccrued | 385 | 1064 | 385 | 2385 | 4162 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| totalMPStaked | 429 | 1117 | 429 | 2429 | 4166 |
|
||||
| totalMPStaked | 429 | 1107 | 429 | 2429 | 4165 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| totalMaxMP | 407 | 1095 | 407 | 2407 | 4163 |
|
||||
| totalMaxMP | 407 | 1086 | 407 | 2407 | 4162 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| totalRewardsAccrued | 407 | 407 | 407 | 407 | 3 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| totalRewardsSupply | 998 | 1624 | 1792 | 6737 | 290 |
|
||||
| totalRewardsSupply | 998 | 1627 | 1792 | 6737 | 290 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| totalShares | 597 | 597 | 597 | 597 | 6 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| totalStaked | 408 | 1095 | 408 | 2408 | 4170 |
|
||||
| totalStaked | 408 | 1086 | 408 | 2408 | 4169 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| unstake | 38969 | 41385 | 38995 | 75006 | 269 |
|
||||
| unstake | 9886 | 41014 | 39781 | 79550 | 271 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| updateAccount | 347677 | 347677 | 347677 | 347677 | 1 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| updateGlobalState | 15820 | 25876 | 29230 | 29230 | 8 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| updateVault | 31948 | 33943 | 31948 | 110579 | 1025 |
|
||||
| updateVault | 31948 | 34282 | 31948 | 110579 | 1024 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| upgradeTo | 10279 | 10895 | 10279 | 12745 | 4 |
|
||||
| upgradeTo | 10279 | 10772 | 10279 | 12745 | 5 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| upgradeToAndCall | 3228 | 3228 | 3228 | 3228 | 1 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
@@ -260,37 +260,43 @@
|
||||
+===============================================================================================+
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| 1685156 | 7956 | | | | |
|
||||
| 1683255 | 7965 | | | | |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| | | | | | |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| Function Name | Min | Avg | Median | Max | # Calls |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| STAKING_TOKEN | 240 | 240 | 240 | 240 | 1 |
|
||||
| STAKING_TOKEN | 252 | 252 | 252 | 252 | 1 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| emergencyExit | 15023 | 31463 | 31461 | 48561 | 263 |
|
||||
| emergencyExit | 15073 | 31537 | 31535 | 48635 | 263 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| initialize | 97660 | 97660 | 97660 | 97660 | 366 |
|
||||
| initialize | 97688 | 97688 | 97688 | 97688 | 374 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| leave | 12161 | 124868 | 66517 | 354279 | 4 |
|
||||
| leave | 12223 | 113138 | 84120 | 356510 | 5 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| lock | 12091 | 57739 | 61416 | 100356 | 1035 |
|
||||
| lock | 12151 | 58671 | 62251 | 103499 | 1035 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| migrateToVault | 24782 | 75606 | 32371 | 212902 | 4 |
|
||||
| lockUntil | 363 | 1743 | 2363 | 2363 | 7758 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| owner | 379 | 411 | 379 | 2379 | 374 |
|
||||
| migrateToVault | 24910 | 77530 | 32637 | 219937 | 4 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| register | 12718 | 78090 | 78644 | 78644 | 366 |
|
||||
| owner | 448 | 479 | 448 | 2448 | 382 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| stake | 12071 | 162433 | 75460 | 281406 | 2669 |
|
||||
| register | 12742 | 78218 | 78761 | 78761 | 374 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| stakeManager | 369 | 369 | 369 | 369 | 365 |
|
||||
| stake | 12131 | 165238 | 76290 | 284275 | 2671 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| trustStakeManager | 7580 | 7580 | 7580 | 7580 | 1 |
|
||||
| stakeManager | 393 | 393 | 393 | 393 | 373 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| unstake | 12048 | 57701 | 54438 | 106028 | 270 |
|
||||
| trustStakeManager | 7650 | 7650 | 7650 | 7650 | 1 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| withdraw | 20733 | 20733 | 20733 | 20733 | 1 |
|
||||
| unstake | 12108 | 57512 | 55296 | 110656 | 272 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| updateLockUntil | 4432 | 20765 | 21532 | 21532 | 509 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| withdraw | 20817 | 20817 | 20817 | 20817 | 1 |
|
||||
|----------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| withdrawFromVault | 20391 | 20391 | 20391 | 20391 | 1 |
|
||||
╰----------------------------------------+-----------------+--------+--------+--------+---------╯
|
||||
|
||||
╭----------------------------------------------------+-----------------+------+--------+--------+---------╮
|
||||
@@ -304,9 +310,9 @@
|
||||
|----------------------------------------------------+-----------------+------+--------+--------+---------|
|
||||
| Function Name | Min | Avg | Median | Max | # Calls |
|
||||
|----------------------------------------------------+-----------------+------+--------+--------+---------|
|
||||
| fallback | 708 | 6331 | 2301 | 374054 | 23169 |
|
||||
| fallback | 708 | 6172 | 2125 | 374054 | 23167 |
|
||||
|----------------------------------------------------+-----------------+------+--------+--------+---------|
|
||||
| implementation | 346 | 2345 | 2346 | 2346 | 4349 |
|
||||
| implementation | 346 | 2136 | 2346 | 2346 | 4871 |
|
||||
╰----------------------------------------------------+-----------------+------+--------+--------+---------╯
|
||||
|
||||
╭--------------------------------------------+-----------------+--------+--------+--------+---------╮
|
||||
@@ -320,7 +326,7 @@
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| Function Name | Min | Avg | Median | Max | # Calls |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| createVault | 230968 | 247693 | 248068 | 248068 | 365 |
|
||||
| createVault | 231113 | 247846 | 248213 | 248213 | 373 |
|
||||
|--------------------------------------------+-----------------+--------+--------+--------+---------|
|
||||
| vaultImplementation | 2345 | 2345 | 2345 | 2345 | 1 |
|
||||
╰--------------------------------------------+-----------------+--------+--------+--------+---------╯
|
||||
@@ -330,7 +336,7 @@
|
||||
+===============================================================================================================================================+
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
|
||||
| 1204853 | 6207 | | | | |
|
||||
| 1204853 | 6015 | | | | |
|
||||
|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
|
||||
| | | | | | |
|
||||
|------------------------------------------------------------------------------------------+-----------------+-------+--------+-------+---------|
|
||||
@@ -410,11 +416,11 @@
|
||||
|---------------------------------------------+-----------------+-------+--------+-------+---------|
|
||||
| Function Name | Min | Avg | Median | Max | # Calls |
|
||||
|---------------------------------------------+-----------------+-------+--------+-------+---------|
|
||||
| approve | 29075 | 31501 | 29183 | 46259 | 2668 |
|
||||
| approve | 29075 | 31545 | 29183 | 46259 | 2676 |
|
||||
|---------------------------------------------+-----------------+-------+--------+-------+---------|
|
||||
| balanceOf | 561 | 1354 | 561 | 2561 | 4957 |
|
||||
| balanceOf | 561 | 1346 | 561 | 2561 | 4960 |
|
||||
|---------------------------------------------+-----------------+-------+--------+-------+---------|
|
||||
| mint | 33964 | 37136 | 34072 | 68248 | 2677 |
|
||||
| mint | 33964 | 37190 | 34072 | 68248 | 2685 |
|
||||
╰---------------------------------------------+-----------------+-------+--------+-------+---------╯
|
||||
|
||||
╭-----------------------------------------------------------------------------+-----------------+--------+--------+--------+---------╮
|
||||
|
||||
162
.gas-snapshot
162
.gas-snapshot
@@ -1,21 +1,21 @@
|
||||
EmergencyExitTest:test_CannotEnableEmergencyModeTwice() (gas: 93554)
|
||||
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_CannotLeaveBeforeEmergencyMode() (gas: 336067)
|
||||
EmergencyExitTest:test_EmergencyExitBasic() (gas: 427580)
|
||||
EmergencyExitTest:test_EmergencyExitMultipleUsers() (gas: 730615)
|
||||
EmergencyExitTest:test_EmergencyExitToAlternateAddress() (gas: 433110)
|
||||
EmergencyExitTest:test_EmergencyExitWithLock() (gas: 433444)
|
||||
EmergencyExitTest:test_EmergencyExitWithRewards() (gas: 419310)
|
||||
EmergencyExitTest:test_OnlyOwnerCanEnableEmergencyMode() (gas: 39176)
|
||||
FuzzTests:testFuzz_AccrueMP(uint128,uint64,uint64) (runs: 1000, μ: 372282, ~: 342651)
|
||||
FuzzTests:testFuzz_AccrueMP_Relock(uint128,uint64,uint64,uint64) (runs: 1000, μ: 472264, ~: 444743)
|
||||
FuzzTests:testFuzz_EmergencyExit(uint256,uint256) (runs: 1000, μ: 495376, ~: 486543)
|
||||
FuzzTests:testFuzz_Lock(uint256,uint64) (runs: 1000, μ: 726274, ~: 725709)
|
||||
FuzzTests:testFuzz_Relock(uint256,uint64,uint64) (runs: 1000, μ: 381860, ~: 362893)
|
||||
FuzzTests:testFuzz_Rewards(uint256,uint256,uint256,uint16,uint16) (runs: 1000, μ: 597041, ~: 598339)
|
||||
FuzzTests:testFuzz_Stake(uint256,uint64) (runs: 1000, μ: 288027, ~: 260835)
|
||||
FuzzTests:testFuzz_Unstake(uint128,uint64,uint16,uint128) (runs: 1000, μ: 475649, ~: 448228)
|
||||
FuzzTests:testFuzz_UpdateVault(uint128,uint64,uint64) (runs: 1000, μ: 372305, ~: 342674)
|
||||
IntegrationTest:testStakeFoo() (gas: 1362727)
|
||||
FuzzTests:testFuzz_AccrueMP(uint128,uint64,uint64) (runs: 1006, μ: 397033, ~: 368037)
|
||||
FuzzTests:testFuzz_AccrueMP_Relock(uint128,uint64,uint64,uint64) (runs: 1006, μ: 502073, ~: 471734)
|
||||
FuzzTests:testFuzz_EmergencyExit(uint256,uint256) (runs: 1001, μ: 497104, ~: 487267)
|
||||
FuzzTests:testFuzz_Lock(uint256,uint64) (runs: 1006, μ: 727730, ~: 726735)
|
||||
FuzzTests:testFuzz_Relock(uint256,uint64,uint64) (runs: 1006, μ: 409301, ~: 388725)
|
||||
FuzzTests:testFuzz_Rewards(uint256,uint256,uint256,uint16,uint16) (runs: 1001, μ: 599762, ~: 601124)
|
||||
FuzzTests:testFuzz_Stake(uint256,uint64) (runs: 1006, μ: 311991, ~: 285086)
|
||||
FuzzTests:testFuzz_Unstake(uint128,uint64,uint16,uint128) (runs: 1006, μ: 498758, ~: 473111)
|
||||
FuzzTests:testFuzz_UpdateVault(uint128,uint64,uint64) (runs: 1006, μ: 397056, ~: 368060)
|
||||
IntegrationTest:testStakeFoo() (gas: 1362931)
|
||||
KarmaNFTTest:testApproveNotAllowed() (gas: 10507)
|
||||
KarmaNFTTest:testGetApproved() (gas: 10531)
|
||||
KarmaNFTTest:testIsApprovedForAll() (gas: 10705)
|
||||
@@ -44,24 +44,25 @@ KarmaTest:testRemoveKarmaDistributorOnlyOwner() (gas: 88798)
|
||||
KarmaTest:testRemoveUnknownKarmaDistributor() (gas: 41398)
|
||||
KarmaTest:testTotalSupply() (gas: 338940)
|
||||
KarmaTest:testTransfersNotAllowed() (gas: 40241)
|
||||
LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 9617526)
|
||||
LeaveTest:test_RevertWhenStakeManagerIsTrusted() (gas: 332331)
|
||||
LeaveTest:test_TrustNewStakeManager() (gas: 9673268)
|
||||
LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1000, μ: 382883, ~: 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)
|
||||
LeaveTest:test_LeaveShouldKeepFundsLockedInStakeVault() (gas: 9899411)
|
||||
LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 9865059)
|
||||
LeaveTest:test_RevertWhenStakeManagerIsTrusted() (gas: 333238)
|
||||
LeaveTest:test_TrustNewStakeManager() (gas: 9933491)
|
||||
LockTest:test_LockFailsWithInvalidPeriod(uint256) (runs: 1006, μ: 384564, ~: 384588)
|
||||
LockTest:test_LockFailsWithNoStake() (gas: 89700)
|
||||
LockTest:test_LockFailsWithZero() (gas: 343310)
|
||||
LockTest:test_LockMultipleTimesExceedMaxLock() (gas: 628421)
|
||||
LockTest:test_LockWithPriorLock() (gas: 566521)
|
||||
LockTest:test_LockWithoutPriorLock() (gas: 446388)
|
||||
LockTest:test_RevertWhenVaultToLockIsEmpty() (gas: 89700)
|
||||
MaliciousUpgradeTest:test_UpgradeStackOverflowStakeManager() (gas: 1995193)
|
||||
MathTest:test_CalcAbsoluteMaxTotalMP() (gas: 5240)
|
||||
MathTest:test_CalcAccrueMP() (gas: 8599)
|
||||
MathTest:test_CalcBonusMP() (gas: 19244)
|
||||
MathTest:test_CalcInitialMP() (gas: 5836)
|
||||
MathTest:test_CalcMaxAccruedMP() (gas: 4886)
|
||||
MathTest:test_CalcMaxTotalMP() (gas: 20006)
|
||||
MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 799444)
|
||||
MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 801979)
|
||||
NFTMetadataGeneratorSVGTest:testGenerateMetadata() (gas: 92580)
|
||||
NFTMetadataGeneratorSVGTest:testSetImageStrings() (gas: 60081)
|
||||
NFTMetadataGeneratorSVGTest:testSetImageStringsRevert() (gas: 35891)
|
||||
@@ -78,60 +79,61 @@ OverflowTest:testTotalSupply() (gas: 338940)
|
||||
OverflowTest:testTransfersNotAllowed() (gas: 40241)
|
||||
OverflowTest:test_RevertWhen_MintingCausesOverflow() (gas: 129363)
|
||||
OverflowTest:test_RevertWhen_SettingRewardCausesOverflow() (gas: 127641)
|
||||
StakeManager_RewardsTest:testRewardsBalanceOf() (gas: 1279683)
|
||||
StakeManager_RewardsTest:testRewardsBalanceOf() (gas: 1281373)
|
||||
StakeManager_RewardsTest:testSetRewards() (gas: 227019)
|
||||
StakeManager_RewardsTest:testSetRewards_RevertsBadAmount() (gas: 63685)
|
||||
StakeManager_RewardsTest:testSetRewards_RevertsBadDuration() (gas: 103443)
|
||||
StakeManager_RewardsTest:testSetRewards_RevertsNotAuthorized() (gas: 39367)
|
||||
StakeManager_RewardsTest:testTotalRewardsSupply() (gas: 745217)
|
||||
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: 878053)
|
||||
StakeVaultMigrationTest:test_RevertWhenDestinationVaultIsNotRegistered() (gas: 162053)
|
||||
StakeVaultMigrationTest:test_RevertWhenMigrationVaultNotEmpty() (gas: 630655)
|
||||
StakeVaultMigrationTest:test_RevertWhenNotOwnerOfMigrationVault() (gas: 70297)
|
||||
StakeVaultTest:testOwner() (gas: 15262)
|
||||
StakingTokenTest:testOwner() (gas: 15262)
|
||||
StakingTokenTest:testStakeToken() (gas: 13144)
|
||||
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: 2393482)
|
||||
UpgradeTest:test_RevertWhenNotOwner() (gas: 3562509)
|
||||
UpgradeTest:test_UpgradeStakeManager() (gas: 9509435)
|
||||
StakeManager_RewardsTest:testTotalRewardsSupply() (gas: 746062)
|
||||
StakeTest:test_StakeMultipleAccounts() (gas: 556308)
|
||||
StakeTest:test_StakeMultipleAccountsAndRewards() (gas: 564800)
|
||||
StakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 942461)
|
||||
StakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 571074)
|
||||
StakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 595232)
|
||||
StakeTest:test_StakeMultipleTimesDoesNotExceedsMaxMP() (gas: 1528357)
|
||||
StakeTest:test_StakeMultipleTimesWithLockIncreaseAtSameBlock() (gas: 581504)
|
||||
StakeTest:test_StakeMultipleTimesWithLockZeroAfterMaxLock() (gas: 1124100)
|
||||
StakeTest:test_StakeOneAccount() (gas: 316362)
|
||||
StakeTest:test_StakeOneAccountAndRewards() (gas: 324917)
|
||||
StakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 616802)
|
||||
StakeTest:test_StakeOneAccountReachingMPLimit() (gas: 503792)
|
||||
StakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 337583)
|
||||
StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 338223)
|
||||
StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 338268)
|
||||
StakeVaultMigrationTest:testMigrateToVault() (gas: 885152)
|
||||
StakeVaultMigrationTest:test_RevertWhenDestinationVaultIsNotRegistered() (gas: 162181)
|
||||
StakeVaultMigrationTest:test_RevertWhenMigrationVaultNotEmpty() (gas: 631911)
|
||||
StakeVaultMigrationTest:test_RevertWhenNotOwnerOfMigrationVault() (gas: 70563)
|
||||
StakeVaultTest:testOwner() (gas: 15331)
|
||||
StakingTokenTest:testOwner() (gas: 15331)
|
||||
StakingTokenTest:testStakeToken() (gas: 13156)
|
||||
TrustedCodehashAccessTest:test_RevertWhenProxyCloneCodehashNotTrusted() (gas: 2021691)
|
||||
UnstakeTest:test_RevertWhen_FundsLocked() (gas: 461737)
|
||||
UnstakeTest:test_StakeMultipleAccounts() (gas: 556287)
|
||||
UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 564844)
|
||||
UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 942527)
|
||||
UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 571140)
|
||||
UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 595231)
|
||||
UnstakeTest:test_StakeMultipleTimesDoesNotExceedsMaxMP() (gas: 1528413)
|
||||
UnstakeTest:test_StakeMultipleTimesWithLockIncreaseAtSameBlock() (gas: 581459)
|
||||
UnstakeTest:test_StakeMultipleTimesWithLockZeroAfterMaxLock() (gas: 1124111)
|
||||
UnstakeTest:test_StakeOneAccount() (gas: 316384)
|
||||
UnstakeTest:test_StakeOneAccountAndRewards() (gas: 324916)
|
||||
UnstakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 616801)
|
||||
UnstakeTest:test_StakeOneAccountReachingMPLimit() (gas: 503772)
|
||||
UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 337605)
|
||||
UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 338223)
|
||||
UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 338268)
|
||||
UnstakeTest:test_UnstakeBonusMPAndAccuredMP() (gas: 581839)
|
||||
UnstakeTest:test_UnstakeMultipleAccounts() (gas: 796850)
|
||||
UnstakeTest:test_UnstakeMultipleAccountsAndRewards() (gas: 907371)
|
||||
UnstakeTest:test_UnstakeOneAccount() (gas: 545178)
|
||||
UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 544489)
|
||||
UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 468681)
|
||||
UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 570741)
|
||||
UpdateVaultTest:test_UpdateAccount() (gas: 2397297)
|
||||
UpgradeTest:test_RevertWhenNotOwner() (gas: 3696209)
|
||||
UpgradeTest:test_UpgradeStakeManager() (gas: 9769347)
|
||||
VaultRegistrationTest:test_VaultRegistration() (gas: 63138)
|
||||
WithdrawTest:testOwner() (gas: 15296)
|
||||
WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 347979)
|
||||
WithdrawTest:testOwner() (gas: 15365)
|
||||
WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 348908)
|
||||
@@ -1,14 +1,17 @@
|
||||
{
|
||||
"files": [
|
||||
"src/StakeVault.sol",
|
||||
"src/StakeManager.sol",
|
||||
"certora/helpers/ERC20A.sol"
|
||||
"certora/helpers/ERC20A.sol",
|
||||
"certora/harness/StakeManagerHarness.sol"
|
||||
],
|
||||
"link": [
|
||||
"StakeManager:STAKING_TOKEN=ERC20A"
|
||||
"StakeManagerHarness:STAKING_TOKEN=ERC20A"
|
||||
],
|
||||
"loop_iter": "3",
|
||||
"msg": "Verifying StakeManager.sol",
|
||||
"optimistic_loop": true,
|
||||
"parametric_contracts": ["StakeManagerHarness"],
|
||||
"packages": [
|
||||
"forge-std=lib/forge-std/src",
|
||||
"@openzeppelin/contracts=lib/openzeppelin-contracts/contracts",
|
||||
@@ -30,6 +33,6 @@
|
||||
],
|
||||
"rule_sanity": "basic",
|
||||
"server": "production",
|
||||
"verify": "StakeManager:certora/specs/StakeManager.spec"
|
||||
"verify": "StakeManagerHarness:certora/specs/StakeManager.spec"
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
{
|
||||
"files": [
|
||||
"src/StakeVault.sol",
|
||||
"src/StakeManager.sol",
|
||||
"certora/harness/StakeManagerHarness.sol",
|
||||
"certora/helpers/ERC20A.sol"
|
||||
],
|
||||
"link" : [
|
||||
"StakeManager:STAKING_TOKEN=ERC20A"
|
||||
"StakeManagerHarness:STAKING_TOKEN=ERC20A"
|
||||
],
|
||||
"msg": "Verifying StakeManager.sol",
|
||||
"rule_sanity": "basic",
|
||||
"verify": "StakeManager:certora/specs/StakeManager.spec",
|
||||
"verify": "StakeManagerHarness:certora/specs/StakeManager.spec",
|
||||
"parametric_contracts": ["StakeManagerHarness"],
|
||||
"optimistic_loop": true,
|
||||
"loop_iter": "3",
|
||||
"prover_args": ["-backendStrategy singleRace -smt_useLIA false -smt_useNIA true -depth 0 -s [z3:def{randomSeed=1},z3:def{randomSeed=2},z3:def{randomSeed=3},z3:def{randomSeed=4},z3:def{randomSeed=5},z3:def{randomSeed=6},z3:def{randomSeed=7},z3:def{randomSeed=8},z3:def{randomSeed=9},z3:def{randomSeed=10}]"],
|
||||
|
||||
13
certora/harness/StakeManagerHarness.sol
Normal file
13
certora/harness/StakeManagerHarness.sol
Normal file
@@ -0,0 +1,13 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity 0.8.26;
|
||||
|
||||
import { StakeManager } from "../../src/StakeManager.sol";
|
||||
import { IStakeVault } from "../../src/interfaces/IStakeVault.sol";
|
||||
|
||||
contract StakeManagerHarness is StakeManager {
|
||||
function getVaultLockUntil(address vault) public view returns (uint256) {
|
||||
return IStakeVault(vault).lockUntil();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,13 +7,17 @@ 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) envfree;
|
||||
function lastMPUpdatedTime() external returns (uint256) envfree;
|
||||
function updateGlobalState() external;
|
||||
function updateVault(address vaultAddress) external;
|
||||
function getVaultLockUntil(address) external returns (uint256) envfree;
|
||||
function emergencyModeEnabled() external returns (bool) envfree;
|
||||
function leave() external;
|
||||
function Math.mulDiv(uint256 a, uint256 b, uint256 c) internal returns uint256 => mulDivSummary(a,b,c);
|
||||
|
||||
function _.updateLockUntil(uint256 _lockUntil) external => DISPATCHER(true);
|
||||
function _.lockUntil() external => DISPATCHER(true);
|
||||
}
|
||||
|
||||
function mulDivSummary(uint256 a, uint256 b, uint256 c) returns uint256 {
|
||||
@@ -31,22 +35,16 @@ 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);
|
||||
return lockUntil;
|
||||
}
|
||||
|
||||
invariant sumOfBalancesIsTotalStaked()
|
||||
sumOfBalances == to_mathint(totalStaked())
|
||||
filtered {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using StakeManager as streamer;
|
||||
using StakeManagerHarness as streamer;
|
||||
|
||||
function getVaultStakedBalance(address vault) returns uint256 {
|
||||
uint256 stakedBalance;
|
||||
stakedBalance, _, _, _, _, _, _ = streamer.vaultData(vault);
|
||||
stakedBalance, _, _, _, _, _ = streamer.vaultData(vault);
|
||||
return stakedBalance;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@ contract StakeManager is
|
||||
uint256 mpAccrued;
|
||||
uint256 maxMP;
|
||||
uint256 lastMPUpdateTime;
|
||||
uint256 lockUntil;
|
||||
uint256 rewardsAccrued;
|
||||
}
|
||||
|
||||
@@ -186,15 +185,16 @@ contract StakeManager is
|
||||
|
||||
VaultData storage vault = vaultData[msg.sender];
|
||||
|
||||
(uint256 _deltaMpTotal, uint256 _deltaMPMax, uint256 _newLockEnd) =
|
||||
_calculateStake(vault.stakedBalance, vault.maxMP, vault.lockUntil, block.timestamp, amount, lockPeriod);
|
||||
(uint256 _deltaMpTotal, uint256 _deltaMPMax, uint256 _newLockEnd) = _calculateStake(
|
||||
vault.stakedBalance, vault.maxMP, IStakeVault(msg.sender).lockUntil(), block.timestamp, amount, lockPeriod
|
||||
);
|
||||
|
||||
vault.stakedBalance += amount;
|
||||
totalStaked += amount;
|
||||
totalMPStaked += _deltaMpTotal;
|
||||
|
||||
if (lockPeriod != 0) {
|
||||
vault.lockUntil = _newLockEnd;
|
||||
IStakeVault(msg.sender).updateLockUntil(_newLockEnd);
|
||||
}
|
||||
|
||||
vault.mpAccrued += _deltaMpTotal;
|
||||
@@ -224,13 +224,14 @@ contract StakeManager is
|
||||
|
||||
_updateGlobalState();
|
||||
_updateVault(msg.sender, false);
|
||||
(uint256 deltaMp, uint256 newLockEnd) =
|
||||
_calculateLock(vault.stakedBalance, vault.maxMP, vault.lockUntil, block.timestamp, lockPeriod);
|
||||
(uint256 deltaMp, uint256 newLockEnd) = _calculateLock(
|
||||
vault.stakedBalance, vault.maxMP, IStakeVault(msg.sender).lockUntil(), block.timestamp, lockPeriod
|
||||
);
|
||||
|
||||
// Update account state
|
||||
vault.lockUntil = newLockEnd;
|
||||
vault.mpAccrued += deltaMp;
|
||||
vault.maxMP += deltaMp;
|
||||
IStakeVault(msg.sender).updateLockUntil(newLockEnd);
|
||||
|
||||
// Update global state
|
||||
totalMPAccrued += deltaMp;
|
||||
@@ -251,6 +252,9 @@ contract StakeManager is
|
||||
* @param amount The amount of tokens to unstake
|
||||
*/
|
||||
function unstake(uint256 amount) external onlyTrustedCodehash onlyNotEmergencyMode onlyRegisteredVault {
|
||||
if (IStakeVault(msg.sender).lockUntil() > block.timestamp) {
|
||||
revert StakeManager__FundsLocked();
|
||||
}
|
||||
VaultData storage vault = vaultData[msg.sender];
|
||||
_unstake(amount, vault, msg.sender);
|
||||
emit Unstaked(msg.sender, amount);
|
||||
@@ -265,14 +269,11 @@ contract StakeManager is
|
||||
VaultData storage vault = vaultData[msg.sender];
|
||||
|
||||
if (vault.stakedBalance > 0) {
|
||||
//updates lockuntil to allow unstake early
|
||||
vault.lockUntil = block.timestamp;
|
||||
// calling `_unstake` to update accounting accordingly
|
||||
_unstake(vault.stakedBalance, vault, msg.sender);
|
||||
|
||||
// further cleanup that isn't done in `_unstake`
|
||||
vault.rewardIndex = 0;
|
||||
vault.lockUntil = 0;
|
||||
vault.lastMPUpdateTime = 0;
|
||||
}
|
||||
|
||||
@@ -384,8 +385,8 @@ contract StakeManager is
|
||||
newVault.mpAccrued = oldVault.mpAccrued;
|
||||
newVault.maxMP = oldVault.maxMP;
|
||||
newVault.lastMPUpdateTime = oldVault.lastMPUpdateTime;
|
||||
newVault.lockUntil = oldVault.lockUntil;
|
||||
newVault.rewardsAccrued = oldVault.rewardsAccrued;
|
||||
IStakeVault(migrateTo).updateLockUntil(IStakeVault(msg.sender).lockUntil());
|
||||
|
||||
delete vaultData[msg.sender];
|
||||
|
||||
@@ -445,9 +446,8 @@ contract StakeManager is
|
||||
_updateGlobalState();
|
||||
_updateVault(vaultAddress, false);
|
||||
|
||||
(uint256 _deltaMpTotal, uint256 _deltaMpMax) = _calculateUnstake(
|
||||
vault.stakedBalance, vault.lockUntil, block.timestamp, vault.mpAccrued, vault.maxMP, amount
|
||||
);
|
||||
(uint256 _deltaMpTotal, uint256 _deltaMpMax) =
|
||||
_calculateUnstake(vault.stakedBalance, vault.mpAccrued, vault.maxMP, amount);
|
||||
vault.stakedBalance -= amount;
|
||||
vault.maxMP -= _deltaMpMax;
|
||||
vault.rewardIndex = lastRewardIndex;
|
||||
@@ -457,10 +457,6 @@ contract StakeManager is
|
||||
totalMPAccrued -= _deltaMpTotal;
|
||||
totalMaxMP -= _deltaMpMax;
|
||||
totalStaked -= amount;
|
||||
|
||||
// if the user can unstake it means the lock period has ended
|
||||
// and we can reset lockUntil
|
||||
vault.lockUntil = 0;
|
||||
}
|
||||
|
||||
function _totalShares() internal view returns (uint256) {
|
||||
|
||||
@@ -23,6 +23,8 @@ contract StakeVault is IStakeVault, Initializable, OwnableUpgradeable {
|
||||
error StakeVault__InvalidDestinationAddress();
|
||||
/// @notice Emitted when staking was unsuccessful
|
||||
error StakeVault__StakingFailed();
|
||||
/// @notice Emitted when the funds are locked
|
||||
error StakeVault__FundsLocked();
|
||||
/// @notice Emitted when unstaking was unsuccessful
|
||||
error StakeVault__UnstakingFailed();
|
||||
/// @notice Emitted when not allowed to exit the system
|
||||
@@ -33,6 +35,10 @@ contract StakeVault is IStakeVault, Initializable, OwnableUpgradeable {
|
||||
error StakeVault__StakeManagerImplementationNotTrusted();
|
||||
/// @notice Emitted when migration failed
|
||||
error StakeVault__MigrationFailed();
|
||||
/// @notice Emitted when the caller is not the owner of the vault
|
||||
error StakeVault__NotAuthorized();
|
||||
/// @notice Emitted when withdrawing funds from vault fails
|
||||
error StakeVault__WithdrawFromVaultFailed();
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
STATE VARIABLES
|
||||
@@ -44,6 +50,8 @@ contract StakeVault is IStakeVault, Initializable, OwnableUpgradeable {
|
||||
IStakeManagerProxy public stakeManager;
|
||||
/// @notice Address of the trusted stake manager implementation
|
||||
address public stakeManagerImplementationAddress;
|
||||
/// @notice Timestamp until the funds are locked
|
||||
uint256 public lockUntil;
|
||||
|
||||
modifier validDestination(address _destination) {
|
||||
if (_destination == address(0)) {
|
||||
@@ -199,9 +207,13 @@ contract StakeVault is IStakeVault, Initializable, OwnableUpgradeable {
|
||||
// If it was a benign upgrade, it will cause the stake manager to properly update
|
||||
// its internal accounting before we move the funds out.
|
||||
try stakeManager.leave() {
|
||||
STAKING_TOKEN.transfer(_destination, STAKING_TOKEN.balanceOf(address(this)));
|
||||
if (lockUntil <= block.timestamp) {
|
||||
STAKING_TOKEN.transfer(_destination, STAKING_TOKEN.balanceOf(address(this)));
|
||||
}
|
||||
} catch {
|
||||
STAKING_TOKEN.transfer(_destination, STAKING_TOKEN.balanceOf(address(this)));
|
||||
if (lockUntil <= block.timestamp) {
|
||||
STAKING_TOKEN.transfer(_destination, STAKING_TOKEN.balanceOf(address(this)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,6 +264,23 @@ contract StakeVault is IStakeVault, Initializable, OwnableUpgradeable {
|
||||
_withdraw(_token, _amount, _destination);
|
||||
}
|
||||
|
||||
function withdrawFromVault(
|
||||
uint256 _amount,
|
||||
address _destination
|
||||
)
|
||||
external
|
||||
onlyOwner
|
||||
validDestination(_destination)
|
||||
{
|
||||
if (lockUntil > block.timestamp) {
|
||||
revert StakeVault__FundsLocked();
|
||||
}
|
||||
bool success = STAKING_TOKEN.transfer(_destination, _amount);
|
||||
if (!success) {
|
||||
revert StakeVault__WithdrawFromVaultFailed();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @notice Returns the available amount of a token that can be withdrawn.
|
||||
* @dev Returns only excess amount if token is staking token.
|
||||
@@ -265,6 +294,18 @@ contract StakeVault is IStakeVault, Initializable, OwnableUpgradeable {
|
||||
return _token.balanceOf(address(this));
|
||||
}
|
||||
|
||||
/**
|
||||
* @notice Updates the lock until timestamp.
|
||||
* @dev This function is only callable by the trusted stake manager.
|
||||
* @param _lockUntil The new lock until timestamp.
|
||||
*/
|
||||
function updateLockUntil(uint256 _lockUntil) external onlyTrustedStakeManager {
|
||||
if (msg.sender != address(stakeManager)) {
|
||||
revert StakeVault__NotAuthorized();
|
||||
}
|
||||
lockUntil = _lockUntil;
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
INTERNAL FUNCTIONS
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
@@ -33,6 +33,8 @@ interface IStakeManager is ITrustedCodehashAccess, IStakeConstants {
|
||||
error StakeManager__InsufficientBalance();
|
||||
/// @notice Emitted when the reward period has not ended.
|
||||
error StakeManager__RewardPeriodNotEnded();
|
||||
/// @notice Emitted when trying to unstake and funds are locked
|
||||
error StakeManager__FundsLocked();
|
||||
|
||||
/// @notice Emitted when a vault is registered.
|
||||
event VaultRegistered(address indexed vault, address indexed owner);
|
||||
|
||||
@@ -7,4 +7,6 @@ interface IStakeVault {
|
||||
function owner() external view returns (address);
|
||||
function stakeManager() external view returns (IStakeManagerProxy);
|
||||
function register() external;
|
||||
function lockUntil() external view returns (uint256);
|
||||
function updateLockUntil(uint256 newLockUntil) external;
|
||||
}
|
||||
|
||||
@@ -120,8 +120,6 @@ abstract contract StakeMath is MultiplierPointMath {
|
||||
/**
|
||||
*
|
||||
* @param _balance Account current balance
|
||||
* @param _currentLockEndTime Account current lock end timestamp
|
||||
* @param _processTime Process current timestamp
|
||||
* @param _currentTotalMP Account current total multiplier points
|
||||
* @param _currentMaxMP Account current max multiplier points
|
||||
* @param _reducedAmount Reduced amount of balance
|
||||
@@ -130,8 +128,6 @@ abstract contract StakeMath is MultiplierPointMath {
|
||||
*/
|
||||
function _calculateUnstake(
|
||||
uint256 _balance,
|
||||
uint256 _currentLockEndTime,
|
||||
uint256 _processTime,
|
||||
uint256 _currentTotalMP,
|
||||
uint256 _currentMaxMP,
|
||||
uint256 _reducedAmount
|
||||
@@ -146,9 +142,6 @@ abstract contract StakeMath is MultiplierPointMath {
|
||||
if (_reducedAmount > _balance) {
|
||||
revert StakeMath__InsufficientBalance();
|
||||
}
|
||||
if (_currentLockEndTime > _processTime) {
|
||||
revert StakeMath__FundsLocked();
|
||||
}
|
||||
_deltaMpTotal = _reduceMP(_balance, _currentTotalMP, _reducedAmount);
|
||||
_deltaMpMax = _reduceMP(_balance, _currentMaxMP, _reducedAmount);
|
||||
}
|
||||
|
||||
@@ -1392,6 +1392,22 @@ contract UnstakeTest is StakeTest {
|
||||
super.setUp();
|
||||
}
|
||||
|
||||
function test_RevertWhen_FundsLocked() public {
|
||||
uint256 stakeAmount = 10e18;
|
||||
uint256 lockUpPeriod = streamer.MIN_LOCKUP_PERIOD();
|
||||
|
||||
_stake(alice, stakeAmount, lockUpPeriod);
|
||||
|
||||
// Alice tries to unstake before lock up period has expired
|
||||
vm.expectRevert(IStakeManager.StakeManager__FundsLocked.selector);
|
||||
_unstake(alice, stakeAmount);
|
||||
|
||||
vm.warp(vm.getBlockTimestamp() + lockUpPeriod);
|
||||
|
||||
// Alice unstake after lock up period has expired
|
||||
_unstake(alice, stakeAmount);
|
||||
}
|
||||
|
||||
function test_UnstakeOneAccount() public {
|
||||
test_StakeOneAccount();
|
||||
|
||||
@@ -2317,6 +2333,31 @@ contract LeaveTest is StakeManagerTest {
|
||||
assertEq(stakingToken.balanceOf(alice), aliceInitialBalance, "Alice has all her funds back");
|
||||
}
|
||||
|
||||
function test_LeaveShouldKeepFundsLockedInStakeVault() public {
|
||||
uint256 aliceInitialBalance = stakingToken.balanceOf(alice);
|
||||
uint256 stakeAmount = 10e18;
|
||||
uint256 lockUpPeriod = streamer.MIN_LOCKUP_PERIOD();
|
||||
|
||||
_stake(alice, stakeAmount, lockUpPeriod);
|
||||
|
||||
assertEq(stakingToken.balanceOf(alice), aliceInitialBalance - stakeAmount, "Alice should have staked tokens");
|
||||
|
||||
_upgradeStakeManager();
|
||||
_leave(alice);
|
||||
|
||||
assertEq(
|
||||
stakingToken.balanceOf(alice), aliceInitialBalance - stakeAmount, "Alice still doesn't have her funds back"
|
||||
);
|
||||
|
||||
vm.warp(block.timestamp + lockUpPeriod);
|
||||
|
||||
vm.prank(alice);
|
||||
StakeVault vault = StakeVault(vaults[alice]);
|
||||
vault.withdrawFromVault(stakeAmount, alice);
|
||||
|
||||
assertEq(stakingToken.balanceOf(alice), aliceInitialBalance, "Alice has withdrawn her funds");
|
||||
}
|
||||
|
||||
function test_TrustNewStakeManager() public {
|
||||
// first, upgrade to new stake manager, marking it as not trusted
|
||||
_upgradeStakeManager();
|
||||
@@ -2897,7 +2938,7 @@ contract FuzzTests is StakeManagerTest {
|
||||
vaultData.rewardsAccrued, p.rewardsAccrued, string(abi.encodePacked(text, "wrong account rewards accrued"))
|
||||
);
|
||||
assertEq(
|
||||
vaultData.lockUntil,
|
||||
StakeVault(p.account).lockUntil(),
|
||||
expectedVaultLockState[p.account].lockEnd,
|
||||
string(abi.encodePacked(text, "wrong account lock end"))
|
||||
);
|
||||
@@ -2954,19 +2995,18 @@ contract FuzzTests is StakeManagerTest {
|
||||
}
|
||||
|
||||
function _expectUnstake(address account, uint256 amount) internal {
|
||||
CheckVaultParams storage expectedAccountParams = expectedAccountState[account];
|
||||
expectedAccountParams.account = vaults[account];
|
||||
if (expectedVaultLockState[expectedAccountParams.account].lockEnd >= vm.getBlockTimestamp()) {
|
||||
expectedRevert = IStakeManager.StakeManager__FundsLocked.selector;
|
||||
return;
|
||||
}
|
||||
if (amount == 0) {
|
||||
expectedRevert = StakeMath.StakeMath__InvalidAmount.selector;
|
||||
return;
|
||||
}
|
||||
CheckVaultParams storage expectedAccountParams = expectedAccountState[account];
|
||||
if (amount > expectedAccountParams.stakedBalance) {
|
||||
expectedRevert = StakeMath.StakeMath__InsufficientBalance.selector;
|
||||
console.log("no balance");
|
||||
return;
|
||||
}
|
||||
if (expectedVaultLockState[expectedAccountParams.account].lockEnd >= vm.getBlockTimestamp()) {
|
||||
expectedRevert = StakeMath.StakeMath__FundsLocked.selector;
|
||||
console.log("locked");
|
||||
return;
|
||||
}
|
||||
expectedRevert = NO_REVERT;
|
||||
@@ -2987,6 +3027,7 @@ contract FuzzTests is StakeManagerTest {
|
||||
|
||||
function _expectAccrue(address account, uint256 accruedTime) internal {
|
||||
CheckVaultParams storage expectedAccountParams = expectedAccountState[account];
|
||||
expectedAccountParams.account = vaults[account];
|
||||
if (expectedAccountParams.vaultBalance > 0) {
|
||||
uint256 rawAccruedMP = _accrueMP(expectedAccountParams.vaultBalance, accruedTime);
|
||||
expectedAccountParams.mpAccrued =
|
||||
@@ -3001,6 +3042,7 @@ contract FuzzTests is StakeManagerTest {
|
||||
|
||||
function _expectStake(address account, uint256 stakeAmount, uint256 lockUpPeriod) internal {
|
||||
CheckVaultParams storage expectedAccountParams = expectedAccountState[account];
|
||||
expectedAccountParams.account = vaults[account];
|
||||
uint256 calcLockEnd = Math.max(
|
||||
expectedVaultLockState[expectedAccountParams.account].lockEnd, vm.getBlockTimestamp()
|
||||
) + lockUpPeriod;
|
||||
@@ -3012,7 +3054,6 @@ contract FuzzTests is StakeManagerTest {
|
||||
expectedRevert = StakeMath.StakeMath__AbsoluteMaxMPOverflow.selector;
|
||||
} else {
|
||||
expectedRevert = NO_REVERT;
|
||||
expectedAccountParams.account = vaults[account];
|
||||
uint256 expectedBonusMP = _bonusMP(stakeAmount, calcLockUpPeriod);
|
||||
uint256 expectedMaxTotalMP = _maxTotalMP(stakeAmount, calcLockUpPeriod);
|
||||
if (expectedVaultLockState[expectedAccountParams.account].lockEnd > vm.getBlockTimestamp()) {
|
||||
|
||||
Reference in New Issue
Block a user