// Minimal target ABIs used to encode the calldata that the vault executes via manage(). // The DecoderAndSanitizer exposes functions with identical signatures, so the same encoded // targetData is used both to derive the leaf (eth_call the decoder) and to execute (call the target). export const ERC20_ABI = [ { type: "function", name: "approve", stateMutability: "nonpayable", inputs: [ { name: "spender", type: "address" }, { name: "amount", type: "uint256" }, ], outputs: [{ type: "bool" }], }, { type: "function", name: "allowance", stateMutability: "view", inputs: [ { name: "owner", type: "address" }, { name: "spender", type: "address" }, ], outputs: [{ type: "uint256" }], }, { type: "function", name: "balanceOf", stateMutability: "view", inputs: [{ name: "account", type: "address" }], outputs: [{ type: "uint256" }], }, ] as const; export const AAVE_V3_POOL_ABI = [ { type: "function", name: "supply", stateMutability: "nonpayable", inputs: [ { name: "asset", type: "address" }, { name: "amount", type: "uint256" }, { name: "onBehalfOf", type: "address" }, { name: "referralCode", type: "uint16" }, ], outputs: [], }, { type: "function", name: "withdraw", stateMutability: "nonpayable", inputs: [ { name: "asset", type: "address" }, { name: "amount", type: "uint256" }, { name: "to", type: "address" }, ], outputs: [{ type: "uint256" }], }, { type: "function", name: "getReserveData", stateMutability: "view", inputs: [{ name: "asset", type: "address" }], // Only the aToken address (index 8) is needed; declare the full struct minimally. outputs: [ { type: "tuple", components: [ { name: "configuration", type: "uint256" }, { name: "liquidityIndex", type: "uint128" }, { name: "currentLiquidityRate", type: "uint128" }, { name: "variableBorrowIndex", type: "uint128" }, { name: "currentVariableBorrowRate", type: "uint128" }, { name: "currentStableBorrowRate", type: "uint128" }, { name: "lastUpdateTimestamp", type: "uint40" }, { name: "id", type: "uint16" }, { name: "aTokenAddress", type: "address" }, { name: "stableDebtTokenAddress", type: "address" }, { name: "variableDebtTokenAddress", type: "address" }, { name: "interestRateStrategyAddress", type: "address" }, { name: "accruedToTreasury", type: "uint128" }, { name: "unbacked", type: "uint128" }, { name: "isolationModeTotalDebt", type: "uint128" }, ], }, ], }, ] as const; // Uniswap V3 SwapRouter02 exactInputSingle (no deadline). Matches the composite decoder's // exactInputSingle((address,address,uint24,address,uint256,uint256,uint160)) sanitizer. export const UNISWAP_V3_ROUTER_ABI = [ { type: "function", name: "exactInputSingle", stateMutability: "payable", inputs: [ { name: "params", type: "tuple", components: [ { name: "tokenIn", type: "address" }, { name: "tokenOut", type: "address" }, { name: "fee", type: "uint24" }, { name: "recipient", type: "address" }, { name: "amountIn", type: "uint256" }, { name: "amountOutMinimum", type: "uint256" }, { name: "sqrtPriceLimitX96", type: "uint160" }, ], }, ], outputs: [{ name: "amountOut", type: "uint256" }], }, ] as const;