Skip to main content
If you’re a remote blockchain partner, you can submit to withdraw from xReserve after a user burns tokens on your blockchain. This tutorial walks through the process using Canton TestNet as the example remote blockchain and Ethereum Sepolia as both the example source and destination blockchain. xReserve is also deployed on Arc, which you can use as an alternative source or destination blockchain. See Supported Blockchains and Domains for domain IDs.
This tutorial is intended for remote blockchain partners. If you’re a developer or user, visit the remote blockchain website or contact them for instructions on how to withdraw funds from xReserve.

Step 1. Monitor burn events

Listen for burn events on your blockchain. Each event should include at least:
  • The recipient wallet address on the destination chain.
  • The remote domain ID.

Step 2. Prepare the withdrawal

Send the burn intent data to the /prepare-withdrawal endpoint. The following example request contains data to withdraw 2500 USDC on Ethereum:
json
Response The API returns a fully encoded burn intent and the canonical message hash for you to sign, for example:
json

Step 3. Sign the message hash

Use your attester keys to sign the messageHashToSign returned in the previous step. This produces the burn intent signatures.
When a withdrawal draws on more than one xReserve source blockchain (for example, reserves held on both Ethereum and Arc), /prepare-withdrawal returns a burnIntents array with one entry per source blockchain and a single messageHashToSign computed over the entire set. Sign that one hash and submit all intents together. The burn amount on your blockchain must equal the sum of value plus maxFee across every intent in the batch.

Step 4. Submit the withdrawal

Send the encoded burn intent payload, the array of burn signatures, and the burn transaction hash to the /withdraw endpoint. Set useCircleForwarding to true if you want Circle to submit the withdrawal on behalf of your user.
Note: If you don’t use Circle forwarding, you’ll need to perform an additional crosschain transfer to withdraw funds from xReserve.
The following is an example request:
json
Response The API returns withdrawalId, a unique identifier for each withdrawal batch. For example:
json

Step 5. Monitor withdrawal status

Check the status of your withdrawal by calling GET /withdrawals/{withdrawalId}. xReserve releases funds once the status is finalized. If the status remains created, verified, or unverified, keep polling. If the status changes to failed, resolve the issue and resubmit the withdrawal.