CCIP v2.0.0 CCTPVerifier API Reference

CCTPVerifier is a CCIP Cross-Chain Verifier that integrates with Circle CCTP to handle USDC transfers.

On the source chain, it constructs and forwards CCTP burn messages via the configured TokenMessenger.
On the destination chain, it verifies attested messages and executes delivery through the configured MessageTransmitter.

This verifier is specific to CCTP V2 and is not backwards compatible with CCTP V1.

Applications do not call this contract directly.

Usage Boundary

You do not call this contract directly.

  • OffRamp components invoke this verifier during message validation and execution.
  • The owner configures domains, verification rules, and allowed senders.
  • Use this verifier only when integrating CCIP with CCTP-based USDC transfers.
  • You are responsible for ensuring domain mappings and CCTP configuration are correct.

Contract

ccvs/CCTPVerifier.sol

Import

import {CCTPVerifier} from "chainlink-ccip/ccvs/CCTPVerifier.sol";

Inheritance

  • Ownable2StepMsgSender
  • BaseVerifier

Constructor

constructor(
  ITokenMessenger tokenMessenger,
  CCTPMessageTransmitterProxy messageTransmitterProxy,
  IERC20 usdcToken,
  DynamicConfig memory dynamicConfig,
  BaseVerifierArgs memory baseVerifierArgs
) BaseVerifier(
  baseVerifierArgs.storageLocations,
  baseVerifierArgs.rmn,
  baseVerifierArgs.versionTag
)
ParameterTypeDescription
tokenMessengerITokenMessengerCCTP token messenger used to initiate burns on the source chain.
messageTransmitterProxyCCTPMessageTransmitterProxyProxy used to verify and deliver messages on the destination chain.
usdcTokenIERC20USDC token contract used for transfers.
dynamicConfigDynamicConfig memoryRuntime configuration for verification behavior.
baseVerifierArgsBaseVerifierArgs memoryShared verifier configuration (storage, RMN, version).

External API

forwardToVerifier

function forwardToVerifier(
  MessageV1Codec.MessageV1 calldata message,
  bytes32 messageId,
  address feeToken,
  uint256 feeTokenAmount,
  bytes calldata verifierArgs
) external returns (bytes memory verifierReturnData)

Forwards a message to the verifier for processing and returns encoded verifier output.

  • Produces verifier output that is later consumed by verifyMessage.

verifyMessage

function verifyMessage(
  MessageV1Codec.MessageV1 memory message,
  bytes32 messageHash,
  bytes calldata verifierResults
) external

Verifies a CCTP message and attestation and triggers execution on the destination chain.

  • verifierResults must match the output produced during verification forwarding.

getStaticConfig

function getStaticConfig()
  external
  view
  returns (
    address tokenMessenger,
    address messageTransmitterProxy,
    address usdcToken,
    uint32 localDomainIdentifier
  )

Returns static configuration for CCTP integration.


getDynamicConfig

function getDynamicConfig() external view returns (DynamicConfig memory dynamicConfig)

Returns runtime configuration.


setDynamicConfig

function setDynamicConfig(DynamicConfig memory dynamicConfig) external onlyOwner

Updates runtime configuration.


getDomain

function getDomain(uint64 chainSelector) external view returns (Domain memory)

Returns domain configuration for a chain.


setDomains

function setDomains(SetDomainArgs[] calldata domains) external onlyOwner

Configures domain mappings.


applyRemoteChainConfigUpdates

function applyRemoteChainConfigUpdates(
  RemoteChainConfigArgs[] calldata remoteChainConfigArgs
) external onlyOwner

Updates remote chain configuration.


applyAllowlistUpdates

function applyAllowlistUpdates(AllowlistConfigArgs[] calldata allowlistConfigArgsItems) external

Updates allowlist configuration.

Callable by the owner or the allowlistAdmin set in the dynamic config. Any other caller reverts with OnlyCallableByOwnerOrAllowlistAdmin.


setAllowedFinalityConfig

function setAllowedFinalityConfig(bytes4 allowedFinality) external onlyOwner

Sets allowed finality configuration.


