Skip to main content

Overview

Stellar CCTP contracts run on Soroban, Stellar’s smart contracts platform. CCTP message fields use 32-byte address encodings. CCTP treats mintRecipient as a contract address. If the recipient is a Stellar user or muxed account instead, hook data can carry a forwardRecipient strkey so the forwarder can send funds to that address. To align with Stellar address encoding while keeping parity with EVM and other non-EVM blockchains, CCTP uses three contracts:
  • TokenMessengerMinter: consolidates the responsibilities of TokenMessengerV2 (burn + send) and TokenMinterV2 (receive + mint). On mint, mintRecipient is treated as a contract address and hooks supply the forwardRecipient when needed.
  • MessageTransmitter: provides the messaging layer that emits or receives attested messages and delivers them to TokenMessengerMinter (including receive_message for forwarder flows).
  • CctpForwarder: receives minted USDC and forwards it to forwardRecipient in hook data.

Mainnet contract addresses

Testnet contract addresses

CCTP interface

  • TokenMessengerMinter: initiates crosschain burns and mints tokens upon attested message receipt.
  • MessageTransmitter: emits messages, verifies attestations, and routes verified messages to the recipient contract.
  • CctpForwarder: completes mint and forward in one transaction when hook data supplies a forwardRecipient strkey.

TokenMessengerMinter interface

The TokenMessengerMinter 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. On Stellar it assumes mintRecipient is a contract. Account recipients use CctpForwarder and hook-qualified forwardRecipient bytes.

MessageTransmitter interface

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

CctpForwarder interface

The CctpForwarder contract calls receive_message on MessageTransmitter, takes the mint, and transfers USDC to forwardRecipient parsed from hook_data. See Hook format for details.
The CctpForwarder flow is non-custodial. mint_and_forward mints to this contract and pays forwardRecipient in one atomic Soroban invocation. Circle does not take custody of the minted balance in between.