const inputAmount = parseUnits("100", 6);
const minAfterSlippage = inputAmount * 80n / 100n;
// 1. Approve Across to spend USDC
const approveAcross = await account.buildComposable({
type: "approve",
data: { spender: ACROSS_SPOKE_POOL, tokenAddress: USDC_ARBITRUM, chainId: arbitrum.id, amount: inputAmount }
});
// 2. Bridge USDC: Arbitrum → Base (via Across SpokePool)
const bridge = await account.buildComposable({
type: "default",
data: {
chainId: arbitrum.id,
to: ACROSS_SPOKE_POOL,
abi: acrossSpokePoolAbi,
functionName: "depositV3",
args: [
account.addressOn(arbitrum.id, true), // depositor
account.addressOn(base.id, true), // recipient
USDC_ARBITRUM, // inputToken
USDC_BASE, // outputToken
inputAmount, // inputAmount
outputAmount, // outputAmount (from Across quote API)
base.id, // destinationChainId
zeroAddress, // exclusiveRelayer
quoteTimestamp, // quoteTimestamp
fillDeadline, // fillDeadline
0, // exclusivityDeadline
"0x" // message
]
}
});
// 3. Swap USDC → WETH on Base (waits for bridge)
const swap = await account.buildComposable({
type: "default",
data: {
chainId: base.id,
to: UNISWAP_ROUTER,
abi: UniswapAbi,
functionName: "exactInputSingle",
args: [{
tokenIn: USDC_BASE,
amountIn: runtimeERC20BalanceOf({
tokenAddress: USDC_BASE,
targetAddress: account.addressOn(base.id, true),
constraints: [greaterThanOrEqualTo(minAfterSlippage)]
}),
tokenOut: WETH_BASE,
amountOutMinimum: 0n,
recipient: account.addressOn(base.id, true),
fee: 500,
sqrtPriceLimitX96: 0n
}]
}
});
// 4. Deposit WETH into Morpho
const deposit = await account.buildComposable({
type: "default",
data: {
chainId: base.id,
to: MORPHO_WETH_POOL,
abi: MorphoAbi,
functionName: "deposit",
args: [
runtimeERC20BalanceOf({ tokenAddress: WETH_BASE, targetAddress: account.addressOn(base.id, true) }),
account.addressOn(base.id, true)
]
}
});
// Execute entire flow
const quote = await meeClient.getQuote({
instructions: [approveAcross, bridge, swap, deposit],
feeToken: { address: USDC_ARBITRUM, chainId: arbitrum.id }
});
const { hash } = await meeClient.executeQuote({ quote });