mirror of https://github.com/logos-co/staking.git
refactor(StakeManager): Use maxMP instead of totalMP
This commit is contained in:
parent
3f4f6a7aaf
commit
9b7836c8cf
42
.gas-report
42
.gas-report
|
@ -1,7 +1,7 @@
|
|||
| contracts/StakeManager.sol:StakeManager contract | | | | | |
|
||||
|--------------------------------------------------|-----------------|--------|--------|--------|---------|
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
| 2600451 | 13644 | | | | |
|
||||
| 2605863 | 13669 | | | | |
|
||||
| Function Name | min | avg | median | max | # calls |
|
||||
| ACCURE_RATE | 328 | 328 | 328 | 328 | 1546 |
|
||||
| MAX_LOCKUP_PERIOD | 405 | 405 | 405 | 405 | 4 |
|
||||
|
@ -10,14 +10,14 @@
|
|||
| REWARD_TOKEN | 317 | 317 | 317 | 317 | 744 |
|
||||
| YEAR | 308 | 308 | 308 | 308 | 685 |
|
||||
| acceptUpdate | 23633 | 23633 | 23633 | 23633 | 1 |
|
||||
| accounts | 1572 | 1572 | 1572 | 1572 | 154869 |
|
||||
| calculateMP | 798 | 798 | 798 | 798 | 1372 |
|
||||
| accounts | 1572 | 1572 | 1572 | 1572 | 155271 |
|
||||
| calculateMP | 798 | 798 | 798 | 798 | 1371 |
|
||||
| currentEpoch | 384 | 1050 | 384 | 2384 | 54 |
|
||||
| epochEnd | 627 | 627 | 627 | 2627 | 25441 |
|
||||
| epochEnd | 627 | 627 | 627 | 2627 | 25508 |
|
||||
| epochReward | 1381 | 2881 | 1381 | 5881 | 3 |
|
||||
| executeAccount(address) | 33469 | 110665 | 149264 | 149264 | 3 |
|
||||
| executeAccount(address,uint256) | 26562 | 72195 | 74101 | 199919 | 152455 |
|
||||
| executeEpoch() | 23435 | 120639 | 121820 | 900335 | 25330 |
|
||||
| executeAccount(address) | 33469 | 110371 | 148822 | 148822 | 3 |
|
||||
| executeAccount(address,uint256) | 26562 | 71632 | 73548 | 195495 | 152857 |
|
||||
| executeEpoch() | 23435 | 120644 | 121820 | 900335 | 25397 |
|
||||
| executeEpoch(uint256) | 23861 | 24497 | 23861 | 26090 | 7 |
|
||||
| expiredStakeStorage | 416 | 2325 | 2416 | 2416 | 22 |
|
||||
| isTrustedCodehash | 541 | 944 | 541 | 2541 | 728 |
|
||||
|
@ -28,13 +28,13 @@
|
|||
| newEpoch | 463 | 463 | 463 | 463 | 5 |
|
||||
| owner | 2432 | 2432 | 2432 | 2432 | 13 |
|
||||
| pendingReward | 408 | 1442 | 2408 | 2408 | 29 |
|
||||
| potentialMP | 408 | 408 | 408 | 408 | 49964 |
|
||||
| potentialMP | 408 | 408 | 408 | 408 | 50098 |
|
||||
| previousManager | 297 | 297 | 297 | 297 | 13 |
|
||||
| setTrustedCodehash | 47982 | 47982 | 47982 | 47982 | 147 |
|
||||
| stake | 24047 | 24047 | 24047 | 24047 | 1 |
|
||||
| startMigration | 103624 | 103632 | 103636 | 103636 | 3 |
|
||||
| startTime | 306 | 306 | 306 | 306 | 21 |
|
||||
| totalMP | 385 | 385 | 385 | 2385 | 49985 |
|
||||
| totalMP | 385 | 385 | 385 | 2385 | 50119 |
|
||||
| totalStaked | 386 | 1786 | 2386 | 2386 | 20 |
|
||||
| totalSupply | 784 | 1965 | 2784 | 2784 | 22 |
|
||||
| unstake | 23841 | 23841 | 23841 | 23841 | 1 |
|
||||
|
@ -48,10 +48,10 @@
|
|||
| STAKING_TOKEN | 193 | 193 | 193 | 193 | 2 |
|
||||
| acceptMigration | 35141 | 35141 | 35141 | 35141 | 2 |
|
||||
| leave | 35196 | 35196 | 35196 | 35196 | 1 |
|
||||
| lock | 43196 | 71076 | 62042 | 162843 | 7 |
|
||||
| lock | 43196 | 71013 | 62042 | 162400 | 7 |
|
||||
| owner | 318 | 318 | 318 | 318 | 727 |
|
||||
| stake | 27291 | 282802 | 266296 | 351880 | 732 |
|
||||
| unstake | 40179 | 88236 | 78765 | 184769 | 11 |
|
||||
| stake | 27291 | 283772 | 266970 | 352542 | 732 |
|
||||
| unstake | 40179 | 88155 | 78765 | 184327 | 11 |
|
||||
|
||||
|
||||
| contracts/VaultFactory.sol:VaultFactory contract | | | | | |
|
||||
|
@ -69,24 +69,24 @@
|
|||
| Deployment Cost | Deployment Size | | | | |
|
||||
| 0 | 0 | | | | |
|
||||
| Function Name | min | avg | median | max | # calls |
|
||||
| getExpiredMP | 2427 | 2427 | 2427 | 2427 | 25486 |
|
||||
| getExpiredMP | 2427 | 2427 | 2427 | 2427 | 25553 |
|
||||
| transferOwnership | 28533 | 28533 | 28533 | 28533 | 1 |
|
||||
|
||||
|
||||
| script/Deploy.s.sol:Deploy contract | | | | | |
|
||||
|-------------------------------------|-----------------|---------|---------|---------|---------|
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
| 6220738 | 29931 | | | | |
|
||||
| 6226159 | 29956 | | | | |
|
||||
| Function Name | min | avg | median | max | # calls |
|
||||
| run | 5420174 | 5420174 | 5420174 | 5420174 | 66 |
|
||||
| run | 5425181 | 5425181 | 5425181 | 5425181 | 66 |
|
||||
|
||||
|
||||
| script/DeployMigrationStakeManager.s.sol:DeployMigrationStakeManager contract | | | | | |
|
||||
|-------------------------------------------------------------------------------|-----------------|---------|---------|---------|---------|
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
| 3412741 | 16827 | | | | |
|
||||
| 3418160 | 16852 | | | | |
|
||||
| Function Name | min | avg | median | max | # calls |
|
||||
| run | 2427736 | 2427736 | 2427736 | 2427736 | 19 |
|
||||
| run | 2432743 | 2432743 | 2432743 | 2432743 | 19 |
|
||||
|
||||
|
||||
| script/DeploymentConfig.s.sol:DeploymentConfig contract | | | | | |
|
||||
|
@ -111,16 +111,16 @@
|
|||
| Deployment Cost | Deployment Size | | | | |
|
||||
| 0 | 0 | | | | |
|
||||
| Function Name | min | avg | median | max | # calls |
|
||||
| approve | 46175 | 46235 | 46199 | 46367 | 727 |
|
||||
| balanceOf | 561 | 2127 | 2561 | 2561 | 32612 |
|
||||
| approve | 46175 | 46233 | 46199 | 46367 | 727 |
|
||||
| balanceOf | 561 | 2128 | 2561 | 2561 | 32679 |
|
||||
|
||||
|
||||
| test/script/DeployBroken.s.sol:DeployBroken contract | | | | | |
|
||||
|------------------------------------------------------|-----------------|---------|---------|---------|---------|
|
||||
| Deployment Cost | Deployment Size | | | | |
|
||||
| 4918894 | 23867 | | | | |
|
||||
| 4924318 | 23892 | | | | |
|
||||
| Function Name | min | avg | median | max | # calls |
|
||||
| run | 4266410 | 4266410 | 4266410 | 4266410 | 1 |
|
||||
| run | 4271418 | 4271418 | 4271418 | 4271418 | 1 |
|
||||
|
||||
|
||||
|
||||
|
|
112
.gas-snapshot
112
.gas-snapshot
|
@ -1,67 +1,67 @@
|
|||
CreateVaultTest:testDeployment() (gas: 9774)
|
||||
CreateVaultTest:test_createVault() (gas: 700333)
|
||||
ExecuteAccountTest:testDeployment() (gas: 28875)
|
||||
ExecuteAccountTest:test_ExecuteAccountLimit() (gas: 1559514)
|
||||
ExecuteAccountTest:test_ExecuteAccountMintMP() (gas: 5232040)
|
||||
ExecuteAccountTest:test_RevertWhen_InvalidLimitEpoch() (gas: 1769214)
|
||||
ExecuteAccountTest:test_ShouldNotMintMoreThanCap() (gas: 320225995)
|
||||
ExecuteEpochTest:testDeployment() (gas: 28876)
|
||||
ExecuteEpochTest:testNewDeployment() (gas: 30948)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteAccountAfterEpochEnd() (gas: 1350443)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteAccountAfterManyEpochsJumoMany() (gas: 1367228)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteAccountAfterManyEpochsWithBrokenTime() (gas: 1613317)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteAccountAfterManyEpochsWithBrokenTimeJumpMany() (gas: 1377593)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteEpochAfterEnd() (gas: 1910717)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteEpochExecuteAccountAfterManyEpochs() (gas: 2492323)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteEpochExecuteAccountAfterManyEpochsJumoMany() (gas: 1460710)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteEpochExecuteAccountAfterManyEpochsWithBrokenTime() (gas: 2502709)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteEpochExecuteAccountAfterManyEpochsWithBrokenTimeJumpMany() (gas: 1471052)
|
||||
ExecuteAccountTest:testDeployment() (gas: 28853)
|
||||
ExecuteAccountTest:test_ExecuteAccountLimit() (gas: 1559565)
|
||||
ExecuteAccountTest:test_ExecuteAccountMintMP() (gas: 5229838)
|
||||
ExecuteAccountTest:test_RevertWhen_InvalidLimitEpoch() (gas: 1769243)
|
||||
ExecuteAccountTest:test_ShouldNotMintMoreThanCap() (gas: 319099087)
|
||||
ExecuteEpochTest:testDeployment() (gas: 28898)
|
||||
ExecuteEpochTest:testNewDeployment() (gas: 31015)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteAccountAfterEpochEnd() (gas: 1351146)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteAccountAfterManyEpochsJumoMany() (gas: 1367601)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteAccountAfterManyEpochsWithBrokenTime() (gas: 1613976)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteAccountAfterManyEpochsWithBrokenTimeJumpMany() (gas: 1377966)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteEpochAfterEnd() (gas: 1909295)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteEpochExecuteAccountAfterManyEpochs() (gas: 2489731)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteEpochExecuteAccountAfterManyEpochsJumoMany() (gas: 1460839)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteEpochExecuteAccountAfterManyEpochsWithBrokenTime() (gas: 2500073)
|
||||
ExecuteEpochTest:test_ExecuteEpochExecuteEpochExecuteAccountAfterManyEpochsWithBrokenTimeJumpMany() (gas: 1471203)
|
||||
ExecuteEpochTest:test_ExecuteEpochNewEpoch() (gas: 1083615)
|
||||
ExecuteEpochTest:test_ExecuteEpochShouldIncreaseEpoch() (gas: 92277)
|
||||
ExecuteEpochTest:test_ExecuteEpochShouldIncreasePendingReward() (gas: 252659)
|
||||
ExecuteEpochTest:test_ExecuteEpochShouldNotIncreaseEpochBeforeEnd() (gas: 38961)
|
||||
ExecuteEpochTest:test_ExecuteEpochShouldIncreaseEpoch() (gas: 92233)
|
||||
ExecuteEpochTest:test_ExecuteEpochShouldIncreasePendingReward() (gas: 252720)
|
||||
ExecuteEpochTest:test_ExecuteEpochShouldNotIncreaseEpochBeforeEnd() (gas: 38962)
|
||||
ExecuteEpochTest:test_ExecuteEpochShouldNotIncreaseEpochInMigration() (gas: 149703)
|
||||
LeaveTest:testDeployment() (gas: 28853)
|
||||
LeaveTest:test_RevertWhen_NoPendingMigration() (gas: 1311974)
|
||||
LeaveTest:test_RevertWhen_SenderIsNotVault() (gas: 31740)
|
||||
LockTest:testDeployment() (gas: 28853)
|
||||
LockTest:test_NewLockupPeriod() (gas: 1310978)
|
||||
LockTest:test_RevertWhen_InvalidNewLockupPeriod() (gas: 1285586)
|
||||
LockTest:test_RevertWhen_InvalidUpdateLockupPeriod() (gas: 1406860)
|
||||
LockTest:test_RevertWhen_SenderIsNotVault() (gas: 31834)
|
||||
LockTest:test_ShouldIncreaseBonusMP() (gas: 1293620)
|
||||
LockTest:test_UpdateLockupPeriod() (gas: 1470415)
|
||||
MigrateTest:testDeployment() (gas: 28853)
|
||||
MigrateTest:test_RevertWhen_NoPendingMigration() (gas: 1276097)
|
||||
MigrateTest:test_RevertWhen_SenderIsNotVault() (gas: 31739)
|
||||
MigrationInitializeTest:testDeployment() (gas: 28853)
|
||||
MigrationInitializeTest:test_RevertWhen_MigrationPending() (gas: 5451158)
|
||||
MigrationStakeManagerTest:testDeployment() (gas: 28853)
|
||||
MigrationStakeManagerTest:testNewDeployment() (gas: 30992)
|
||||
MigrationStakeManagerTest:test_ExecuteEpochShouldNotIncreaseEpochInMigration() (gas: 149668)
|
||||
LeaveTest:testDeployment() (gas: 28831)
|
||||
LeaveTest:test_RevertWhen_NoPendingMigration() (gas: 1312647)
|
||||
LeaveTest:test_RevertWhen_SenderIsNotVault() (gas: 31763)
|
||||
LockTest:testDeployment() (gas: 28831)
|
||||
LockTest:test_NewLockupPeriod() (gas: 1311618)
|
||||
LockTest:test_RevertWhen_InvalidNewLockupPeriod() (gas: 1286248)
|
||||
LockTest:test_RevertWhen_InvalidUpdateLockupPeriod() (gas: 1407167)
|
||||
LockTest:test_RevertWhen_SenderIsNotVault() (gas: 31857)
|
||||
LockTest:test_ShouldIncreaseMaxMP() (gas: 1294282)
|
||||
LockTest:test_UpdateLockupPeriod() (gas: 1470744)
|
||||
MigrateTest:testDeployment() (gas: 28831)
|
||||
MigrateTest:test_RevertWhen_NoPendingMigration() (gas: 1276770)
|
||||
MigrateTest:test_RevertWhen_SenderIsNotVault() (gas: 31762)
|
||||
MigrationInitializeTest:testDeployment() (gas: 28831)
|
||||
MigrationInitializeTest:test_RevertWhen_MigrationPending() (gas: 5462037)
|
||||
MigrationStakeManagerTest:testDeployment() (gas: 28831)
|
||||
MigrationStakeManagerTest:testNewDeployment() (gas: 30948)
|
||||
MigrationStakeManagerTest:test_ExecuteEpochShouldNotIncreaseEpochInMigration() (gas: 149713)
|
||||
SetStakeManagerTest:testDeployment() (gas: 9774)
|
||||
SetStakeManagerTest:test_RevertWhen_InvalidStakeManagerAddress() (gas: 63105)
|
||||
SetStakeManagerTest:test_SetStakeManager() (gas: 41301)
|
||||
StakeManagerTest:testDeployment() (gas: 28625)
|
||||
StakeManagerTest:testDeployment() (gas: 28603)
|
||||
StakeTest:testDeployment() (gas: 28831)
|
||||
StakeTest:test_RevertWhen_InvalidLockupPeriod() (gas: 1057656)
|
||||
StakeTest:test_RevertWhen_Restake() (gas: 1301092)
|
||||
StakeTest:test_RevertWhen_RestakeWithLock() (gas: 1304525)
|
||||
StakeTest:test_RevertWhen_SenderIsNotVault() (gas: 32082)
|
||||
StakeTest:test_RevertWhen_StakeIsTooLow() (gas: 803915)
|
||||
StakeTest:test_RevertWhen_InvalidLockupPeriod() (gas: 1057645)
|
||||
StakeTest:test_RevertWhen_Restake() (gas: 1301832)
|
||||
StakeTest:test_RevertWhen_RestakeWithLock() (gas: 1305220)
|
||||
StakeTest:test_RevertWhen_SenderIsNotVault() (gas: 32104)
|
||||
StakeTest:test_RevertWhen_StakeIsTooLow() (gas: 803959)
|
||||
StakeTest:test_RevertWhen_StakeTokenTransferFails() (gas: 207758)
|
||||
StakeTest:test_StakeWithLockBonusMP() (gas: 2323783)
|
||||
StakeTest:test_StakeWithoutLockUpTimeMintsMultiplierPoints() (gas: 1297379)
|
||||
StakeTest:test_StakeWithLockMaxMP() (gas: 2325472)
|
||||
StakeTest:test_StakeWithoutLockUpTimeMintsMultiplierPoints() (gas: 1298474)
|
||||
StakedTokenTest:testStakeToken() (gas: 7597)
|
||||
UnstakeTest:testDeployment() (gas: 28875)
|
||||
UnstakeTest:test_RevertWhen_AmountMoreThanBalance() (gas: 1281609)
|
||||
UnstakeTest:test_RevertWhen_FundsLocked() (gas: 1325777)
|
||||
UnstakeTest:test_RevertWhen_SenderIsNotVault() (gas: 31879)
|
||||
UnstakeTest:test_UnstakeShouldBurnMultiplierPoints() (gas: 6432067)
|
||||
UnstakeTest:test_UnstakeShouldReturnFund_NoLockUp() (gas: 1303800)
|
||||
UnstakeTest:test_UnstakeShouldReturnFund_WithLockUp() (gas: 1387208)
|
||||
UserFlowsTest:testDeployment() (gas: 28853)
|
||||
UserFlowsTest:test_PendingMPToBeMintedCannotBeGreaterThanTotalSupplyMP(uint8,uint128) (runs: 114, μ: 130857603, ~: 130246926)
|
||||
UserFlowsTest:test_StakeWithLockUpTimeLocksStake() (gas: 1425816)
|
||||
UserFlowsTest:test_StakedSupplyShouldIncreaseAndDecreaseAgain() (gas: 2461484)
|
||||
UnstakeTest:testDeployment() (gas: 28853)
|
||||
UnstakeTest:test_RevertWhen_AmountMoreThanBalance() (gas: 1282314)
|
||||
UnstakeTest:test_RevertWhen_FundsLocked() (gas: 1326462)
|
||||
UnstakeTest:test_RevertWhen_SenderIsNotVault() (gas: 31857)
|
||||
UnstakeTest:test_UnstakeShouldBurnMultiplierPoints() (gas: 6413830)
|
||||
UnstakeTest:test_UnstakeShouldReturnFund_NoLockUp() (gas: 1304463)
|
||||
UnstakeTest:test_UnstakeShouldReturnFund_WithLockUp() (gas: 1387562)
|
||||
UserFlowsTest:testDeployment() (gas: 28831)
|
||||
UserFlowsTest:test_PendingMPToBeMintedCannotBeGreaterThanTotalSupplyMP(uint8,uint128) (runs: 114, μ: 130456714, ~: 129540928)
|
||||
UserFlowsTest:test_StakeWithLockUpTimeLocksStake() (gas: 1426181)
|
||||
UserFlowsTest:test_StakedSupplyShouldIncreaseAndDecreaseAgain() (gas: 2462875)
|
||||
VaultFactoryTest:testDeployment() (gas: 9774)
|
|
@ -25,7 +25,7 @@ contract StakeManager is StakeMath, TrustedCodehashAccess, IStakeManager {
|
|||
struct Account {
|
||||
address rewardAddress;
|
||||
uint256 balance;
|
||||
uint256 bonusMP;
|
||||
uint256 maxMP;
|
||||
uint256 totalMP;
|
||||
uint256 lastMint;
|
||||
uint256 lockUntil;
|
||||
|
@ -167,12 +167,13 @@ contract StakeManager is StakeMath, TrustedCodehashAccess, IStakeManager {
|
|||
uint256 mpLimitEpoch = currentEpoch + epochAmountToReachMpLimit;
|
||||
uint256 lastEpochAmountToMint = ((mpPerEpoch * (epochAmountToReachMpLimit + 1)) - maxMpToMint);
|
||||
uint256 bonusMP = _calculateInitialMP(_amount) + _calculateBonusMP(_amount, _seconds);
|
||||
uint256 maxMP = _calculateMaxMP(_amount, _seconds);
|
||||
|
||||
// account initialization
|
||||
accounts[msg.sender] = Account({
|
||||
rewardAddress: StakeVault(msg.sender).owner(),
|
||||
balance: _amount,
|
||||
bonusMP: bonusMP,
|
||||
maxMP: maxMP,
|
||||
totalMP: bonusMP,
|
||||
lastMint: block.timestamp,
|
||||
lockUntil: block.timestamp + _seconds,
|
||||
|
@ -208,8 +209,8 @@ contract StakeManager is StakeMath, TrustedCodehashAccess, IStakeManager {
|
|||
}
|
||||
_processAccount(account, currentEpoch);
|
||||
|
||||
uint256 reducedMP = Math.mulDiv(_amount, account.totalMP, account.balance);
|
||||
uint256 reducedInitialMP = Math.mulDiv(_amount, account.bonusMP, account.balance);
|
||||
uint256 reducedTotalMP = Math.mulDiv(_amount, account.totalMP, account.balance);
|
||||
uint256 reducedMaxMP = Math.mulDiv(_amount, account.maxMP, account.balance);
|
||||
|
||||
uint256 mpPerEpoch = _calculateAccuredMP(account.balance, ACCURE_RATE);
|
||||
expiredStakeStorage.decrementExpiredMP(account.mpLimitEpoch, mpPerEpoch);
|
||||
|
@ -219,10 +220,10 @@ contract StakeManager is StakeMath, TrustedCodehashAccess, IStakeManager {
|
|||
|
||||
//update storage
|
||||
account.balance -= _amount;
|
||||
account.bonusMP -= reducedInitialMP;
|
||||
account.totalMP -= reducedMP;
|
||||
account.maxMP -= reducedMaxMP;
|
||||
account.totalMP -= reducedTotalMP;
|
||||
totalStaked -= _amount;
|
||||
totalMP -= reducedMP;
|
||||
totalMP -= reducedTotalMP;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -261,7 +262,7 @@ contract StakeManager is StakeMath, TrustedCodehashAccess, IStakeManager {
|
|||
|
||||
//update account storage
|
||||
account.lockUntil = lockUntil;
|
||||
account.bonusMP += bonusMP;
|
||||
account.maxMP += bonusMP;
|
||||
account.totalMP += bonusMP;
|
||||
//update global storage
|
||||
totalMP += bonusMP;
|
||||
|
@ -477,50 +478,18 @@ contract StakeManager is StakeMath, TrustedCodehashAccess, IStakeManager {
|
|||
* @param epoch Epoch to increment total supply
|
||||
*/
|
||||
function _mintMP(Account storage account, uint256 processTime, Epoch storage epoch) private {
|
||||
uint256 mpToMint = _getMaxMPToMint(
|
||||
_calculateAccuredMP(account.balance, processTime - account.lastMint),
|
||||
account.balance,
|
||||
account.bonusMP,
|
||||
account.totalMP
|
||||
);
|
||||
|
||||
uint256 accruedMP = _calculateAccuredMP(account.balance, processTime - account.lastMint);
|
||||
if (accruedMP + account.totalMP > account.maxMP) {
|
||||
accruedMP = account.maxMP - account.totalMP; //how much left to reach cap
|
||||
}
|
||||
//update storage
|
||||
account.lastMint = processTime;
|
||||
account.totalMP += mpToMint;
|
||||
totalMP += mpToMint;
|
||||
account.totalMP += accruedMP;
|
||||
totalMP += accruedMP;
|
||||
|
||||
//mp estimation
|
||||
epoch.potentialMP -= mpToMint;
|
||||
potentialMP -= mpToMint;
|
||||
}
|
||||
|
||||
/**
|
||||
* @notice Calculates maximum multiplier point increase for given balance
|
||||
* @param _mpToMint tested value
|
||||
* @param _balance balance of account
|
||||
* @param _totalMP total multiplier point of the account
|
||||
* @param _bonusMP bonus multiplier point of the account
|
||||
* @return _maxMpToMint maximum multiplier points to mint
|
||||
*/
|
||||
function _getMaxMPToMint(
|
||||
uint256 _mpToMint,
|
||||
uint256 _balance,
|
||||
uint256 _bonusMP,
|
||||
uint256 _totalMP
|
||||
)
|
||||
private
|
||||
pure
|
||||
returns (uint256 _maxMpToMint)
|
||||
{
|
||||
// Maximum multiplier point for given balance
|
||||
_maxMpToMint = _calculateMaxAccuredMP(_balance) + _bonusMP;
|
||||
if (_mpToMint + _totalMP > _maxMpToMint) {
|
||||
//reached cap when increasing MP
|
||||
return _maxMpToMint - _totalMP; //how much left to reach cap
|
||||
} else {
|
||||
//not reached capw hen increasing MP
|
||||
return _mpToMint; //just return tested value
|
||||
}
|
||||
epoch.potentialMP -= accruedMP;
|
||||
potentialMP -= accruedMP;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -9,11 +9,11 @@ import { DeployMigrationStakeManager } from "../script/DeployMigrationStakeManag
|
|||
import { DeploymentConfig } from "../script/DeploymentConfig.s.sol";
|
||||
import { StakeManager, IStakeManager, ExpiredStakeStorage } from "../contracts/StakeManager.sol";
|
||||
import { ITrustedCodehashAccess } from "../contracts/interfaces/ITrustedCodehashAccess.sol";
|
||||
import { MultiplierPointMath } from "../contracts/MultiplierPointMath.sol";
|
||||
import { StakeMath } from "../contracts/StakeMath.sol";
|
||||
import { StakeVault } from "../contracts/StakeVault.sol";
|
||||
import { VaultFactory } from "../contracts/VaultFactory.sol";
|
||||
|
||||
contract StakeManagerTest is Test {
|
||||
contract StakeManagerTest is Test, StakeMath {
|
||||
DeploymentConfig internal deploymentConfig;
|
||||
StakeManager internal stakeManager;
|
||||
VaultFactory internal vaultFactory;
|
||||
|
@ -89,37 +89,43 @@ contract StakeTest is StakeManagerTest {
|
|||
stakeManager.stake(100, 1);
|
||||
}
|
||||
|
||||
function test_StakeWithLockBonusMP() public {
|
||||
function test_StakeWithLockMaxMP() public {
|
||||
uint256 stakeAmount = 10_000;
|
||||
uint256 lockTime = stakeManager.MIN_LOCKUP_PERIOD();
|
||||
|
||||
StakeVault userVault = _createStakingAccount(testUser, stakeAmount, 0, stakeAmount);
|
||||
|
||||
(, uint256 balance, uint256 bonusMP, uint256 totalMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
(, uint256 balance, uint256 maxMP, uint256 totalMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
assertEq(balance, stakeAmount, "balance of user vault should be equal to stake amount after stake");
|
||||
assertEq(bonusMP, stakeAmount, "bonusMP of user vault should be equal to stake amount after stake if no lock");
|
||||
assertEq(
|
||||
maxMP,
|
||||
_calculateMaxMP(stakeAmount, 0),
|
||||
"maxMP of user vault should be equal to stake amount after stake if no lock"
|
||||
);
|
||||
assertEq(
|
||||
totalMP, stakeAmount, "totalMP of user vault should be equal to stakeAmount after stake if no epochs passed"
|
||||
);
|
||||
|
||||
vm.prank(testUser);
|
||||
userVault.lock(lockTime);
|
||||
uint256 estimatedBonusMp = stakeAmount + stakeManager.calculateMP(stakeAmount, lockTime);
|
||||
|
||||
(, balance, bonusMP, totalMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
uint256 estimatedMaxMP = maxMP + _calculateAccuredMP(stakeAmount, lockTime);
|
||||
uint256 estimatedTotalMP = _calculateInitialMP(stakeAmount) + _calculateBonusMP(stakeAmount, lockTime);
|
||||
(, balance, maxMP, totalMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
assertEq(balance, stakeAmount, "balance of user vault should be equal to stake amount after lock");
|
||||
assertEq(bonusMP, estimatedBonusMp, "bonusMP of user vault should be equal to estimated bonusMP after lock");
|
||||
assertEq(totalMP, bonusMP, "totalMP of user vault should be equal to bonusMP after lock if no epochs passed");
|
||||
assertEq(maxMP, estimatedMaxMP, "maxMP of user vault should be equal to estimated maxMP after lock");
|
||||
assertEq(
|
||||
totalMP, estimatedTotalMP, "totalMP of user vault should be equal to maxMP after lock if no epochs passed"
|
||||
);
|
||||
|
||||
StakeVault userVault2 = _createStakingAccount(testUser, stakeAmount, lockTime, stakeAmount);
|
||||
|
||||
(, balance, bonusMP, totalMP,,,,) = stakeManager.accounts(address(userVault2));
|
||||
(, balance, maxMP, totalMP,,,,) = stakeManager.accounts(address(userVault2));
|
||||
assertEq(balance, stakeAmount, "balance of user vault should be equal to stake amount after stake locked");
|
||||
assertEq(maxMP, estimatedMaxMP, "maxMP of user vault should be equal to estimated maxMP after stake locked");
|
||||
assertEq(
|
||||
bonusMP, estimatedBonusMp, "bonusMP of user vault should be equal to estimated bonusMP after stake locked"
|
||||
);
|
||||
assertEq(
|
||||
totalMP, bonusMP, "totalMP of user vault should be equal to bonusMP after stake locked if no epochs passed"
|
||||
totalMP,
|
||||
estimatedTotalMP,
|
||||
"totalMP of user vault should be equal to maxMP after stake locked if no epochs passed"
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -173,10 +179,10 @@ contract StakeTest is StakeManagerTest {
|
|||
}
|
||||
|
||||
function test_StakeWithoutLockUpTimeMintsMultiplierPoints() public {
|
||||
uint256 stakeAmount = 54;
|
||||
uint256 stakeAmount = MIN_BALANCE;
|
||||
StakeVault userVault = _createStakingAccount(testUser, stakeAmount, 0, stakeAmount);
|
||||
|
||||
(,, uint256 totalMP,,,,,) = stakeManager.accounts(address(userVault));
|
||||
(,,, uint256 totalMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
assertEq(stakeManager.totalMP(), stakeAmount, "total multiplier point supply");
|
||||
assertEq(totalMP, stakeAmount, "user multiplier points");
|
||||
|
||||
|
@ -254,7 +260,7 @@ contract UnstakeTest is StakeManagerTest {
|
|||
vm.warp(stakeManager.epochEnd());
|
||||
stakeManager.executeAccount(address(userVault), i + 1);
|
||||
}
|
||||
(, uint256 balanceBefore, uint256 bonusMPBefore, uint256 totalMPBefore,,,,) =
|
||||
(, uint256 balanceBefore, uint256 maxMPBefore, uint256 totalMPBefore,,,,) =
|
||||
stakeManager.accounts(address(userVault));
|
||||
uint256 totalSupplyMPBefore = stakeManager.totalMP();
|
||||
uint256 unstakeAmount = stakeAmount * percentToBurn / 100;
|
||||
|
@ -262,7 +268,7 @@ contract UnstakeTest is StakeManagerTest {
|
|||
|
||||
assertEq(ERC20(stakeToken).balanceOf(testUser), 0);
|
||||
userVault.unstake(unstakeAmount);
|
||||
(, uint256 balanceAfter, uint256 bonusMPAfter, uint256 totalMPAfter,,,,) =
|
||||
(, uint256 balanceAfter, uint256 maxMPAfter, uint256 totalMPAfter,,,,) =
|
||||
stakeManager.accounts(address(userVault));
|
||||
|
||||
uint256 totalSupplyMPAfter = stakeManager.totalMP();
|
||||
|
@ -270,13 +276,13 @@ contract UnstakeTest is StakeManagerTest {
|
|||
console.log("totalSupplyMPAfter", totalSupplyMPAfter);
|
||||
console.log("balanceBefore", balanceBefore);
|
||||
console.log("balanceAfter", balanceAfter);
|
||||
console.log("bonusMPBefore", bonusMPBefore);
|
||||
console.log("bonusMPAfter", bonusMPAfter);
|
||||
console.log("maxMPBefore", maxMPBefore);
|
||||
console.log("maxMPAfter", maxMPAfter);
|
||||
console.log("totalMPBefore", totalMPBefore);
|
||||
console.log("totalMPAfter", totalMPAfter);
|
||||
|
||||
assertEq(balanceAfter, balanceBefore - (balanceBefore * percentToBurn / 100));
|
||||
assertEq(bonusMPAfter, bonusMPBefore - (bonusMPBefore * percentToBurn / 100));
|
||||
assertEq(maxMPAfter, maxMPBefore - (maxMPBefore * percentToBurn / 100));
|
||||
assertEq(totalMPAfter, totalMPBefore - (totalMPBefore * percentToBurn / 100));
|
||||
assertEq(totalSupplyMPAfter, totalSupplyMPBefore - (totalMPBefore * percentToBurn / 100));
|
||||
assertEq(ERC20(stakeToken).balanceOf(testUser), unstakeAmount);
|
||||
|
@ -304,10 +310,10 @@ contract LockTest is StakeManagerTest {
|
|||
vm.startPrank(testUser);
|
||||
userVault.lock(lockTime);
|
||||
|
||||
(, uint256 balance, uint256 bonusMP, uint256 totalMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
(, uint256 balance, uint256 maxMP, uint256 totalMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
|
||||
console.log("balance", balance);
|
||||
console.log("bonusMP", bonusMP);
|
||||
console.log("maxMP", maxMP);
|
||||
console.log("totalMP", totalMP);
|
||||
}
|
||||
|
||||
|
@ -326,12 +332,12 @@ contract LockTest is StakeManagerTest {
|
|||
|
||||
vm.warp(block.timestamp + stakeManager.MIN_LOCKUP_PERIOD() - 1);
|
||||
stakeManager.executeAccount(address(userVault));
|
||||
(, uint256 balance, uint256 bonusMP, uint256 totalMP,, uint256 lockUntil,,) =
|
||||
(, uint256 balance, uint256 maxMP, uint256 totalMP,, uint256 lockUntil,,) =
|
||||
stakeManager.accounts(address(userVault));
|
||||
|
||||
vm.startPrank(testUser);
|
||||
userVault.lock(minLockup - 1);
|
||||
(, balance, bonusMP, totalMP,, lockUntil,,) = stakeManager.accounts(address(userVault));
|
||||
(, balance, maxMP, totalMP,, lockUntil,,) = stakeManager.accounts(address(userVault));
|
||||
|
||||
assertEq(lockUntil, block.timestamp + minLockup);
|
||||
|
||||
|
@ -353,21 +359,21 @@ contract LockTest is StakeManagerTest {
|
|||
userVault.lock(minLockup - 1);
|
||||
}
|
||||
|
||||
function test_ShouldIncreaseBonusMP() public {
|
||||
function test_ShouldIncreaseMaxMP() public {
|
||||
uint256 stakeAmount = 100;
|
||||
uint256 lockTime = stakeManager.MAX_LOCKUP_PERIOD();
|
||||
StakeVault userVault = _createStakingAccount(testUser, stakeAmount);
|
||||
(, uint256 balance, uint256 bonusMP, uint256 totalMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
(, uint256 balance, uint256 maxMP, uint256 totalMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
uint256 totalSupplyMPBefore = stakeManager.totalMP();
|
||||
|
||||
vm.startPrank(testUser);
|
||||
userVault.lock(lockTime);
|
||||
|
||||
//solhint-disable-next-line max-line-length
|
||||
(, uint256 newBalance, uint256 newBonusMP, uint256 newCurrentMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
(, uint256 newBalance, uint256 newMaxMP, uint256 newCurrentMP,,,,) = stakeManager.accounts(address(userVault));
|
||||
uint256 totalSupplyMPAfter = stakeManager.totalMP();
|
||||
assertGt(totalSupplyMPAfter, totalSupplyMPBefore, "totalMP");
|
||||
assertGt(newBonusMP, bonusMP, "bonusMP");
|
||||
assertGt(newMaxMP, maxMP, "maxMP");
|
||||
assertGt(newCurrentMP, totalMP, "totalMP");
|
||||
assertEq(newBalance, balance, "balance");
|
||||
}
|
||||
|
@ -717,7 +723,7 @@ contract UserFlowsTest is StakeManagerTest {
|
|||
public
|
||||
{
|
||||
uint8 accountNum = 5;
|
||||
uint256 minimumPossibleStake = 53; //less than this the stake per epoch of the account would be 0
|
||||
uint256 minimumPossibleStake = MIN_BALANCE; //less than this the stake per epoch of the account would be 0
|
||||
uint256 baseStakeAmount =
|
||||
(minimumPossibleStake * (uint256(randomStakeMultiplier) + 1)) + uint256(randomStakeAddition);
|
||||
uint256 epochsAmountToReachCap = 0;
|
||||
|
|
Loading…
Reference in New Issue