diff --git a/.gas-report b/.gas-report index 0b1f545..8ddc0f4 100644 --- a/.gas-report +++ b/.gas-report @@ -3,15 +3,15 @@ | Deployment Cost | Deployment Size | | | | | | 6200681 | 29704 | | | | | | Function Name | min | avg | median | max | # calls | -| run | 5302574 | 5302574 | 5302574 | 5302574 | 57 | +| run | 5302574 | 5302574 | 5302574 | 5302574 | 63 | | script/DeploymentConfig.s.sol:DeploymentConfig contract | | | | | | |---------------------------------------------------------|-----------------|-----|--------|-----|---------| | Deployment Cost | Deployment Size | | | | | -| 0 | 0 | | | | | +| 0 | 7132 | | | | | | Function Name | min | avg | median | max | # calls | -| activeNetworkConfig | 454 | 454 | 454 | 454 | 114 | +| activeNetworkConfig | 454 | 454 | 454 | 454 | 126 | | src/RewardsStreamer.sol:RewardsStreamer contract | | | | | | @@ -33,11 +33,11 @@ | Deployment Cost | Deployment Size | | | | | | 2525879 | 11640 | | | | | | Function Name | min | avg | median | max | # calls | -| MAX_LOCKUP_PERIOD | 349 | 349 | 349 | 349 | 4 | -| MAX_MULTIPLIER | 251 | 251 | 251 | 251 | 11 | -| MIN_LOCKUP_PERIOD | 297 | 297 | 297 | 297 | 11 | -| MP_RATE_PER_YEAR | 253 | 253 | 253 | 253 | 3 | -| STAKING_TOKEN | 428 | 2037 | 2428 | 2428 | 292 | +| MAX_LOCKUP_PERIOD | 349 | 349 | 349 | 349 | 6 | +| MAX_MULTIPLIER | 251 | 251 | 251 | 251 | 33 | +| MIN_LOCKUP_PERIOD | 297 | 297 | 297 | 297 | 15 | +| MP_RATE_PER_YEAR | 253 | 253 | 253 | 253 | 9 | +| STAKING_TOKEN | 428 | 2036 | 2428 | 2428 | 322 | | emergencyModeEnabled | 2420 | 2420 | 2420 | 2420 | 7 | | enableEmergencyMode | 2485 | 19392 | 24677 | 24677 | 8 | | getAccount | 1661 | 1661 | 1661 | 1661 | 72 | @@ -46,17 +46,17 @@ | getUserTotalMaxMP | 3123 | 3123 | 3123 | 3123 | 1 | | getUserTotalStakedBalance | 15118 | 15118 | 15118 | 15118 | 1 | | getUserVaults | 5201 | 5201 | 5201 | 5201 | 4 | -| initialize | 115611 | 115611 | 115611 | 115611 | 59 | +| initialize | 115611 | 115611 | 115611 | 115611 | 65 | | lastRewardTime | 395 | 1395 | 1395 | 2395 | 2 | | leave | 56244 | 56244 | 56244 | 56244 | 1 | | lock | 12063 | 34172 | 16480 | 73975 | 3 | | proxiableUUID | 331 | 331 | 331 | 331 | 3 | -| registerVault | 55866 | 72745 | 72966 | 72966 | 233 | +| registerVault | 55866 | 72766 | 72966 | 72966 | 257 | | rewardEndTime | 373 | 1373 | 1373 | 2373 | 2 | | rewardStartTime | 352 | 1352 | 1352 | 2352 | 2 | | rewardsBalanceOf | 1317 | 1317 | 1317 | 1317 | 4 | | setReward | 2583 | 50892 | 60278 | 102595 | 7 | -| setTrustedCodehash | 24243 | 24310 | 24243 | 26243 | 59 | +| setTrustedCodehash | 24243 | 24304 | 24243 | 26243 | 65 | | stake | 131082 | 170202 | 177899 | 198232 | 66 | | totalMP | 373 | 373 | 373 | 373 | 81 | | totalMaxMP | 350 | 350 | 350 | 350 | 81 | @@ -69,39 +69,13 @@ | upgradeToAndCall | 3225 | 9387 | 10926 | 10936 | 5 | -| src/StakeManagerProxy.sol:StakeManagerProxy contract | | | | | | -|------------------------------------------------------|-----------------|-------|--------|--------|---------| -| Deployment Cost | Deployment Size | | | | | -| 256467 | 1263 | | | | | -| Function Name | min | avg | median | max | # calls | -| MAX_LOCKUP_PERIOD | 5276 | 5276 | 5276 | 5276 | 4 | -| MAX_MULTIPLIER | 678 | 3132 | 5178 | 5178 | 11 | -| MIN_LOCKUP_PERIOD | 724 | 3996 | 5224 | 5224 | 11 | -| MP_RATE_PER_YEAR | 680 | 680 | 680 | 680 | 3 | -| STAKING_TOKEN | 855 | 6086 | 7355 | 7355 | 292 | -| emergencyModeEnabled | 7347 | 7347 | 7347 | 7347 | 7 | -| enableEmergencyMode | 28480 | 45381 | 50665 | 50665 | 8 | -| getAccount | 2115 | 2115 | 2115 | 2115 | 72 | -| getStakedBalance | 7559 | 7559 | 7559 | 7559 | 1 | -| getUserTotalMP | 9660 | 9660 | 9660 | 9660 | 1 | -| getUserTotalMaxMP | 3553 | 3553 | 3553 | 3553 | 1 | -| getUserTotalStakedBalance | 15548 | 15548 | 15548 | 15548 | 1 | -| getUserVaults | 5637 | 6762 | 5637 | 10137 | 4 | -| implementation | 343 | 808 | 343 | 2343 | 382 | -| lastRewardTime | 822 | 1822 | 1822 | 2822 | 2 | -| rewardEndTime | 800 | 1800 | 1800 | 2800 | 2 | -| rewardStartTime | 779 | 4029 | 4029 | 7279 | 2 | -| rewardsBalanceOf | 1747 | 1747 | 1747 | 1747 | 4 | -| setReward | 28863 | 77206 | 86636 | 128881 | 7 | -| setTrustedCodehash | 52889 | 52889 | 52889 | 52889 | 2 | -| totalMP | 800 | 800 | 800 | 800 | 81 | -| totalMaxMP | 777 | 777 | 777 | 777 | 81 | -| totalRewardsAccrued | 800 | 800 | 800 | 800 | 3 | -| totalRewardsSupply | 1387 | 2498 | 2151 | 11627 | 30 | -| totalStaked | 823 | 823 | 823 | 823 | 82 | -| updateAccountMP | 41755 | 44833 | 44257 | 61357 | 21 | -| updateGlobalState | 37076 | 54033 | 51237 | 136272 | 21 | -| upgradeToAndCall | 29868 | 36025 | 37562 | 37572 | 5 | +| src/StakeManagerProxy.sol:StakeManagerProxy contract | | | | | | +|------------------------------------------------------|-----------------|------|--------|--------|---------| +| Deployment Cost | Deployment Size | | | | | +| 256467 | 1231 | | | | | +| Function Name | min | avg | median | max | # calls | +| fallback | 678 | 7210 | 2115 | 136272 | 823 | +| implementation | 343 | 775 | 343 | 2343 | 412 | | src/StakeVault.sol:StakeVault contract | | | | | | @@ -113,10 +87,10 @@ | emergencyExit | 36375 | 48879 | 48113 | 65213 | 7 | | leave | 33507 | 131439 | 60635 | 370978 | 4 | | lock | 33245 | 60677 | 50845 | 107772 | 4 | -| owner | 2339 | 2339 | 2339 | 2339 | 233 | -| register | 87015 | 103894 | 104115 | 104115 | 233 | +| owner | 2339 | 2339 | 2339 | 2339 | 257 | +| register | 87015 | 103915 | 104115 | 104115 | 257 | | stake | 33411 | 241491 | 252403 | 272784 | 67 | -| stakeManager | 368 | 368 | 368 | 368 | 233 | +| stakeManager | 368 | 368 | 368 | 368 | 257 | | trustStakeManager | 28953 | 28953 | 28953 | 28953 | 1 | | unstake | 33282 | 96630 | 102062 | 109909 | 14 | | withdraw | 42289 | 42289 | 42289 | 42289 | 1 | @@ -195,9 +169,9 @@ | Deployment Cost | Deployment Size | | | | | | 625454 | 3260 | | | | | | Function Name | min | avg | median | max | # calls | -| approve | 46330 | 46339 | 46342 | 46342 | 238 | +| approve | 46330 | 46339 | 46342 | 46342 | 262 | | balanceOf | 558 | 989 | 558 | 2558 | 139 | -| mint | 51279 | 56523 | 51279 | 68379 | 251 | +| mint | 51279 | 56438 | 51279 | 68379 | 275 | | transfer | 34384 | 42934 | 42934 | 51484 | 2 | diff --git a/.gas-snapshot b/.gas-snapshot index 70f4f78..dfc4dbe 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,19 +1,25 @@ EmergencyExitTest:test_CannotEnableEmergencyModeTwice() (gas: 92690) -EmergencyExitTest:test_CannotLeaveBeforeEmergencyMode() (gas: 297717) +EmergencyExitTest:test_CannotLeaveBeforeEmergencyMode() (gas: 297695) EmergencyExitTest:test_EmergencyExitBasic() (gas: 384455) -EmergencyExitTest:test_EmergencyExitMultipleUsers() (gas: 659210) +EmergencyExitTest:test_EmergencyExitMultipleUsers() (gas: 659275) EmergencyExitTest:test_EmergencyExitToAlternateAddress() (gas: 392374) -EmergencyExitTest:test_EmergencyExitWithLock() (gas: 391784) +EmergencyExitTest:test_EmergencyExitWithLock() (gas: 391762) EmergencyExitTest:test_EmergencyExitWithRewards() (gas: 377316) -EmergencyExitTest:test_OnlyOwnerCanEnableEmergencyMode() (gas: 39430) +EmergencyExitTest:test_OnlyOwnerCanEnableEmergencyMode() (gas: 39426) IntegrationTest:testStakeFoo() (gas: 1178499) LeaveTest:test_LeaveShouldProperlyUpdateAccounting() (gas: 2960876) LeaveTest:test_RevertWhenStakeManagerIsTrusted() (gas: 294826) -LeaveTest:test_TrustNewStakeManager() (gas: 3038518) +LeaveTest:test_TrustNewStakeManager() (gas: 3036018) LockTest:test_LockFailsWithInvalidPeriod() (gas: 309911) -LockTest:test_LockFailsWithNoStake() (gas: 63708) -LockTest:test_LockWithoutPriorLock() (gas: 385937) +LockTest:test_LockFailsWithNoStake() (gas: 63730) +LockTest:test_LockWithoutPriorLock() (gas: 385915) MaliciousUpgradeTest:test_UpgradeStackOverflowStakeManager() (gas: 1745333) +MathTest:test_CalcAbsoluteMaxTotalMP() (gas: 18908) +MathTest:test_CalcAccrueMP() (gas: 22207) +MathTest:test_CalcBonusMP() (gas: 17713) +MathTest:test_CalcInitialMP() (gas: 5395) +MathTest:test_CalcMaxAccruedMP() (gas: 15586) +MathTest:test_CalcMaxTotalMP() (gas: 23298) MultipleVaultsStakeTest:test_StakeMultipleVaults() (gas: 716776) NFTMetadataGeneratorSVGTest:testGenerateMetadata() (gas: 85934) NFTMetadataGeneratorSVGTest:testSetImageStrings() (gas: 58332) @@ -23,46 +29,46 @@ NFTMetadataGeneratorURLTest:testSetBaseURL() (gas: 49555) NFTMetadataGeneratorURLTest:testSetBaseURLRevert() (gas: 35979) RewardsStreamerMP_RewardsTest:testRewardsBalanceOf() (gas: 670670) RewardsStreamerMP_RewardsTest:testSetRewards() (gas: 160274) -RewardsStreamerMP_RewardsTest:testSetRewards_RevertsBadAmount() (gas: 39339) -RewardsStreamerMP_RewardsTest:testSetRewards_RevertsBadDuration() (gas: 39362) +RewardsStreamerMP_RewardsTest:testSetRewards_RevertsBadAmount() (gas: 39404) +RewardsStreamerMP_RewardsTest:testSetRewards_RevertsBadDuration() (gas: 39340) RewardsStreamerMP_RewardsTest:testSetRewards_RevertsNotAuthorized() (gas: 39375) -RewardsStreamerMP_RewardsTest:testTotalRewardsSupply() (gas: 610684) +RewardsStreamerMP_RewardsTest:testTotalRewardsSupply() (gas: 610662) RewardsStreamerTest:testStake() (gas: 869181) StakeTest:test_StakeMultipleAccounts() (gas: 494442) StakeTest:test_StakeMultipleAccountsAndRewards() (gas: 500380) -StakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 830635) -StakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 507518) -StakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 529355) +StakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 830612) +StakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 510842) +StakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 532885) StakeTest:test_StakeOneAccount() (gas: 276933) -StakeTest:test_StakeOneAccountAndRewards() (gas: 282902) -StakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 499586) -StakeTest:test_StakeOneAccountReachingMPLimit() (gas: 494699) -StakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 296811) -StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 296745) -StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 296812) +StakeTest:test_StakeOneAccountAndRewards() (gas: 282880) +StakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 499564) +StakeTest:test_StakeOneAccountReachingMPLimit() (gas: 493508) +StakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 296788) +StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 298477) +StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 298544) StakingTokenTest:testStakeToken() (gas: 10422) UnstakeTest:test_StakeMultipleAccounts() (gas: 494464) -UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 500380) -UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 830612) -UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 507540) -UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 529377) +UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 500402) +UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 830634) +UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 510841) +UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 532907) UnstakeTest:test_StakeOneAccount() (gas: 276956) UnstakeTest:test_StakeOneAccountAndRewards() (gas: 282924) UnstakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 499608) -UnstakeTest:test_StakeOneAccountReachingMPLimit() (gas: 494679) -UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 296811) -UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 296745) -UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 296856) -UnstakeTest:test_UnstakeBonusMPAndAccuredMP() (gas: 536198) +UnstakeTest:test_StakeOneAccountReachingMPLimit() (gas: 493510) +UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 296788) +UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 298477) +UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 298543) +UnstakeTest:test_UnstakeBonusMPAndAccuredMP() (gas: 537915) UnstakeTest:test_UnstakeMultipleAccounts() (gas: 692599) UnstakeTest:test_UnstakeMultipleAccountsAndRewards() (gas: 786234) UnstakeTest:test_UnstakeOneAccount() (gas: 472857) UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 494565) UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 404122) -UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 516307) -UpgradeTest:test_RevertWhenNotOwner() (gas: 2602182) -UpgradeTest:test_UpgradeStakeManager() (gas: 2875621) -VaultRegistrationTest:test_VaultRegistration() (gas: 62035) +UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 523042) +UpgradeTest:test_RevertWhenNotOwner() (gas: 2602178) +UpgradeTest:test_UpgradeStakeManager() (gas: 2875664) +VaultRegistrationTest:test_VaultRegistration() (gas: 62013) WithdrawTest:test_CannotWithdrawStakedFunds() (gas: 310550) XPNFTTokenTest:testApproveNotAllowed() (gas: 10500) XPNFTTokenTest:testGetApproved() (gas: 10523) diff --git a/test/RewardsStreamerMP.t.sol b/test/RewardsStreamerMP.t.sol index 8595da2..f0cee0d 100644 --- a/test/RewardsStreamerMP.t.sol +++ b/test/RewardsStreamerMP.t.sol @@ -132,19 +132,96 @@ contract RewardsStreamerMPTest is Test { vault.leave(account); } - function _calculateBonusMP(uint256 amount, uint256 lockupTime) public view returns (uint256) { + function _calculeInitialMP(uint256 amount) internal pure returns (uint256) { + return amount; + } + + function _calculateMaxAccruedMP(uint256 amount) internal view returns (uint256) { + return amount * streamer.MAX_MULTIPLIER(); + } + + function _calculateAbsoluteMaxTotalMP(uint256 amount) internal view returns (uint256) { + return _calculeInitialMP(amount) + _calculateBonusMP(amount, streamer.MAX_LOCKUP_PERIOD()) + + _calculateMaxAccruedMP(amount); + } + + function _calculateMaxTotalMP(uint256 amount, uint256 lockPeriod) internal view returns (uint256 maxTotalMaxMP) { + uint256 bonusMP = 0; + if (lockPeriod != 0) { + bonusMP = _calculateBonusMP(amount, lockPeriod); + } + return _calculeInitialMP(amount) + bonusMP + _calculateMaxAccruedMP(amount); + } + + function _calculateBonusMP(uint256 amount, uint256 lockupTime) internal view returns (uint256) { // solhint-disable-next-line return Math.mulDiv(amount, lockupTime, 365 days); } - function _calculeAccuredMP(uint256 totalStaked, uint256 timeDiff) public view returns (uint256) { + function _calculateAccuredMP(uint256 totalStaked, uint256 timeDiff) internal view returns (uint256) { return Math.mulDiv(timeDiff * totalStaked, streamer.MP_RATE_PER_YEAR(), 365 days); } - function _calculateTimeToMPLimit(uint256 amount) public view returns (uint256) { + function _calculateTimeToAccureMPLimit(uint256 amount) internal view returns (uint256) { uint256 maxMP = amount * streamer.MAX_MULTIPLIER(); + uint256 timeInSeconds = _calculateTimeToAccureMP(amount, maxMP); + return timeInSeconds; + } + + function _calculateTimeToAccureMP(uint256 amount, uint256 target) internal view returns (uint256) { uint256 mpPerYear = amount * streamer.MP_RATE_PER_YEAR(); - return maxMP * 365 days / mpPerYear; + return target * 365 days / mpPerYear; + } +} + +contract MathTest is RewardsStreamerMPTest { + function test_CalcInitialMP() public { + assertEq(_calculeInitialMP(1), 1, "wrong initial MP"); + assertEq(_calculeInitialMP(10e18), 10e18, "wrong initial MP"); + assertEq(_calculeInitialMP(20e18), 20e18, "wrong initial MP"); + assertEq(_calculeInitialMP(30e18), 30e18, "wrong initial MP"); + } + + function test_CalcAccrueMP() public { + assertEq(_calculateAccuredMP(10e18, 0), 0, "wrong accrued MP"); + assertEq(_calculateAccuredMP(10e18, 365 days / 2), 5e18, "wrong accrued MP"); + assertEq(_calculateAccuredMP(10e18, 365 days), 10e18, "wrong accrued MP"); + assertEq(_calculateAccuredMP(10e18, 365 days * 2), 20e18, "wrong accrued MP"); + assertEq(_calculateAccuredMP(10e18, 365 days * 3), 30e18, "wrong accrued MP"); + } + + function test_CalcBonusMP() public { + assertEq(_calculateBonusMP(10e18, 0), 0, "wrong bonus MP"); + assertEq(_calculateBonusMP(10e18, streamer.MIN_LOCKUP_PERIOD()), 2_465_753_424_657_534_246, "wrong bonus MP"); + assertEq( + _calculateBonusMP(10e18, streamer.MIN_LOCKUP_PERIOD() + 13 days), + 2_821_917_808_219_178_082, + "wrong bonus MP" + ); + assertEq(_calculateBonusMP(100e18, 0), 0, "wrong bonus MP"); + } + + function test_CalcMaxTotalMP() public { + assertEq(_calculateMaxTotalMP(10e18, 0), 50e18, "wrong max total MP"); + assertEq( + _calculateMaxTotalMP(10e18, streamer.MIN_LOCKUP_PERIOD()), 52_465_753_424_657_534_246, "wrong max total MP" + ); + assertEq( + _calculateMaxTotalMP(10e18, streamer.MIN_LOCKUP_PERIOD() + 13 days), + 52_821_917_808_219_178_082, + "wrong max total MP" + ); + assertEq(_calculateMaxTotalMP(100e18, 0), 500e18, "wrong max total MP"); + } + + function test_CalcAbsoluteMaxTotalMP() public { + assertEq(_calculateAbsoluteMaxTotalMP(10e18), 90e18, "wrong absolute max total MP"); + assertEq(_calculateAbsoluteMaxTotalMP(100e18), 900e18, "wrong absolute max total MP"); + } + + function test_CalcMaxAccruedMP() public { + assertEq(_calculateMaxAccruedMP(10e18), 40e18, "wrong max accrued MP"); + assertEq(_calculateMaxAccruedMP(100e18), 400e18, "wrong max accrued MP"); } } @@ -580,13 +657,14 @@ contract StakeTest is RewardsStreamerMPTest { uint256 expectedBonusMP = _calculateBonusMP(stakeAmount, lockUpPeriod); _stake(alice, stakeAmount, lockUpPeriod); + uint256 expectedMaxTotalMP = _calculateMaxTotalMP(stakeAmount, lockUpPeriod); checkStreamer( CheckStreamerParams({ totalStaked: stakeAmount, // 10e18 + (amount * (lockPeriod * MAX_MULTIPLIER * SCALE_FACTOR / MAX_LOCKUP_PERIOD) / SCALE_FACTOR) totalMP: stakeAmount + expectedBonusMP, - totalMaxMP: 52_465_753_424_657_534_246, + totalMaxMP: expectedMaxTotalMP, stakingBalance: stakeAmount, rewardBalance: 0, rewardIndex: 0 @@ -620,13 +698,14 @@ contract StakeTest is RewardsStreamerMPTest { uint256 expectedBonusMP = _calculateBonusMP(stakeAmount, lockUpPeriod); _stake(alice, stakeAmount, lockUpPeriod); + uint256 expectedMaxTotalMP = _calculateMaxTotalMP(stakeAmount, lockUpPeriod); checkStreamer( CheckStreamerParams({ totalStaked: stakeAmount, // 10 + (amount * (lockPeriod * MAX_MULTIPLIER * SCALE_FACTOR / MAX_LOCKUP_PERIOD) / SCALE_FACTOR) totalMP: stakeAmount + expectedBonusMP, - totalMaxMP: 52_821_917_808_219_178_082, + totalMaxMP: expectedMaxTotalMP, stakingBalance: stakeAmount, rewardBalance: 0, rewardIndex: 0 @@ -748,7 +827,7 @@ contract StakeTest is RewardsStreamerMPTest { ); uint256 currentTime = vm.getBlockTimestamp(); - uint256 timeToMaxMP = _calculateTimeToMPLimit(stakeAmount); + uint256 timeToMaxMP = _calculateTimeToAccureMP(stakeAmount, totalMaxMP - totalMP); vm.warp(currentTime + timeToMaxMP); streamer.updateGlobalState(); @@ -911,12 +990,13 @@ contract StakeTest is RewardsStreamerMPTest { uint256 sumOfStakeAmount = aliceStakeAmount + bobStakeAmount; uint256 sumOfExpectedBonusMP = aliceExpectedBonusMP + bobExpectedBonusMP; - + uint256 expectedMaxTotalMP = _calculateMaxTotalMP(aliceStakeAmount, aliceLockUpPeriod) + + _calculateMaxTotalMP(bobStakeAmount, bobLockUpPeriod); checkStreamer( CheckStreamerParams({ totalStaked: sumOfStakeAmount, totalMP: sumOfStakeAmount + sumOfExpectedBonusMP, - totalMaxMP: 202_465_753_424_657_534_246, + totalMaxMP: expectedMaxTotalMP, stakingBalance: sumOfStakeAmount, rewardBalance: 0, rewardIndex: 0 @@ -941,12 +1021,14 @@ contract StakeTest is RewardsStreamerMPTest { uint256 sumOfStakeAmount = aliceStakeAmount + bobStakeAmount; uint256 sumOfExpectedBonusMP = aliceExpectedBonusMP + bobExpectedBonusMP; + uint256 expectedMaxTotalMP = _calculateMaxTotalMP(aliceStakeAmount, aliceLockUpPeriod) + + _calculateMaxTotalMP(bobStakeAmount, bobLockUpPeriod); checkStreamer( CheckStreamerParams({ totalStaked: sumOfStakeAmount, totalMP: sumOfStakeAmount + sumOfExpectedBonusMP, - totalMaxMP: 250_356_164_383_561_643_835, + totalMaxMP: expectedMaxTotalMP, stakingBalance: sumOfStakeAmount, rewardBalance: 0, rewardIndex: 0 @@ -1194,10 +1276,12 @@ contract UnstakeTest is StakeTest { uint256 lockUpPeriod = streamer.MIN_LOCKUP_PERIOD(); // 10e18 is what's used in `test_StakeOneAccountWithMinLockUp` uint256 expectedBonusMP = _calculateBonusMP(stakeAmount, lockUpPeriod); - + uint256 unstakeAmount = 5e18; + uint256 warpLength = (365 days); // wait for 1 year uint256 currentTime = vm.getBlockTimestamp(); - vm.warp(currentTime + (365 days)); + + vm.warp(currentTime + (warpLength)); streamer.updateGlobalState(); streamer.updateAccountMP(vaults[alice]); @@ -1207,23 +1291,24 @@ contract UnstakeTest is StakeTest { totalStaked: stakeAmount, totalMP: (stakeAmount + expectedBonusMP) + stakeAmount, // we do `+ stakeAmount` we've accrued // `stakeAmount` after 1 year - totalMaxMP: 52_465_753_424_657_534_246, + totalMaxMP: _calculateMaxTotalMP(stakeAmount, lockUpPeriod), stakingBalance: 10e18, rewardBalance: 0, rewardIndex: 0 }) ); - + uint256 newBalance = stakeAmount - unstakeAmount; // unstake half of the tokens _unstake(alice, 5e18); - expectedBonusMP = _calculateBonusMP(5e18, lockUpPeriod); + uint256 expectedTotalMP = _calculeInitialMP(newBalance) + _calculateBonusMP(newBalance, lockUpPeriod) + + _calculateAccuredMP(newBalance, warpLength); checkStreamer( CheckStreamerParams({ - totalStaked: 5e18, - totalMP: (5e18 + expectedBonusMP) + 5e18, - totalMaxMP: 26_232_876_712_328_767_123, - stakingBalance: 5e18, + totalStaked: newBalance, + totalMP: expectedTotalMP, + totalMaxMP: _calculateMaxTotalMP(newBalance, lockUpPeriod), + stakingBalance: newBalance, rewardBalance: 0, rewardIndex: 0 }) @@ -1281,7 +1366,7 @@ contract UnstakeTest is StakeTest { timestamp[stage] = block.timestamp; totalStaked[stage] = amountStaked; predictedBonusMP[stage] = totalStaked[stage] + _calculateBonusMP(totalStaked[stage], secondsLocked); - predictedTotalMaxMP[stage] = 52_465_753_424_657_534_246; + predictedTotalMaxMP[stage] = _calculateMaxTotalMP(totalStaked[stage], secondsLocked); increasedAccuredMP[stage] = 0; //no increased accured MP in first stage predictedAccuredMP[stage] = 0; //no accured MP in first stage predictedTotalMP[stage] = predictedBonusMP[stage] + predictedAccuredMP[stage]; @@ -1292,7 +1377,8 @@ contract UnstakeTest is StakeTest { totalStaked[stage] = totalStaked[stage - 1]; predictedBonusMP[stage] = predictedBonusMP[stage - 1]; //no change in bonusMP in second stage predictedTotalMaxMP[stage] = predictedTotalMaxMP[stage - 1]; - increasedAccuredMP[stage] = _calculeAccuredMP(totalStaked[stage], timestamp[stage] - timestamp[stage - 1]); + // solhint-disable-next-line max-line-length + increasedAccuredMP[stage] = _calculateAccuredMP(totalStaked[stage], timestamp[stage] - timestamp[stage - 1]); predictedAccuredMP[stage] = predictedAccuredMP[stage - 1] + increasedAccuredMP[stage]; predictedTotalMP[stage] = predictedBonusMP[stage] + predictedAccuredMP[stage]; }