Skip to main content
After configuration, anyone can bridge the token between the home blockchain and any destination you deploy to, without bridge governance or ownership.

Prerequisites

Before you begin, ensure that you’ve:
  • Deployed the ERC-20 on the home blockchain with the same number of decimals you intend to use on every destination
  • Noted the CrossChainTokenService address for the home blockchain and each destination blockchain
  • Obtained access to the Iris fee-quote endpoint (POST /v2/quote/cctpx/{tokenId}/{sourceDomain}/{destinationDomain})
Configure the token as ownerless on exactly one blockchain—the home blockchain where the token’s supply originates. On every other blockchain, CCTP for non-USDC deploys a wrapped CrossChainToken automatically. Configuring the same token as ownerless on more than one blockchain will lock supply on each with no mechanism to release it.

Step 1. Configure the token on the home blockchain

Call registerOwnerlessToken on the local service with the token’s address. Submit the transaction and wait for confirmation, then read the deterministic tokenId from the service.
TypeScript
Save the returned tokenId. You will use it in every subsequent step and in every crosschain transfer. Quote remote deploys with this tokenId; using a placeholder or sentinel in the Iris path causes QuoteArgsMismatch.

Step 2. Quote and deploy the wrapped token on each destination

For each destination, fetch a fee quote from Iris, then call deployRemoteOwnerlessToken on the home service. Pass the original token address, the destination domain ID, and the fee claim. Include a FORWARD request with msgType: "DeployTokenMessage" so the quote covers destination deploy gas and Circle can deliver the message. Iris still expects a positive amount string even for deploys.
TypeScript
This call sends a CCTP message that, when delivered, creates a remote CrossChainToken wrapper and TokenManager. That wrapper is a new protocol deployment; it is not the same contract as a native copy of your token that may already exist on the destination. Omit FORWARD only if you will self-relay in the next step.

Step 3. Complete delivery (forwarded or self-relay)

How the deploy lands depends on the quote:
  • With FORWARD: Circle typically submits receiveMessage on the destination. Poll until resolveTokenAddress returns a non-zero address on the destination service.
  • Without FORWARD: Poll Iris /v2/messages/{sourceDomain}?transactionHash=… until the attestation is complete, then call receiveMessage on the destination MessageTransmitterV2 yourself. See Attestation Verification.

Step 4. Verify the remote contracts

Once the destination has processed the message, look up the wrapped token and its TokenManager on the destination service:
TypeScript

Step 5. Rederive the tokenId from the token address

You can rederive the ownerless tokenId from a token address on the home blockchain at any time:
TypeScript
Before the first outbound transfer, confirm the remote TokenManager rate limit is non-zero; rateLimit: 0 blocks all outbound transfers. See Configure rate limits and transfer caps.