126 lines
5.0 KiB
Solidity
126 lines
5.0 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.20;
|
|
|
|
import {Script, console} from "forge-std/Script.sol";
|
|
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
import {
|
|
AaveUniV2CwStableRebalanceFlashReceiver
|
|
} from "../../contracts/flash/AaveUniV2CwStableRebalanceFlashReceiver.sol";
|
|
|
|
/**
|
|
* @title RunMainnetUniV2CwusdcUsdcFlashRebalanceRemove
|
|
* @notice Simulate or broadcast flash rebalance + LP remove on mainnet cWUSDC/USDC UniV2.
|
|
*
|
|
* Prerequisite: run plan-mainnet-cwusdc-usdc-univ2-flash-rebalance-remove.py and transfer LP
|
|
* to the receiver (or set UNIV2_FLASH_PULL_LP=1 with prior LP approval to receiver).
|
|
*
|
|
* Env:
|
|
* PRIVATE_KEY
|
|
* ETHEREUM_MAINNET_RPC
|
|
* UNIV2_FLASH_REBALANCE_RECEIVER_MAINNET
|
|
* UNIV2_FLASH_REBALANCE_PLAN_JSON optional path to planner JSON
|
|
*/
|
|
contract RunMainnetUniV2CwusdcUsdcFlashRebalanceRemove is Script {
|
|
address internal constant DEFAULT_PAIR = 0xC28706F899266b36BC43cc072b3a921BDf2C48D9;
|
|
address internal constant DEFAULT_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
|
|
address internal constant DEFAULT_CW = 0x2de5F116bFcE3d0f922d9C8351e0c5Fc24b9284a;
|
|
address internal constant DEFAULT_USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
|
|
|
|
function run() external {
|
|
uint256 pk = vm.envUint("PRIVATE_KEY");
|
|
address receiver = vm.envAddress("UNIV2_FLASH_REBALANCE_RECEIVER_MAINNET");
|
|
string memory planPath = vm.envOr(
|
|
"UNIV2_FLASH_REBALANCE_PLAN_JSON",
|
|
string("reports/status/mainnet-cwusdc-usdc-univ2-flash-rebalance-plan-latest.json")
|
|
);
|
|
|
|
(
|
|
address pair,
|
|
address router,
|
|
address cw,
|
|
address usdc,
|
|
address lpHolder,
|
|
address recipient,
|
|
uint256 lpAmount,
|
|
uint256 flashStableIn,
|
|
uint256 minCwRebalance,
|
|
uint256 minCwRemove,
|
|
uint256 minStableRemove,
|
|
uint256 cwToSell,
|
|
uint256 minStableRepay
|
|
) = _loadPlan(planPath);
|
|
|
|
pair = pair == address(0) ? DEFAULT_PAIR : pair;
|
|
router = router == address(0) ? DEFAULT_ROUTER : router;
|
|
cw = cw == address(0) ? DEFAULT_CW : cw;
|
|
usdc = usdc == address(0) ? DEFAULT_USDC : usdc;
|
|
|
|
console.log("receiver", receiver);
|
|
console.log("pair", pair);
|
|
console.log("lpHolder", lpHolder);
|
|
console.log("lpAmount", lpAmount);
|
|
console.log("flashStableIn", flashStableIn);
|
|
console.log("receiverLpBefore", IERC20(pair).balanceOf(receiver));
|
|
|
|
vm.startBroadcast(pk);
|
|
if (vm.envOr("UNIV2_FLASH_PULL_LP", uint256(0)) == 1) {
|
|
AaveUniV2CwStableRebalanceFlashReceiver(receiver).pullLpFrom(pair, lpHolder, lpAmount);
|
|
}
|
|
AaveUniV2CwStableRebalanceFlashReceiver.RebalanceRemoveParams memory p =
|
|
AaveUniV2CwStableRebalanceFlashReceiver.RebalanceRemoveParams({
|
|
router: router,
|
|
pair: pair,
|
|
cwToken: cw,
|
|
stableToken: usdc,
|
|
lpAmount: lpAmount,
|
|
rebalanceStableIn: flashStableIn,
|
|
minCwFromRebalance: minCwRebalance,
|
|
minStableFromRemove: minStableRemove,
|
|
minCwFromRemove: minCwRemove,
|
|
cwToSellForRepay: cwToSell,
|
|
minStableFromRepaySwap: minStableRepay,
|
|
recipient: recipient
|
|
});
|
|
AaveUniV2CwStableRebalanceFlashReceiver(receiver).runRebalanceRemove(usdc, flashStableIn, p);
|
|
vm.stopBroadcast();
|
|
|
|
console.log("recipientStableAfter", IERC20(usdc).balanceOf(recipient));
|
|
console.log("recipientCwAfter", IERC20(cw).balanceOf(recipient));
|
|
}
|
|
|
|
function _loadPlan(string memory path)
|
|
internal
|
|
view
|
|
returns (
|
|
address pair,
|
|
address router,
|
|
address cw,
|
|
address usdc,
|
|
address lpHolder,
|
|
address recipient,
|
|
uint256 lpAmount,
|
|
uint256 flashStableIn,
|
|
uint256 minCwRebalance,
|
|
uint256 minCwRemove,
|
|
uint256 minStableRemove,
|
|
uint256 cwToSell,
|
|
uint256 minStableRepay
|
|
)
|
|
{
|
|
string memory json = vm.readFile(path);
|
|
pair = vm.parseJsonAddress(json, ".pair");
|
|
router = vm.parseJsonAddress(json, ".router");
|
|
cw = vm.parseJsonAddress(json, ".cwToken");
|
|
usdc = vm.parseJsonAddress(json, ".stableToken");
|
|
lpHolder = vm.parseJsonAddress(json, ".lpHolder");
|
|
recipient = vm.parseJsonAddress(json, ".recipient");
|
|
lpAmount = vm.parseJsonUint(json, ".lpAmountRaw");
|
|
flashStableIn = vm.parseJsonUint(json, ".flashLoan.stableBorrowRaw");
|
|
minCwRebalance = vm.parseJsonUint(json, ".rebalanceSwap.minCwOutRaw");
|
|
minCwRemove = vm.parseJsonUint(json, ".removeLiquidity.minCwOutRaw");
|
|
minStableRemove = vm.parseJsonUint(json, ".removeLiquidity.minStableOutRaw");
|
|
cwToSell = vm.parseJsonUint(json, ".repaySwap.cwToSellRaw");
|
|
minStableRepay = vm.parseJsonUint(json, ".repaySwap.minStableOutRaw");
|
|
}
|
|
}
|