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:
r4bbit
2024-10-10 15:19:46 +02:00
parent b79deb70f5
commit b864355d31
3 changed files with 106 additions and 21 deletions

View File

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

View File

@@ -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)

View File

@@ -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();