Skip to content

Bridge

Cross-chain token movement. Bridge routes differ from swap routes in a way that matters to users: they trade off against each other on three axes, not one.

Route: /defi/bridge · Source: defi-dex/src/pages/defi/bridge.tsx · Fee: 0.1% of input

What it does

The user picks a source chain and token, a destination chain and token, and an amount. The app quotes every bridge-capable provider in parallel and shows the routes side by side so the user can choose on:

  • Price — output amount after the bridge's own fees.
  • Speed — estimated time to finality on the destination.
  • Trust assumptions — a canonical bridge, an optimistic bridge, a liquidity network and an intent solver have genuinely different risk profiles, and users with size care about that.

Then one approval and one signature, same as a swap.

Bridge providers

ProviderModelNotes
AcrossOptimistic / relayer-filledUsually the fastest for supported pairs
deBridgeLiquidity network
LiFiMeta-aggregatorAggregates other bridges itself
Squid RouterAxelar-basedBackend-proxied (integrator id)
RangoMeta-aggregator
SymbiosisCross-chain AMMExcluded from the swap path, included for bridge
XY FinanceCross-chain aggregator
RelayIntent solverFills asynchronously — see the caveat below
NordsternIntent solverSame caveat
Near 1ClickNEAR intents
RhinoFiL2 bridgeMulti-step: quote → commit → calldata
GasZipGas top-upSmall native amounts to a fresh chain
HoudiniPrivacy-oriented
ChangeNow / ChangellyCustodial exchangeDeposit-address model
KimaCustodialCurrently disabled (backend origin returning 520)
Butter NetworkCross-chainExcluded from bridge path by default

Full table with endpoints and proxy status: providers.

Default bridge excludes

bz-backend/services/swap.service.js excludes these from the bridge fan-out by default:

ExcludedReason
icecream_swapSame-chain only
one_inchSame-chain only
butter_networkExcluded by default
open_oceanSame-chain only

Bridge-into-only destinations

A chain can be a bridge destination without having a BlazpayRelayer deployment. Adding one requires only:

  1. A Network record and at least one Token record, seeded from LiFi's chain/token data.
  2. A production cache bust.

You then get "bridge into this chain" without swap or bridge-out support. Robinhood Chain (4663) was added this way; it has since had a relayer deployed too, so it now supports both directions. Procedure: add a chain.

Route comparison caveat — solvers deliver nothing in-transaction

Intent-based providers (Relay, Nordstern) do not produce output inside your transaction. They take your funds and a solver fills the order moments later, off the critical path.

This is fine for an interactive bridge, where the user watches a status poll. It is not fine for automation: the DCA and Autopilot vaults measure the balance delta inside the transaction, see zero, and correctly revert with OutputBelowMinimum. That is why the automation path route-probes every candidate with estimateGas before selecting one. See execution engine.

Nordstern in particular

nordstern returns calldata whose selector is 0x57f96440… and delivers zero output in-transaction. If you see a vault revert with OutputBelowMinimum and the route was Nordstern, that is working as intended — the probe should have filtered it out earlier.

Status tracking

Bridges are not atomic, so a bridge transaction has two lifecycles: source-chain confirmation and destination-chain delivery.

MechanismWhere
Per-provider status endpointswap-sdk routers map in utils/constants.ts; getTxStatus(chainId, hash) per aggregator
Backend refresh sweepGET /defi/txn/:walletAddress re-checks pending transactions for that wallet
Background cronbz-backend/services/bridgeStatusCron.js
Status update endpointPATCH /defi/transaction/update
Qube-specific completionPOST /defi/bridge/qube

History surface: /defi/bridge-history.

Bridge corridors have their own prerendered landing pages: /bridge/{from}-to-{to} covering four top sources × ten emerging destinations plus fifteen major pairs. BridgeRoutePage.tsx is also the dispatcher for /bridge/:chain — if the param contains -to- it renders the corridor page, otherwise it delegates to ChainLandingPage in bridge mode.

/defi/bridge?chain=sei preselects that chain as the destination (toToken), whereas the swap page preselects it as the source. Data model: defi-dex/src/data/bridgeRouteSeo.mjs. See SEO subsystem.

Redesign in flight

A visual redesign is approved — "Concept 1". The reference mockup is defi-dex/design/bridge-redesign-concept1.html. Targets: TokenModal.tsx, bridge.tsx and ProviderList. The app's existing Kodchasan font stays as-is; do not introduce a per-page font class.

Under the hood

Bridging shares almost the entire pipeline with swap — same SSE fan-out, same two-round-trip build, same relayer settlement. The differences are:

ConcernSwapBridge
fromChain / toChainEqualDifferent
Provider setexcludeBridge unusedexcludeBridge applied
CompletionAtomic in one transactionTwo-phase, needs status polling
Relayer requirementSource chain onlySource chain only — destination needs no relayer

Known limits

  • No destination-side guarantee. Once the source transaction confirms, delivery depends on the bridge. Blazpay surfaces the provider's status but cannot force a fill.
  • Bridge-out from a destination-only chain is unavailable until a relayer is deployed there.
  • Kima is disabled, so its custodial deposit-address route is not offered.
  • Intent solvers cannot be used by automation. See the caveat above.

Internal + developer documentation. Usage figures are point-in-time snapshots — re-verify before publishing them.