Skip to content

docs: CCTP V2 integration on Arc Testnet — domain 26, minFinalityThreshold 2000, V1 selector incompatible #110

@osr21

Description

@osr21

Summary

After building a full CCTP V2 bridge (Arc Testnet ↔ Ethereum Sepolia ↔ Base Sepolia ↔ Avalanche Fuji), three Arc-specific integration details were not documented anywhere and caused significant debugging time. Sharing them here so the docs or a dedicated integration guide can cover them.


1. Arc Testnet CCTP domain is 26

The CCTP V2 depositForBurn call requires a destinationDomain parameter. Arc Testnet's domain is 26. This is not listed in the Circle CCTP docs or the arc-node README. The only way to confirm it is empirically by inspecting a successful MessageSent event.

// Sending from Ethereum Sepolia → Arc Testnet
const destinationDomain = 26; // Arc Testnet — not in Circle's public docs

2. Arc Testnet requires minFinalityThreshold: 2000 (finalized), not 1000 (safe)

CCTP V2's depositForBurn accepts a minFinalityThreshold parameter that controls when the attestation is issued. All other testnets work with 1000 (safe finality, ~1–2 min). Arc Testnet requires 2000 (finalized) — using 1000 results in an attestation that never progresses past pending in the Circle Iris API.

// Arc Testnet source burns:
const minFinalityThreshold = 2000; // finalized — required for Arc

// All other chains (Sepolia, Base Sepolia, Fuji):
const minFinalityThreshold = 1000; // safe — works fine

3. All CCTP contracts on Arc use V2 — the V1 4-parameter selector will silently fail

The CCTP V2 depositForBurn function signature is:

function depositForBurn(
    uint256 amount,
    uint32 destinationDomain,
    bytes32 mintRecipient,
    address burnToken,
    bytes32 destinationCaller, // V2 addition
    uint256 maxFee,            // V2 addition
    uint32 minFinalityThreshold // V2 addition
) external returns (uint64 nonce);

The V1 version has only 4 parameters. If a DApp or library calls the V1 selector (0x6fd3504e) against Arc's TokenMessenger (0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA), the transaction will be accepted by the node but revert on-chain with no useful error data. This is a common mistake when copying integration examples from older Circle docs.

The correct V2 selector is 0x8e0250ee.


Suggested documentation additions

  • Add Arc Testnet to the CCTP supported domains list (domain 26)
  • Document minFinalityThreshold: 2000 as Arc-specific in the CCTP integration guide
  • Add a warning that all Arc CCTP contracts are V2-only and the V1 ABI will silently fail
  • Include Arc Testnet in the Circle Iris attestation API endpoint documentation

Context

Discovered while building arc-relay-bridge — a fully working CCTP V2 bridge across Arc Testnet, Ethereum Sepolia, Base Sepolia, and Avalanche Fuji.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions