home / skills / openclaw / skills / lifi-crosschain

lifi-crosschain skill

/skills/rhlsthrm/lifi-crosschain

This skill helps you obtain cross-chain LI.FI quotes, execute transfers, and track DeFi operations across 35+ blockchains.

npx playbooks add skill openclaw/skills --skill lifi-crosschain

Review the files below or copy the command above to add this skill to your agents.

Files (4)
SKILL.md
15.8 KB
---
name: lifi
description: Cross-chain token swaps and bridges via the LI.FI protocol. Get quotes, execute transfers, track progress, and compose DeFi operations across 35+ blockchains.
user-invocable: true
argument-hint: "[swap|bridge|track|routes|zap] <details>"
metadata: {"openclaw":{"emoji":"🔗","requires":{"bins":["curl"]},"primaryEnv":"LIFI_API_KEY"}}
---

# /lifi — Cross-Chain Swaps & Bridges

LI.FI is a cross-chain bridge and DEX aggregation protocol. It finds optimal routes across 35+ blockchains, comparing dozens of bridges (Stargate, Hop, Across, etc.) and DEXes (Uniswap, SushiSwap, 1inch, etc.) to execute token swaps and cross-chain transfers.

## Arguments: `$ARGUMENTS`

Parse the arguments:
- **First positional arg**: Action — `swap`, `bridge`, `track`, `routes`, `zap`, or a natural language request
- **Remaining args**: Details (token names, amounts, chains, tx hashes, etc.)

If no arguments are provided, ask the user what they want to do.

## Key Concepts

- **Base URL**: `https://li.quest/v1`
- The API returns `transactionRequest` objects (to, data, value, gasLimit, gasPrice) ready to sign — provide these to the agent's wallet
- **Native token address**: `0x0000000000000000000000000000000000000000` (for ETH, MATIC, BNB, etc.)
- Amounts are always in the token's **smallest unit** (wei): 1 ETH = `1000000000000000000` (18 decimals), 1 USDC = `1000000` (6 decimals)
- Optional API key via `x-lifi-api-key` header for higher rate limits (not required)

---

## API Reference

### Discovery Endpoints

#### GET /v1/chains — List supported blockchains
```bash
curl -s "https://li.quest/v1/chains"
# Optional: ?chainTypes=EVM or ?chainTypes=SVM
```

#### GET /v1/tokens — List supported tokens
```bash
curl -s "https://li.quest/v1/tokens?chains=1,137"
# Optional: chainTypes, minPriceUSD
```

#### GET /v1/token — Get specific token details
```bash
curl -s "https://li.quest/v1/token?chain=1&token=USDC"
# chain (required): chain ID or name. token (required): address or symbol
```

#### GET /v1/connections — Check available swap routes
```bash
curl -s "https://li.quest/v1/connections?fromChain=1&toChain=137&fromToken=0x0000000000000000000000000000000000000000"
# Optional: toToken, chainTypes, allowBridges
```

#### GET /v1/tools — List available bridges and DEXes
```bash
curl -s "https://li.quest/v1/tools"
# Returns {bridges: [{key, name}], exchanges: [{key, name}]}
```

### Quote & Swap Endpoints

#### GET /v1/quote — Get optimal route + transaction data
The primary endpoint for initiating any swap or bridge.
```bash
curl -s "https://li.quest/v1/quote?\
fromChain=1&toChain=137\
&fromToken=0x0000000000000000000000000000000000000000\
&toToken=0x0000000000000000000000000000000000000000\
&fromAddress=0xYOUR_WALLET\
&fromAmount=1000000000000000000\
&slippage=0.03"
```
**Required**: fromChain, toChain, fromToken, toToken, fromAddress, fromAmount
**Optional**: toAddress, slippage (decimal, e.g. 0.03 = 3%), integrator, order (RECOMMENDED|FASTEST|CHEAPEST|SAFEST), allowBridges, allowExchanges

Returns: `action`, `estimate` (toAmount, fees, executionDuration), and `transactionRequest` (to, data, value, gasLimit).

