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.
tx.value must be 0, native token included. The balance is debited internally, so nothing rides along with the transaction. Withdrawals are also gas-exempt, so an account funded entirely over the bridge can withdraw all of it without keeping anything back for fees.
Steps
Call
withdraw(token, to, amount, deadline)on the Pod bridge precompile.tois an address on the bridged chain, anddeadlineis an auction-aligned batch deadline in microseconds, exactly like an order's.Poll
GET /v1/bridge/withdrawals/by-id/{txHash}— keyed by the withdraw transaction's own hash — until aproofappears. The route 404s until the withdrawal executes, a tick after admission.pendingmeans the certificate is still assembling;refusedmeans nothing was debited.Call
claim(token, amount, to, proof, auxTxSuffix)on the bridged chain's bridge contract. Takeamountandtofrom the proof response — that amount is in the bridged chain's decimals, not the 18-decimal value you signed. Do not taketokenfrom it: the proof reports the Pod-side address, andclaimneeds the bridged-chain one, which isl1_tokenin/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.
Last updated

