import { createComposeSdk, materialisers, resources } from '@lifi/composer-sdk';
const CHAIN_ID = 1;
const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
const USDT = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
const DAI = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
const FRAX = '0x853d955aCEf822Db058eb8505911ED77F175b99e';
const LUSD = '0x5f98805A4E8be255a32880FDeC7F6728C6568bA0';
const sdk = createComposeSdk({
baseUrl: 'https://composer.li.quest',
apiKey: process.env.LIFI_API_KEY!,
});
// One input per stablecoin on Ethereum.
const builder = sdk.flow(CHAIN_ID, {
name: 'consolidate-stables-to-usdc',
inputs: {
usdt: resources.erc20(USDT, CHAIN_ID),
dai: resources.erc20(DAI, CHAIN_ID),
frax: resources.erc20(FRAX, CHAIN_ID),
lusd: resources.erc20(LUSD, CHAIN_ID),
},
});
// Swap each stablecoin to USDC with the same config.
const swapConfig = {
resourceOut: resources.erc20(USDC, CHAIN_ID),
slippage: 0.03,
};
builder.lifi.swap('swapUsdt', { bind: { amountIn: builder.inputs.usdt }, config: swapConfig });
builder.lifi.swap('swapDai', { bind: { amountIn: builder.inputs.dai }, config: swapConfig });
builder.lifi.swap('swapFrax', { bind: { amountIn: builder.inputs.frax }, config: swapConfig });
builder.lifi.swap('swapLusd', { bind: { amountIn: builder.inputs.lusd }, config: swapConfig });
// directDeposit pulls a fixed amount of each token from the signer.
const result = await builder.compile({
signer: '0xYourSignerAddress',
inputs: {
usdt: materialisers.directDeposit({ amount: '100000000' }), // 100 USDT (6 decimals)
dai: materialisers.directDeposit({ amount: '100000000000000000000' }), // 100 DAI (18 decimals)
frax: materialisers.directDeposit({ amount: '100000000000000000000' }), // 100 FRAX
lusd: materialisers.directDeposit({ amount: '100000000000000000000' }), // 100 LUSD
},
sweepTo: builder.context.sender,
});
for (const id of ['swapUsdt', 'swapDai', 'swapFrax', 'swapLusd']) {
console.log(id, result.outputs[`${id}.amountOut`]?.amount);
}