Cross-chain / Bridge·EVM · Multi-chain
Across Protocol
Intent-based cross-chain bridge. Users sign an intent (input asset/chain, output asset/chain, amounts) and a competitive relayer network fills it on the destination, with a single canonical pool settling later via UMA's Optimistic Oracle.
- 01fast L2-to-L2 transfers
- 02intent-based bridging UX
- 03single-tx canonical-token deposits
- 04embedded bridging in dApps
- 05low-fee USDC / ETH / WETH transfers
- pnpm add @across-protocol/app-sdk viem
| Variable | Scope | Description |
|---|---|---|
| ACROSS_INTEGRATOR_ID | Client | Across integrator ID (bytes2 hex, e.g. `0xdead`) for fee attribution and analytics. Register at docs.across.to. |
Use `@across-protocol/app-sdk`: instantiate `createAcrossClient({ integratorId, chains, useTestnet })`. Quote a route via `client.getQuote({ route: { originChainId, destinationChainId, inputToken, outputToken }, inputAmount, recipient })` — Across is intent-based so the response includes the relayer fee, expected fill time, and a deposit calldata payload. Execute with `client.executeQuote({ walletClient, deposit, onProgress })`, which handles the ERC20 approval, the `depositV3` / `deposit` call to the SpokePool, and polling the Across indexer for the destination fill. Track fills via `client.getDeposit({ depositTxHash, originChainId })` and surface `fillTxHash` when status === 'filled'.
- ⚑Across is intent-based with a closed relayer set: only assets with a canonical Across route are supported. Calling `getQuote` for an unsupported pair returns no route — handle the empty case and fall back to an aggregator.
- ⚑Output amount = inputAmount minus the relayer fee quoted at request time; the fee expires (typically ~30s) and re-quoting is required before signing.
- ⚑Fills are usually seconds, but if no relayer takes the order it eventually settles via slow-fill from the HubPool — communicate the worst-case ETA (minutes) to users.
- ⚑`integratorId` must be set on every quote/deposit or fees won't be attributed to your app and analytics will be missing.
- ⚑Solana support is a separate spoke with a different deposit interface — do not assume EVM `depositV3` ABI translates.
- ⚑Testnet Across uses a separate set of SpokePool addresses; pass `useTestnet: true` and never mix testnet/mainnet chain IDs.