Skip to main content
CCTP on Aptos is distributed across four Move packages: TokenMessengerMinterV2, MessageTransmitterV2, StablecoinHandler, and CctpExtensions. Because Move uses static dispatch, contracts cannot call each other dynamically at runtime. Instead, these functions return receipt structs (BurnReceipt and MintReceipt) that act as hot potatoes: they have no abilities (they cannot be dropped, copied, or stored) and must be consumed in the same transaction. The Move compiler enforces this at compile time, not at runtime, so a transaction that fails to consume a receipt will not compile. For working end-to-end examples, see Transfer USDC between Aptos and Arc.

Package addresses

Package IDs identify deployed modules. Use them in use declarations and transaction payloads. Object IDs identify onchain state objects (such as configuration or shared resources) and are passed as function arguments when a transaction interacts with protocol state.

Testnet

Package IDs

Object IDs

Mainnet

Package IDs

Object IDs

CCTP interface

  • TokenMessengerMinterV2: initiates crosschain USDC burns and prepares mints upon attested message receipt.
  • MessageTransmitterV2: provides the core messaging layer, verifying attestations and routing messages to the appropriate handler.
  • StablecoinHandler: executes the actual burn and mint of USDC, consuming the receipt structs returned by TokenMessengerMinterV2.
  • CctpExtensions: provides protocol extension hooks for advanced integrations.

TokenMessengerMinterV2 interface

TokenMessengerMinterV2 manages the USDC burn and mint lifecycle. Its functions return receipt structs (BurnReceipt and MintReceipt) that must be passed to the StablecoinHandler in the same transaction.

MessageTransmitterV2 interface

MessageTransmitterV2 provides the messaging layer for CCTP on Aptos. It verifies attestations, marks nonces as used, and returns a Receipt hot potato that the caller must consume in the same transaction.

StablecoinHandler interface

StablecoinHandler is the entry point for executing USDC burns and mints on Aptos. Its functions consume the receipt structs produced by TokenMessengerMinterV2 and call the appropriate completion functions internally.

CctpExtensions interface

CctpExtensions provides protocol extension hooks for advanced integrations. Function-level documentation is not yet available here. Refer to the aptos-cctp GitHub repository for the current interface definitions.

Move scripts

Precompiled scripts for deposit_for_burn, deposit_for_burn_with_hook, and receive_message are available in typescript/example/precompiled-move-scripts/ in the aptos-cctp repository. The v2/ subdirectory contains scripts for both testnet and mainnet. You can also compile them from source; see the Aptos documentation on compiling scripts.

Examples

Send USDC from Aptos (outbound)

The outbound flow uses a Move script that withdraws the fungible asset, calls deposit_for_burn to create a BurnReceipt, then passes both to stablecoin_handler::burn to complete the transfer.

Send USDC from Aptos with hook data (outbound)

For transfers that include hook data (for example, to trigger a post-mint action on the destination blockchain):

Receive USDC on Aptos (inbound)

The inbound flow verifies the attestation, creates a Receipt, exchanges it for a MintReceipt using prepare_mint, then passes the MintReceipt to stablecoin_handler::mint to deposit USDC to the recipient.

Send a generic message (non-token transfer)