> ## Documentation Index
> Fetch the complete documentation index at: https://circle-devdocs-test-ai-codegen-component.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# CCTP EVM Contracts and Interfaces

> CCTP smart contracts for EVM-compatible blockchains

## Contract responsibilities

* **TokenMessengerV2**: Entrypoint for cross-chain USDC transfer. Routes
  messages to burn USDC on a source chain, and mint USDC on a destination chain.
* **MessageTransmitterV2**: Generic message passing. Sends all messages on the
  source chain, and receives all messages on the destination chain.
* **TokenMinterV2**: Responsible for minting and burning USDC. Contains
  chain-specific settings used by burners and minters.
* **MessageV2**: Provides helper functions for cross-chain transfers, such as
  `bytes32ToAddress` and `addressToBytes32`, which are commonly used when
  bridging between EVM and non-EVM chains. These conversions are simple: prepend
  12 zero bytes to an EVM address, or strip them to convert back.

<Note>
  **Note:** If you're writing your own integration, it's more gas-efficient to
  [include this logic directly in your contract](https://github.com/circlefin/evm-cctp-contracts/blob/5f1901a9791b18204e8556bb53fb0dfcb05a832a/src/messages/Message.sol#L146)
  rather than calling an external one.
</Note>

Full contract source code is
[available on GitHub](https://github.com/circlefin/evm-cctp-contracts).

## Mainnet contract addresses

### TokenMessengerV2: Mainnet

| Chain           | [Domain](/cctp/cctp-supported-blockchains#cctp-supported-domains) | Address                                                                                                                                 |
| --------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| **Ethereum**    | 0                                                                 | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://etherscan.io/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)                 |
| **Avalanche**   | 1                                                                 | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://snowtrace.io/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)                 |
| **OP Mainnet**  | 2                                                                 | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://optimistic.etherscan.io/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)      |
| **Arbitrum**    | 3                                                                 | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://arbiscan.io/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)                  |
| **Base**        | 6                                                                 | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://basescan.org/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)                 |
| **Polygon PoS** | 7                                                                 | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://polygonscan.com/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)              |
| **Unichain**    | 10                                                                | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://uniscan.xyz/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)                  |
| **Linea**       | 11                                                                | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://lineascan.build/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)              |
| **Codex**       | 12                                                                | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://explorer.codex.xyz/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)           |
| **Sonic**       | 13                                                                | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://sonicscan.org/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)                |
| **World Chain** | 14                                                                | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://worldscan.org/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)                |
| **Sei**         | 16                                                                | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://seitrace.com/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d?chain=pacific-1) |
| **XDC**         | 18                                                                | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://xdcscan.com/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)                  |
| **HyperEVM**    | 19                                                                | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://hyperscan.com/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)                |
| **Ink**         | 21                                                                | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://explorer.inkonchain.com/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)      |
| **Plume**       | 22                                                                | [`0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d`](https://explorer.plume.org/address/0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d)           |

### MessageTransmitterV2: Mainnet

| Chain           | [Domain](/cctp/cctp-supported-blockchains#cctp-supported-domains) | Address                                                                                                                                 |
| --------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| **Ethereum**    | 0                                                                 | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://etherscan.io/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)                 |
| **Avalanche**   | 1                                                                 | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://snowtrace.io/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)                 |
| **OP Mainnet**  | 2                                                                 | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://optimistic.etherscan.io/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)      |
| **Arbitrum**    | 3                                                                 | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://arbiscan.io/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)                  |
| **Base**        | 6                                                                 | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://basescan.org/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)                 |
| **Polygon PoS** | 7                                                                 | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://polygonscan.com/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)              |
| **Unichain**    | 10                                                                | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://uniscan.xyz/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)                  |
| **Linea**       | 11                                                                | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://lineascan.build/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)              |
| **Codex**       | 12                                                                | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://explorer.codex.xyz/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)           |
| **Sonic**       | 13                                                                | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://sonicscan.org/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)                |
| **World Chain** | 14                                                                | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://worldscan.org/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)                |
| **Sei**         | 16                                                                | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://seitrace.com/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64?chain=pacific-1) |
| **XDC**         | 18                                                                | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://xdcscan.com/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)                  |
| **HyperEVM**    | 19                                                                | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://hyperscan.com/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)                |
| **Ink**         | 21                                                                | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://explorer.inkonchain.com/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)      |
| **Plume**       | 22                                                                | [`0x81D40F21F12A8F0E3252Bccb954D722d4c464B64`](https://explorer.plume.org/address/0x81D40F21F12A8F0E3252Bccb954D722d4c464B64)           |

### TokenMinterV2: Mainnet

| Chain           | [Domain](/cctp/cctp-supported-blockchains#cctp-supported-domains) | Address                                                                                                                                 |
| --------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| **Ethereum**    | 0                                                                 | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://etherscan.io/address/0xfd78EE919681417d192449715b2594ab58f5D002)                 |
| **Avalanche**   | 1                                                                 | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://snowtrace.io/address/0xfd78EE919681417d192449715b2594ab58f5D002)                 |
| **OP Mainnet**  | 2                                                                 | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://optimistic.etherscan.io/address/0xfd78EE919681417d192449715b2594ab58f5D002)      |
| **Arbitrum**    | 3                                                                 | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://arbiscan.io/address/0xfd78EE919681417d192449715b2594ab58f5D002)                  |
| **Base**        | 6                                                                 | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://basescan.org/address/0xfd78EE919681417d192449715b2594ab58f5D002)                 |
| **Polygon PoS** | 7                                                                 | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://polygonscan.com/address/0xfd78EE919681417d192449715b2594ab58f5D002)              |
| **Unichain**    | 10                                                                | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://uniscan.xyz/address/0xfd78EE919681417d192449715b2594ab58f5D002)                  |
| **Linea**       | 11                                                                | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://lineascan.build/address/0xfd78EE919681417d192449715b2594ab58f5D002)              |
| **Codex**       | 12                                                                | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://explorer.codex.xyz/address/0xfd78EE919681417d192449715b2594ab58f5D002)           |
| **Sonic**       | 13                                                                | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://sonicscan.org/address/0xfd78EE919681417d192449715b2594ab58f5D002)                |
| **World Chain** | 14                                                                | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://worldscan.org/address/0xfd78EE919681417d192449715b2594ab58f5D002)                |
| **Sei**         | 16                                                                | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://seitrace.com/address/0xfd78EE919681417d192449715b2594ab58f5D002?chain=pacific-1) |
| **XDC**         | 18                                                                | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://xdcscan.com/address/0xfd78EE919681417d192449715b2594ab58f5D002)                  |
| **HyperEVM**    | 19                                                                | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://hyperscan.com/address/0xfd78EE919681417d192449715b2594ab58f5D002)                |
| **Ink**         | 21                                                                | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://explorer.inkonchain.com/address/0xfd78EE919681417d192449715b2594ab58f5D002)      |
| **Plume**       | 22                                                                | [`0xfd78EE919681417d192449715b2594ab58f5D002`](https://explorer.plume.org/address/0xfd78EE919681417d192449715b2594ab58f5D002)           |

### MessageV2: Mainnet

| Chain           | [Domain](/cctp/cctp-supported-blockchains#cctp-supported-domains) | Address                                                                                                                                 |
| --------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| **Ethereum**    | 0                                                                 | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://etherscan.io/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)                 |
| **Avalanche**   | 1                                                                 | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://snowtrace.io/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)                 |
| **OP Mainnet**  | 2                                                                 | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://optimistic.etherscan.io/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)      |
| **Arbitrum**    | 3                                                                 | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://arbiscan.io/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)                  |
| **Base**        | 6                                                                 | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://basescan.org/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)                 |
| **Polygon PoS** | 7                                                                 | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://polygonscan.com/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)              |
| **Unichain**    | 10                                                                | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://uniscan.xyz/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)                  |
| **Linea**       | 11                                                                | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://lineascan.build/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)              |
| **Codex**       | 12                                                                | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://explorer.codex.xyz/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)           |
| **Sonic**       | 13                                                                | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://sonicscan.org/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)                |
| **World Chain** | 14                                                                | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://worldscan.org/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)                |
| **Sei**         | 16                                                                | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://seitrace.com/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78?chain=pacific-1) |
| **XDC**         | 18                                                                | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://xdcscan.com/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)                  |
| **HyperEVM**    | 19                                                                | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://hyperscan.com/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)                |
| **Ink**         | 21                                                                | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://explorer.inkonchain.com/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)      |
| **Plume**       | 22                                                                | [`0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78`](https://explorer.plume.org/address/0xec546b6B005471ECf012e5aF77FBeC07e0FD8f78)           |

## Testnet contract addresses

### TokenMessengerV2: Testnet

| Chain                   | [Domain](/cctp/cctp-supported-blockchains#cctp-supported-domains) | Address                                                                                                                                    |
| ----------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **Ethereum Sepolia**    | 0                                                                 | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://sepolia.etherscan.io/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)            |
| **Avalanche Fuji**      | 1                                                                 | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://testnet.snowtrace.io/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)            |
| **OP Sepolia**          | 2                                                                 | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://sepolia-optimism.etherscan.io/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)   |
| **Arbitrum Sepolia**    | 3                                                                 | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://sepolia.arbiscan.io/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)             |
| **Base Sepolia**        | 6                                                                 | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://base-sepolia.blockscout.com/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)     |
| **Polygon PoS Amoy**    | 7                                                                 | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://amoy.polygonscan.com/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)            |
| **Unichain Sepolia**    | 10                                                                | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://unichain-sepolia.blockscout.com/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA) |
| **Linea Sepolia**       | 11                                                                | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://sepolia.lineascan.build/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)         |
| **Codex Testnet**       | 12                                                                | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://explorer.codex-stg.xyz/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)          |
| **Sonic Testnet**       | 13                                                                | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://blaze.soniclabs.com/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)             |
| **World Chain Sepolia** | 14                                                                | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://sepolia.worldscan.org/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)           |
| **Sei Testnet**         | 16                                                                | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://seitrace.com/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA?chain=atlantic-2)   |
| **XDC Apothem**         | 18                                                                | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://testnet.xdcscan.com/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)             |
| **HyperEVM Testnet**    | 19                                                                | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://testnet.purrsec.com/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)             |
| **Ink Testnet**         | 21                                                                | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://explorer-sepolia.inkonchain.com/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA) |
| **Plume Testnet**       | 22                                                                | [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://testnet-explorer.plume.org/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)      |

### MessageTransmitterV2: Testnet

| Chain                   | [Domain](/cctp/cctp-supported-blockchains#cctp-supported-domains) | Address                                                                                                                                    |
| ----------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **Ethereum Sepolia**    | 0                                                                 | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://sepolia.etherscan.io/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)            |
| **Avalanche Fuji**      | 1                                                                 | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://testnet.snowtrace.io/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)            |
| **OP Sepolia**          | 2                                                                 | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://sepolia-optimism.etherscan.io/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)   |
| **Arbitrum Sepolia**    | 3                                                                 | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://sepolia.arbiscan.io/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)             |
| **Base Sepolia**        | 6                                                                 | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://base-sepolia.blockscout.com/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)     |
| **Polygon PoS Amoy**    | 7                                                                 | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://amoy.polygonscan.com/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)            |
| **Unichain Sepolia**    | 10                                                                | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://unichain-sepolia.blockscout.com/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275) |
| **Linea Sepolia**       | 11                                                                | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://sepolia.lineascan.build/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)         |
| **Codex Testnet**       | 12                                                                | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://explorer.codex-stg.xyz/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)          |
| **Sonic Testnet**       | 13                                                                | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://blaze.soniclabs.com/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)             |
| **World Chain Sepolia** | 14                                                                | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://sepolia.worldscan.org/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)           |
| **Sei Testnet**         | 16                                                                | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://seitrace.com/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275?chain=atlantic-2)   |
| **XDC Apothem**         | 18                                                                | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://testnet.xdcscan.com/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)             |
| **HyperEVM Testnet**    | 19                                                                | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://testnet.purrsec.com/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)             |
| **Ink Testnet**         | 21                                                                | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://explorer-sepolia.inkonchain.com/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275) |
| **Plume Testnet**       | 22                                                                | [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://testnet-explorer.plume.org/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)      |

### TokenMinterV2: Testnet

| Chain                   | [Domain](/cctp/cctp-supported-blockchains#cctp-supported-domains) | Address                                                                                                                                    |
| ----------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **Ethereum Sepolia**    | 0                                                                 | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://sepolia.etherscan.io/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)            |
| **Avalanche Fuji**      | 1                                                                 | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://testnet.snowtrace.io/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)            |
| **OP Sepolia**          | 2                                                                 | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://sepolia-optimism.etherscan.io/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)   |
| **Arbitrum Sepolia**    | 3                                                                 | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://sepolia.arbiscan.io/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)             |
| **Base Sepolia**        | 6                                                                 | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://base-sepolia.blockscout.com/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)     |
| **Polygon PoS Amoy**    | 7                                                                 | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://amoy.polygonscan.com/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)            |
| **Unichain Sepolia**    | 10                                                                | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://unichain-sepolia.blockscout.com/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192) |
| **Linea Sepolia**       | 11                                                                | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://sepolia.lineascan.build/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)         |
| **Codex Testnet**       | 12                                                                | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://explorer.codex-stg.xyz/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)          |
| **Sonic Testnet**       | 13                                                                | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://blaze.soniclabs.com/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)             |
| **World Chain Sepolia** | 14                                                                | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://sepolia.worldscan.org/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)           |
| **Sei Testnet**         | 16                                                                | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://seitrace.com/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192?chain=atlantic-2)   |
| **XDC Apothem**         | 18                                                                | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://testnet.xdcscan.com/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)             |
| **HyperEVM Testnet**    | 19                                                                | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://testnet.purrsec.com/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)             |
| **Ink Testnet**         | 21                                                                | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://explorer-sepolia.inkonchain.com/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192) |
| **Plume Testnet**       | 22                                                                | [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://testnet-explorer.plume.org/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192)      |

### MessageV2: Testnet

| Chain                   | [Domain](/cctp/cctp-supported-blockchains#cctp-supported-domains) | Address                                                                                                                                    |
| ----------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **Ethereum Sepolia**    | 0                                                                 | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://sepolia.etherscan.io/address/0xbaC0179bB358A8936169a63408C8481D582390C4)            |
| **Avalanche Fuji**      | 1                                                                 | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://testnet.snowtrace.io/address/0xbaC0179bB358A8936169a63408C8481D582390C4)            |
| **OP Sepolia**          | 2                                                                 | [`0xbac0179bb358a8936169a63408c8481d582390c4`](https://sepolia-optimism.etherscan.io/address/0xbac0179bb358a8936169a63408c8481d582390c4)   |
| **Arbitrum Sepolia**    | 3                                                                 | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://sepolia.arbiscan.io/address/0xbaC0179bB358A8936169a63408C8481D582390C4)             |
| **Base Sepolia**        | 6                                                                 | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://base-sepolia.blockscout.com/address/0xbaC0179bB358A8936169a63408C8481D582390C4)     |
| **Polygon PoS Amoy**    | 7                                                                 | [`0xbac0179bb358a8936169a63408c8481d582390c4`](https://amoy.polygonscan.com/address/0xbac0179bb358a8936169a63408c8481d582390c4)            |
| **Unichain Sepolia**    | 10                                                                | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://unichain-sepolia.blockscout.com/address/0xbaC0179bB358A8936169a63408C8481D582390C4) |
| **Linea Sepolia**       | 11                                                                | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://sepolia.lineascan.build/address/0xbaC0179bB358A8936169a63408C8481D582390C4)         |
| **Codex Testnet**       | 12                                                                | [`0xbac0179bb358a8936169a63408c8481d582390c4`](https://explorer.codex-stg.xyz/address/0xbac0179bb358a8936169a63408c8481d582390c4)          |
| **Sonic Testnet**       | 13                                                                | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://blaze.soniclabs.com/address/0xbaC0179bB358A8936169a63408C8481D582390C4)             |
| **World Chain Sepolia** | 14                                                                | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://sepolia.worldscan.org/address/0xbaC0179bB358A8936169a63408C8481D582390C4)           |
| **Sei Testnet**         | 16                                                                | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://seitrace.com/address/0xbaC0179bB358A8936169a63408C8481D582390C4?chain=atlantic-2)   |
| **XDC Apothem**         | 18                                                                | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://testnet.xdcscan.com/address/0xbaC0179bB358A8936169a63408C8481D582390C4)             |
| **HyperEVM Testnet**    | 19                                                                | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://testnet.purrsec.com/address/0xbaC0179bB358A8936169a63408C8481D582390C4)             |
| **Ink Testnet**         | 21                                                                | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://explorer-sepolia.inkonchain.com/address/0xbaC0179bB358A8936169a63408C8481D582390C4) |
| **Plume Testnet**       | 22                                                                | [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://testnet-explorer.plume.org/address/0xbaC0179bB358A8936169a63408C8481D582390C4)      |

## CCTP V2 Interface

This section provides the **Smart Contract Interface** exposed by **CCTP V2**,
outlining the available functions, and their parameters.

The interface below serves as a reference for permissionless messaging functions
exposed by the **TokenMessengerV2** and **MessageTransmitterV2** functions.

### Changes from CCTP V1

#### New functions

* `TokenMessengerV2#depositForBurnWithHook` (extends `depositForBurn` by adding
  hook data)
* `TokenMessengerV2#handleReceiveUnfinalizedMessage` (replaces
  `handleReceiveMessage`)
* `TokenMessengerV2#handleReceiveFinalizedMessage` (replaces
  `handleReceiveMessage`)

#### Modified functions

* `TokenMessengerV2#depositForBurn`
* `MessageTransmitterV2#sendMessage`
* `MessageTransmitterV2#receiveMessage`

#### Removed functions

* `TokenMessengerV2#handleReceiveMessage`
* `TokenMessengerV2#replaceDepositForBurn`
* `TokenMessengerV2#depositForBurnWithCaller`
* `MessageTransmitterV2#replaceMessage`
* `MessageTransmitterV2#sendMessageWithCaller`

### TokenMessengerV2

#### depositForBurn

Deposits and burns tokens from sender to be minted on destination domain, and
emits a cross-chain message by calling MessageTransmitter's `sendMessage`
function. Minted tokens will be transferred to `mintRecipient`.

**Parameters**

| Field                  | Type      | Description                                                                                                                             |
| ---------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `amount`               | `uint256` | Amount of tokens to deposit and burn                                                                                                    |
| `destinationDomain`    | `uint32`  | Destination domain ID to send the message to                                                                                            |
| `mintRecipient`        | `bytes32` | Address of mint recipient on destination domain (must be converted to 32 byte array, that is, prefix with zeros if needed)              |
| `burnToken`            | `address` | Address of contract to burn deposited tokens on local domain                                                                            |
| `destinationCaller`    | `bytes32` | Address as `bytes32` which can call `receiveMessage` on destination domain. If set to bytes32(0), any address can call `receiveMessage` |
| `maxFee`               | `uint256` | Max fee paid for fast burn, specified in units of `burnToken`                                                                           |
| `minFinalityThreshold` | `uint32`  | Minimum finality threshold at which burn will be attested                                                                               |

#### depositForBurnWithHook

Deposits and burns tokens from sender to be minted on destination domain, and
emits a cross-chain message with additional hook data appended. In addition to
the standard `depositForBurn` parameters, `depositForBurnWithHook` accepts a
dynamic-length `hookData` parameter, allowing the caller to include additional
metadata to the attested message, which can be used to trigger custom logic on
the destination chain.

**Parameters**

| Field                  | Type      | Description                                                                                                                             |
| ---------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `amount`               | `uint256` | Amount of tokens to burn                                                                                                                |
| `destinationDomain`    | `uint32`  | Destination domain to send the message to                                                                                               |
| `mintRecipient`        | `bytes32` | Address of mint recipient on destination domain (must be converted to 32 byte array, that is, prefix with zeros if needed)              |
| `burnToken`            | `address` | Address of contract to burn deposited tokens on local domain                                                                            |
| `destinationCaller`    | `bytes32` | Address as `bytes32` which can call `receiveMessage` on destination domain. If set to bytes32(0), any address can call `receiveMessage` |
| `maxFee`               | `uint256` | Max fee paid for fast burn, specified in units of `burnToken`                                                                           |
| `minFinalityThreshold` | `uint32`  | Minimum finality threshold at which burn will be attested                                                                               |
| `hookData`             | `bytes`   | Additional metadata attached to the attested message, which can be used to trigger custom logic on the destination chain                |

#### getMinFeeAmount

Calculates and returns the minimum fee required for a given amount in a Standard
Transfer. If the `minFee` (per unit of `burnToken`) is non-zero, the specified
`maxFee` must be at least the returned minimum fee. Otherwise, the burn will
revert onchain.

**Parameters**

| Field    | Type      | Description                                                                                     |
| -------- | --------- | ----------------------------------------------------------------------------------------------- |
| `amount` | `uint256` | The amount used to compute the minimum fee. Must be greater than `1` if standard fee is applied |

#### handleReceiveFinalizedMessage

Handles incoming message received by the local MessageTransmitter, and takes the
appropriate action. For a burn message, mints the associated token to the
requested recipient on the local domain. Validates the function sender is the
local MessageTransmitter, and the remote sender is a registered remote
TokenMessenger for `remoteDomain`.

**Parameters**

| Field                       | Type                     | Description                                                  |
| --------------------------- | ------------------------ | ------------------------------------------------------------ |
| `remoteDomain`              | `uint32`                 | The domain where the message originated from                 |
| `sender`                    | `bytes32`                | The sender of the message (remote TokenMessenger)            |
| `finalityThresholdExecuted` | `uint32`                 | Specifies the level of finality Iris signed the message with |
| `messageBody`               | `bytes` (dynamic length) | The message body bytes                                       |

#### handleReceiveUnfinalizedMessage

Handles incoming message received by the local MessageTransmitter, and takes the
appropriate action. For a burn message, mints the associated token to the
requested recipient on the local domain. Validates the function sender is the
local MessageTransmitter, and the remote sender is a registered remote
TokenMessenger for `remoteDomain`.

Similar to `handleReceiveFinalizedMessage`, but is called for messages which are
not finalized (`finalityThresholdExecuted` \< 2000).

Unlike `handleReceiveFinalizedMessage`, `handleReceiveUnfinalizedMessage` has
the following `messageBody` parameters:

* **`expirationBlock`**. If `expirationBlock` ≤ `blockNumber` on the destination
  domain, the message will revert and must be re-signed without the expiration
  block.
* **`feeExecuted`**. If nonzero, the `feeExecuted` is minted to the
  `feeRecipient`.

**Parameters**

| Field                       | Type                     | Description                                                                       |
| --------------------------- | ------------------------ | --------------------------------------------------------------------------------- |
| `remoteDomain`              | `uint32`                 | The domain where the message originated from                                      |
| `sender`                    | `bytes32`                | The sender of the message (remote TokenMessenger)                                 |
| `finalityThresholdExecuted` | `uint32`                 | Specifies the level of finality Iris signed the message with                      |
| `messageBody`               | `bytes` (dynamic length) | The message body bytes (see [Message format](/cctp/technical-guide#message-body)) |

### MessageTransmitterV2

#### receiveMessage

Receive message on destination chain by passing message and attestation. Emits
`MessageReceived` event. Messages with a given nonce can only be broadcast
successfully once for a pair of domains. The message body of a valid message is
passed to the specified recipient for further processing.

**Parameters**

| Field         | Type    | Description                                                                |
| ------------- | ------- | -------------------------------------------------------------------------- |
| `message`     | `bytes` | Encoded message (see [Message format](/cctp/technical-guide#message-body)) |
| `attestation` | `bytes` | Signed attestation received from attestation service (Iris)                |

#### sendMessage

Sends a message to the recipient on the destination domain. Emits a
`MessageSent` event which will be attested by Circle's attestation service.

**Parameters**

| Field                  | Type      | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| ---------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `destinationDomain`    | `uint32`  | Destination domain ID to send the message to                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `recipient`            | `bytes32` | Address of recipient on destination domain                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `destinationCaller`    | `bytes32` | Address as `bytes32` which can call `receiveMessage` on destination domain. If set to bytes32(0), any address can call `receiveMessage`                                                                                                                                                                                                                                                                                                                                                                                       |
| `minFinalityThreshold` | `uint32`  | Minimum finality threshold requested. <br /> <br /> Initially, supported values for `minFinalityThreshold` are \[1, 2000]. A value outside of the support values range will be interpreted as 2000 (finalized) by the attestation service (Iris). <br /> <br /> For a value within the supported range, the attestation service (Iris) will attest the message with a `finalityThresholdExecuted` >= `minFinalityThreshold`. <br /> <br /> Initial thresholds supported: <br /> <br /> 1000: Confirmed <br /> 2000: Finalized |
| `messageBody`          | `bytes`   | App-specific message to be handled by recipient                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |

## CCTP V2 Workflow vs. CCTP V1

This table highlights the key workflow improvements of CCTP V2 over CCTP V1 in
terms of enhanced cross-chain messaging, fewer manual steps, and greater control
over message acceptance:

| CCTP V2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | CCTP V1                                                                                                                                                                                                                                                 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Burn USDC via `depositForBurnWithHook`** <br /> <br /> You can call `depositForBurnWithHook` on **TokenMessengerV2**, which supports **hooks** and **finality thresholds**. New parameters include `destinationCaller`, `maxFee`, and `minFinalityThreshold`, allowing you to choose **Fast Transfer (1000)** or **Standard Transfer (2000)**.                                                                                                                                                        | **Burn USDC via `depositForBurn`** <br /> <br /> In CCTP V1, you call `depositForBurn` on **TokenMessenger**.                                                                                                                                           |
| **Retrieve, Hash, and Wait for Attestation** <br /> <br /> Iris automates message retrieval and hashing, allowing you to just poll for attestation via [GET /v2/messages](/api-reference/cctp/all/get-messages-v-2). The attestation includes both the hashed message and the attestation signature.                                                                                                                                                                                                    | **Retrieve and Hash Message explicitly** <br /> <br /> In CCTP V1, you need to manually extract and hash the `messageBytes` data from the `MessageSent` event logs using `Keccak256`.                                                                   |
| **Wait for Attestation via Iris** <br /> <br /> The attestation request is merged with message retrieval and hashing from the previous step. You simply wait for the polling to complete and retrieve the attestation.                                                                                                                                                                                                                                                                                  | **Request Attestation from Circle's Attestation Service** <br /> <br /> In CCTP V1, you poll for attestation via [GET /v1/attestations](/api-reference/cctp/all/get-attestation).                                                                       |
| **Send Messages via `MessageTransmitterV2#sendMessage`** <br /> <br /> The recipient must implement message handling methods based on finality thresholds: <br /> • `handleReceiveFinalizedMessage` for messages with `finalityThresholdExecuted ≥ 2000` (fully finalized). <br /> • `handleReceiveUnfinalizedMessage` for messages with `finalityThresholdExecuted < 2000` (pre-finalized). <br /> <br /> This allows recipients to enforce specific finality requirements before accepting a message. | **Send Messages via `MessageTransmitter#sendMessage`** <br /> <br /> In CCTP V1, you send an arbitrary message via `sendMessage` on **MessageTransmitter**. The recipient must implement `IMessageHandler#handleReceiveMessage` to process the message. |

<br />

**WHAT'S NEXT**

* [CCTP Solana Programs and Interfaces <Icon icon="arrow-right" />](/cctp/solana-programs)
