test: add lockup tests

Closes #3
This commit is contained in:
r4bbit
2024-09-23 16:14:01 +02:00
parent 47440677a8
commit b93c66b5e2
4 changed files with 173 additions and 19 deletions

View File

@@ -15,17 +15,21 @@
| src/RewardsStreamerMP.sol:RewardsStreamerMP contract | | | | | |
|------------------------------------------------------|-----------------|--------|--------|--------|---------|
| Deployment Cost | Deployment Size | | | | |
| 1096353 | 4939 | | | | |
| 1100217 | 4957 | | | | |
| Function Name | min | avg | median | max | # calls |
| accountedRewards | 373 | 595 | 373 | 2373 | 9 |
| getUserInfo | 1553 | 1553 | 1553 | 1553 | 16 |
| potentialMP | 330 | 330 | 330 | 330 | 9 |
| rewardIndex | 373 | 595 | 373 | 2373 | 9 |
| stake | 167821 | 194716 | 187721 | 228608 | 3 |
| totalMP | 352 | 352 | 352 | 352 | 9 |
| totalStaked | 330 | 330 | 330 | 330 | 9 |
| unstake | 133268 | 133274 | 133274 | 133280 | 2 |
| updateGlobalState | 30008 | 52396 | 49622 | 80335 | 4 |
| MAX_LOCKING_PERIOD | 228 | 228 | 228 | 228 | 18 |
| MAX_MULTIPLIER | 229 | 229 | 229 | 229 | 24 |
| MIN_LOCKING_PERIOD | 229 | 229 | 229 | 229 | 8 |
| SCALE_FACTOR | 251 | 251 | 251 | 251 | 28 |
| accountedRewards | 373 | 1075 | 373 | 2373 | 37 |
| getUserInfo | 1553 | 1553 | 1553 | 1553 | 32 |
| potentialMP | 330 | 330 | 330 | 330 | 37 |
| rewardIndex | 373 | 427 | 373 | 2373 | 37 |
| stake | 167821 | 217684 | 228608 | 249401 | 31 |
| totalMP | 352 | 352 | 352 | 352 | 37 |
| totalStaked | 330 | 330 | 330 | 330 | 37 |
| unstake | 75267 | 113408 | 133268 | 133945 | 5 |
| updateGlobalState | 30008 | 67918 | 80335 | 80335 | 9 |
| test/mocks/MockToken.sol:MockToken contract | | | | | |
@@ -33,10 +37,10 @@
| Deployment Cost | Deployment Size | | | | |
| 639406 | 3369 | | | | |
| Function Name | min | avg | median | max | # calls |
| approve | 46346 | 46346 | 46346 | 46346 | 10 |
| balanceOf | 561 | 1143 | 561 | 2561 | 79 |
| mint | 51284 | 58124 | 51284 | 68384 | 10 |
| transfer | 34390 | 42940 | 42940 | 51490 | 4 |
| approve | 46346 | 46346 | 46346 | 46346 | 110 |
| balanceOf | 561 | 1334 | 561 | 2561 | 168 |
| mint | 51284 | 58124 | 51284 | 68384 | 110 |
| transfer | 34390 | 47690 | 51490 | 51490 | 9 |

View File

@@ -1,2 +1,22 @@
RewardsStreamerMPTest:testStake() (gas: 1377536)
RewardsStreamerTest:testStake() (gas: 869874)
IntegrationTest:testStake() (gas: 1377603)
RewardsStreamerTest:testStake() (gas: 869874)
StakeTest:test_StakeMultipleAccounts() (gas: 438756)
StakeTest:test_StakeMultipleAccountsAndRewards() (gas: 586002)
StakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 449214)
StakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 470881)
StakeTest:test_StakeOneAccount() (gas: 267795)
StakeTest:test_StakeOneAccountAndRewards() (gas: 415039)
StakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 284120)
StakeTest:test_StakeOneAccountWithMinLockUp() (gas: 284152)
StakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 284196)
UnstakeTest:test_StakeMultipleAccounts() (gas: 438756)
UnstakeTest:test_StakeMultipleAccountsAndRewards() (gas: 586069)
UnstakeTest:test_StakeMultipleAccountsWithMinLockUp() (gas: 449192)
UnstakeTest:test_StakeMultipleAccountsWithRandomLockUp() (gas: 470881)
UnstakeTest:test_StakeOneAccount() (gas: 267795)
UnstakeTest:test_StakeOneAccountAndRewards() (gas: 415039)
UnstakeTest:test_StakeOneAccountWithMaxLockUp() (gas: 284186)
UnstakeTest:test_StakeOneAccountWithMinLockUp() (gas: 284152)
UnstakeTest:test_StakeOneAccountWithRandomLockUp() (gas: 284263)
UnstakeTest:test_UnstakeOneAccount() (gas: 445796)
UnstakeTest:test_UnstakeOneAccountAndRewards() (gas: 556852)

