Chainlink CCV

Symbiotic-secured Cross-Chain Verifier for Chainlink CCIP-compatible message verification.

Overview

The CCV provider watches CCIPMessageSent events, builds the verifier payload, collects BLS attestations through Symbiotic relay sidecars, and submits execution calldata to the destination OffRamp path. Success is confirmed when the destination emits MessageExecuted(messageId).

This template supports the Symbiotic CCV path only. The Chainlink auxiliary devenv stack is not required.

Message Flow

Contracts and Code

Contracts

  • contracts/src/ccv/SymbioticCCV.sol
  • contracts/src/ccv/interfaces/
  • contracts/src/ccv/libraries/
  • contracts/src/symbiotic/Settlement.sol
  • contracts/src/symbiotic/KeyRegistry.sol
  • contracts/src/symbiotic/Driver.sol

Operator

  • operator/src/provider/chainlink_ccv.rs
  • operator/src/provider/mod.rs

Monitor Templates

  • config/templates/oz-monitor/monitors/ccip_message_sent.json

Configuration

Select CCV in config/environments/<env>.json:

{
  "activeProvider": "chainlink_ccv"
}

CCIP chain selectors come from chains.source.ccipChainSelector and chains.destination.ccipChainSelector, which are required for non-local environments. They can be overridden at runtime via the CCV_SOURCE_CHAIN_SELECTOR / CCV_DEST_CHAIN_SELECTOR environment variables. For local Anvil only (chainId 31337), the selector falls back to chainId when ccipChainSelector is unset.

Address resolution order:

  1. CCV_* environment variables
  2. deployments/<env>.json

Available overrides:

VariableDescription
CCV_SOURCE_ADDRESSSymbioticCCV on source chain
CCV_DEST_ADDRESSSymbioticCCV on destination chain
CCV_SOURCE_ONRAMP_ADDRESSSource OnRamp-compatible contract
CCV_DEST_OFFRAMP_ADDRESSDestination OffRamp submit target
CCV_SOURCE_CHAIN_SELECTOROverride the source CCIP chain selector
CCV_DEST_CHAIN_SELECTOROverride the destination CCIP chain selector

Local and testnet are supported (testnet uses the testnet-ccv environment: config/environments/testnet-ccv.json and deployments/testnet-ccv.json, run via ENV=testnet-ccv); mainnet is not yet supported for CCV. make watch only succeeds once destination MessageExecuted(messageId) is observed.

See Setup and CLI & API Reference for operation.