Skip to main content

Overview

The SDK provides pre-configured chain metadata for all CCTP V2 supported networks, including mainnet and testnet environments. Chain configurations include contract addresses, RPC endpoints, and network characteristics.

Chain Type

The Chain struct contains all information needed to interact with a CCTP-enabled chain:
chains.go:24
type Chain struct {
    Name                 string      // Human-readable name
    ChainID              *big.Int    // EVM chain ID
    Domain               uint32      // CCTP domain identifier
    RPC                  string      // Default RPC endpoint
    TokenMessengerV2     string      // TokenMessengerV2 contract address
    MessageTransmitterV2 string      // MessageTransmitterV2 contract address
    USDC                 string      // USDC token address
    Explorer             string      // Block explorer base URL
    IsTestnet            bool        // Testnet flag
    InstantFinality      bool        // True for chains with instant finality
}
The InstantFinality field indicates chains where Fast Transfer and Standard Transfer have similar performance characteristics (Avalanche, Polygon, Sonic, Sei, XDC, HyperEVM).

Chain Lookup Functions

GetChains

Retrieve all configured chains for mainnet or testnet:
chains.go:79
func GetChains(testnet bool) []Chain
chains := cctp.GetChains(false)
fmt.Printf("Found %d mainnet chains\n", len(chains))

for _, chain := range chains {
    fmt.Printf("- %s (domain %d)\n", chain.Name, chain.Domain)
}

GetChainByDomain

Lookup a chain by its CCTP domain ID:
chains.go:507
func GetChainByDomain(domain uint32, testnet bool) (*Chain, error)
// Find Ethereum mainnet (domain 0)
ethChain, err := cctp.GetChainByDomain(0, false)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Chain: %s\n", ethChain.Name)
fmt.Printf("TokenMessenger: %s\n", ethChain.TokenMessengerV2)

GetChainByName

Lookup a chain by its name:
chains.go:518
func GetChainByName(name string, testnet bool) (*Chain, error)
sourceChain, err := cctp.GetChainByName("Ethereum", false)
if err != nil {
    log.Fatal(err)
}

destChain, err := cctp.GetChainByName("Avalanche", false)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Transfer from %s to %s\n", sourceChain.Name, destChain.Name)

Chain Name Constants

The SDK provides constants for all supported chains to avoid string typos:
chains.go:38
const (
    Ethereum   = "Ethereum"
    Avalanche  = "Avalanche"
    OPMainnet  = "OP Mainnet"
    Arbitrum   = "Arbitrum"
    Base       = "Base"
    PolygonPoS = "Polygon PoS"
    Unichain   = "Unichain"
    Linea      = "Linea"
    Codex      = "Codex"
    Sonic      = "Sonic"
    WorldChain = "World Chain"
    Sei        = "Sei"
    XDC        = "XDC"
    HyperEVM   = "HyperEVM"
    Ink        = "Ink"
    Plume      = "Plume"
)

Contract Addresses

All CCTP V2 chains use standardized contract addresses, making multi-chain integration straightforward.

Mainnet Contracts

chains.go:90
const (
    tokenMessengerV2Addr     = "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d"
    messageTransmitterV2Addr = "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64"
)

Testnet Contracts

chains.go:294
const (
    tokenMessengerV2Addr     = "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA"
    messageTransmitterV2Addr = "0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275"
)

Domain Mapping

Each chain has a unique CCTP domain identifier:
ChainDomainInstant Finality
Ethereum0No
Avalanche1Yes
OP Mainnet2No
Arbitrum3No
Base6No
Polygon PoS7Yes
Unichain10No
Linea11No
Codex12No
Sonic13Yes
World Chain14No
Sei16Yes
XDC18Yes
HyperEVM19Yes
Ink21No
Plume22No
Testnet chains use the same domain IDs as their mainnet counterparts.

Next Steps

RPC Overrides

Learn how to customize RPC endpoints

Transfer Orchestrator

Use chain configs for transfers

Build docs developers (and LLMs) love