Skip to content

Instantly share code, notes, and snippets.

@ypatil12
Created April 27, 2022 03:31
Show Gist options
  • Save ypatil12/02498e7c3b968e7116a1bb993757ed0e to your computer and use it in GitHub Desktop.
Save ypatil12/02498e7c3b968e7116a1bb993757ed0e to your computer and use it in GitHub Desktop.
Scenario where accrued rewardToken is not calculated properly
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.10;
import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol";
import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol";
import {MockBooster} from "./mocks/MockBooster.sol";
import {MockRewards} from "./mocks/MockRewards.sol";
import "../FlywheelCore.sol";
import "../rewards/FlywheelStaticRewards.sol";
import "forge-std/console.sol";
contract StaticRewardstest is DSTestPlus {
using SafeCastLib for uint256;
FlywheelCore flywheel;
FlywheelStaticRewards staticRewards;
MockRewards rewards;
MockBooster booster;
MockERC20 strategy;
MockERC20 rewardToken;
address constant user = address(0xDEAD);
address constant user2 = address(0xBEEF);
function setUp() public {
rewardToken = new MockERC20("test token", "TKN", 18);
strategy = new MockERC20("test strategy", "TKN", 18);
booster = new MockBooster();
flywheel = new FlywheelCore(
rewardToken,
MockRewards(address(0)),
IFlywheelBooster(address(0)),
address(this),
Authority(address(0))
);
staticRewards = new FlywheelStaticRewards(flywheel, address(this), Authority(address(0)));
flywheel.setFlywheelRewards(staticRewards);
}
function testUpdateStaticRewards() public {
strategy.mint(user, 1 ether);
rewardToken.mint(address(staticRewards), 20000 ether);
uint32 rewardEndTimestamp = (block.timestamp + 10000).safeCastTo32();
FlywheelStaticRewards.RewardsInfo memory rewardInfo = FlywheelStaticRewards.RewardsInfo(
1 ether,
rewardEndTimestamp
);
staticRewards.setRewardsInfo(strategy, rewardInfo);
flywheel.addStrategyForRewards(strategy);
flywheel.accrue(strategy, user);
hevm.warp(rewardEndTimestamp - 5000); //user1 should have 5000 ETH accrued
flywheel.accrue(strategy, user2);
strategy.mint(user2, 1 ether);
hevm.warp(rewardEndTimestamp - 4000); //1000 seconds pass user1 should have total of 5000 + 500 = 5500 ETH accrued; user 2 should have 500 ETH accrued
FlywheelStaticRewards.RewardsInfo memory rewardInfo2 = FlywheelStaticRewards.RewardsInfo(
2 ether,
rewardEndTimestamp
);
///// MUST ACCRUE BEFORE SETTING REWARDS INFO -> NOT DOCUMENTED IN README /////
// flywheel.accrue(strategy, user); // -> If we want to calculate accrued amounts properly, we must accrue right before a change in setRewardsInfo
staticRewards.setRewardsInfo(strategy, rewardInfo2); //4000 seconds left of rewards, for 8000 ETH to be accrued evenly among user1 and user2
hevm.warp(rewardEndTimestamp);
(uint256 accrued1, uint256 accrued2) = flywheel.accrue(strategy, user, user2);
console.log("accrued1Is: ", accrued1);
console.log("accrued2Is: ", accrued2);
require(accrued1 == 9500 ether); //10000 ETH for user 1 - should be 9500 ETH for user1
require(accrued2 == 4500 ether); //5000 ETH for user 2 - should be 4500 ETH for user 2
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment