address accountOwner;
address creditManager;
address creditFacade;
address usdc;
address weth;
address yvWETH;
address uniswapV3Router;
bytes memory yvWETH_priceData;
// Assume exchange rate: 2000 USDC/yvWETH
MultiCall[] memory calls = new MultiCall[](8);
// 1. On-demand price update (must be first)
calls[0] = MultiCall({
target: creditFacade,
callData: abi.encodeCall(
ICreditFacadeV3Multicall.onDemandPriceUpdate,
(yvWETH, false, yvWETH_priceData)
)
});
// 2. Add collateral
calls[1] = MultiCall({
target: creditFacade,
callData: abi.encodeCall(
ICreditFacadeV3Multicall.addCollateral,
(usdc, 10_000 * 10**6)
)
});
// 3. Borrow
calls[2] = MultiCall({
target: creditFacade,
callData: abi.encodeCall(
ICreditFacadeV3Multicall.increaseDebt,
(40_000 * 10**6)
)
});
// 4. Store expected balances for slippage check
// Min output: (50000 / 2000) * 0.995 = 24.875 yvWETH
BalanceDelta[] memory deltas = new BalanceDelta[](1);
deltas[0] = BalanceDelta({
token: yvWETH,
amount: (25 * 10**18) * 995 / 1000
});
calls[3] = MultiCall({
target: creditFacade,
callData: abi.encodeCall(
ICreditFacadeV3Multicall.storeExpectedBalances,
(deltas)
)
});
// 5. Swap via Uniswap
address uniswapV3Adapter = ICreditManagerV3(creditManager).contractToAdapter(uniswapV3Router);
ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
tokenIn: usdc,
tokenOut: weth,
fee: 500,
recipient: address(0), // Adapter overrides
deadline: block.timestamp + 3600,
amountIn: 50_000 * 10**6,
amountOutMinimum: 0, // Using Gearbox slippage check
sqrtPriceLimitX96: 0
});
calls[4] = MultiCall({
target: uniswapV3Adapter,
callData: abi.encodeCall(IUniswapV3Adapter.exactInputSingle, (params))
});
// 6. Deposit to Yearn using diff pattern
address yvWETHAdapter = ICreditManagerV3(creditManager).contractToAdapter(yvWETH);
calls[5] = MultiCall({
target: yvWETHAdapter,
callData: abi.encodeCall(IYearnV2Adapter.depositDiff, (1)) // Leave 1 wei
});
// 7. Compare balances (slippage check)
calls[6] = MultiCall({
target: creditFacade,
callData: abi.encodeCall(ICreditFacadeV3Multicall.compareBalances, ())
});
// 8. Set quota for yvWETH
calls[7] = MultiCall({
target: creditFacade,
callData: abi.encodeCall(
ICreditFacadeV3Multicall.updateQuota,
(yvWETH, 50_000 * 10**6, 50_000 * 10**6)
)
});
// Approve collateral to Credit Manager (not Facade!)
IERC20(usdc).approve(creditManager, 10_000 * 10**6);
// Execute
ICreditFacadeV3(creditFacade).openCreditAccount(accountOwner, calls, 0);