Skip to content

Commit 7edbf9d

Browse files
test: stata claim reward snapshot-diffs
Co-authored-by: Lukas <[email protected]>
1 parent cccd87d commit 7edbf9d

File tree

3 files changed

+97
-4
lines changed

3 files changed

+97
-4
lines changed

snapshots/StataTokenV2.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
2+
"claimRewards": "359669",
23
"deposit": "280955",
34
"depositATokens": "219311",
45
"redeem": "205837",

tests/gas/StataToken.gas.t.sol

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import 'forge-std/Test.sol';
55

66
import {Errors} from '../../src/contracts/protocol/libraries/helpers/Errors.sol';
77
import {UserConfiguration} from '../../src/contracts/protocol/libraries/configuration/UserConfiguration.sol';
8-
import {Testhelpers, IERC20} from './Testhelpers.sol';
8+
import {PullRewardsTransferStrategy} from '../../src/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol';
9+
import {Testhelpers, TestnetERC20, IERC20} from './Testhelpers.sol';
910
import {StataTokenFactory} from '../../src/contracts/extensions/stata-token/StataTokenFactory.sol';
1011
import {StataTokenV2} from '../../src/contracts/extensions/stata-token/StataTokenV2.sol';
1112
import {DataTypes} from '../../src/contracts/protocol/libraries/types/DataTypes.sol';
@@ -16,6 +17,11 @@ import {DataTypes} from '../../src/contracts/protocol/libraries/types/DataTypes.
1617
contract StataToken_gas_Tests is Testhelpers {
1718
StataTokenV2 public stataToken;
1819

20+
address public rewardTokenOne;
21+
address public rewardTokenTwo;
22+
address public emissionAdmin;
23+
PullRewardsTransferStrategy strategy;
24+
1925
function setUp() public override {
2026
super.setUp();
2127
StataTokenFactory(report.staticATokenFactoryProxy).createStataTokens(
@@ -24,6 +30,20 @@ contract StataToken_gas_Tests is Testhelpers {
2430
stataToken = StataTokenV2(
2531
StataTokenFactory(report.staticATokenFactoryProxy).getStataToken(tokenList.usdx)
2632
);
33+
34+
emissionAdmin = vm.addr(1024);
35+
rewardTokenOne = address(new TestnetERC20('LM Reward ERC20 One', 'RWD_1', 18, poolAdmin));
36+
rewardTokenTwo = address(new TestnetERC20('LM Reward ERC20 Two', 'RWD_2', 18, poolAdmin));
37+
strategy = new PullRewardsTransferStrategy(
38+
report.rewardsControllerProxy,
39+
emissionAdmin,
40+
emissionAdmin
41+
);
42+
43+
vm.startPrank(poolAdmin);
44+
contracts.emissionManager.setEmissionAdmin(rewardTokenOne, emissionAdmin);
45+
contracts.emissionManager.setEmissionAdmin(rewardTokenTwo, emissionAdmin);
46+
vm.stopPrank();
2747
}
2848

2949
function test_deposit() external {
@@ -52,4 +72,41 @@ contract StataToken_gas_Tests is Testhelpers {
5272
stataToken.redeemATokens(shares, address(this), address(this));
5373
vm.snapshotGasLastCall('StataTokenV2', 'redeemAToken');
5474
}
75+
76+
function test_claimRewards() external {
77+
uint256 amountToDeposit = 1000e8;
78+
_supplyOnReserve(address(this), amountToDeposit, tokenList.usdx);
79+
DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData(
80+
tokenList.usdx
81+
);
82+
IERC20(reserveData.aTokenAddress).approve(address(stataToken), amountToDeposit);
83+
stataToken.depositATokens(amountToDeposit, address(this));
84+
85+
uint32 endTimestamp = uint32(vm.getBlockTimestamp() + 15 days);
86+
_setupEmission(
87+
rewardTokenOne,
88+
reserveData.aTokenAddress,
89+
endTimestamp,
90+
1e14,
91+
emissionAdmin,
92+
address(strategy)
93+
);
94+
_setupEmission(
95+
rewardTokenTwo,
96+
reserveData.aTokenAddress,
97+
endTimestamp,
98+
1e14,
99+
emissionAdmin,
100+
address(strategy)
101+
);
102+
stataToken.refreshRewardTokens();
103+
vm.warp(endTimestamp);
104+
105+
address[] memory rewardTokens = new address[](2);
106+
rewardTokens[0] = rewardTokenOne;
107+
rewardTokens[1] = rewardTokenTwo;
108+
109+
stataToken.claimRewards(address(this), rewardTokens);
110+
vm.snapshotGasLastCall('StataTokenV2', 'claimRewards');
111+
}
55112
}

tests/gas/Testhelpers.sol

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ pragma solidity ^0.8.0;
33

44
import {IERC20} from 'openzeppelin-contracts/contracts/interfaces/IERC20.sol';
55
import {IPriceOracleGetter} from '../../src/contracts/interfaces/IPriceOracleGetter.sol';
6-
import {TestnetProcedures} from '../utils/TestnetProcedures.sol';
6+
import {RewardsDataTypes} from '../../src/contracts/rewards/libraries/RewardsDataTypes.sol';
7+
import {TestnetProcedures, TestnetERC20} from '../utils/TestnetProcedures.sol';
8+
import {ITransferStrategyBase} from '../../src/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol';
9+
import {AggregatorInterface} from '../../src/contracts/dependencies/chainlink/AggregatorInterface.sol';
710

811
contract Testhelpers is TestnetProcedures {
912
address rando = makeAddr('randomUser');
@@ -12,7 +15,7 @@ contract Testhelpers is TestnetProcedures {
1215
initTestEnvironment(false);
1316

1417
// supply and borrow some on reserve with a random user as "some" interest accrual
15-
// is the realisitc usecase we want to check in gas snapshots
18+
// is the realistic use case we want to check in gas snapshots
1619
_supplyOnReserve(rando, 100 ether, tokenList.weth);
1720
_supplyOnReserve(rando, 1_000_000e6, tokenList.usdx);
1821
_supplyOnReserve(rando, 100e8, tokenList.wbtc);
@@ -43,7 +46,7 @@ contract Testhelpers is TestnetProcedures {
4346
abi.encodeWithSelector(IPriceOracleGetter.getAssetPrice.selector, address(asset)),
4447
abi.encode(0)
4548
);
46-
// borrow the full emount of the asset
49+
// borrow the full amount of the asset
4750
vm.prank(borrower);
4851
contracts.poolProxy.borrow(asset, amount, 2, 0, borrower);
4952
// revert the oracle price
@@ -58,4 +61,36 @@ contract Testhelpers is TestnetProcedures {
5861
vm.warp(vm.getBlockTimestamp() + amount * 12);
5962
vm.roll(vm.getBlockNumber() + amount);
6063
}
64+
65+
function _setupEmission(
66+
address rewardToken,
67+
address asset,
68+
uint32 emissionEnd,
69+
uint88 emissionPerSecond,
70+
address emissionAdmin,
71+
address strategy
72+
) internal {
73+
RewardsDataTypes.RewardsConfigInput[] memory config = new RewardsDataTypes.RewardsConfigInput[](
74+
1
75+
);
76+
config[0] = RewardsDataTypes.RewardsConfigInput(
77+
emissionPerSecond,
78+
0,
79+
emissionEnd,
80+
asset,
81+
rewardToken,
82+
ITransferStrategyBase(strategy),
83+
AggregatorInterface(address(2))
84+
);
85+
86+
// configure asset
87+
vm.prank(emissionAdmin);
88+
contracts.emissionManager.configureAssets(config);
89+
90+
// fund admin & approve transfers to allow claiming
91+
uint256 fundsToEmit = (emissionEnd - vm.getBlockTimestamp()) * emissionPerSecond;
92+
deal(rewardToken, emissionAdmin, fundsToEmit, true);
93+
vm.prank(emissionAdmin);
94+
IERC20(rewardToken).approve(address(strategy), fundsToEmit);
95+
}
6196
}

0 commit comments

Comments
 (0)