# Bridge to Arc

> Move USDC to Arc on Circle's CCTP rails, or bring any token from 60+ chains through LI.FI — the two bridge families and when to use which.

Source: https://getchord.xyz/docs/recipes/bridge-to-arc/

**Goal**: a user with funds elsewhere ends up with USDC on Arc, ready to trade.

## Which rail

| | CCTP (`/v1/bridge2/*`) | LI.FI (`/v1/crosschain/*`) |
| --- | --- | --- |
| Moves | USDC only, native burn and mint | any token the provider routes, swapped and bridged |
| From | Ethereum, Base, Arbitrum, OP Mainnet, Polygon, Avalanche, Monad and the other CCTP domains | 60+ chains including Monad and Robinhood Chain (Arc as a destination is subject to provider support) |
| Speed | fast transfer, seconds to a few minutes | route-dependent, minutes |
| Gas on Arc | none for the user — Chord's relayer submits the mint | destination gas handled by the route |
| Fee | Circle's fee (`/bridge2/fee`) | provider fee + the app fee in `/crosschain/config` |

USDC in, Arc out: use CCTP. Anything else: LI.FI.

## CCTP fast transfer

1. **Read the table.** `GET /bridge2/config` — the chains with their CCTP domains and USDC addresses, the TokenMessenger and MessageTransmitter contracts, and the relayer (address, Arc balance, enabled).
2. **Quote the fee.** `GET /bridge2/fee?src=6&dst=26` → `fastBps` and `standardBps`.
3. **Burn on the source chain.** The user approves USDC to `contracts.tokenMessengerV2` and calls `depositForBurn` with the Arc domain (`arcDomain`), the recipient as a 32-byte address, and the fast-finality threshold from `fastFinalityThreshold`. This is the only signature.
4. **Poll the attestation.** `GET /bridge2/status?srcDomain=6&tx=0x…` until `status: "complete"`.
5. **Relay the mint.** `POST /bridge2/relay { "srcDomain": 6, "tx": "0x…" }` — Chord's relayer submits `receiveMessage` on Arc and returns the mint hash. `409 NOT_ATTESTED` means poll longer; `429 DAILY_CAP` means relay it yourself with the message and attestation from step 4.

The user never needs USDC on Arc for gas, because the relayer pays the mint.

## LI.FI routes

1. **Chains and tokens.** `GET /crosschain/config?provider=lifi` lists destinations; `GET /crosschain/currencies?chainId=8453&q=usdc&provider=lifi` lists bridgeable tokens on a chain.
2. **Quote.** `POST /crosschain/quote` with `user`, `originChainId`, `destinationChainId`, `originCurrency`, `destinationCurrency`, `amount` (smallest unit), `slippageBps` and `provider: "lifi"`. The answer carries the provider's steps and fees and the transactions to sign on the origin chain; an approve step is prepended when the origin token is an ERC-20.
3. **Sign in order** and keep the deposit hash.
4. **Poll.** `GET /crosschain/status?requestId={depositHash}&provider=lifi&fromChain=8453&toChain=5042` until `success`, or `refund` / `failure`. `depositing` → `pending` → `submitted` → `success` is the happy path; `delayed` is a route waiting on the bridge.

The Chord app embeds the LI.FI widget for this flow; the endpoints above are the same contract for a custom UI.

## After the bridge

The user holds USDC on Arc as the predeploy balance, which is also their gas. Quote a trade with `inputMint=0x3600000000000000000000000000000000000000` and follow the [Swap recipe](/docs/recipes/swap/).
