Overview
Stellar CCTP contracts run on Soroban, Stellar’s smart contracts platform. CCTP message fields use 32-byte address encodings. CCTP treatsmintRecipient 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 ofTokenMessengerV2(burn + send) andTokenMinterV2(receive + mint). On mint,mintRecipientis treated as a contract address and hooks supply theforwardRecipientwhen needed.MessageTransmitter: provides the messaging layer that emits or receives attested messages and delivers them toTokenMessengerMinter(includingreceive_messagefor forwarder flows).CctpForwarder: receives minted USDC and forwards it toforwardRecipientin 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 aforwardRecipientstrkey.
TokenMessengerMinter interface
TheTokenMessengerMinter 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
TheMessageTransmitter 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
TheCctpForwarder 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.