For the complete documentation index, see llms.txt. This page is also available as Markdown.

Bridge from Pod

This guide walks through moving tokens off Pod: withdraw on the bridge precompile debits your balance, burns it on Pod, and makes the same value claimable on the bridged chain. For background on how the bridge works, see Native Bridge; for the full call reference, see the Bridge precompile.

Before you start

Read GET /v1/bridge/config on any full node. It names the bridged chain, the contract the claim is submitted to, and the per-token rules — there is no chainId parameter to pass, and this list is the only source of the Pod-token → bridged-chain-token mapping:

{
  "claim_chain_id": 42161,
  "source_contract": "0x…",
  "version": 1,
  "tokens": [
    { "pod_token": "0x…", "l1_token": "0x…", "decimals": 6, "min": "0xf4240", "max": "0x…" }
  ]
}

Amounts and decimals

amount is in Pod's 18 decimals — the units the balance is denominated in — and must be a whole number of bridged-chain units: amount % 10^(18 - decimals) == 0. For a 6-decimal token like USDC that means a multiple of 1e12 wei. Nothing is rounded for you; an inexact amount is rejected before attestation.

min and max from /v1/bridge/config are in the token's bridged-chain decimals and are compared against the converted amount, not the 18-decimal one you sign.

Steps

  1. Call withdraw(token, to, amount, deadline) on the Pod bridge precompile. to is an address on the bridged chain, and deadline is an auction-aligned batch deadline in microseconds, exactly like an order's.

  2. Poll GET /v1/bridge/withdrawals/by-id/{txHash} — keyed by the withdraw transaction's own hash — until a proof appears. The route 404s until the withdrawal executes, a tick after admission. pending means the certificate is still assembling; refused means nothing was debited.

  3. Call claim(token, amount, to, proof, auxTxSuffix) on the bridged chain's bridge contract. Take amount and to from the proof response — that amount is in the bridged chain's decimals, not the 18-decimal value you signed. Do not take token from it: the proof reports the Pod-side address, and claim needs the bridged-chain one, which is l1_token in /v1/bridge/config.

The bridge relayer performs step 3 for you. The call is permissionless, so submit it yourself only if the relayer is unavailable.

Examples for withdrawing 100 USDC from Pod (6 decimals on the bridged chain)

If the withdrawal is refused

Admission deliberately does not check your balance — pending fills can raise it before the batch executes — so a shortfall arrives as an outcome, not as a rejected transaction. Watch eth_subscribe("pod_withdrawals", { account }), or read error from the REST detail:

  • insufficient_balance — the balance did not cover the amount when the batch executed.

  • not_included — the solver left the intent out of the solution its deadline pointed at.

Both mean nothing was debited and no claim will ever exist. The nonce is spent, so retrying means a new transaction with a new hash. A client watching only the bridged chain would wait forever for an event that cannot come.

A refused status can also arrive with no error at all — a node whose bridge config does not cover the token records the row and signs nothing. Treat refused as terminal on the status alone, without requiring a reason.

Anyone can submit the claim transaction — it does not need to come from the account that withdrew.

Last updated