We refreshed our doc site!
Bookmarked links may have changed
Read release notesTo get started with CCTP, follow the example script provided here. The example uses web3.js to transfer USDC from a wallet address on Ethereum Sepolia testnet to another wallet address on Avalanche Fuji testnet.
Interactive Tutorial with Web3 Services
If you are new to building smart contracts, check out our interactive tutorial where you can transfer USDC using Circle's Web3 Services: Smart Contract Platform and Programmable Wallets.
The script has 5 steps:
const approveTx = await usdcEthContract.methods.approve(ETH_TOKEN_MESSENGER_CONTRACT_ADDRESS, amount).send({gas: approveTxGas})
const burnTx = await ethTokenMessengerContract.methods.depositForBurn(amount, AVAX_DESTINATION_DOMAIN, destinationAddressInBytes32, USDC_ETH_CONTRACT_ADDRESS).send();
const transactionReceipt = await web3.eth.getTransactionReceipt(burnTx.transactionHash);
const eventTopic = web3.utils.keccak256('MessageSent(bytes)')
const log = transactionReceipt.logs.find((l) => l.topics[0] === eventTopic)
const messageBytes = web3.eth.abi.decodeParameters(['bytes'], log.data)[0]
const messageHash = web3.utils.keccak256(messageBytes);
Rate Limit
The attestation service rate limit is 10 requests per second. If you exceed 10 requests per second, the service blocks all API requests for the next 5 minutes and returns an HTTP 429 response.
let attestationResponse = {status: 'pending'};
while(attestationResponse.status != 'complete') {
const response = await fetch(`https://iris-api-sandbox.circle.com/attestations/${messageHash}`);
attestationResponse = await response.json()
await new Promise(r => setTimeout(r, 2000));
}
const receiveTx = await avaxMessageTransmitterContract.receiveMessage(receivingMessageBytes, signature);