Skip to main content
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.
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
The code below uses contract addresses from the System Architecture reference. These are the same across all supported EVM chains.

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.
1

Request a quote

Call POST /quote/request with the user’s input and desired output. This example sends 10 USDC from Base to Arbitrum.
TypeScript
The interoperable address prefix encodes the chain. 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.
2

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.
3

Construct and open the order on-chain

Build a StandardOrder from the quote response and call open() on the InputSettlerEscrow contract. This locks your tokens and broadcasts the intent to solvers.
TypeScript
The 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.
Set fillDeadline well before expires. The solver must deliver before fillDeadline; expires is the final deadline after which you can claim a refund if the order wasn’t filled.
4

Track the order

Poll GET /orders/status until the order reaches a terminal state. Use the onChainOrderId from the Open event.
TypeScript
Once Settled, the user has received USDC on Arbitrum and the solver has been paid from escrow.

What Just Happened

  1. Requested a quote. The order server returned pricing from its solver network based on your input/output pair.
  2. Approved tokens. The escrow contract was authorized to transfer your USDC.
  3. Opened the order. Tokens were locked in escrow and the intent was broadcast to solvers via the Open event.
  4. Solver delivered. A solver fulfilled the order by delivering USDC on Arbitrum.
  5. 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