// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.30; import "forge-std/console2.sol"; import {CommonBase} from "../lib/forge-std/src/Base.sol"; import {Script} from "../lib/forge-std/src/Script.sol"; import {StdChains} from "../lib/forge-std/src/StdChains.sol"; import {StdCheatsSafe} from "../lib/forge-std/src/StdCheats.sol"; import {stdJson} from "../lib/forge-std/src/StdJson.sol"; import {StdUtils} from "../lib/forge-std/src/StdUtils.sol"; import {IERC3156FlashBorrower} from "../lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sol"; import {IERC20} from "../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "../lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; import {IPartyInfo} from "../src/IPartyInfo.sol"; import {IPartyPlanner} from "../src/IPartyPlanner.sol"; import {IPartyPool} from "../src/IPartyPool.sol"; import {MockFlashBorrower} from "../test/MockFlashBorrower.sol"; contract ExercisePool is Script { IPartyPlanner private immutable planner; IPartyInfo private immutable info; constructor() { require(block.chainid==1, 'Not Ethereum'); string memory root = vm.projectRoot(); string memory path = string.concat(root, "/deployment/liqp-deployments.json"); string memory json = vm.readFile(path); bytes memory partyPlannerRaw = stdJson.parseRaw(json, ".1.v1.PartyPlanner"); planner = IPartyPlanner(abi.decode(partyPlannerRaw, (address))); bytes memory partyInfoRaw = stdJson.parseRaw(json, ".1.v1.PartyInfo"); info = IPartyInfo(abi.decode(partyInfoRaw, (address))); } function run() public { IPartyPool pool = IPartyPool(vm.envAddress('POOL')); console2.log('Exercising pool at', address(pool)); vm.startBroadcast(); exercise(pool); vm.stopBroadcast(); } function exercise(IPartyPool pool) internal { uint8 WETH_index = 3; // gather tokens and denominators IERC20[] memory tokens = pool.allTokens(); uint256 n = tokens.length; IERC20 WETH = tokens[WETH_index]; require(address(WETH) == address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2), 'Expected WETH as the fourth token'); // approve all for (uint256 i=0; i LP) uint256 amountIn = WETH.balanceOf(address(pool)) / 100; // trade 1% of what's in the pool require( WETH.balanceOf(msg.sender) >= amountIn, 'Insufficient WETH for swapMint'); (, uint256 lpMinted,) = pool.swapMint(msg.sender, msg.sender, WETH_index, amountIn, 0); // 5) regular swap (token 0 -> last token) require( WETH.balanceOf(msg.sender) >= amountIn, 'Insufficient WETH for swap'); WETH.approve(address(pool), amountIn); uint256 inputIndex = WETH_index; uint256 outputIndex = 0; pool.swap(msg.sender, bytes4(0), msg.sender, inputIndex, outputIndex, amountIn, int128(0), 0, false, ''); // 6) Collect protocol fees now (after some swaps) so some will have been moved out pool.collectProtocolFees(); // 7) Final swap-style operation: burnSwap (burn LP then swap to single asset) // ensure we have some LP allowance pool.burnSwap(msg.sender, msg.sender, lpMinted, WETH_index, 0, false); } }