Goal
USDCx outbound bridging (Canton USDCx -> Ethereum USDC): burn on Canton via BridgeUserAgreement_Burn, Circle releases USDC on Ethereum (minus fee); relayer tracks the release.
Mechanics (confirmed, July 2026)
BridgeUserAgreement_Burn takes destination domain (0 = Ethereum), amount (max 6 dp), Ethereum recipient address, a UUID request id, and the holding contract ids to burn.
- It is a user-party choice: custodial users -> middleware signs directly; external-key users -> prepare/execute signing flow (same pattern as
pkg/transfer).
- Factory + disclosed contracts from the DA Utilities burn-mint-factory registry endpoint.
- Circle validates the burn and releases USDC to the Ethereum recipient; timing is Circle-controlled; a Circle withdrawal fee applies.
Flow
- Dapp calls
POST /api/v2/bridge/withdraw/prepare (external key) or the custodial variant; api-server builds BridgeUserAgreement_Burn.
execute submits the burn and registers the transfer with the relayer (bridge_key=xreserve, stage="", metadata: burn_request_id).
- xreserve adapter
Step: "" -> awaiting_release — watch Ethereum for the xReserve release matching burn_request_id -> completed with the release tx hash. The adapter never submits anything; it only observes Circle.
Work items
Depends on
- xreserve inbound adapter (shares circle/ledger clients, config, onboarding)
- Bridge API (prepare/execute endpoints, registration)
Goal
USDCx outbound bridging (Canton USDCx -> Ethereum USDC): burn on Canton via
BridgeUserAgreement_Burn, Circle releases USDC on Ethereum (minus fee); relayer tracks the release.Mechanics (confirmed, July 2026)
BridgeUserAgreement_Burntakes destination domain (0 = Ethereum), amount (max 6 dp), Ethereum recipient address, a UUID request id, and the holding contract ids to burn.pkg/transfer).Flow
POST /api/v2/bridge/withdraw/prepare(external key) or the custodial variant; api-server buildsBridgeUserAgreement_Burn.executesubmits the burn and registers the transfer with the relayer (bridge_key=xreserve,stage="", metadata:burn_request_id).Step:"" -> awaiting_release— watch Ethereum for the xReserve release matchingburn_request_id->completedwith the release tx hash. The adapter never submits anything; it only observes Circle.Work items
burn_request_idin metadata)bridges/xreservewithdrawalStep: release watcher on the xReserve contractGET /api/v2/bridge/tokensand the withdraw response show Circle's fee and "timing controlled by Circle"Depends on