mirror of
https://github.com/vacp2p/staking-reward-streamer.git
synced 2026-01-09 21:18:01 -05:00
test(RewardsStreamerMP): ensure bonusMP and maxMP are decreased
correctly at unstake This commit adds some tests to check that, if a user (partically) unstakes their funds, their initial and bonus MP get decreased proportionally, as well as their max mp. Closes #46
This commit is contained in:
34
.gas-report
34
.gas-report
@@ -17,21 +17,21 @@
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
| 1115122 | 5026 | | | | |
|
||||
| Function Name | min | avg | median | max | # calls |
|
||||
| MAX_LOCKING_PERIOD | 228 | 228 | 228 | 228 | 18 |
|
||||
| MAX_MULTIPLIER | 252 | 252 | 252 | 252 | 24 |
|
||||
| MIN_LOCKING_PERIOD | 229 | 229 | 229 | 229 | 8 |
|
||||
| MAX_LOCKING_PERIOD | 228 | 228 | 228 | 228 | 21 |
|
||||
| MAX_MULTIPLIER | 252 | 252 | 252 | 252 | 27 |
|
||||
| MIN_LOCKING_PERIOD | 229 | 229 | 229 | 229 | 10 |
|
||||
| MP_RATE_PER_YEAR | 231 | 231 | 231 | 231 | 2 |
|
||||
| SCALE_FACTOR | 251 | 251 | 251 | 251 | 30 |
|
||||
| accountedRewards | 373 | 921 | 373 | 2373 | 62 |
|
||||
| getUserInfo | 1576 | 1576 | 1576 | 1576 | 61 |
|
||||
| rewardIndex | 373 | 405 | 373 | 2373 | 62 |
|
||||
| stake | 168040 | 215222 | 228839 | 249323 | 43 |
|
||||
| totalMP | 330 | 330 | 330 | 330 | 62 |
|
||||
| totalMaxMP | 329 | 329 | 329 | 329 | 62 |
|
||||
| totalStaked | 373 | 373 | 373 | 373 | 62 |
|
||||
| unstake | 75511 | 107624 | 110519 | 134250 | 10 |
|
||||
| updateGlobalState | 30008 | 56707 | 47387 | 80335 | 22 |
|
||||
| updateUserMP | 34631 | 36820 | 37133 | 37133 | 16 |
|
||||
| SCALE_FACTOR | 251 | 251 | 251 | 251 | 36 |
|
||||
| accountedRewards | 373 | 931 | 373 | 2373 | 68 |
|
||||
| getUserInfo | 1576 | 1576 | 1576 | 1576 | 62 |
|
||||
| rewardIndex | 373 | 402 | 373 | 2373 | 68 |
|
||||
| stake | 168040 | 216282 | 228839 | 249323 | 45 |
|
||||
| totalMP | 330 | 330 | 330 | 330 | 68 |
|
||||
| totalMaxMP | 329 | 329 | 329 | 329 | 68 |
|
||||
| totalStaked | 373 | 373 | 373 | 373 | 68 |
|
||||
| unstake | 75511 | 104952 | 91588 | 134250 | 12 |
|
||||
| updateGlobalState | 30008 | 55930 | 47387 | 80335 | 24 |
|
||||
| updateUserMP | 34631 | 36855 | 37133 | 37133 | 18 |
|
||||
|
||||
|
||||
| src/XPNFTToken.sol:XPNFTToken contract | | | | | |
|
||||
@@ -103,9 +103,9 @@
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
| 639406 | 3369 | | | | |
|
||||
| Function Name | min | avg | median | max | # calls |
|
||||
| approve | 46346 | 46346 | 46346 | 46346 | 150 |
|
||||
| balanceOf | 561 | 1330 | 561 | 2561 | 273 |
|
||||
| mint | 51284 | 59110 | 51284 | 68384 | 166 |
|
||||
| approve | 46346 | 46346 | 46346 | 46346 | 160 |
|
||||
| balanceOf | 561 | 1333 | 561 | 2561 | 290 |
|
||||
| mint | 51284 | 59054 | 51284 | 68384 | 176 |
|
||||
| transfer | 34390 | 48070 | 51490 | 51490 | 10 |
|
||||
|
||||
|
||||
|
||||
@@ -20,8 +20,8 @@ StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 283254)
|
||||
StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 283298)
|
||||
UnstakeTest:test_StakeMultipleAccounts() (gas: 439328)
|
||||
UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 586572)
|
||||
UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 744073)
|
||||
UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 448570)
|
||||
UnstakeTest:test_StakeMultipleAccountsMPIncreasesMaxMPDoesNotChange() (gas: 744095)
|
||||
UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 448592)
|
||||
UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 469972)
|
||||
UnstakeTest:test_StakeOneAccount() (gas: 268069)
|
||||
UnstakeTest:test_StakeOneAccountAndRewards() (gas: 415333)
|
||||
@@ -29,11 +29,13 @@ UnstakeTest:test_StakeOneAccountMPIncreasesMaxMPDoesNotChange() (gas: 473205)
|
||||
UnstakeTest:test_StakeOneAccountReachingMPLimit() (gas: 468229)
|
||||
UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 283267)
|
||||
UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 283254)
|
||||
UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 283343)
|
||||
UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 283320)
|
||||
UnstakeTest:test_UnstakeMultipleAccounts() (gas: 616921)
|
||||
UnstakeTest:test_UnstakeMultipleAccountsAndRewards() (gas: 938293)
|
||||
UnstakeTest:test_UnstakeOneAccount() (gas: 446643)
|
||||
UnstakeTest:test_UnstakeOneAccount() (gas: 446601)
|
||||
UnstakeTest:test_UnstakeOneAccountAndAccruedMP() (gas: 467894)
|
||||
UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 557494)
|
||||
UnstakeTest:test_UnstakeOneAccountWithLockUpAndAccruedMP() (gas: 490838)
|
||||
XPNFTTokenTest:testApproveNotAllowed() (gas: 10507)
|
||||
XPNFTTokenTest:testGetApproved() (gas: 10531)
|
||||
XPNFTTokenTest:testIsApprovedForAll() (gas: 10705)
|
||||
|
||||
@@ -1100,6 +1100,89 @@ contract UnstakeTest is StakeTest {
|
||||
);
|
||||
}
|
||||
|
||||
function test_UnstakeOneAccountAndAccruedMP() public {
|
||||
test_StakeOneAccount();
|
||||
|
||||
// wait for 1 year
|
||||
uint256 currentTime = vm.getBlockTimestamp();
|
||||
vm.warp(currentTime + (365 days));
|
||||
|
||||
streamer.updateGlobalState();
|
||||
streamer.updateUserMP(alice);
|
||||
|
||||
checkStreamer(
|
||||
CheckStreamerParams({
|
||||
totalStaked: 10e18,
|
||||
totalMP: 20e18, // total MP must have been doubled
|
||||
totalMaxMP: 50e18,
|
||||
stakingBalance: 10e18,
|
||||
rewardBalance: 0,
|
||||
rewardIndex: 0,
|
||||
accountedRewards: 0
|
||||
})
|
||||
);
|
||||
|
||||
// unstake half of the tokens
|
||||
_unstake(alice, 5e18);
|
||||
|
||||
checkStreamer(
|
||||
CheckStreamerParams({
|
||||
totalStaked: 5e18, // 10 - 5
|
||||
totalMP: 10e18, // 20 - 10 (5 initial + 5 accrued)
|
||||
totalMaxMP: 25e18,
|
||||
stakingBalance: 5e18,
|
||||
rewardBalance: 0,
|
||||
rewardIndex: 0,
|
||||
accountedRewards: 0
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
function test_UnstakeOneAccountWithLockUpAndAccruedMP() public {
|
||||
test_StakeOneAccountWithMinLockUp();
|
||||
|
||||
uint256 stakeAmount = 10e18;
|
||||
uint256 lockUpPeriod = streamer.MIN_LOCKING_PERIOD();
|
||||
// 10e18 is what's used in `test_StakeOneAccountWithMinLockUp`
|
||||
uint256 expectedBonusMP = _calculateBonusMP(stakeAmount, lockUpPeriod);
|
||||
|
||||
// wait for 1 year
|
||||
uint256 currentTime = vm.getBlockTimestamp();
|
||||
vm.warp(currentTime + (365 days));
|
||||
|
||||
streamer.updateGlobalState();
|
||||
streamer.updateUserMP(alice);
|
||||
|
||||
checkStreamer(
|
||||
CheckStreamerParams({
|
||||
totalStaked: stakeAmount,
|
||||
totalMP: (stakeAmount + expectedBonusMP) + stakeAmount, // we do `+ stakeAmount` we've accrued
|
||||
// `stakeAmount` after 1 year
|
||||
totalMaxMP: 52_465_753_424_657_534_240,
|
||||
stakingBalance: 10e18,
|
||||
rewardBalance: 0,
|
||||
rewardIndex: 0,
|
||||
accountedRewards: 0
|
||||
})
|
||||
);
|
||||
|
||||
// unstake half of the tokens
|
||||
_unstake(alice, 5e18);
|
||||
expectedBonusMP = _calculateBonusMP(5e18, lockUpPeriod);
|
||||
|
||||
checkStreamer(
|
||||
CheckStreamerParams({
|
||||
totalStaked: 5e18,
|
||||
totalMP: (5e18 + expectedBonusMP) + 5e18,
|
||||
totalMaxMP: 26_232_876_712_328_767_120,
|
||||
stakingBalance: 5e18,
|
||||
rewardBalance: 0,
|
||||
rewardIndex: 0,
|
||||
accountedRewards: 0
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
function test_UnstakeOneAccountAndRewards() public {
|
||||
test_StakeOneAccountAndRewards();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user