This quickstart walks you through a complete cross-chain USDC transfer (Base → Arbitrum) using the standard escrow flow, the recommended path for most integrations. By the end, you’ll have requested a quote, approved tokens, opened an order on-chain, and tracked it to settlement. If you need gasless off-chain order submission or are building on top of resource locks, see the Compact Orders guide instead. The entire flow uses TypeScript with ethers.js since the escrow flow requires on-chain transactions. You’ll need a provider connected to Base and a signer (wallet) with USDC.Documentation Index
Fetch the complete documentation index at: https://docs.li.fi/llms.txt
Use this file to discover all available pages before exploring further.
No API key is required. All integrator endpoints are open with no rate limits. See Authentication for details.
Prerequisites
The escrow flow involves on-chain transactions (approving tokens and calling the escrow contract to lock funds). We use ethers.js to interact with the Base network, but any EVM-compatible library (viem, web3.js, etc.) works the same way.TypeScript
Escrow Flow
The standard escrow integration is a 4-step process: request a quote, approve tokens, open the order on-chain, and track it to settlement.The Intents API uses interoperable addresses (EIP-7930). See Request a Quote for encoding details.
Request a quote
Call The interoperable address prefix encodes the chain.
POST /quote/request with the user’s input and desired output. This example sends 10 USDC from Base to Arbitrum.TypeScript
0x00010000022105 is Base (8453) and 0x0001000002A4B1 is Arbitrum (42161). See Interoperable Address Encoding for details.The response contains an array of quotes sorted by best price. The best quote is at index 0. Use preview.outputs[0].amount from the best quote when constructing your order in the next steps.Approve tokens
Before opening the escrow, the
InputSettlerEscrow contract needs permission to transfer your tokens. Approve USDC on Base.TypeScript
You can also use Permit2 for gasless approvals. The escrow supports registration via Permit2 signatures. See Input Settlement for details.
Construct and open the order on-chain
Build a The
StandardOrder from the quote response and call open() on the InputSettlerEscrow contract. This locks your tokens and broadcasts the intent to solvers.TypeScript
open() call transfers your tokens into escrow and emits an Open event. Solvers and the order server detect this event automatically. No separate submission step is needed.Track the order
Poll
Once
GET /orders/status until the order reaches a terminal state. Use the onChainOrderId from the Open event.TypeScript
| Status | Meaning |
|---|---|
Open | Order registered on-chain, tokens locked in escrow |
Signed | Order signed and available for solver pickup |
Delivered | Solver has delivered assets on the destination chain |
Settled | Proof verified, locked funds released to solver. Complete. |
Settled, the user has received USDC on Arbitrum and the solver has been paid from escrow.What Just Happened
- Requested a quote. The order server returned pricing from its solver network based on your input/output pair.
- Approved tokens. The escrow contract was authorized to transfer your USDC.
- Opened the order. Tokens were locked in escrow and the intent was broadcast to solvers via the
Openevent. - Solver delivered. A solver fulfilled the order by delivering USDC on Arbitrum.
- Settlement completed. The oracle verified delivery and the escrow released the locked funds to the solver.
Next Steps
API Overview
Full endpoint reference, base URLs, and authentication
Request a Quote
Exact-input, exact-output, and exclusive quote details
Compact Orders
Off-chain gasless order submission via The Compact
Track Order Status
On-chain events and order server status polling

