pragma solidity ^0.8.19;
import {ERC20Mock} from "../../../../contracts/mocks/core/tokens/ERC20Mock.sol";
import {FeeCollector} from "../../../../contracts/core/collectors/FeeCollector.sol";
import {Treasury} from "../../../../contracts/core/collectors/Treasury.sol";
import {RAACToken} from "../../../../contracts/core/tokens/RAACToken.sol";
import {veRAACToken} from "../../../../contracts/core/tokens/veRAACToken.sol";
import {GaugeController, IGaugeController} from "../../../../contracts/core/governance/gauges/GaugeController.sol";
import {RAACGauge} from "../../../../contracts/core/governance/gauges/RAACGauge.sol";
import {RWAGauge} from "../../../../contracts/core/governance/gauges/RWAGauge.sol";
import {Test, console} from "forge-std/Test.sol";
contract TestSuite is Test {
FeeCollector feeCollector;
Treasury treasury;
RAACToken raacToken;
veRAACToken veRAACTok;
GaugeController gaugeController;
RAACGauge raacGauge;
RAACGauge raacGauge2;
RWAGauge rwaGauge;
ERC20Mock rewardToken;
address repairFund;
address admin;
uint256 initialSwapTaxRate = 100;
uint256 initialBurnTaxRate = 50;
uint256 initialWeight = 5000;
function setUp() public {
repairFund = makeAddr("repairFund");
admin = makeAddr("admin");
rewardToken = new ERC20Mock("Reward Token", "RWT");
treasury = new Treasury(admin);
raacToken = new RAACToken(admin, initialSwapTaxRate, initialBurnTaxRate);
veRAACTok = new veRAACToken(address(raacToken));
feeCollector = new FeeCollector(address(raacToken), address(veRAACTok), address(treasury), repairFund, admin);
vm.startPrank(admin);
raacToken.setFeeCollector(address(feeCollector));
raacToken.setMinter(admin);
gaugeController = new GaugeController(address(veRAACTok));
raacGauge = new RAACGauge(address(rewardToken), address(raacToken), address(gaugeController));
rwaGauge = new RWAGauge(address(rewardToken), address(raacToken), address(gaugeController));
gaugeController.addGauge(address(raacGauge), IGaugeController.GaugeType.RAAC, initialWeight);
gaugeController.addGauge(address(rwaGauge), IGaugeController.GaugeType.RWA, initialWeight);
vm.stopPrank();
}
function testPeriodIsSkipped() public {
uint256 maxEmission = raacGauge.MAX_WEEKLY_EMISSION();
uint256 initialStartTime = 7 days;
uint256 duration = 7 days;
vm.startPrank(address(gaugeController));
rewardToken.mint(address(raacGauge), maxEmission);
raacGauge.notifyRewardAmount(maxEmission);
vm.warp(initialStartTime + duration);
raacGauge.updatePeriod();
raacGauge.notifyRewardAmount(maxEmission);
vm.warp(block.timestamp + duration);
vm.expectRevert();
raacGauge.updatePeriod();
vm.stopPrank();
(,, uint256 distributed, uint256 periodStartTime) = raacGauge.periodState();
console.log("Distributed amount: ", distributed);
console.log("Period start time: ", periodStartTime);
vm.prank(address(gaugeController));
vm.expectRevert();
raacGauge.notifyRewardAmount(maxEmission);
}
}
Users permanently lose two full periods of rewards in every period transition and lost rewards cannot be recovered as they are tied to specific time periods