chore(tests): Add fuzz tests

This commit is contained in:
Ricardo Guilherme Schmidt
2025-02-03 08:00:58 -03:00
parent d99eb140f7
commit 6e46e3ca99
2 changed files with 170 additions and 3 deletions

View File

@@ -6,7 +6,7 @@
bytecode_hash = "none"
cbor_metadata = false
evm_version = "cancun"
fuzz = { runs = 1_000 }
fuzz = { runs = 1_000, max_test_rejects = 262144 }
gas_reports = ["*"]
libs = ["lib"]
optimizer = true
@@ -16,6 +16,7 @@
solc = "0.8.26"
src = "src"
test = "test"
[profile.ci]
fuzz = { runs = 10_000 }
verbosity = 4

View File

@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import { Test } from "forge-std/Test.sol";
import { Test, console } from "forge-std/Test.sol";
import { Math } from "@openzeppelin/contracts/utils/math/Math.sol";
import { DeployRewardsStreamerMPScript } from "../script/DeployRewardsStreamerMP.s.sol";
import { UpgradeRewardsStreamerMPScript } from "../script/UpgradeRewardsStreamerMP.s.sol";
@@ -110,7 +110,7 @@ contract RewardsStreamerMPTest is StakeMath, Test {
vault.register();
}
function _stake(address account, uint256 amount, uint256 lockupTime) public {
function _stake(address account, uint256 amount, uint256 lockupTime) public virtual {
StakeVault vault = StakeVault(vaults[account]);
vm.prank(account);
vault.stake(amount, lockupTime);
@@ -2129,6 +2129,8 @@ contract MultipleVaultsStakeTest is RewardsStreamerMPTest {
}
function test_StakeMultipleVaults() public {
console.log(MAX_BALANCE);
// Alice vault1 stakes 10 tokens
_stakeWithVault(alice, vault1, 10e18, 0);
@@ -2154,3 +2156,167 @@ contract MultipleVaultsStakeTest is RewardsStreamerMPTest {
);
}
}
contract FuzzTests is RewardsStreamerMPTest {
function _stake(address account, uint256 amount, uint256 lockPeriod) public override {
stakingToken.mint(account, amount);
vm.prank(account);
stakingToken.approve(vaults[account], amount);
super._stake(account, amount, lockPeriod);
}
function testFuzz_Stake(uint256 stakeAmount, uint256 lockUpPeriod) public {
vm.assume(stakeAmount > 0 && stakeAmount <= MAX_BALANCE);
vm.assume(lockUpPeriod == 0 || (lockUpPeriod >= MIN_LOCKUP_PERIOD && lockUpPeriod <= MAX_LOCKUP_PERIOD));
uint256 expectedBonusMP = _bonusMP(stakeAmount, lockUpPeriod);
uint256 expectedMaxTotalMP = _maxTotalMP(stakeAmount, lockUpPeriod);
_stake(alice, stakeAmount, lockUpPeriod);
checkStreamer(
CheckStreamerParams({
totalStaked: stakeAmount,
totalMPAccrued: stakeAmount + expectedBonusMP,
totalMaxMP: expectedMaxTotalMP,
stakingBalance: stakeAmount,
rewardBalance: 0,
rewardIndex: 0
})
);
checkVault(
CheckVaultParams({
account: vaults[alice],
rewardBalance: 0,
stakedBalance: stakeAmount,
vaultBalance: stakeAmount,
rewardIndex: 0,
mpAccrued: stakeAmount + expectedBonusMP,
maxMP: expectedMaxTotalMP
})
);
}
function testFuzz_AccrueMP(uint256 stakeAmount, uint256 lockUpPeriod, uint16 accruedTime) public {
vm.assume(stakeAmount > 0 && stakeAmount <= MAX_BALANCE);
vm.assume(lockUpPeriod == 0 || (lockUpPeriod >= MIN_LOCKUP_PERIOD && lockUpPeriod <= MAX_LOCKUP_PERIOD));
uint256 expectedBonusMP = _bonusMP(stakeAmount, lockUpPeriod);
uint256 expectedMaxTotalMP = _maxTotalMP(stakeAmount, lockUpPeriod);
uint256 expectedAccruedMP = Math.min(stakeAmount + expectedBonusMP + _accrueMP(stakeAmount, accruedTime),expectedMaxTotalMP);
_stake(alice, stakeAmount, lockUpPeriod);
uint256 currentTime = vm.getBlockTimestamp();
vm.warp(currentTime + accruedTime);
streamer.updateGlobalState();
checkStreamer(
CheckStreamerParams({
totalStaked: stakeAmount,
totalMPAccrued: expectedAccruedMP,
totalMaxMP: expectedMaxTotalMP,
stakingBalance: stakeAmount,
rewardBalance: 0,
rewardIndex: 0
})
);
checkVault(
CheckVaultParams({
account: vaults[alice],
rewardBalance: 0,
stakedBalance: stakeAmount,
vaultBalance: stakeAmount,
rewardIndex: 0,
mpAccrued: expectedAccruedMP,
maxMP: expectedMaxTotalMP
})
);
}
function testFuzz_Unstake(uint256 stakeAmount, uint256 lockUpPeriod, uint16 accruedTime, uint256 unstakeAmount) public {
vm.assume(stakeAmount > 0 && stakeAmount <= MAX_BALANCE);
vm.assume(lockUpPeriod == 0 || (lockUpPeriod >= MIN_LOCKUP_PERIOD && lockUpPeriod <= MAX_LOCKUP_PERIOD));
vm.assume(unstakeAmount <= stakeAmount);
vm.assume(accruedTime >= lockUpPeriod);
uint256 expectedBonusMP = _bonusMP(stakeAmount, lockUpPeriod);
uint256 expectedMaxTotalMP = _maxTotalMP(stakeAmount, lockUpPeriod);
uint256 expectedAccruedMP = Math.min(stakeAmount + expectedBonusMP + _accrueMP(stakeAmount, accruedTime),expectedMaxTotalMP);
_stake(alice, stakeAmount, lockUpPeriod);
uint256 currentTime = vm.getBlockTimestamp();
vm.warp(currentTime + lockUpPeriod);
streamer.updateGlobalState();
_unstake(alice, unstakeAmount);
checkStreamer(
CheckStreamerParams({
totalStaked: stakeAmount,
totalMPAccrued: expectedAccruedMP - _reduceMP(stakeAmount, expectedAccruedMP, unstakeAmount),
totalMaxMP: expectedMaxTotalMP - _reduceMP(stakeAmount, expectedAccruedMP, unstakeAmount),
stakingBalance: stakeAmount,
rewardBalance: 0,
rewardIndex: 0
})
);
checkVault(
CheckVaultParams({
account: vaults[alice],
rewardBalance: 0,
stakedBalance: stakeAmount,
vaultBalance: stakeAmount,
rewardIndex: 0,
mpAccrued: expectedAccruedMP - _reduceMP(stakeAmount, expectedAccruedMP, unstakeAmount),
maxMP: expectedMaxTotalMP - _reduceMP(stakeAmount, expectedAccruedMP, unstakeAmount)
})
);
}
function testFuzz_EmergencyExit(uint256 stakeAmount, uint256 lockUpPeriod) public {
vm.assume(stakeAmount > 0 && stakeAmount <= MAX_BALANCE);
vm.assume(lockUpPeriod == 0 || (lockUpPeriod >= MIN_LOCKUP_PERIOD && lockUpPeriod <= MAX_LOCKUP_PERIOD));
uint256 expectedBonusMP = _bonusMP(stakeAmount, lockUpPeriod);
uint256 expectedMaxTotalMP = _maxTotalMP(stakeAmount, lockUpPeriod);
_stake(alice, stakeAmount, lockUpPeriod);
vm.prank(admin);
streamer.enableEmergencyMode();
_emergencyExit(alice);
checkStreamer(
CheckStreamerParams({
totalStaked: stakeAmount,
totalMPAccrued: stakeAmount + expectedBonusMP,
totalMaxMP: expectedMaxTotalMP,
stakingBalance: 0,
rewardBalance: 0,
rewardIndex: 0
})
);
checkVault(
CheckVaultParams({
account: vaults[alice],
rewardBalance: 0,
stakedBalance: stakeAmount,
vaultBalance: 0,
rewardIndex: 0,
mpAccrued: stakeAmount + expectedBonusMP,
maxMP: expectedMaxTotalMP
})
);
}
}