In this tutorial you will:Documentation Index
Fetch the complete documentation index at: https://docs.injective.network/llms.txt
Use this file to discover all available pages before exploring further.
- Learn how the CCTP burn-attest-mint protocol works
- Burn USDC on a source chain to initiate a cross-chain transfer
- Fetch the Circle attestation that authorises minting on the destination chain
- Mint USDC on the destination chain to complete the transfer
- Burn USDC on the source chain.
- Receive an attestation.
- Mint an equivalent amount of USDC on the destination chain.
Prerequisites
Before starting this tutorial, ensure you have the following installed:| Tool | Minimum version | Check | Install |
|---|---|---|---|
| Node.js | 22+ | node --version | nodejs.org |
| npm | 11+ | npm --version | Included with Node.js |
- MetaMask installed in your browser
- Connected to Injective Testnet
- Also connected to Sepolia
- Testnet INJ from the Injective Faucet or Google Cloud Faucet
- Testnet Sepolia ETH from a Sepolia faucet
- Testnet USDC from the Circle Faucet
Get started
The accompanying code for this tutorial is available in the USDC CCTP demo repository. Clone the repository and install its dependencies:http://localhost:5173 in your browser to view the dApp.
How does CCTP work?
CCTP transfers USDC across chains by burning it on the source chain, obtaining a signed attestation from Circle’s API, and minting an equivalent amount on the destination chain. CCTP transfers USDC across chains in three steps:- Burn:
The source chain’s
TokenMessengerV2contract burns the specified USDC amount. It then emits aMessageSentevent containing the transfer details. - Attest: Circle’s Iris API monitors on-chain events, and signs a message. It then produces an attestation once the burn is confirmed.
- Mint:
The destination chain’s
MessageTransmitterV2contract verifies the attestation and mints an equivalent amount of USDC to the recipient address.
The dApp implements each step with the following calls:
For the contract addresses used on Injective,
refer to USDC on Injective.
Burning USDC on the source chain
With the dApp open athttp://localhost:5173:
- Select Connect Wallet and approve the MetaMask connection prompt.
- Select the source chain (for example, Ethereum Sepolia) and the destination chain (Injective EVM Testnet), then enter the USDC amount to transfer.
- Select Approve USDC and confirm the approval transaction in MetaMask.
- Select Burn USDC and confirm the burn transaction.
When you select Burn USDC,
the dApp calls
depositForBurn on the TokenMessengerV2 contract:How to choose the minFinalityThreshold value?
How to choose the minFinalityThreshold value?
The value of
minFinalityThreshold should be set to:- A value ≤ 1000 produces a “fast” message, and
- a value > 1000 produces a “standard” message.
What is a Circle attestation?
A Circle attestation is a cryptographic signature from Circle’s Iris API that proves a USDC burn occurred on the source chain. Attestations are used to authorise the corresponding mint on the destination chain. After a burn, Circle’s Iris API watches for theMessageSent event,
on the source chain.
Once the required number of block confirmations is reached,
Circle signs the message and issues an attestation.
Attestation times vary by source chain:
- Ethereum Sepolia (standard mode): 15–20 minutes
- Injective EVM Testnet: typically a few minutes
Transfers from Sepolia support a fast mode that reduces wait times significantly,
but require a sufficient
maxFee to be set.
If the fee is too low, the transfer falls back to standard mode.Waiting for attestation
This dApp polls the Iris API automatically. You do not need to leave the page. The UI will notify you when the attestation is ready.The dApp fetches the attestation using the transaction hash from the burn step:
Minting USDC on the destination chain
Once the dApp shows “Attestation received”:- When prompted, switch MetaMask to the destination chain.
- Select Mint USDC and confirm the transaction in MetaMask.
- Verify your USDC balance on the destination chain using the balance shown in the dApp, or by viewing your address in Injective Testnet Blockscout or Sepolia Etherscan.
When you select Mint USDC,
the dApp calls
receiveMessage on the MessageTransmitterV2 contract:Next steps
Congratulations on completing your first cross-chain USDC transfer using CCTP on Injective! Here is what you learnt in this tutorial:- How the CCTP burn-attest-mint protocol transfers USDC 1:1 across chains, without wrapping or bridging
- How to burn USDC on a source chain to initiate a cross-chain transfer
- How to obtain a Circle attestation and use it to mint USDC on the destination chain
- USDC on Injective: Contract addresses, testnet faucets, and frequently asked questions.
- MultiVM Token Standard: Use USDC across both EVM and Cosmos on Injective without bridging.
