Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions ccv/chains/evm/deployment/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ replace github.com/fbsobreira/gotron-sdk => github.com/smartcontractkit/chainlin
require (
github.com/Masterminds/semver/v3 v3.4.0
github.com/ethereum/go-ethereum v1.16.5
github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251029160438-93e0a575186e
github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251030162727-690c3fee46e0
github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20251030162727-690c3fee46e0
github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251029160438-93e0a575186e
github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251101235216-c2afcdc23ae0
github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251101235216-c2afcdc23ae0
github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20251101235216-c2afcdc23ae0
github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251101235216-c2afcdc23ae0
github.com/smartcontractkit/chainlink-deployments-framework v0.56.0
github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20250808121824-2c3544aab8f3
github.com/smartcontractkit/mcms v0.25.0
Expand Down
16 changes: 8 additions & 8 deletions ccv/chains/evm/deployment/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -668,18 +668,18 @@ github.com/smartcontractkit/chain-selectors v1.0.72 h1:AExF2H3mABdLCN0QZd+IjU8Ck
github.com/smartcontractkit/chain-selectors v1.0.72/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-aptos v0.0.0-20250915164817-46a35eda083d h1:bcfnHPXAhrhUw95X60Y/lDhQAb4SxSyTrqyVCHqfXPI=
github.com/smartcontractkit/chainlink-aptos v0.0.0-20250915164817-46a35eda083d/go.mod h1:tEjqontct1/5cKHm4q75nopZa1rwzaQZwd9U9wn0uZE=
github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251029160438-93e0a575186e h1:A5lV4Qdm7Pf5jAADGhBvAIErkWLgFZuvh8+DgYHfTzQ=
github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251029160438-93e0a575186e/go.mod h1:pETrvAF8uvkZgtDgI/oRllZZaC4IpPO26tMxh1u9LC4=
github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251030162727-690c3fee46e0 h1:+pVqdOIAtjJiUjAA+Irm6hhtrBAeN2mmI36L4qDKrDE=
github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251030162727-690c3fee46e0/go.mod h1:uMSQ8dF0Vs2LT0t8l/4IElmW26rbDJe1+CFuMfwE6Vk=
github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20251030162727-690c3fee46e0 h1:I4cD0AHfOJz23EoT2MZybXhx1JwyLVzjxXaQnx/8JMg=
github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20251030162727-690c3fee46e0/go.mod h1:E7S5zIT8GNd2VwXIa0se+vSxaI+nPMQi4v3BaufqRB8=
github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251101235216-c2afcdc23ae0 h1:gXlz6p2gppev3EzDE/EriIHTVb6cJ842RMc2NKKGOng=
github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251101235216-c2afcdc23ae0/go.mod h1:pETrvAF8uvkZgtDgI/oRllZZaC4IpPO26tMxh1u9LC4=
github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251101235216-c2afcdc23ae0 h1:/7UCC1NDKPQT8YWyJvD6dGfaoJlhEkjdAD52vrRYY4c=
github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251101235216-c2afcdc23ae0/go.mod h1:uMSQ8dF0Vs2LT0t8l/4IElmW26rbDJe1+CFuMfwE6Vk=
github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20251101235216-c2afcdc23ae0 h1:W2EitZwEhE/8AV9rkISXYhRLwl9myk0fc8EDklS1ld0=
github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20251101235216-c2afcdc23ae0/go.mod h1:DCKioKnxJqMj6Mf2AefaGu8LEPavROwnFD0/+Gh4Gfk=
github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250908144012-8184001834b5 h1:GmJQqNrWn5pNc8YTei6l2TOSYjK2fRd4+edFZIifCrU=
github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250908144012-8184001834b5/go.mod h1:Ve1xD71bl193YIZQEoJMmBqLGQJdNs29bwbuObwvbhQ=
github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250908144012-8184001834b5 h1:QhcYGEhRLInr1/qh/3RJiVdvJ0nxBHKhPe65WLbSBnU=
github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250908144012-8184001834b5/go.mod h1:xtZNi6pOKdC3sLvokDvXOhgHzT+cyBqH/gWwvxTxqrg=
github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251029160438-93e0a575186e h1:MaJjAcYTHRu5hTRm3MKVqXfYBdAsipKUTN0cDweIMB0=
github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251029160438-93e0a575186e/go.mod h1:OmWUdexQbmSKsJOvE0j0R94XSMXd1QAFAnV+nX2MbZ4=
github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251101235216-c2afcdc23ae0 h1:3iatTQpnMivA4kP4I+vfq5Wi3cyaEFILIHDtwftjb7Y=
github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251101235216-c2afcdc23ae0/go.mod h1:OmWUdexQbmSKsJOvE0j0R94XSMXd1QAFAnV+nX2MbZ4=
github.com/smartcontractkit/chainlink-common v0.9.6-0.20250929154511-1f5fbda7ae76 h1:Slnws8RoXRUYGgEMYK6X2yYzjZwNgVb93PxU45VEObQ=
github.com/smartcontractkit/chainlink-common v0.9.6-0.20250929154511-1f5fbda7ae76/go.mod h1:1r3aM96KHAESfnayJ3BTHCkP1qJS1BEG1r4czeoaXlA=
github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.4 h1:hvqATtrZ0iMRTI80cpBot/3JFbjz2j+2tvpfooVhRHw=
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,16 @@ type RemoteChainConfig struct {
BaseExecutionGasCost uint32
}

type CommitteeVerifier struct {
Implementation datastore.AddressRef
Resolver datastore.AddressRef
}

type ConfigureChainForLanesCfg struct {
ChainSel uint64
RemoteChains map[uint64]RemoteChainConfig
// CommitteeVerifiers are the committee verifiers that will be configured by the CS.
CommitteeVerifiers []datastore.AddressRef
CommitteeVerifiers []CommitteeVerifier
MCMSArgs *mcms.Input
}

Expand Down Expand Up @@ -72,13 +77,20 @@ var ConfigureChainForLanes = changesets.NewFromOnChainSequence(changesets.NewFro
return sequences.ConfigureChainForLanesInput{}, fmt.Errorf("failed to resolve onRamp ref: %w", err)
}

var committeeVerifiers []common.Address
var committeeVerifiers []sequences.CommitteeVerifier
for _, cvRef := range cfg.CommitteeVerifiers {
committeeVerifierAddr, err := datastore_utils.FindAndFormatRef(e.DataStore, cvRef, cfg.ChainSel, evm_datastore_utils.ToEVMAddress)
committeeVerifierAddr, err := datastore_utils.FindAndFormatRef(e.DataStore, cvRef.Implementation, cfg.ChainSel, evm_datastore_utils.ToEVMAddress)
if err != nil {
return sequences.ConfigureChainForLanesInput{}, fmt.Errorf("failed to resolve committee verifier ref: %w", err)
}
committeeVerifiers = append(committeeVerifiers, committeeVerifierAddr)
resolverAddr, err := datastore_utils.FindAndFormatRef(e.DataStore, cvRef.Resolver, cfg.ChainSel, evm_datastore_utils.ToEVMAddress)
if err != nil {
return sequences.ConfigureChainForLanesInput{}, fmt.Errorf("failed to resolve committee verifier resolver ref: %w", err)
}
committeeVerifiers = append(committeeVerifiers, sequences.CommitteeVerifier{
Implementation: committeeVerifierAddr,
Resolver: resolverAddr,
})
}

feeQuoterAddr, err := datastore_utils.FindAndFormatRef(e.DataStore, datastore.AddressRef{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,10 @@ func TestDeployCommitteeVerifier_Apply_MultipleQualifiersOnSameChain(t *testing.

alphaCV, ok := find(addrs1, datastore.ContractType(committee_verifier.ContractType), "alpha")
require.True(t, ok, "committee verifier (alpha) not found in first run output")
alphaProxy, ok := find(addrs1, datastore.ContractType(committee_verifier.ProxyType), "alpha")
require.True(t, ok, "committee verifier proxy (alpha) not found in first run output")
alphaResolver, ok := find(addrs1, datastore.ContractType(committee_verifier.ResolverType), "alpha")
require.True(t, ok, "committee verifier resolver (alpha) not found in first run output")
alphaResolverProxy, ok := find(addrs1, datastore.ContractType(committee_verifier.ResolverProxyType), "alpha")
require.True(t, ok, "committee verifier resolver proxy (alpha) not found in first run output")

// 2) Second run with qualifier "beta"; seed env with first run addresses so they are considered existing
dsSeed := datastore.NewMemoryDataStore()
Expand All @@ -146,12 +148,15 @@ func TestDeployCommitteeVerifier_Apply_MultipleQualifiersOnSameChain(t *testing.

betaCV, ok := find(addrs2, datastore.ContractType(committee_verifier.ContractType), "beta")
require.True(t, ok, "committee verifier (beta) not found in second run output")
betaProxy, ok := find(addrs2, datastore.ContractType(committee_verifier.ProxyType), "beta")
require.True(t, ok, "committee verifier proxy (beta) not found in second run output")
betaResolver, ok := find(addrs2, datastore.ContractType(committee_verifier.ResolverType), "beta")
require.True(t, ok, "committee verifier resolver (beta) not found in second run output")
betaResolverProxy, ok := find(addrs2, datastore.ContractType(committee_verifier.ResolverProxyType), "beta")
require.True(t, ok, "committee verifier resolver proxy (beta) not found in second run output")

// Ensure addresses differ across qualifiers
require.NotEqual(t, alphaCV.Address, betaCV.Address, "expected different CommitteeVerifier addresses for different qualifiers")
require.NotEqual(t, alphaProxy.Address, betaProxy.Address, "expected different CommitteeVerifierProxy addresses for different qualifiers")
require.NotEqual(t, alphaResolver.Address, betaResolver.Address, "expected different CommitteeVerifierResolver addresses for different qualifiers")
require.NotEqual(t, alphaResolverProxy.Address, betaResolverProxy.Address, "expected different CommitteeVerifierResolverProxy addresses for different qualifiers")

// 3) Third run re-using qualifier "alpha" should be idempotent (returns existing alpha addresses)
dsUnion := datastore.NewMemoryDataStore()
Expand All @@ -177,10 +182,13 @@ func TestDeployCommitteeVerifier_Apply_MultipleQualifiersOnSameChain(t *testing.

reAlphaCV, ok := find(addrs3, datastore.ContractType(committee_verifier.ContractType), "alpha")
require.True(t, ok)
reAlphaProxy, ok := find(addrs3, datastore.ContractType(committee_verifier.ProxyType), "alpha")
reAlphaResolver, ok := find(addrs3, datastore.ContractType(committee_verifier.ResolverType), "alpha")
require.True(t, ok)
reAlphaResolverProxy, ok := find(addrs3, datastore.ContractType(committee_verifier.ResolverProxyType), "alpha")
require.True(t, ok)

// Should return the same addresses as first run for the same qualifier
require.Equal(t, alphaCV.Address, reAlphaCV.Address, "expected same CommitteeVerifier address when reusing qualifier")
require.Equal(t, alphaProxy.Address, reAlphaProxy.Address, "expected same CommitteeVerifierProxy address when reusing qualifier")
require.Equal(t, alphaResolver.Address, reAlphaResolver.Address, "expected same CommitteeVerifierResolver address when reusing qualifier")
require.Equal(t, alphaResolverProxy.Address, reAlphaResolverProxy.Address, "expected same CommitteeVerifierResolverProxy address when reusing qualifier")
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/committee_verifier"
"github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/proxy"
"github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/versioned_verifier_resolver"
"github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/utils/operations/contract"
cldf_deployment "github.com/smartcontractkit/chainlink-deployments-framework/deployment"
)

var ContractType cldf_deployment.ContractType = "CommitteeVerifier"

var ProxyType cldf_deployment.ContractType = "CommitteeVerifierProxy"
var ResolverType cldf_deployment.ContractType = "CommitteeVerifierResolver"

var ResolverProxyType cldf_deployment.ContractType = "CommitteeVerifierResolverProxy"

type DynamicConfig = committee_verifier.CommitteeVerifierDynamicConfig

Expand All @@ -22,8 +25,10 @@ type ConstructorArgs struct {
StorageLocation string
}

type ProxyConstructorArgs struct {
RampAddress common.Address
type ResolverConstructorArgs struct{}

type ResolverProxyConstructorArgs struct {
ResolverAddress common.Address
}

type SetDynamicConfigArgs struct {
Expand Down Expand Up @@ -58,17 +63,30 @@ var Deploy = contract.NewDeploy(contract.DeployParams[ConstructorArgs]{
Validate: func(ConstructorArgs) error { return nil },
})

var DeployProxy = contract.NewDeploy(contract.DeployParams[ProxyConstructorArgs]{
Name: "committee-verifier-proxy:deploy",
var DeployResolver = contract.NewDeploy(contract.DeployParams[ResolverConstructorArgs]{
Name: "committee-verifier-resolver:deploy",
Version: semver.MustParse("1.7.0"),
Description: "Deploys the CommitteeVerifierResolver contract",
ContractMetadata: versioned_verifier_resolver.VersionedVerifierResolverMetaData,
BytecodeByTypeAndVersion: map[string]contract.Bytecode{
cldf_deployment.NewTypeAndVersion(ResolverType, *semver.MustParse("1.7.0")).String(): {
EVM: common.FromHex(versioned_verifier_resolver.VersionedVerifierResolverBin),
},
},
Validate: func(ResolverConstructorArgs) error { return nil },
})

var DeployResolverProxy = contract.NewDeploy(contract.DeployParams[ResolverProxyConstructorArgs]{
Name: "committee-verifier-resolver-proxy:deploy",
Version: semver.MustParse("1.7.0"),
Description: "Deploys the CommitteeVerifierProxy contract",
Description: "Deploys the CommitteeVerifierResolverProxy contract",
ContractMetadata: proxy.ProxyMetaData,
BytecodeByTypeAndVersion: map[string]contract.Bytecode{
cldf_deployment.NewTypeAndVersion(ProxyType, *semver.MustParse("1.7.0")).String(): {
cldf_deployment.NewTypeAndVersion(ResolverProxyType, *semver.MustParse("1.7.0")).String(): {
EVM: common.FromHex(proxy.ProxyBin),
},
},
Validate: func(ProxyConstructorArgs) error { return nil },
Validate: func(ResolverProxyConstructorArgs) error { return nil },
})

var SetDynamicConfig = contract.NewWrite(contract.WriteParams[SetDynamicConfigArgs, *committee_verifier.CommitteeVerifier]{
Expand Down Expand Up @@ -151,3 +169,14 @@ var GetDestChainConfig = contract.NewRead(contract.ReadParams[uint64, DestChainC
return committeeVerifier.GetDestChainConfig(opts, args)
},
})

var GetVersionTag = contract.NewRead(contract.ReadParams[any, [4]byte, *committee_verifier.CommitteeVerifier]{
Name: "committee-verifier:get-version-tag",
Version: semver.MustParse("1.7.0"),
Description: "Gets the version tag of the CommitteeVerifier contract",
ContractType: ContractType,
NewContract: committee_verifier.NewCommitteeVerifier,
CallContract: func(committeeVerifier *committee_verifier.CommitteeVerifier, opts *bind.CallOpts, args any) ([4]byte, error) {
return committeeVerifier.VersionTag(opts)
},
})
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (

var ContractType cldf_deployment.ContractType = "Proxy"

var SetRamp = contract.NewWrite(contract.WriteParams[common.Address, *proxy.Proxy]{
var SetTarget = contract.NewWrite(contract.WriteParams[common.Address, *proxy.Proxy]{
Name: "proxy:set-target",
Version: semver.MustParse("1.7.0"),
Description: "Set the target address on the proxy",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package versioned_verifier_resolver

import (
"github.com/Masterminds/semver/v3"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/core/types"
"github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/versioned_verifier_resolver"
"github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/utils/operations/contract"
cldf_deployment "github.com/smartcontractkit/chainlink-deployments-framework/deployment"
)

var ContractType cldf_deployment.ContractType = "VersionedVerifierResolver"

type InboundImplementationArgs = versioned_verifier_resolver.VersionedVerifierResolverInboundImplementationArgs

type OutboundImplementationArgs = versioned_verifier_resolver.VersionedVerifierResolverOutboundImplementationArgs

var ApplyInboundImplementationUpdates = contract.NewWrite(contract.WriteParams[[]InboundImplementationArgs, *versioned_verifier_resolver.VersionedVerifierResolver]{
Name: "versioned-verifier-resolver:apply-inbound-implementation-updates",
Version: semver.MustParse("1.7.0"),
Description: "Updates verifier implementations for inbound traffic",
ContractType: ContractType,
ContractABI: versioned_verifier_resolver.VersionedVerifierResolverABI,
NewContract: versioned_verifier_resolver.NewVersionedVerifierResolver,
IsAllowedCaller: contract.OnlyOwner[*versioned_verifier_resolver.VersionedVerifierResolver, []InboundImplementationArgs],
Validate: func([]InboundImplementationArgs) error { return nil },
CallContract: func(resolver *versioned_verifier_resolver.VersionedVerifierResolver, opts *bind.TransactOpts, args []InboundImplementationArgs) (*types.Transaction, error) {
return resolver.ApplyInboundImplementationUpdates(opts, args)
},
})

var ApplyOutboundImplementationUpdates = contract.NewWrite(contract.WriteParams[[]OutboundImplementationArgs, *versioned_verifier_resolver.VersionedVerifierResolver]{
Name: "versioned-verifier-resolver:apply-outbound-implementation-updates",
Version: semver.MustParse("1.7.0"),
Description: "Updates verifier implementations for outbound traffic",
ContractType: ContractType,
ContractABI: versioned_verifier_resolver.VersionedVerifierResolverABI,
NewContract: versioned_verifier_resolver.NewVersionedVerifierResolver,
IsAllowedCaller: contract.OnlyOwner[*versioned_verifier_resolver.VersionedVerifierResolver, []OutboundImplementationArgs],
Validate: func([]OutboundImplementationArgs) error { return nil },
CallContract: func(resolver *versioned_verifier_resolver.VersionedVerifierResolver, opts *bind.TransactOpts, args []OutboundImplementationArgs) (*types.Transaction, error) {
return resolver.ApplyOutboundImplementationUpdates(opts, args)
},
})
Loading
Loading