View File

@@ -82,9 +82,8 @@ contract RewardsStreamerMP is ReentrancyGuard {
if (lockPeriod != 0) {
uint256 lockMultiplier = (lockPeriod * MAX_MULTIPLIER * SCALE_FACTOR) / MAX_LOCKING_PERIOD;
lockMultiplier = lockMultiplier / SCALE_FACTOR;
initialMP += (amount * lockMultiplier);
userPotentialMP += (amount * lockMultiplier);
initialMP += amount * lockMultiplier / SCALE_FACTOR;
userPotentialMP += (amount * lockMultiplier / SCALE_FACTOR);
user.lockUntil = block.timestamp + lockPeriod;
} else {
user.lockUntil = 0;

View File

@@ -89,6 +89,12 @@ contract RewardsStreamerMPTest is Test {
rewardToken.transfer(address(streamer), amount);
streamer.updateGlobalState();
}
function _calculateBonusMP(uint256 amount, uint256 lockupTime) public view returns (uint256) {
return amount
* (lockupTime * streamer.MAX_MULTIPLIER() * streamer.SCALE_FACTOR() / streamer.MAX_LOCKING_PERIOD())
/ streamer.SCALE_FACTOR();
}
}
contract IntegrationTest is RewardsStreamerMPTest {
@@ -508,6 +514,69 @@ contract StakeTest is RewardsStreamerMPTest {
);
}
function test_StakeOneAccountWithMinLockUp() public {
uint256 stakeAmount = 10e18;
uint256 lockUpPeriod = streamer.MIN_LOCKING_PERIOD();
uint256 expectedBonusMP = _calculateBonusMP(stakeAmount, lockUpPeriod);
_stake(alice, stakeAmount, lockUpPeriod);
checkStreamer(
CheckStreamerParams({
totalStaked: stakeAmount,
// 10 + (amount * (lockPeriod * MAX_MULTIPLIER * SCALE_FACTOR / MAX_LOCKING_PERIOD) / SCALE_FACTOR)
totalMP: stakeAmount + expectedBonusMP,
potentialMP: stakeAmount * streamer.MAX_MULTIPLIER() + expectedBonusMP,
stakingBalance: stakeAmount,
rewardBalance: 0,
rewardIndex: 0,
accountedRewards: 0
})
);
}
function test_StakeOneAccountWithMaxLockUp() public {
uint256 stakeAmount = 10e18;
uint256 lockUpPeriod = streamer.MAX_LOCKING_PERIOD();
uint256 expectedBonusMP = _calculateBonusMP(stakeAmount, lockUpPeriod);
_stake(alice, 10e18, lockUpPeriod);
checkStreamer(
CheckStreamerParams({
totalStaked: stakeAmount,
// 10 + (amount * (lockPeriod * MAX_MULTIPLIER * SCALE_FACTOR / MAX_LOCKING_PERIOD) / SCALE_FACTOR)
totalMP: stakeAmount + expectedBonusMP,
potentialMP: stakeAmount * streamer.MAX_MULTIPLIER() + expectedBonusMP,
stakingBalance: stakeAmount,
rewardBalance: 0,
rewardIndex: 0,
accountedRewards: 0
})
);
}
function test_StakeOneAccountWithRandomLockUp() public {
uint256 stakeAmount = 10e18;
uint256 lockUpPeriod = streamer.MIN_LOCKING_PERIOD() + 13 days;
uint256 expectedBonusMP = _calculateBonusMP(stakeAmount, lockUpPeriod);
_stake(alice, stakeAmount, lockUpPeriod);
checkStreamer(
CheckStreamerParams({
totalStaked: stakeAmount,
// 10 + (amount * (lockPeriod * MAX_MULTIPLIER * SCALE_FACTOR / MAX_LOCKING_PERIOD) / SCALE_FACTOR)
totalMP: stakeAmount + expectedBonusMP,
potentialMP: stakeAmount * streamer.MAX_MULTIPLIER() + expectedBonusMP,
stakingBalance: stakeAmount,
rewardBalance: 0,
rewardIndex: 0,
accountedRewards: 0
})
);
}
function test_StakeMultipleAccounts() public {
// Alice stakes 10 tokens
_stake(alice, 10e18, 0);
@@ -605,6 +674,68 @@ contract StakeTest is RewardsStreamerMPTest {
})
);
}
function test_StakeMultipleAccountsWithMinLockUp() public {
uint256 aliceStakeAmount = 10e18;
uint256 aliceLockUpPeriod = streamer.MIN_LOCKING_PERIOD();
uint256 aliceExpectedBonusMP = _calculateBonusMP(aliceStakeAmount, aliceLockUpPeriod);
uint256 bobStakeAmount = 30e18;
uint256 bobLockUpPeriod = 0;
uint256 bobExpectedBonusMP = _calculateBonusMP(bobStakeAmount, bobLockUpPeriod);
// alice stakes with lockup period
_stake(alice, aliceStakeAmount, aliceLockUpPeriod);
// Bob stakes 30 tokens
_stake(bob, bobStakeAmount, bobLockUpPeriod);
uint256 sumOfStakeAmount = aliceStakeAmount + bobStakeAmount;
uint256 sumOfExpectedBonusMP = aliceExpectedBonusMP + bobExpectedBonusMP;
checkStreamer(
CheckStreamerParams({
totalStaked: sumOfStakeAmount,
totalMP: sumOfStakeAmount + sumOfExpectedBonusMP,
potentialMP: sumOfStakeAmount * streamer.MAX_MULTIPLIER() + sumOfExpectedBonusMP,
stakingBalance: sumOfStakeAmount,
rewardBalance: 0,
rewardIndex: 0,
accountedRewards: 0
})
);
}
function test_StakeMultipleAccountsWithRandomLockUp() public {
uint256 aliceStakeAmount = 10e18;
uint256 aliceLockUpPeriod = streamer.MAX_LOCKING_PERIOD() - 21 days;
uint256 aliceExpectedBonusMP = _calculateBonusMP(aliceStakeAmount, aliceLockUpPeriod);
uint256 bobStakeAmount = 30e18;
uint256 bobLockUpPeriod = streamer.MIN_LOCKING_PERIOD() + 43 days;
uint256 bobExpectedBonusMP = _calculateBonusMP(bobStakeAmount, bobLockUpPeriod);
// alice stakes with lockup period
_stake(alice, aliceStakeAmount, aliceLockUpPeriod);
// Bob stakes 30 tokens
_stake(bob, bobStakeAmount, bobLockUpPeriod);
uint256 sumOfStakeAmount = aliceStakeAmount + bobStakeAmount;
uint256 sumOfExpectedBonusMP = aliceExpectedBonusMP + bobExpectedBonusMP;
checkStreamer(
CheckStreamerParams({
totalStaked: sumOfStakeAmount,
totalMP: sumOfStakeAmount + sumOfExpectedBonusMP,
potentialMP: sumOfStakeAmount * streamer.MAX_MULTIPLIER() + sumOfExpectedBonusMP,
stakingBalance: sumOfStakeAmount,
rewardBalance: 0,
rewardIndex: 0,
accountedRewards: 0
})
);
}
}
contract UnstakeTest is StakeTest {