From 93062570b2982d120f0814e478ba179d4b4e05a3 Mon Sep 17 00:00:00 2001 From: Ricardo Guilherme Schmidt <3esmit@gmail.com> Date: Tue, 12 Nov 2024 10:10:21 -0300 Subject: [PATCH] refactor(StakeManager): Use maxMP instead of totalMP --- .gas-report | 42 +++++++------- .gas-snapshot | 112 ++++++++++++++++++------------------- contracts/StakeManager.sol | 65 ++++++--------------- test/StakeManager.t.sol | 68 ++++++++++++---------- 4 files changed, 131 insertions(+), 156 deletions(-) diff --git a/.gas-report b/.gas-report index 5f7b853..ebaf607 100644 --- a/.gas-report +++ b/.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 | diff --git a/.gas-snapshot b/.gas-snapshot index 1b5a51d..5bf219f 100644 --- a/.gas-snapshot +++ b/.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) \ No newline at end of file diff --git a/contracts/StakeManager.sol b/contracts/StakeManager.sol index 9428ea7..8d72e26 100644 --- a/contracts/StakeManager.sol +++ b/contracts/StakeManager.sol @@ -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; } /** diff --git a/test/StakeManager.t.sol b/test/StakeManager.t.sol index d84ffae..f2046ea 100644 --- a/test/StakeManager.t.sol +++ b/test/StakeManager.t.sol @@ -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;