mirror of
https://github.com/vacp2p/staking-reward-streamer.git
synced 2026-01-09 21:18:01 -05:00
32
.gas-report
32
.gas-report
@@ -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 |
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user