#### GET /v1/status — Track cross-chain transfer
```bash
curl -s "https://li.quest/v1/status?txHash=0xTX_HASH"
# Optional: bridge, fromChain, toChain
```
Returns: `status` (NOT_FOUND, PENDING, DONE, FAILED), `substatus` (COMPLETED, PARTIAL, REFUNDED), source/destination tx details.

### Advanced Routing

#### POST /v1/advanced/routes — Compare multiple route options
```bash
curl -s -X POST "https://li.quest/v1/advanced/routes" \
  -H "Content-Type: application/json" \
  -d '{
    "fromChainId": "1",
    "toChainId": "137",
    "fromTokenAddress": "0x0000000000000000000000000000000000000000",
    "toTokenAddress": "0x0000000000000000000000000000000000000000",
    "fromAddress": "0xYOUR_WALLET",
    "fromAmount": "1000000000000000000",
    "options": {"order": "RECOMMENDED"}
  }'
```
**Required**: fromChainId, toChainId, fromTokenAddress, toTokenAddress, fromAddress, fromAmount
**Optional**: toAddress, slippage, options.order

Returns: `routes[]` array — each route has steps, estimated output, fees, and execution time.

#### POST /v1/advanced/stepTransaction — Get tx data for a route step
```bash
curl -s -X POST "https://li.quest/v1/advanced/stepTransaction" \
  -H "Content-Type: application/json" \
  -d '{ ...step object from routes response... }'
```
Pass the entire step object from a route. Returns `transactionRequest` ready to sign.

#### POST /v1/quote/contractCalls — Zaps (multi-action DeFi composition)
```bash
curl -s -X POST "https://li.quest/v1/quote/contractCalls" \
  -H "Content-Type: application/json" \
  -d '{
    "fromChain": "1",
    "toChain": "137",
    "fromToken": "0x0000000000000000000000000000000000000000",
    "toToken": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
    "fromAddress": "0xYOUR_WALLET",
    "fromAmount": "1000000000000000000",
    "contractCalls": [
      {
        "toContractAddress": "0xTARGET_CONTRACT",
        "toContractCallData": "0xENCODED_FUNCTION_CALL",
        "toContractGasLimit": "200000"
      }
    ]
  }'
```
**Required**: fromChain, toChain, fromToken, toToken, fromAddress, fromAmount, contractCalls[]
**Optional**: slippage

### Gas Information

#### GET /v1/gas/prices — Gas prices across all chains
```bash
curl -s "https://li.quest/v1/gas/prices"
```

#### GET /v1/gas/suggestion/{chainId} — Recommended gas params for a chain
```bash
curl -s "https://li.quest/v1/gas/suggestion/1"
```

---

## Guided Workflows

### Workflow 1 — Swap or Bridge Tokens

Use this for any "swap X for Y" or "bridge tokens to chain" request.

