← Protocols
Across Protocol
Cross-chain / Bridge·EVM · Multi-chain

Across Protocol

01Description

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.

02Best for
  • 01fast L2-to-L2 transfers
  • 02intent-based bridging UX
  • 03single-tx canonical-token deposits
  • 04embedded bridging in dApps
  • 05low-fee USDC / ETH / WETH transfers
03Install
  • pnpm add @across-protocol/app-sdk viem
04Environment variables
VariableScopeDescription
ACROSS_INTEGRATOR_IDClientAcross integrator ID (bytes2 hex, e.g. `0xdead`) for fee attribution and analytics. Register at docs.across.to.
05Prompt snippet
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'.
06Gotchas
  • 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.
07Alternatives