Skip to content

Commit

Permalink
Add stake fuzz test
Browse files Browse the repository at this point in the history
  • Loading branch information
kphed committed Dec 20, 2023
1 parent 86c0e23 commit 7ff0a6d
Showing 1 changed file with 58 additions and 13 deletions.
71 changes: 58 additions & 13 deletions test/StakedBRR.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -81,43 +81,88 @@ contract StakedBRRTest is Test, Helper {
uint256 amount = BRR.balanceOf(address(this));
uint256 brrBalanceBefore = BRR.balanceOf(address(this));
uint256 stakedBRRBalanceBefore = stakedBRR.balanceOf(address(this));
uint256 wethRewards = WETH.balanceOf(address(dynamicRewardsStore));

BRR.safeApprove(address(stakedBRR), type(uint256).max);

vm.expectEmit(true, true, true, true, address(BRR));
vm.expectEmit(true, true, true, true, BRR);

emit ERC20.Transfer(address(this), address(stakedBRR), amount);

vm.expectEmit(true, true, true, true, address(stakedBRR));

emit ERC20.Transfer(address(0), address(this), amount);
emit ERC20.Transfer(address(0), to, amount);

stakedBRR.stake(to, amount);

assertEq(brrBalanceBefore - amount, BRR.balanceOf(address(this)));
assertEq(
stakedBRRBalanceBefore + amount,
stakedBRR.balanceOf(address(this))
);
assertEq(stakedBRRBalanceBefore + amount, stakedBRR.balanceOf(to));

// Sanity check - make sure that the rewards accrue and are distributed correctly.
// For simplicity's sake, the test contract will own 100% of the supply and rewards.
assertEq(stakedBRR.totalSupply(), stakedBRR.balanceOf(address(this)));
assertEq(stakedBRR.totalSupply(), stakedBRR.balanceOf(to));

// Should be zero since no time has elapsed since staking.
assertEq(0, flywheel.rewardsAccrued(address(this)));
assertEq(0, flywheel.rewardsAccrued(to));

// Fast forward the entire rewards cycle length to claim 100% of the rewards.
vm.warp(block.timestamp + dynamicRewards.rewardsCycleLength());

flywheel.accrue(SolmateERC20(address(stakedBRR)), address(this));
flywheel.accrue(SolmateERC20(address(stakedBRR)), to);

assertEq(wethRewards, flywheel.rewardsAccrued(to));

uint256 wethBalanceBefore = WETH.balanceOf(to);

flywheel.claimRewards(to);

assertEq(wethBalanceBefore + amount, WETH.balanceOf(to));
assertEq(0, flywheel.rewardsAccrued(to));
}

function testStakeFuzz(address to, uint88 amount) external {
vm.assume(to != address(0) && amount != 0);

deal(BRR, address(this), amount);

uint256 brrBalanceBefore = BRR.balanceOf(address(this));
uint256 stakedBRRBalanceBefore = stakedBRR.balanceOf(to);
uint256 wethRewards = WETH.balanceOf(address(dynamicRewardsStore));

BRR.safeApprove(address(stakedBRR), type(uint256).max);

vm.expectEmit(true, true, true, true, BRR);

emit ERC20.Transfer(address(this), address(stakedBRR), amount);

vm.expectEmit(true, true, true, true, address(stakedBRR));

emit ERC20.Transfer(address(0), to, amount);

stakedBRR.stake(to, amount);

assertEq(brrBalanceBefore - amount, BRR.balanceOf(address(this)));
assertEq(stakedBRRBalanceBefore + amount, stakedBRR.balanceOf(to));
assertEq(stakedBRR.totalSupply(), stakedBRR.balanceOf(to));
assertEq(0, flywheel.rewardsAccrued(to));

// Due to rounding, there may be a small amount of rewards that aren't issued (less than 0.01%).
uint256 wethRewardsWithErrorMargin = (wethRewards * 9_999) / 10_000;

vm.warp(block.timestamp + dynamicRewards.rewardsCycleLength());

flywheel.accrue(SolmateERC20(address(stakedBRR)), to);

assertEq(amount, flywheel.rewardsAccrued(address(this)));
assertLe(wethRewardsWithErrorMargin, flywheel.rewardsAccrued(to));

uint256 wethBalanceBefore = WETH.balanceOf(address(this));
uint256 wethBalanceBefore = WETH.balanceOf(to);

flywheel.claimRewards(address(this));
flywheel.claimRewards(to);

assertEq(wethBalanceBefore + amount, WETH.balanceOf(address(this)));
assertLe(
wethBalanceBefore + wethRewardsWithErrorMargin,
WETH.balanceOf(to)
);
assertEq(0, flywheel.rewardsAccrued(to));
}
}

0 comments on commit 7ff0a6d

Please sign in to comment.