-
-
Save ypatil12/02498e7c3b968e7116a1bb993757ed0e to your computer and use it in GitHub Desktop.
Scenario where accrued rewardToken is not calculated properly
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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