Skip to content

bridges:claim

Finalize a two-step bridge on the destination chain: mint a CCTP transfer once Circle has attested it, or prove and finalize a canonical L2 withdrawal. Run it after switching to the destination chain.

bridges:claim <transferId>
NameTypeDescription
transferIdstringTransaction hash of the bridge on the source chain
NameTypeDescription
--usingbridge-adapterAdapter that initiated the transfer (default: detected from the source transaction)
--from-chainchainSource chain of the transfer (default: probed across supported chains)

Bridges are asynchronous, so a claim happens in a later script than the bridge. The transfer id is the source-chain transaction hash of the bridge:

load bridges
switch base
bridges:claim 0x1111111111111111111111111111111111111111111111111111111111111111 --from-chain mainnet

Wait for the attestation, then claim, in one long-running script:

load bridges
load std
set $transferId 0x1111111111111111111111111111111111111111111111111111111111111111
loop until @bool(@bridges:status($transferId) == "claimable") (
wait 30s
)
switch base
bridges:claim $transferId
AdapterClaim
CCTPv2Fetches Circle's attestation and calls receiveMessage on the destination MessageTransmitter
NativeBridge (OP Stack)Proves the withdrawal, then finalizes it after the 7-day challenge window (run claim twice)
NativeBridge (Arbitrum)Builds the outbox merkle proof and executes the withdrawal on the L1 Outbox
Across / LayerZero / CCIPNothing to claim — relayers, executors and the DON deliver these

Claiming too early fails with the reason (attestation pending, output root not published, still inside the challenge window). Poll @bridges:status until it reports claimable.

Inside a sim:fork, claims are unnecessary: the simulation auto-relays the destination leg when you switch chains.