USDC provides Sonic users with a trusted digital dollar that facilitates liquidity, and crosschain transfers. Learn how to deploy USDC dApps on Sonic.

Sonic is changing how developers build crosschain apps with USDC, and Circle powers this shift with native USDC and CCTP V2. Together, they help enable secure, native interoperability for moving value across chains in under a minute. Native USDC is redeemable 1:1 for USD, backed by highly liquid cash and cash-equivalent assets, and offers near-instant settlement, while CCTP V2 enables secure crosschain transfers through native burning on the source chain and native minting on the destination. This unifies liquidity, improves capital efficiency, and improves the developer and user experience.
In this post, we’ll explore how these technologies work together on Sonic, highlight key ecosystem protocols building with them, and walk through a sample application you can try yourself.
Ecosystem Players on Sonic
With the upgrade to native USDC and support for CCTP V2, builders are already deploying meaningful use cases on Sonic. USDC is powering the next wave of activity on protocols such as Aave, CCTP.to, Curve Finance, Shadow Exchange, and Silo Finance.
Try Out CCTP V2 Yourself
How do crosschain transfers work in practice? Here’s a step-by-step example using a sample app to move USDC from Ethereum Sepolia to Sonic Blaze testnet. You can fork this sample application on Replit and try it yourself — no signup or API keys are required.
Here’s what the flow looks like under the hood:
1. Approve USDC
await client.sendTransaction({
to: "0x1c7d4b196cb0c7b01d743fbc6116a902379c7238", // USDC Address on Ethereum Sepolia
data: encodeFunctionData({
abi: [
{
type: "function",
name: "approve",
stateMutability: "nonpayable",
inputs: [
{ name: "spender", type: "address" },
{ name: "amount", type: "uint256" },
],
outputs: [{ name: "", type: "bool" }],
},
],
functionName: "approve",
args: [
"0x8fe6b999dc680ccfdd5bf7eb0974218be2542daa", // Token Messenger Address on Ethereum Sepolia
10000000000n,
],
}),
});
2. Burn USDC
await client.sendTransaction({
to: "0x8fe6b999dc680ccfdd5bf7eb0974218be2542daa", // Token Messenger Address on Ethereum Sepolia
data: encodeFunctionData({
abi: [
{
type: "function",
name: "depositForBurn",
stateMutability: "nonpayable",
inputs: [
{ name: "amount", type: "uint256" },
{ name: "destinationDomain", type: "uint32" },
{ name: "mintRecipient", type: "bytes32" },
{ name: "burnToken", type: "address" },
{ name: "hookData", type: "bytes32" },
{ name: "maxFee", type: "uint256" },
{ name: "finalityThreshold", type: "uint32" },
],
outputs: [],
},
],
functionName: "depositForBurn",
args: [
amount,
13, // Destination Domain for Sonic Blaze
mintRecipient,
"0x1c7d4b196cb0c7b01d743fbc6116a902379c7238", // USDC Address on Ethereum Sepolia
maxFee,
finalityThreshold,
],
}),
});
3. Retrieve Attestation
const response = await axios.get(
`${IRIS_API_URL}/v2/messages/0?transactionHash=${txHash}` // 0 = Domain ID for Ethereum Sepolia
);
4. Mint USDC
await client.sendTransaction({
to: "0xe737e5cebeeba77efe34d4aa090756590b1ce275", // Message Transmitter on Sonic Blaze
data: encodeFunctionData({
functionName: "receiveMessage",
args: [attestation.message, attestation.attestation],
}),
});
Ready to Ship?
Everything’s ready for you to start building. Whether you're testing on Sonic Blaze or deploying to mainnet, native USDC and CCTP V2 are already live and integrated. You can:
- Fork the CCTP V2 sample app and customize it
- Use Sonic Blaze testnet for dev and testing:
- USDC address: 0xA4879Fed32Ecbef99399e5cbC247E533421C4eC6
- TokenMessenger address: 0x8fe6b999dc680ccfdd5bf7eb0974218be2542daa
- MessageTransmitter address: 0xe737e5cebeeba77efe34d4aa090756590b1ce275
- Domain ID: 13
- Use Sonic Mainnet for production:
- USDC address: 0x29219dd400f2bf60e5a23d13be72b486d4038894
- TokenMessenger address: 0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d
- MessageTransmitter address: 0x81D40F21F12A8F0E3252Bccb954D722d4c464B64
- Domain ID: 13