| name | li-fi-sdk |
| description | TypeScript/JavaScript SDK for cross-chain and same-chain token swaps, bridging, and DeFi operations.
USE THIS SKILL TO:
- Swap tokens between different blockchains (e.g., "swap USDC on Ethereum to ETH on Arbitrum")
- Bridge tokens to another chain (e.g., "transfer my ETH from mainnet to Base")
- Swap tokens on the same chain with best DEX rates (e.g., "swap ETH to DAI on Polygon")
- Get quotes or compare routes for token swaps across any chains
- Execute 1-click DeFi workflows (zap into LP, bridge+swap+deposit, cross-chain yield entry)
- Build a dApp, wallet, or frontend that supports multi-chain token operations
- Create payment flows that accept any token and convert to a specific token
- Build React, Next.js, Vue, or Node.js apps with cross-chain swap functionality
- Handle cross-chain transaction lifecycle (status tracking, retries, refunds)
- Find available bridges, DEXs, chains, or tokens for cross-chain operations
|
LI.FI SDK Integration
The LI.FI SDK (@lifi/sdk) is a TypeScript/JavaScript toolkit for cross-chain and on-chain swaps and bridging. It provides complete functionality from obtaining routes/quotes to executing transactions across 30+ blockchain networks.
Installation
yarn add @lifi/sdk
npm install @lifi/sdk
pnpm add @lifi/sdk
bun add @lifi/sdk
Quick Start
1. Configure the SDK
import { createConfig } from '@lifi/sdk';
createConfig({
integrator: 'YourAppName',
});
2. Request a Quote
import { getQuote } from '@lifi/sdk';
const quote = await getQuote({
fromChain: 42161,
toChain: 10,
fromToken: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
toToken: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',
fromAmount: '10000000',
fromAddress: '0xYourWalletAddress',
});
3. Execute the Transfer
import { executeRoute, convertQuoteToRoute } from '@lifi/sdk';
const route = convertQuoteToRoute(quote);
const executedRoute = await executeRoute(route, {
updateRouteHook(updatedRoute) {
console.log('Route updated:', updatedRoute);
},
});
Core Concepts
Routes vs Quotes
getQuote(): Returns single best option with transaction data ready. Use for simple transfers.
getRoutes(): Returns multiple options for comparison. Use when presenting choices to users.
See references/REFERENCE.md for chain IDs, token addresses, and parameter tables.
SDK Configuration
Basic Configuration
import { createConfig } from '@lifi/sdk';
createConfig({
integrator: 'YourAppName',
apiKey: 'your-api-key',
});
Advanced Configuration
import { createConfig, ChainType } from '@lifi/sdk';
createConfig({
integrator: 'YourAppName',
apiKey: 'your-api-key',
rpcUrls: {
1: ['https://your-ethereum-rpc.com'],
137: ['https://your-polygon-rpc.com'],
},
chains: {
allow: [1, 10, 137, 42161],
},
preloadChains: true,
});
Requesting Routes and Quotes
Get Multiple Routes
import { getRoutes, RoutesRequest } from '@lifi/sdk';
const routesRequest: RoutesRequest = {
fromChainId: 42161,
toChainId: 10,
fromTokenAddress: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
toTokenAddress: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',
fromAmount: '10000000',
fromAddress: '0xYourAddress',
options: {
slippage: 0.005,
order: 'CHEAPEST',
},
};
const result = await getRoutes(routesRequest);
const routes = result.routes;
Get Single Best Quote
import { getQuote, QuoteRequest } from '@lifi/sdk';
const quoteRequest: QuoteRequest = {
fromChain: 42161,
toChain: 10,
fromToken: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
toToken: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',
fromAmount: '10000000',
fromAddress: '0xYourAddress',
slippage: 0.005,
};
const quote = await getQuote(quoteRequest);
Route Options
const options = {
slippage: 0.005,
order: 'CHEAPEST',
maxPriceImpact: 0.3,
allowSwitchChain: true,
integrator: 'YourApp',
fee: 0.03,
bridges: {
allow: ['stargate', 'hop'],
deny: ['multichain'],
prefer: ['stargate'],
},
exchanges: {
allow: ['1inch', 'uniswap'],
deny: ['sushiswap'],
},
};
Executing Transactions
Basic Execution
import { executeRoute } from '@lifi/sdk';
const executedRoute = await executeRoute(route, {
updateRouteHook(updatedRoute) {
console.log('Status:', updatedRoute.steps[0]?.execution?.status);
},
});
Execution with All Hooks
import { executeRoute } from '@lifi/sdk';
const executedRoute = await executeRoute(route, {
updateRouteHook(updatedRoute) {
const step = updatedRoute.steps[0];
const process = step?.execution?.process;
const latestProcess = process?.[process.length - 1];
console.log('Status:', latestProcess?.status);
console.log('TX Hash:', latestProcess?.txHash);
},
acceptExchangeRateUpdateHook(toToken, oldAmount, newAmount) {
const oldValue = parseFloat(oldAmount);
const newValue = parseFloat(newAmount);
const percentChange = ((newValue - oldValue) / oldValue) * 100;
if (Math.abs(percentChange) < 2) {
return Promise.resolve(true);
}
return promptUserToAccept(percentChange);
},
async switchChainHook(chainId) {
await walletClient.switchChain({ id: chainId });
return walletClient;
},
async updateTransactionRequestHook(txRequest) {
return {
...txRequest,
gas: txRequest.gas ? BigInt(txRequest.gas) * 120n / 100n : undefined,
};
},
});
Execute a Quote
import { getQuote, convertQuoteToRoute, executeRoute } from '@lifi/sdk';
const quote = await getQuote(quoteRequest);
const route = convertQuoteToRoute(quote);
const result = await executeRoute(route);
Managing Execution Lifecycle
Resume Interrupted Execution
import { resumeRoute } from '@lifi/sdk';
const resumedRoute = await resumeRoute(savedRoute, {
updateRouteHook(route) {
console.log('Resumed execution:', route);
},
});
Background Execution
import { executeRoute, updateRouteExecution } from '@lifi/sdk';
const routePromise = executeRoute(route, {
updateRouteHook(route) {
saveRouteState(route);
},
});
updateRouteExecution(route, { executeInBackground: true });
const resumedRoute = await resumeRoute(savedRoute, {
executeInBackground: false,
});
Stop Execution
import { stopRouteExecution } from '@lifi/sdk';
const stoppedRoute = stopRouteExecution(route);
Get Active Routes
import { getActiveRoutes, getActiveRoute } from '@lifi/sdk';
const activeRoutes = getActiveRoutes();
const activeRoute = getActiveRoute(routeId);
Chain and Token Discovery
Get Available Chains
import { getChains, ChainType } from '@lifi/sdk';
const allChains = await getChains();
const evmChains = await getChains({ chainTypes: [ChainType.EVM] });
Get Available Tokens
import { getTokens, getToken } from '@lifi/sdk';
const tokens = await getTokens({ chains: [1, 137] });
const usdc = await getToken(1, '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48');
Get Available Tools (Bridges/DEXs)
import { getTools } from '@lifi/sdk';
const tools = await getTools();
console.log('Bridges:', tools.bridges);
console.log('Exchanges:', tools.exchanges);
Get Connections
import { getConnections } from '@lifi/sdk';
const connections = await getConnections({
fromChain: 1,
fromToken: '0x0000000000000000000000000000000000000000',
});
Multi-VM Provider Setup
EVM Provider (Viem)
import { createConfig, EVM } from '@lifi/sdk';
import { createWalletClient, http } from 'viem';
import { mainnet } from 'viem/chains';
const walletClient = createWalletClient({
chain: mainnet,
transport: http(),
});
createConfig({
integrator: 'YourApp',
providers: [
EVM({ getWalletClient: () => Promise.resolve(walletClient) }),
],
});
Solana Provider
import { createConfig, Solana } from '@lifi/sdk';
createConfig({
integrator: 'YourApp',
providers: [
Solana({ getWalletAdapter: () => Promise.resolve(walletAdapter) }),
],
});
Contract Calls (Composer)
Execute contract calls on the destination chain after bridging:
import { getContractCallsQuote } from '@lifi/sdk';
const contractCallQuote = await getContractCallsQuote({
fromAddress: '0xYourAddress',
fromChain: 10,
fromToken: '0x0000000000000000000000000000000000000000',
toAmount: '8500000000000',
toChain: 8453,
toToken: '0x0000000000000000000000000000000000000000',
contractCalls: [{
fromAmount: '8500000000000',
fromTokenAddress: '0x0000000000000000000000000000000000000000',
toContractAddress: '0xTargetContract',
toContractCallData: '0x...',
toContractGasLimit: '210000',
}],
});
Error Handling
import { executeRoute } from '@lifi/sdk';
try {
const result = await executeRoute(route, {
acceptExchangeRateUpdateHook: () => Promise.resolve(true),
});
} catch (error) {
if (error.message.includes('Exchange rate has changed')) {
} else if (error.message.includes('insufficient funds')) {
} else if (error.message.includes('user rejected')) {
} else {
console.error('Execution failed:', error);
}
}
Best Practices
-
Always implement acceptExchangeRateUpdateHook - Exchange rates can change during execution. Without this hook, execution fails on rate changes.
-
Persist route state - Use updateRouteHook to save route state for recovery after page refreshes or app restarts.
-
Handle chain switching - For cross-chain routes, implement switchChainHook to handle wallet chain switches.
-
Use appropriate slippage - Default 0.5% (0.005) works for most cases. Increase for volatile tokens or low-liquidity pairs.
-
Set integrator name - Always configure integrator for analytics and potential monetization.
-
Check token allowances - The SDK handles allowances automatically, but you may want to show approval UI to users.
-
Monitor gas prices - Use updateTransactionRequestHook to adjust gas if needed.
See references/REFERENCE.md for detailed parameter tables and TypeScript interfaces.