1. **Identify parameters** from the user's request:
   - Source chain and token (e.g., "ETH on Ethereum")
   - Destination chain and token (e.g., "USDC on Polygon")
   - Amount in human-readable form (e.g., "1.5 ETH")
   - Wallet address (the agent's wallet or user-specified)

2. **Look up token addresses** if the user gave symbols:
   ```bash
   curl -s "https://li.quest/v1/token?chain=1&token=USDC"
   ```
   Extract `address` and `decimals` from the response.

3. **Convert amount to smallest unit**:
   - Multiply human amount by 10^decimals
   - 1.5 ETH (18 decimals) → `1500000000000000000`
   - 100 USDC (6 decimals) → `100000000`

4. **Get a quote**:
   ```bash
   curl -s "https://li.quest/v1/quote?fromChain=1&toChain=137&fromToken=0x0000000000000000000000000000000000000000&toToken=0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359&fromAddress=0xWALLET&fromAmount=1500000000000000000&slippage=0.03"
   ```

5. **Present summary to user** (REQUIRED before returning tx data):
   ```
   Swap: 1.5 ETH (Ethereum) → ~2,850 USDC (Polygon)
   Route: Stargate bridge → Uniswap V3
   Fees: ~$2.50 (gas) + $0.50 (bridge)
   Estimated time: ~2 minutes
   Slippage: 3%
   ```

6. **If ERC20 token**: Check if the LiFi contract has sufficient allowance. The spender address is `transactionRequest.to` from the quote response. If allowance < fromAmount, guide the user to approve the token first.

7. **Return `transactionRequest`** for signing by the agent's wallet.

8. **If cross-chain**: Explain that bridging is asynchronous — the source chain tx will confirm first, then the bridge delivers tokens to the destination. Offer to track with Workflow 3.

### Workflow 2 — Compare Routes

Use when the user wants to see options or find the best deal.

1. **Gather parameters** (same as Workflow 1, steps 1-3).

2. **Request multiple routes**:
   ```bash
   curl -s -X POST "https://li.quest/v1/advanced/routes" \
     -H "Content-Type: application/json" \
     -d '{
       "fromChainId": "1",
       "toChainId": "137",
       "fromTokenAddress": "0x0000000000000000000000000000000000000000",
       "toTokenAddress": "0x0000000000000000000000000000000000000000",
       "fromAddress": "0xWALLET",
       "fromAmount": "1000000000000000000",
       "options": {"order": "RECOMMENDED"}
     }'
   ```

3. **Present comparison table**:
   ```
   #  Route                     Output       Fees     Time    Bridge
   1  Stargate → Uniswap V3    2,850 USDC   $3.00    2 min   Stargate
   2  Hop → SushiSwap          2,845 USDC   $2.80    5 min   Hop
   3  Across → 1inch           2,848 USDC   $3.20    3 min   Across
   ```

4. **User picks a route**. Extract the chosen route's steps.

5. **Get transaction data** for each step:
   ```bash
   curl -s -X POST "https://li.quest/v1/advanced/stepTransaction" \
     -H "Content-Type: application/json" \
     -d '{ ...step object... }'
   ```

6. **Return `transactionRequest`** for signing.

### Workflow 3 — Track a Transfer

Use when the user wants to check status of a cross-chain transfer.

1. **Get details from user**: transaction hash, source chain, destination chain.

2. **Check status**:
   ```bash
   curl -s "https://li.quest/v1/status?txHash=0xTX_HASH&fromChain=1&toChain=137"
   ```

3. **Interpret and report status**:
   - `NOT_FOUND` — Transaction not yet indexed. Wait a minute and retry.
   - `PENDING` — Transfer in progress. Suggest polling every 30 seconds.
   - `DONE` with substatus `COMPLETED` — Transfer complete. Report destination tx hash.
   - `DONE` with substatus `PARTIAL` — User received the bridged token on the destination chain but NOT the final target token (e.g., got USDC.e instead of native USDC). The user may need to swap manually.
   - `DONE` with substatus `REFUNDED` — Transfer failed and funds were returned to the source address.
   - `FAILED` — Transfer failed. Report error details and advise the user to check the source chain tx on a block explorer.

4. **If PENDING**: Offer to poll periodically. Wait 30 seconds between checks.

### Workflow 4 — Zap (Contract Call Composition)

Use for multi-step DeFi operations like "bridge ETH to Polygon and deposit into Aave" or "swap to USDC and stake in a vault."

1. **Understand the multi-step operation** — identify:
   - Source chain/token/amount
   - Destination chain/token (the intermediate token before contract calls)
   - Target contract and function to call on the destination

2. **Gather contract call data**:
   - `toContractAddress`: The destination contract (e.g., Aave lending pool)
   - `toContractCallData`: ABI-encoded function call (e.g., `deposit(address,uint256,address,uint16)`)
   - `toContractGasLimit`: Gas limit for the contract call (e.g., "200000")

3. **Request zap quote**:
   ```bash
   curl -s -X POST "https://li.quest/v1/quote/contractCalls" \
     -H "Content-Type: application/json" \
     -d '{
       "fromChain": "1",
       "toChain": "137",
       "fromToken": "0x0000000000000000000000000000000000000000",
       "toToken": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
       "fromAddress": "0xWALLET",
       "fromAmount": "1000000000000000000",
       "contractCalls": [{
         "toContractAddress": "0xTARGET",
         "toContractCallData": "0xENCODED_CALL",
         "toContractGasLimit": "200000"
       }]
     }'
   ```

4. **Present summary** showing all operations in the zap (bridge + swap + deposit/stake/etc.).

5. **Return `transactionRequest`** for signing.

### Workflow 5 — Discovery

Use when the user asks "what chains are supported?", "what tokens can I swap?", "what bridges are available?", etc.

1. **Determine what the user wants to know**:
   - Supported chains → `GET /v1/chains`
   - Tokens on a chain → `GET /v1/tokens?chains={chainId}`
   - Token details → `GET /v1/token?chain={chainId}&token={symbol}`
   - Available routes → `GET /v1/connections?fromChain={id}&toChain={id}`
   - Available bridges/DEXes → `GET /v1/tools`
   - Gas prices → `GET /v1/gas/prices` or `GET /v1/gas/suggestion/{chainId}`

2. **Call the appropriate endpoint**.

3. **Present results** in a readable table format. For large responses (e.g., all tokens), summarize the most relevant results and offer to filter further.

---

## Safety Protocol

These rules are **mandatory** — never skip them.

### Address Validation
- **ALWAYS** verify `fromAddress` is a valid hex address: starts with `0x`, 42 characters total, valid hex characters
- **NEVER** send to the zero address (`0x0000000000000000000000000000000000000000`) as `toAddress` — this burns funds permanently. The zero address is ONLY valid as a `fromToken`/`toToken` to represent native tokens.

### Amount Validation
- **ALWAYS** convert human-readable amounts to the token's smallest unit before calling the API
  - Check the token's `decimals` field (ETH=18, USDC=6, WBTC=8, DAI=18)
  - Formula: `amount_wei = human_amount × 10^decimals`
- Amounts must be positive integers (no decimals, no negatives, no zero)
- Maximum 78 digits (uint256 max)
- If the user says "1 ETH", send `1000000000000000000`, NOT `1`

### Slippage Validation
- Default to `0.03` (3%) if the user doesn't specify
- **WARN** the user if slippage > 3% — explain they may receive significantly fewer tokens
- **REJECT** slippage > 50% (`0.5`) — this is almost certainly an error
- Slippage must be between 0 and 1 (0% to 100%)

### ERC20 Token Approvals
- **ALWAYS** check token allowance before executing ERC20 swaps
- If allowance < fromAmount, guide the user to approve the token first
- **NEVER** approve unlimited amounts (MaxUint256 / `0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`) unless the user explicitly requests it — approve only the needed amount
- The spender address is `transactionRequest.to` from the quote response

### Transaction Presentation
- **ALWAYS** present a human-readable summary before returning any `transactionRequest` data
- The summary must include: tokens and amounts, route/bridge used, estimated fees, estimated time, slippage setting
- **NEVER** return raw transaction data without explanation

### Cross-Chain Safety
- Explain that cross-chain bridges are **non-atomic** — funds may be in transit for minutes to hours
- After submitting a source chain tx, always offer to track the transfer status
- If a transfer shows `PARTIAL` status, explain the user received bridged tokens but not the final target token

### No Route Found
- If a quote returns no route: suggest trying different tokens, a smaller amount, or an alternative chain pair
- Use `GET /v1/connections` to verify the route is supported before retrying

---

## Error Handling

| Error | Cause | Action |
|-------|-------|--------|
| HTTP 429 | Rate limited | Wait 30s, retry with exponential backoff (30s → 60s → 120s). Suggest user set `LIFI_API_KEY` for higher limits. |
| No route found | Route unsupported or amount too small/large | Check `/v1/connections` for valid pairs. Suggest different tokens, smaller amount, or alternative chains. |
| Slippage error | Price moved beyond tolerance | Increase slippage (e.g., 0.03 → 0.05) and retry. Warn user about the trade-off. |
| Insufficient balance | Wallet lacks funds | Report the shortfall amount. Check balance with the agent's wallet tools. |
| Transaction reverted | Price moved, liquidity drained, or gas too low | Explain possible causes. Suggest retrying with higher slippage or gas. |
| PARTIAL completion | Bridge delivered token but not final swap | User has the bridged asset on the destination chain. They can swap it manually or retry. |
| REFUNDED | Bridge failed, funds returned | Confirm refund on source chain. Suggest trying a different bridge via `allowBridges`. |
| Invalid address | Malformed hex address | Verify address format: `0x` prefix, 42 characters, valid hex. |

---

## Chain Quick Reference

| Chain | ID | Native Token |
|-------|----|-------------|
| Ethereum | 1 | ETH |
| Polygon | 137 | MATIC |
| Arbitrum One | 42161 | ETH |
| Optimism | 10 | ETH |
| BSC | 56 | BNB |
| Base | 8453 | ETH |
| Avalanche | 43114 | AVAX |
| Fantom | 250 | FTM |
| zkSync Era | 324 | ETH |
| Gnosis | 100 | xDAI |
| Scroll | 534352 | ETH |
| Linea | 59144 | ETH |
| Blast | 81457 | ETH |
| Mode | 34443 | ETH |
| Solana | 1151111081099710 | SOL |

For the full list of supported chains, call `GET /v1/chains`.

Native token address on all EVM chains: `0x0000000000000000000000000000000000000000`

Overview

This skill enables cross-chain token swaps, bridges, route comparisons and DeFi zaps using the LI.FI protocol across 35+ blockchains. It returns optimized quotes, transactionRequest objects ready for signing, and status tracking for asynchronous transfers. The skill handles token discovery, amount conversion to smallest units, and multi-step route composition.

How this skill works

The skill calls LI.FI discovery endpoints to list chains and tokens, uses /v1/quote and /v1/advanced/routes to compute optimal routes, and returns transactionRequest payloads (to, data, value, gas limits) that a wallet can sign. For multi-step zaps it posts contractCalls, and for tracking it queries /v1/status to report PENDING, DONE, PARTIAL, REFUNDED, or FAILED. It enforces address, amount, slippage, and allowance safety checks before returning any tx data.

When to use it

  • Swap tokens across or within chains (DEX aggregation)
  • Bridge assets between chains and receive destination tokens
  • Compare multiple routing options to pick cheapest/fastest/safest
  • Compose multi-action DeFi flows (zap into lending, vaults, or staking)
  • Track progress of an in-flight cross-chain transfer

Best practices

  • Always validate fromAddress format (0x + 40 hex chars) and never use zero address as toAddress
  • Convert human amounts to smallest unit using token decimals before calling the API
  • Default slippage to 3%; warn if >3% and reject values >50%
  • Check ERC20 allowance against transactionRequest.to and request an approve for the exact needed amount if insufficient
  • Present a readable summary (tokens, amounts, route, fees, ETA, slippage) before returning transactionRequest

Example use cases

  • Bridge 1.5 ETH from Ethereum to USDC on Polygon and return a transactionRequest to sign
  • Compare 3 route options for ETH → USDC cross-chain swap and show fees, time, and output estimates
  • Create a zap that bridges ETH to Polygon and then deposits into Aave by encoding a contract call
  • Query supported chains or tokens on a specific chain and summarize results
  • Track a cross-chain tx hash and interpret NOT_FOUND / PENDING / DONE / PARTIAL statuses

FAQ

Do I need an API key to use LI.FI through this skill?

No. An x-lifi-api-key can increase rate limits but is optional; endpoints work without it.

What unit should I send amounts in?

Always send amounts in the token's smallest unit (wei). Convert by multiplying human amount × 10^decimals (e.g., 1 ETH = 1e18).