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
CrossChainTokenServiceaddress for the home blockchain and each destination blockchain - Obtained access to the Iris fee-quote endpoint
(
POST /v2/quote/cctpx/{tokenId}/{sourceDomain}/{destinationDomain})
Step 1. Configure the token on the home blockchain
CallregisterOwnerlessToken
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
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 calldeployRemoteOwnerlessToken
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
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 submitsreceiveMessageon the destination. Poll untilresolveTokenAddressreturns a non-zero address on the destination service. - Without
FORWARD: Poll Iris/v2/messages/{sourceDomain}?transactionHash=…until the attestation is complete, then callreceiveMessageon the destinationMessageTransmitterV2yourself. See Attestation Verification.
Step 4. Verify the remote contracts
Once the destination has processed the message, look up the wrapped token and itsTokenManager 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
TokenManager rate limit
is non-zero; rateLimit: 0 blocks all outbound transfers. See
Configure rate limits and transfer caps.