# CCTP Starknet Contracts and Interfaces

### Overview

Starknet CCTP contracts are written in Cairo and run on a non-EVM zk-rollup. To align with Starknet’s architecture while keeping parity with EVM chains, CCTP uses two contracts:

* `TokenMessengerMinterV2`: consolidates the responsibilities of `TokenMessengerV2` (burn + send) and `TokenMinterV2` (receive + mint).
* `MessageTransmitterV2`: provides the messaging layer that emits or receives attested messages and delivers them to `TokenMessengerMinterV2`.

This mirrors how other non-EVM deployments (for example, Solana) combine messenger and minter logic while preserving behavior with the EVM equivalents.

### Testnet contract addresses

| Contract                 | [Domain](/chainaiswap-docs/cross-chain-transfer-protocol/cctp-supported-chains-and-domains.md#cctp-supported-domains) | Address                                                                                                                                                                            |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TokenMessengerMinterV2` |                                                                                                                    25 | [`0x04bDdE1E09a4B09a2F95d893D94a967b7717eB85A3f6dEcA8c080Ee01fBc3370`](https://sepolia.voyager.online/contract/0x04bDdE1E09a4B09a2F95d893D94a967b7717eB85A3f6dEcA8c080Ee01fBc3370) |
| `MessageTransmitterV2`   |                                                                                                                    25 | [`0x04db7926C64f1f32a840F3Fa95cB551f3801a3600Bae87aF87807A54DCE12Fe8`](https://sepolia.voyager.online/contract/0x04db7926C64f1f32a840F3Fa95cB551f3801a3600Bae87aF87807A54DCE12Fe8) |

### CCTP interface

* `TokenMessengerMinterV2`: initiates crosschain burns and mints tokens upon attested message receipt.
* `MessageTransmitterV2`: emits messages, verifies attestations, and routes verified messages to the recipient contract.

#### TokenMessengerMinterV2 interface

The `TokenMessengerMinterV2` contract consolidates the roles of both `TokenMessengerV2` and `TokenMinterV2` found on EVM chains. It handles USDC burns, message emission, and token minting once crosschain messages are attested by Circle’s Iris service.

| Function                             | Description                                                              | Notes                                     |
| ------------------------------------ | ------------------------------------------------------------------------ | ----------------------------------------- |
| `deposit_for_burn`                   | Burns USDC and emits a crosschain message for minting on another domain. | Standard CCTP transfer initiation.        |
| `deposit_for_burn_with_hook`         | Same as `deposit_for_burn`, but attaches custom metadata (`hook_data`).  | Used for programmable transfers.          |
| `handle_receive_finalized_message`   | Mints USDC upon receiving a fully finalized message.                     | Called by `MessageTransmitterV2`.         |
| `handle_receive_unfinalized_message` | Processes partially finalized (“Fast Burn”) messages.                    | Enables faster crosschain transfers.      |
| `message_body_version`               | Returns supported message format version.                                | Used for compatibility checks.            |
| `local_message_transmitter`          | Returns the linked `MessageTransmitterV2` address.                       | Must match configured domain transmitter. |

#### MessageTransmitterV2 interface

The `MessageTransmitterV2` contract provides the core messaging layer for CCTP on Starknet. It is responsible for emitting, receiving, and validating crosschain messages, enforcing attestation rules, and ensuring message uniqueness.

| Function                    | Description                                                                      | Notes                                                                                   |
| --------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| `send_message`              | Sends a crosschain message with specified domain, recipient, and message body.   | Core function for outgoing CCTP messages.                                               |
| `receive_message`           | Validates a message and its attestation; delivers message body to the recipient. | Called by an offchain relayer with an attestation from Circle to complete the transfer. |
| `get_max_message_body_size` | Returns the maximum allowed message size.                                        | Used by offchain components for validation.                                             |
| `is_nonce_used`             | Checks if a message nonce has been processed already.                            | Prevents message replay.                                                                |
| `get_local_domain`          | Returns this contract’s domain ID.                                               | Expected to be 25 for Starknet.                                                         |
| `get_version`               | Returns protocol version supported by this transmitter.                          | Used by Iris attestation service.                                                       |

Previous: [CCTP Solana Programs and Interfaces](/chainaiswap-docs/cross-chain-transfer-protocol/cctp-solana-programs-and-interfaces.md)\
Next: [CCTP Block Confirmations](/chainaiswap-docs/cross-chain-transfer-protocol/cctp-block-confirmations.md)

Responses are generated using AI and may contain mistakes.


---

# 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/cctp-starknet-contracts-and-interfaces.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.
