# CCTP Message Passing V1

Cross-Chain Transfer Protocol V1 uses generalized message passing to facilitate the native burning and minting of USDC across supported blockchains, also known as [domains](/chainaiswap-docs/cross-chain-transfer-protocol/cross-chain-transfer-protocol-v1/cctp-chain-domains-v1.md). Message passing is a three-step process:

{% stepper %}
{% step %}

### Emit message on source domain

An onchain component on the source domain emits a message.
{% endstep %}

{% step %}

### Offchain attestation

Circle’s offchain attestation service signs the message.
{% endstep %}

{% step %}

### Deliver message on destination domain

The onchain component at the destination domain receives the message and forwards the message body to the specified recipient.
{% endstep %}
{% endstepper %}

Architecture

Onchain components on all domains have the same purpose, but implementation differs between EVM-compatible and non-EVM domains.

CCTP V1 on EVM Domains

The relationship between CCTP V1’s onchain components and Circle’s offchain Attestation Service is illustrated below for a burn-and-mint of USDC between EVM-compatible domains:

![](/files/f779c9199a864233d56b65312013d6b3d3a8dd73)

On EVM domains, the onchain component for cross-chain burning and minting is called TokenMessenger, which is built on top of MessageTransmitter, an onchain component for generalized message passing.

In the diagram above, a token depositor calls the [TokenMessenger#depositForBurn](https://github.com/circlefin/evm-cctp-contracts/blob/adb2a382b09ea574f4d18d8af5b6706e8ed9b8f2/src/TokenMessenger.sol#L169) function to deposit a native token (such as USDC), which delegates to the TokenMinter contract to burn the token. The TokenMessenger contract then sends a message via the [MessageTransmitter#sendMessage](https://github.com/circlefin/evm-cctp-contracts/blob/adb2a382b09ea574f4d18d8af5b6706e8ed9b8f2/src/MessageTransmitter.sol#L108) function. After [sufficient block confirmations](/chainaiswap-docs/cross-chain-transfer-protocol/cross-chain-transfer-protocol-v1/cctp-block-confirmations-v1.md), Circle’s offchain attestation service, Iris, signs the message. An API consumer queries this attestation and submits it onchain to the destination domain’s [MessageTransmitter#receiveMessage](https://github.com/circlefin/evm-cctp-contracts/blob/adb2a382b09ea574f4d18d8af5b6706e8ed9b8f2/src/MessageTransmitter.sol#L250) function. For more details, see [Quickstart: Cross-chain USDC transfer](/chainaiswap-docs/cross-chain-transfer-protocol/cross-chain-transfer-protocol-v1/transfer-usdc-on-testnet-from-ethereum-to-avalanche-using-cctp-v1.md).

To send an arbitrary message, directly call [MessageTransmitter#sendMessage](https://github.com/circlefin/evm-cctp-contracts/blob/adb2a382b09ea574f4d18d8af5b6706e8ed9b8f2/src/MessageTransmitter.sol#L108). Note that the message recipient must implement [IMessageHandler#handleReceiveMessage](https://github.com/circlefin/evm-cctp-contracts/blob/master/src/interfaces/IMessageHandler.sol#L31C14-L31C34).

{% hint style="info" %}
Note: In CCTP V1, it is not possible to perform a burn-and-mint operation for USDC and include arbitrary data in the same message. You must include arbitrary data in a separate message. In later CCTP versions, you can burn-and-mint while including data in the same message via Hooks.
{% endhint %}

CCTP V1 on Non-EVM Domains

Noble

Noble is a Cosmos application-specific blockchain (or “appchain”) that provides native asset issuance for the Cosmos ecosystem. USDC is natively issued on Noble and can be transferred via the Inter-Blockchain Communication (IBC) protocol to other supported appchains in Cosmos, or via CCTP V1 to any supported domain (for example, Ethereum).

Note that there are key differences between Cosmos appchains like Noble and EVM-compatible blockchains. Unlike on EVM domains where CCTP V1 is a set of smart contracts, CCTP V1 on Noble is a Cosmos SDK module, which is deployed by Noble governance and built into the Noble blockchain. Cosmos appchains can use IBC to build composable flows with CCTP V1 on Noble. Refer to the [Noble documentation](/chainaiswap-docs/cross-chain-transfer-protocol/cross-chain-transfer-protocol-v1/cctp-noble-cosmos-module-v1.md) for more details.

Solana

Solana is a layer-1 blockchain where USDC is natively issued as an SPL-token. CCTP V1 is deployed to Solana as two Anchor programs: MessageTransmitter and TokenMessengerMinter. Developers can compose programs on top of CCTP V1 programs through CPI’s (Cross-Program Invocations). Arbitrary messages can be sent directly by calling `MessageTransmitter#send_message` just as described in the EVM section above. Refer to the [Solana documentation](/chainaiswap-docs/cross-chain-transfer-protocol/cross-chain-transfer-protocol-v1/cctp-solana-programs-and-interfaces-v1.md) for more details.

Sui

Sui is another layer-1 blockchain where USDC is natively issued as a [`Coin` implementation](https://docs.sui.io/guides/developer/coin). CCTP V1 is deployed to Sui as two programs: MessageTransmitter and TokenMessengerMinter. Arbitrary messages can be sent by directly calling `message_transmitter::send_message` similar to the EVM section above. Refer to the [Sui documentation](broken://pages/394882c18f5631450d57566b3847b1c4cc5836cf) for more details.

Aptos

Aptos is another layer-1 blockchain where USDC is natively issued as a [`FA` implementation](https://aptos.dev/en/build/smart-contracts/fungible-asset). CCTP V1 is deployed to Aptos as two programs: MessageTransmitter and TokenMessengerMinter. Arbitrary messages can be sent by directly calling `message_transmitter::send_message` similar to the EVM section above. Refer to the [Aptos documentation](broken://pages/4880ed1f887793fc790c8f85cd241cc7888f01fa) for more details.

![diagram](/files/b518b0df10692dc463998adb6d4ab7dcef9f0521)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://chainaiswap.gitbook.io/chainaiswap-docs/cross-chain-transfer-protocol/cross-chain-transfer-protocol-v1/cctp-message-passing-v1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
