Skip to content

docs: add CCTP V2 integration guide for Arc Testnet (closes #110)#127

Open
zkasuran wants to merge 1 commit into
circlefin:mainfrom
zkasuran:docs/cctp-v2-integration
Open

docs: add CCTP V2 integration guide for Arc Testnet (closes #110)#127
zkasuran wants to merge 1 commit into
circlefin:mainfrom
zkasuran:docs/cctp-v2-integration

Conversation

@zkasuran

@zkasuran zkasuran commented Jun 8, 2026

Copy link
Copy Markdown

What this does

Adds a CCTP V2 integration guide at docs/cctp-v2-integration.md and links it from the README documentation section. It resolves #110.

The guide documents the Arc-specific details a developer needs to move native USDC on and off Arc with Cross-Chain Transfer Protocol V2, which are not currently in this repo or obvious from Circle's general docs:

  • Arc CCTP domain is 26. Required as destinationDomain in depositForBurn.
  • All Arc CCTP contracts are V2. The V1 depositForBurn selector (0x6fd3504e) reverts against the V2 TokenMessenger. The V2 selector is 0x8e0250ee. This trips up code ported from older Circle examples.
  • Use minFinalityThreshold: 2000 for burns sourced from Arc. 1000 (Fast Transfer) can leave the attestation stuck pending.
  • eth_estimateGas can return data: null for depositForBurn, so pass an explicit gasLimit (covered with the typical gas range).
  • How to fetch the attestation from the Iris API and check route fees.

How I verified the values

  • Domain 26 and the source-chain domains (Ethereum 0, Base 6, Avalanche 1): Circle's supported blockchains.
  • Contract addresses: Circle's EVM smart contracts reference. I also confirmed the TokenMessenger 0x8FE6…2DAA returns contract code (2175 bytes) on Arc Testnet via eth_getCode.
  • Selectors: computed keccak256 of both signatures. V2 depositForBurn(uint256,uint32,bytes32,address,bytes32,uint256,uint32) = 0x8e0250ee, V1 depositForBurn(uint256,uint32,bytes32,address) = 0x6fd3504e.
  • minFinalityThreshold semantics (1000 = Fast/confirmed, 2000 = Standard/finalized): Circle's contract interfaces. The "use 2000 on Arc" guidance comes from the field report in docs: CCTP V2 integration on Arc Testnet — domain 26, minFinalityThreshold 2000, V1 selector incompatible #110; I documented it as Arc behavior, not as a Circle spec.
  • Iris endpoints: the /v2/messages/{sourceDomain} and /v2/burn/USDC/fees/{src}/{dst} paths return well-formed responses against the sandbox host.

Docs-only change, no code touched.

AI disclosure

This guide was prepared with help from Claude (Anthropic), which drafted the prose. Every value (domain, contract addresses, selectors, finality thresholds, API paths) was verified against Circle's official documentation, an on-chain eth_getCode call, a local keccak computation of the selectors, and live calls to the Iris sandbox API before submitting. The verification steps are listed above so they can be rechecked.

Documents the Arc-specific details needed to move native USDC on and off
Arc with CCTP V2, addressing circlefin#110:

- Arc CCTP domain is 26 (verified against Circle's supported-blockchains
  list; the testnet shares the mainnet domain).
- All Arc CCTP contracts are V2. The V1 depositForBurn selector
  (0x6fd3504e) reverts against the V2 TokenMessenger; the V2 selector is
  0x8e0250ee. Both were checked by computing keccak of the signatures.
- Burns sourced from Arc should use minFinalityThreshold 2000 (finalized);
  1000 can leave the attestation stuck pending.
- eth_estimateGas can return data:null for depositForBurn, so pass an
  explicit gasLimit.
- How to fetch the attestation from the Iris API and the fee endpoint.

Contract addresses are from Circle's EVM smart contracts reference and the
TokenMessenger was confirmed to have code on Arc Testnet. Adds a link from
the README documentation section.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

1 participant