updateStorageLocations

function updateStorageLocations(string[] memory newLocations) external onlyOwner

Updates storage locations.


withdrawFeeTokens

function withdrawFeeTokens(address[] calldata feeTokens) external

Withdraws accumulated fee token balances to the feeAggregator in the dynamic config.

Permissionless: it only transfers tokens to the configured fee aggregator.


getFee

function getFee(
  uint64 destChainSelector,
  Client.EVM2AnyMessage memory message,
  bytes memory extraArgs,
  bytes4 requestedFinality
) external view returns (uint16 feeUSDCents, uint32 gasForVerification, uint32 payloadSizeBytes)

Returns the fee in USD cents, verification gas, and payload size for messages to a remote chain. Inherited from BaseVerifier.

Reverts RemoteChainNotSupported(destChainSelector) if the chain has no configuration, and reverts if requestedFinality is outside getAllowedFinalityConfig().


versionTag

function versionTag() public view returns (bytes4 tag)

Returns the immutable version tag set at construction. Inherited from BaseVerifier.


getAllowedFinalityConfig

function getAllowedFinalityConfig() public view returns (bytes4 allowedFinality)

Returns the allowed finality encoding for fast finality transfers. Inherited from BaseVerifier.


getStorageLocations

function getStorageLocations() public view returns (string[] memory)

Returns the off-chain storage locations for verifier infrastructure to read from. Inherited from BaseVerifier.


getRemoteChainConfig

function getRemoteChainConfig(
  uint64 remoteChainSelector
) external view returns (RemoteChainConfig memory)

Returns the router, fee, verification gas, payload size, and allowlist state for a remote chain. Inherited from BaseVerifier.


supportsInterface

function supportsInterface(bytes4 interfaceId) external pure returns (bool)

Returns true for ICrossChainVerifierV1 and IERC165. Inherited from BaseVerifier.


Events

  • event DomainsSet(SetDomainArgs[] domains)
  • event DynamicConfigSet(DynamicConfig dynamicConfig)
  • event StaticConfigSet(address tokenMessenger, address messageTransmitterProxy, address usdcToken, uint32 localDomainIdentifier)

For a cross-contract event index, see Events.

Errors

  • error InvalidVerifierResults()
  • error InvalidCCVVersion(bytes4 expected, bytes4 got)
  • error InvalidMessageTransmitterOnProxy(address expected, address got)
  • error InvalidMessageTransmitterVersion(uint32 expected, uint32 got)
  • error InvalidReceiver(bytes receiver)
  • error InvalidTokenMessengerVersion(uint32 expected, uint32 got)
  • error InvalidMessageId(bytes32 expected, bytes32 got)
  • error InvalidMessageSender(bytes32 expected, bytes32 got)
  • error InvalidSourceDomain(uint32 expected, uint32 got)
  • error InvalidToken(bytes token)
  • error InvalidTokenTransferLength(uint256 length)
  • error InvalidVerifierArgsLength(uint256 length)
  • error OnlyCallableByOwnerOrAllowlistAdmin()
  • error ReceiveMessageCallFailed()
  • error InvalidFastFinalityBps(uint16 fastFinalityBps)
  • error InvalidSetDomainArgs(SetDomainArgs args)
  • error UnknownDomain(uint64 chainSelector)

For a cross-contract error index, see Errors.

Notes

  • Verification requires exact agreement between message data, attestation, and configured domain mappings.
  • The message ID, domain, and sender must match exactly between the source and destination phases.
  • Each message must contain exactly one USDC transfer.
  • Verification forwarding must occur before destination-side verification can succeed.
  • Messages are executed only if both CCTP verification and BaseVerifier checks succeed.
  • Messages will revert if attestation validation fails or if any verification parameter does not match expected values.

Security model

  • Relies on Circle CCTP components for message authenticity and delivery.
  • Relies on BaseVerifier for RMN checks, router validation, and sender allowlisting.
  • Owner controls domain mappings, verification rules, and dynamic configuration.
  • Incorrect configuration may result in failed verification or incorrect message execution.

Get the latest Chainlink content straight to your inbox.