|
| 1 | +// SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | +// solhint-disable func-name-mixedcase, var-name-mixedcase, state-visibility |
| 3 | +// solhint-disable const-name-snakecase, max-states-count, contract-name-camelcase |
| 4 | +// solhint-disable modifier-name-mixedcase, |
| 5 | +pragma solidity ^0.8; |
| 6 | +import { Test } from "mento-std/Test.sol"; |
| 7 | + |
| 8 | +import { ReserveLiquidityStrategy } from "contracts/swap/ReserveLiquidityStrategy.sol"; |
| 9 | +import { IBreakerBox } from "contracts/interfaces/IBreakerBox.sol"; |
| 10 | +import { MockERC20 } from "test/utils/mocks/MockERC20.sol"; |
| 11 | +import { MockReserve } from "test/utils/mocks/MockReserve.sol"; |
| 12 | +import { MockSortedOracles } from "test/utils/mocks/MockSortedOracles.sol"; |
| 13 | +import { FPMM } from "contracts/swap/FPMM.sol"; |
| 14 | + |
| 15 | +contract StrategyIntegrationTest is Test { |
| 16 | + MockERC20 public token0; |
| 17 | + MockERC20 public token1; |
| 18 | + MockReserve public reserve; |
| 19 | + MockSortedOracles public sortedOracles; |
| 20 | + FPMM public pool; |
| 21 | + ReserveLiquidityStrategy public strategy; |
| 22 | + address public rateFeed; |
| 23 | + address public breakerBox; |
| 24 | + address public trader; |
| 25 | + |
| 26 | + function setUp() public { |
| 27 | + breakerBox = makeAddr("BreakerBox"); |
| 28 | + rateFeed = makeAddr("RateFeed"); |
| 29 | + trader = makeAddr("Trader"); |
| 30 | + |
| 31 | + bytes memory tradingModeCalldata = abi.encodeWithSelector(IBreakerBox.getRateFeedTradingMode.selector, rateFeed); |
| 32 | + vm.mockCall(breakerBox, tradingModeCalldata, abi.encode(0)); |
| 33 | + |
| 34 | + token0 = new MockERC20("Token0", "T0", 18); |
| 35 | + token1 = new MockERC20("Token1", "T1", 6); |
| 36 | + reserve = new MockReserve(); |
| 37 | + sortedOracles = new MockSortedOracles(); |
| 38 | + sortedOracles.setMedianRate(rateFeed, 909884940000000000000000); |
| 39 | + pool = new FPMM(false); |
| 40 | + strategy = new ReserveLiquidityStrategy(false); |
| 41 | + strategy.initialize(address(reserve)); |
| 42 | + pool.initialize( |
| 43 | + address(token0), |
| 44 | + address(token1), |
| 45 | + address(sortedOracles), |
| 46 | + rateFeed, |
| 47 | + true, |
| 48 | + address(breakerBox), |
| 49 | + address(this) |
| 50 | + ); |
| 51 | + pool.setLiquidityStrategy(address(strategy), true); |
| 52 | + strategy.addPool(address(pool), 0, 50); |
| 53 | + |
| 54 | + token0.mint(trader, 2e24); |
| 55 | + token1.mint(trader, 2e12); |
| 56 | + |
| 57 | + token1.mint(address(reserve), 10e12); |
| 58 | + |
| 59 | + vm.startPrank(trader); |
| 60 | + token0.transfer(address(pool), 1e24); |
| 61 | + token1.transfer(address(pool), 1e12); |
| 62 | + pool.mint(trader); |
| 63 | + vm.stopPrank(); |
| 64 | + } |
| 65 | + |
| 66 | + function test_rebalance_contraction() public { |
| 67 | + vm.startPrank(trader); |
| 68 | + token0.transfer(address(pool), 100_000 * 1e18); |
| 69 | + uint256 expectedAmountOut = pool.getAmountOut(100_000 * 1e18, address(token0)); |
| 70 | + pool.swap(0, expectedAmountOut, trader, ""); |
| 71 | + vm.stopPrank(); |
| 72 | + |
| 73 | + strategy.rebalance(address(pool)); |
| 74 | + } |
| 75 | + |
| 76 | + function test_rebalance_expansion() public { |
| 77 | + vm.startPrank(trader); |
| 78 | + token1.transfer(address(pool), 100_000 * 1e6); |
| 79 | + uint256 expectedAmountOut = pool.getAmountOut(100_000 * 1e6, address(token1)); |
| 80 | + pool.swap(expectedAmountOut, 0, trader, ""); |
| 81 | + vm.stopPrank(); |
| 82 | + |
| 83 | + strategy.rebalance(address(pool)); |
| 84 | + } |
| 85 | +} |
0 commit comments