mirror of
https://github.com/vacp2p/staking-reward-streamer.git
synced 2026-01-08 20:48:00 -05:00
feat(RewardsStreamerMP.t.sol): Make tests use calc functions and test those functions
chore(linter): added solhint-disable-next-line max-line-length to circumvent bug in linter chore(RewardsStreamerMP.t.sol): rename _calculateTimeToMP -> _calculateTimeToAccureMP
This commit is contained in:
committed by
r4bbit
parent
a565dbbac4
commit
6afc760974
72
.gas-report
72
.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 |
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user