From dab1d0247e5dc225aa704ccb5072b23ffce5615b Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Tue, 31 Mar 2026 16:35:42 -0400 Subject: [PATCH 01/28] Use chain centric lane configuration CS --- build/devenv/cciptestinterfaces/interface.go | 33 +++- build/devenv/evm/impl.go | 82 +++++---- build/devenv/go.mod | 10 +- build/devenv/go.sum | 40 ++++ build/devenv/implcommon.go | 182 +++++++++++-------- go.mod | 2 +- go.sum | 8 + 7 files changed, 231 insertions(+), 126 deletions(-) diff --git a/build/devenv/cciptestinterfaces/interface.go b/build/devenv/cciptestinterfaces/interface.go index 913fb7ad1..3d04da8a3 100644 --- a/build/devenv/cciptestinterfaces/interface.go +++ b/build/devenv/cciptestinterfaces/interface.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/prometheus/client_golang/prometheus" - "github.com/smartcontractkit/chainlink-ccip/deployment/lanes" + "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" "github.com/smartcontractkit/chainlink-ccv/protocol" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" @@ -199,6 +199,27 @@ type OnChainCommittees struct { Threshold uint8 } +// ChainLaneProfile holds everything an impl needs to provide so that +// connectAllChains can assemble PartialChainConfig entries for the +// canonical ConfigureChainsForLanesFromTopology changeset. +type ChainLaneProfile struct { + Router datastore.AddressRef + OnRamp datastore.AddressRef + FeeQuoter datastore.AddressRef + OffRamp datastore.AddressRef + + AddressBytesLength uint8 + BaseExecutionGasCost uint32 + FeeQuoterDestChainConfig adapters.FeeQuoterDestChainConfig + + ExecutorDestChainConfig adapters.ExecutorDestChainConfig + DefaultExecutor datastore.AddressRef + DefaultInboundCCVs []datastore.AddressRef + DefaultOutboundCCVs []datastore.AddressRef + + GasForVerification uint32 +} + // OnChainConfigurable defines methods that allows devenv to // deploy, configure Chainlink product and connect on-chain part with other chains. type OnChainConfigurable interface { @@ -207,11 +228,11 @@ type OnChainConfigurable interface { // DeployContractsForSelector deploys contracts for chain X using topology for CommitteeVerifier configuration. // Returns all the contract addresses and metadata as datastore.DataStore. DeployContractsForSelector(ctx context.Context, env *deployment.Environment, selector uint64, topology *offchain.EnvironmentTopology) (datastore.DataStore, error) - // GetConnectionProfile returns a ChainDefinition describing this chain as a - // lane destination, plus the default committee verifier remote chain input - // to apply for each remote chain. The environment uses profiles from all - // chains to assemble the full cross-chain connection config. - GetConnectionProfile(env *deployment.Environment, selector uint64) (lanes.ChainDefinition, lanes.CommitteeVerifierRemoteChainInput, error) + // GetChainLaneProfile returns the lane profile for this chain, containing + // local contract refs, destination characteristics, and default per-remote + // settings. The environment uses profiles from all chains to assemble the + // full cross-chain connection config. + GetChainLaneProfile(env *deployment.Environment, selector uint64) (ChainLaneProfile, error) // PostConnect runs chain-specific setup after all chains have been connected // (e.g. USDC/Lombard token config, custom executor wiring). PostConnect(env *deployment.Environment, selector uint64, remoteSelectors []uint64) error diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index e561d581e..2466ec627 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -2,7 +2,6 @@ package evm import ( "context" - "encoding/binary" "encoding/json" "errors" "fmt" @@ -51,7 +50,6 @@ import ( burnminterc677ops "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/token_admin_registry" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_6_0/operations/rmn_remote" - "github.com/smartcontractkit/chainlink-ccip/deployment/lanes" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" @@ -1310,13 +1308,49 @@ func (m *CCIP17EVM) GetMaxDataBytes(ctx context.Context, remoteChainSelector uin return destChainConfig.MaxDataBytes, nil } -func (m *CCIP17EVMConfig) GetConnectionProfile(_ *deployment.Environment, selector uint64) (lanes.ChainDefinition, lanes.CommitteeVerifierRemoteChainInput, error) { - chainDef := lanes.ChainDefinition{ - Selector: selector, - AddressBytesLength: 20, - BaseExecutionGasCost: 150_000, - FeeQuoterDestChainConfigOverrides: evmFeeQuoterDestChainConfigOverride(selector), - ExecutorDestChainConfig: lanes.ExecutorDestChainConfig{ +func (m *CCIP17EVMConfig) GetChainLaneProfile(_ *deployment.Environment, selector uint64) (cciptestinterfaces.ChainLaneProfile, error) { + selectorBytes := changesetsutils.GetSelectorHex(selector) + var chainFamilySelector [4]byte + copy(chainFamilySelector[:], selectorBytes[:4]) + + return cciptestinterfaces.ChainLaneProfile{ + Router: datastore.AddressRef{ + Type: datastore.ContractType(routeroperations.ContractType), + Version: routeroperations.Version, + ChainSelector: selector, + }, + OnRamp: datastore.AddressRef{ + Type: datastore.ContractType(onrampoperations.ContractType), + Version: onrampoperations.Version, + ChainSelector: selector, + }, + FeeQuoter: datastore.AddressRef{ + Type: datastore.ContractType(fee_quoter.ContractType), + Version: fee_quoter.Version, + ChainSelector: selector, + }, + OffRamp: datastore.AddressRef{ + Type: datastore.ContractType(offrampoperations.ContractType), + Version: offrampoperations.Version, + ChainSelector: selector, + }, + AddressBytesLength: 20, + BaseExecutionGasCost: 150_000, + FeeQuoterDestChainConfig: adapters.FeeQuoterDestChainConfig{ + IsEnabled: true, + MaxDataBytes: 30_000, + MaxPerMsgGasLimit: 3_000_000, + DestGasOverhead: 300_000, + DefaultTokenFeeUSDCents: 25, + DestGasPerPayloadByteBase: 16, + DefaultTokenDestGasOverhead: 90_000, + DefaultTxGasLimit: 200_000, + NetworkFeeUSDCents: 10, + ChainFamilySelector: chainFamilySelector, + LinkFeeMultiplierPercent: 90, + USDPerUnitGas: big.NewInt(1e6), + }, + ExecutorDestChainConfig: adapters.ExecutorDestChainConfig{ Enabled: true, }, DefaultExecutor: datastore.AddressRef{ @@ -1341,13 +1375,8 @@ func (m *CCIP17EVMConfig) GetConnectionProfile(_ *deployment.Environment, select Qualifier: devenvcommon.DefaultCommitteeVerifierQualifier, }, }, - } - - cvConfig := lanes.CommitteeVerifierRemoteChainInput{ GasForVerification: CommitteeVerifierGasForVerification, - } - - return chainDef, cvConfig, nil + }, nil } func (m *CCIP17EVMConfig) PostConnect(e *deployment.Environment, selector uint64, remoteSelectors []uint64) error { @@ -1371,7 +1400,7 @@ func (m *CCIP17EVMConfig) PostConnect(e *deployment.Environment, selector uint64 for _, rs := range remoteSelectors { destChainSelectorsToAdd = append(destChainSelectorsToAdd, sequences.ExecutorRemoteChainConfigArgs{ DestChainSelector: rs, - Config: lanes.ExecutorDestChainConfig{ + Config: adapters.ExecutorDestChainConfig{ Enabled: true, }, }) @@ -1396,27 +1425,6 @@ func (m *CCIP17EVMConfig) PostConnect(e *deployment.Environment, selector uint64 return nil } -func evmFeeQuoterDestChainConfigOverride(selector uint64) *lanes.FeeQuoterDestChainConfigOverride { - override := lanes.FeeQuoterDestChainConfigOverride(func(cfg *lanes.FeeQuoterDestChainConfig) { - selectorBytes := changesetsutils.GetSelectorHex(selector) - cfg.IsEnabled = true - cfg.MaxDataBytes = 30_000 - cfg.MaxPerMsgGasLimit = 3_000_000 - cfg.DestGasOverhead = 300_000 - cfg.DefaultTokenFeeUSDCents = 25 - cfg.DestGasPerPayloadByteBase = 16 - cfg.DefaultTokenDestGasOverhead = 90_000 - cfg.DefaultTxGasLimit = 200_000 - cfg.NetworkFeeUSDCents = 10 - cfg.ChainFamilySelector = binary.BigEndian.Uint32(selectorBytes[:4]) - cfg.V2Params = &lanes.FeeQuoterV2Params{ - LinkFeeMultiplierPercent: 90, - USDPerUnitGas: big.NewInt(1e6), - } - }) - return &override -} - // ConfigureUSDCAndLombardForTransfer configures CCTP/USDC and Lombard lanes. Called from PostConnect; // does not depend on ConfigureTokensForTransfers. func (m *CCIP17EVMConfig) ConfigureUSDCAndLombardForTransfer(e *deployment.Environment, selector uint64, remoteSelectors []uint64) error { diff --git a/build/devenv/go.mod b/build/devenv/go.mod index d2c0996d2..60ecdfae8 100644 --- a/build/devenv/go.mod +++ b/build/devenv/go.mod @@ -16,9 +16,9 @@ require ( github.com/prometheus/client_golang v1.23.0 github.com/rs/zerolog v1.34.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260326205122-a6b3f014b808 - github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 - github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260326205122-a6b3f014b808 + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331202459-592a42284273 + github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331202459-592a42284273 + github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331202459-592a42284273 github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 github.com/smartcontractkit/chainlink-deployments-framework v0.85.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0 @@ -36,8 +36,8 @@ require ( github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 github.com/sethvargo/go-retry v0.3.0 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331202459-592a42284273 github.com/smartcontractkit/chainlink-ccv v0.0.0-20260218133052-8e7fe2f457f9 github.com/smartcontractkit/chainlink-common/keystore v1.0.0 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd diff --git a/build/devenv/go.sum b/build/devenv/go.sum index 2e8236200..c3b9e83c7 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -1119,18 +1119,58 @@ github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3 h github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3/go.mod h1:OywVThRaVXwknATT2B8QAwjOJ1LoYBB9bTsmRpf6RPw= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260326205122-a6b3f014b808 h1:L41P/gvHKlmYLv05HPW/RK+OycM0sFNIKsGyJPS9IjE= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260326205122-a6b3f014b808/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331171343-5fc2d717fb95 h1:0lC/s03tG7sQ7hQ0yD5m49KhZ9ostKv62is8LpQYzgY= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331171343-5fc2d717fb95/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331192634-7da5ecaa82f4 h1:QWX0dLXYnRFnXqUd22vJwVLNZDotCHkg5V6H0sdtTdo= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331192634-7da5ecaa82f4/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331194110-a896013896cc h1:DuXzHU5S9hHJDkhNZf4RjNnDNSfAgojRRvNoHzBshD0= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331194110-a896013896cc/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331202459-592a42284273 h1:Yq7pNEY3vudDhBwY9RwJE1rll8Cp9lDhqAzBckA+FyE= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331202459-592a42284273/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808 h1:NfO2eAe1z3gDKgkYmpg/jjhNe0XVn7q6k0ySk+1F9co= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331171343-5fc2d717fb95 h1:DuWQjn0NaneGEodlPOUYJD87jRnexldwxZm0bA7Qm40= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331171343-5fc2d717fb95/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331192634-7da5ecaa82f4 h1:OygMETKMtDFkrehhHMVIs+hxbc10qr109hyeLaxSIDk= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331192634-7da5ecaa82f4/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331194110-a896013896cc h1:pMCpq9Cl/hOW++3Zj+ekkyi77eaVYPKPMKsJI78EGyA= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331194110-a896013896cc/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273 h1:2XYL4paS2OR8dv/nEhRXzVNOSrhiwIV2qYL0lW29UG4= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 h1:E196qCqW4eUiUd8y89qAvR3Kh4lvRqJbnkpOH36nYsE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95 h1:oTF+7+OAF+gwx+jyAr700jLKpapAc63YRDqXr04CbDk= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331192634-7da5ecaa82f4 h1:RFzPgFiMds2JnLZho0DqoECld+O+pncNxzD+E/TPvGs= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331192634-7da5ecaa82f4/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331194110-a896013896cc h1:+3bZQ3nH8SHiyAvyQniiw6NtK9OD66BG8yTGEWWfFPY= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331194110-a896013896cc/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331202459-592a42284273 h1:5fmTwgVqmoZrfXSX8x/atiXmpgF19eU4NyS8qPWRmP0= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 h1:r3can+ynfVcXVEHN5+5Ai4Velu55TjSV7phdpCXVrjU= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95 h1:n/whT4MKiF6iHIvu2l71yaSRu6zQgBcu/htljKXEj20= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331192634-7da5ecaa82f4 h1:fEShXypB3HIFGxCsPbuGTT9CDtj5KUUE0wvs1V+2XxI= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331192634-7da5ecaa82f4/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331194110-a896013896cc h1:dS7AjzSnpbJbf+3a89remW8cEEgLrOumY1aj02xuhLg= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331194110-a896013896cc/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331202459-592a42284273 h1:ArU2uhAMGWwNIeGXtlQ11wiicanQHfkmfRpC6dIr6gE= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 h1:jkChf04hhdiMBApbb+lLDxHMY62Md6UeM7v++GSw3K8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139/go.mod h1:1WcontO9PeuKdUf5HXfs3nuICtzUvFNnyCmrHkTCF9Y= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260326205122-a6b3f014b808 h1:wa86USykquE4t+ndaAdVXH2TKheOjDZYQXWDiWyoZ7s= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331171343-5fc2d717fb95 h1:/NEGfzE1/lAyCiVP2cOCkODkBVVMwihPrZsgdQFxQEw= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331171343-5fc2d717fb95/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331192634-7da5ecaa82f4 h1:oG5mHqdPkQULah+XIAR7TzXWISh9+iwap+VY1zpUvYo= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331192634-7da5ecaa82f4/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331194110-a896013896cc h1:9jne5FH7wITWgB6mBK3X+QNouz2DjzA5qynYboOO1BI= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331194110-a896013896cc/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331202459-592a42284273 h1:to49m40lVlKAfv5NO5LmbNY76J3s+tITtrl9es2LbMo= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0/go.mod h1:0ghbAr7tRO0tT5ZqBXhOyzgUO37tNNe33Yn0hskauVM= github.com/smartcontractkit/chainlink-common/keystore v1.0.0 h1:sVa3j2FWK/5OxXpnlfDkF1deDAkuXEfaLKzYqBTA880= diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index 53bbbfd75..905c9bef9 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -3,32 +3,31 @@ package ccv import ( "context" "fmt" - - "github.com/Masterminds/semver/v3" + "sort" chainsel "github.com/smartcontractkit/chain-selectors" - "github.com/smartcontractkit/chainlink-ccip/deployment/lanes" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" ccipAdapters "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" + "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-deployments-framework/operations" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" ) -type chainEntry struct { - remoteSelectors []uint64 - impl cciptestinterfaces.CCIP17Configuration - chainDef lanes.ChainDefinition - cvConfig lanes.CommitteeVerifierRemoteChainInput +type chainProfile struct { + remotes []uint64 + impl cciptestinterfaces.CCIP17Configuration + profile cciptestinterfaces.ChainLaneProfile } -// connectAllChains collects a ChainDefinition from each impl, assembles -// ConnectChainsConfig with a TopologyCommitteePopulator, applies it once, -// then runs each impl's PostConnect for chain-specific follow-up. +// connectAllChains configures lanes incrementally: each iteration adds one +// chain to the mesh, mirroring how production environments grow. The +// underlying ConfigureChainForLanes sequence is fully idempotent, so +// re-running for already-configured contracts is a no-op. func connectAllChains( impls []cciptestinterfaces.CCIP17Configuration, blockchains []*blockchain.Input, @@ -43,7 +42,7 @@ func connectAllChains( return fmt.Errorf("connectAllChains: selectors must be non-empty") } - entries := make(map[uint64]chainEntry, len(impls)) + profiles := make(map[uint64]chainProfile, len(impls)) orderedSelectors := make([]uint64, 0, len(impls)) for i, impl := range impls { networkInfo, err := chainsel.GetChainDetailsByChainIDAndFamily(blockchains[i].ChainID, impl.ChainFamily()) @@ -57,75 +56,65 @@ func connectAllChains( remotes = append(remotes, s) } } - chainDef, cvConfig, err := impl.GetConnectionProfile(e, sel) + profile, err := impl.GetChainLaneProfile(e, sel) if err != nil { - return fmt.Errorf("get connection profile for chain %d: %w", sel, err) + return fmt.Errorf("get chain lane profile for chain %d: %w", sel, err) } - entries[sel] = chainEntry{ - remoteSelectors: remotes, - impl: impl, - chainDef: chainDef, - cvConfig: cvConfig, + profiles[sel] = chainProfile{ + remotes: remotes, + impl: impl, + profile: profile, } orderedSelectors = append(orderedSelectors, sel) } - laneConfigs := make([]lanes.LaneConfig, 0) - for _, sel := range orderedSelectors { - entry := entries[sel] - - cvInputs := buildCommitteeVerifierInputs(topology, entry.remoteSelectors, entries) - - for _, rs := range entry.remoteSelectors { - remote, ok := entries[rs] - if !ok { - return fmt.Errorf("missing chain definition for remote selector %d (referenced from chain %d)", rs, sel) - } - - chainA := entry.chainDef - chainA.Selector = sel - chainA.CommitteeVerifierInputs = cvInputs - - chainB := remote.chainDef - chainB.Selector = rs - - laneConfigs = append(laneConfigs, lanes.LaneConfig{ - ChainA: chainA, - ChainB: chainB, - Version: semver.MustParse("2.0.0"), - }) - } - } - e.OperationsBundle = operations.NewBundle( func() context.Context { return context.Background() }, e.Logger, operations.NewMemoryReporter(), ) - populator := ccipChangesets.NewTopologyCommitteePopulator( + cs := ccipChangesets.ConfigureChainsForLanesFromTopology( ccipAdapters.GetCommitteeVerifierContractRegistry(), - topology, + ccipAdapters.GetChainFamilyRegistry(), + changesetscore.GetRegistry(), ) - laneAdapterRegistry := lanes.GetLaneAdapterRegistry() - mcmsReaderRegistry := changesetscore.GetRegistry() + for i := 1; i < len(orderedSelectors); i++ { + newSel := orderedSelectors[i] + previousSels := orderedSelectors[:i] - connectChainsCS := lanes.ConnectChains(laneAdapterRegistry, mcmsReaderRegistry) - cfg := lanes.ConnectChainsConfig{ - Lanes: laneConfigs, - CommitteePopulator: populator, - } - if err := connectChainsCS.VerifyPreconditions(*e, cfg); err != nil { - return fmt.Errorf("connect chains precondition check failed: %w", err) - } - if _, err := connectChainsCS.Apply(*e, cfg); err != nil { - return fmt.Errorf("configure chains for lanes: %w", err) + var configs []ccipChangesets.PartialChainConfig + + newChainCfg, err := buildPartialChainConfig(newSel, previousSels, profiles, topology) + if err != nil { + return fmt.Errorf("round %d: build config for new chain %d: %w", i, newSel, err) + } + configs = append(configs, newChainCfg) + + for _, prevSel := range previousSels { + prevChainCfg, err := buildPartialChainConfig(prevSel, []uint64{newSel}, profiles, topology) + if err != nil { + return fmt.Errorf("round %d: build config for existing chain %d: %w", i, prevSel, err) + } + configs = append(configs, prevChainCfg) + } + + cfg := ccipChangesets.ConfigureChainsForLanesFromTopologyConfig{ + Topology: topology, + Chains: configs, + } + if err := cs.VerifyPreconditions(*e, cfg); err != nil { + return fmt.Errorf("round %d (adding chain %d): precondition check failed: %w", i, newSel, err) + } + if _, err := cs.Apply(*e, cfg); err != nil { + return fmt.Errorf("round %d (adding chain %d): configure chains for lanes: %w", i, newSel, err) + } } for _, sel := range orderedSelectors { - entry := entries[sel] - if err := entry.impl.PostConnect(e, sel, entry.remoteSelectors); err != nil { + entry := profiles[sel] + if err := entry.impl.PostConnect(e, sel, entry.remotes); err != nil { return fmt.Errorf("post-connect for chain %d: %w", sel, err) } } @@ -133,28 +122,67 @@ func connectAllChains( return nil } -// buildCommitteeVerifierInputs assembles CommitteeVerifierInput entries from -// topology committee qualifiers + per-remote-chain configs looked up from each -// chain's reported CommitteeVerifierRemoteChainInput. -func buildCommitteeVerifierInputs( +func buildPartialChainConfig( + localSel uint64, + remoteSels []uint64, + profiles map[uint64]chainProfile, topology *ccipOffchain.EnvironmentTopology, - remoteSelectors []uint64, - entries map[uint64]chainEntry, -) []lanes.CommitteeVerifierInput { - remoteChainConfigs := make(map[uint64]lanes.CommitteeVerifierRemoteChainInput, len(remoteSelectors)) - for _, rs := range remoteSelectors { - if entry, ok := entries[rs]; ok { - remoteChainConfigs[rs] = entry.cvConfig +) (ccipChangesets.PartialChainConfig, error) { + localEntry, ok := profiles[localSel] + if !ok { + return ccipChangesets.PartialChainConfig{}, fmt.Errorf("no profile for local chain %d", localSel) + } + local := localEntry.profile + + remoteChains := make(map[uint64]ccipAdapters.RemoteChainConfig[datastore.AddressRef, datastore.AddressRef], len(remoteSels)) + for _, rs := range remoteSels { + remoteEntry, ok := profiles[rs] + if !ok { + return ccipChangesets.PartialChainConfig{}, fmt.Errorf("no profile for remote chain %d", rs) + } + remote := remoteEntry.profile + allowTrafficFrom := true + remoteChains[rs] = ccipAdapters.RemoteChainConfig[datastore.AddressRef, datastore.AddressRef]{ + AllowTrafficFrom: &allowTrafficFrom, + OnRamps: []datastore.AddressRef{remote.OnRamp}, + OffRamp: remote.OffRamp, + DefaultInboundCCVs: local.DefaultInboundCCVs, + DefaultOutboundCCVs: local.DefaultOutboundCCVs, + DefaultExecutor: local.DefaultExecutor, + FeeQuoterDestChainConfig: remote.FeeQuoterDestChainConfig, + ExecutorDestChainConfig: local.ExecutorDestChainConfig, + AddressBytesLength: remote.AddressBytesLength, + BaseExecutionGasCost: remote.BaseExecutionGasCost, } } - verifiers := make([]lanes.CommitteeVerifierInput, 0, len(topology.NOPTopology.Committees)) + qualifiers := make([]string, 0, len(topology.NOPTopology.Committees)) for qualifier := range topology.NOPTopology.Committees { - verifiers = append(verifiers, lanes.CommitteeVerifierInput{ + qualifiers = append(qualifiers, qualifier) + } + sort.Strings(qualifiers) + + cvConfigs := make([]ccipChangesets.CommitteeVerifierInputConfig, 0, len(qualifiers)) + for _, qualifier := range qualifiers { + remoteCV := make(map[uint64]ccipChangesets.CommitteeVerifierRemoteChainConfig, len(remoteSels)) + for _, rs := range remoteSels { + remoteCV[rs] = ccipChangesets.CommitteeVerifierRemoteChainConfig{ + GasForVerification: profiles[rs].profile.GasForVerification, + } + } + cvConfigs = append(cvConfigs, ccipChangesets.CommitteeVerifierInputConfig{ CommitteeQualifier: qualifier, - RemoteChains: remoteChainConfigs, + RemoteChains: remoteCV, }) } - return verifiers + return ccipChangesets.PartialChainConfig{ + ChainSelector: localSel, + Router: local.Router, + OnRamp: local.OnRamp, + FeeQuoter: local.FeeQuoter, + OffRamp: local.OffRamp, + CommitteeVerifiers: cvConfigs, + RemoteChains: remoteChains, + }, nil } diff --git a/go.mod b/go.mod index 3fa199e84..0a4450b44 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/pressly/goose/v3 v3.26.0 github.com/prometheus/client_golang v1.23.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273 github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260115212037-5e3a1db0e079 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251222115927-36a18321243c // indirect diff --git a/go.sum b/go.sum index 1a5d3d15c..a29ed2963 100644 --- a/go.sum +++ b/go.sum @@ -716,6 +716,14 @@ github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260107192940-0be702 github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260107192940-0be702ef3ff5/go.mod h1:k5Ln240ZCu7weL16IgR1EN5xUsgVMjU9qr84eYZfCto= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808 h1:NfO2eAe1z3gDKgkYmpg/jjhNe0XVn7q6k0ySk+1F9co= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331171343-5fc2d717fb95 h1:DuWQjn0NaneGEodlPOUYJD87jRnexldwxZm0bA7Qm40= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331171343-5fc2d717fb95/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331192634-7da5ecaa82f4 h1:OygMETKMtDFkrehhHMVIs+hxbc10qr109hyeLaxSIDk= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331192634-7da5ecaa82f4/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331194110-a896013896cc h1:pMCpq9Cl/hOW++3Zj+ekkyi77eaVYPKPMKsJI78EGyA= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331194110-a896013896cc/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273 h1:2XYL4paS2OR8dv/nEhRXzVNOSrhiwIV2qYL0lW29UG4= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 h1:f8ak6g6P2KT4HjUbleU+Bh0gUJXMoGuoriMSyGxxD4M= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:Ve1xD71bl193YIZQEoJMmBqLGQJdNs29bwbuObwvbhQ= github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 h1:VINIWIvYhgbGJpaI7O3aBuBOAZgMEN6BGA61zQIqvFw= From 85ae2e692872a0563448155b93feaffe063f1b9e Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Wed, 1 Apr 2026 09:28:55 -0400 Subject: [PATCH 02/28] Address PR comments --- build/devenv/cciptestinterfaces/interface.go | 15 +++++------ build/devenv/evm/impl.go | 27 +------------------- build/devenv/go.mod | 10 ++++---- build/devenv/go.sum | 10 ++++++++ build/devenv/implcommon.go | 13 +++------- go.mod | 2 +- go.sum | 2 ++ 7 files changed, 28 insertions(+), 51 deletions(-) diff --git a/build/devenv/cciptestinterfaces/interface.go b/build/devenv/cciptestinterfaces/interface.go index 3d04da8a3..06021f56f 100644 --- a/build/devenv/cciptestinterfaces/interface.go +++ b/build/devenv/cciptestinterfaces/interface.go @@ -202,20 +202,17 @@ type OnChainCommittees struct { // ChainLaneProfile holds everything an impl needs to provide so that // connectAllChains can assemble PartialChainConfig entries for the // canonical ConfigureChainsForLanesFromTopology changeset. +// Contract addresses (Router, OnRamp, FeeQuoter, OffRamp, Executor) are +// resolved from the datastore by the changeset itself. type ChainLaneProfile struct { - Router datastore.AddressRef - OnRamp datastore.AddressRef - FeeQuoter datastore.AddressRef - OffRamp datastore.AddressRef - AddressBytesLength uint8 BaseExecutionGasCost uint32 FeeQuoterDestChainConfig adapters.FeeQuoterDestChainConfig - ExecutorDestChainConfig adapters.ExecutorDestChainConfig - DefaultExecutor datastore.AddressRef - DefaultInboundCCVs []datastore.AddressRef - DefaultOutboundCCVs []datastore.AddressRef + ExecutorDestChainConfig adapters.ExecutorDestChainConfig + DefaultExecutorQualifier string + DefaultInboundCCVs []datastore.AddressRef + DefaultOutboundCCVs []datastore.AddressRef GasForVerification uint32 } diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index 2466ec627..eb34b6833 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -1314,26 +1314,6 @@ func (m *CCIP17EVMConfig) GetChainLaneProfile(_ *deployment.Environment, selecto copy(chainFamilySelector[:], selectorBytes[:4]) return cciptestinterfaces.ChainLaneProfile{ - Router: datastore.AddressRef{ - Type: datastore.ContractType(routeroperations.ContractType), - Version: routeroperations.Version, - ChainSelector: selector, - }, - OnRamp: datastore.AddressRef{ - Type: datastore.ContractType(onrampoperations.ContractType), - Version: onrampoperations.Version, - ChainSelector: selector, - }, - FeeQuoter: datastore.AddressRef{ - Type: datastore.ContractType(fee_quoter.ContractType), - Version: fee_quoter.Version, - ChainSelector: selector, - }, - OffRamp: datastore.AddressRef{ - Type: datastore.ContractType(offrampoperations.ContractType), - Version: offrampoperations.Version, - ChainSelector: selector, - }, AddressBytesLength: 20, BaseExecutionGasCost: 150_000, FeeQuoterDestChainConfig: adapters.FeeQuoterDestChainConfig{ @@ -1353,12 +1333,7 @@ func (m *CCIP17EVMConfig) GetChainLaneProfile(_ *deployment.Environment, selecto ExecutorDestChainConfig: adapters.ExecutorDestChainConfig{ Enabled: true, }, - DefaultExecutor: datastore.AddressRef{ - Type: datastore.ContractType(sequences.ExecutorProxyType), - Version: semver.MustParse(proxy.Deploy.Version()), - Qualifier: devenvcommon.DefaultExecutorQualifier, - ChainSelector: selector, - }, + DefaultExecutorQualifier: devenvcommon.DefaultExecutorQualifier, DefaultInboundCCVs: []datastore.AddressRef{ { Type: datastore.ContractType(versioned_verifier_resolver.CommitteeVerifierResolverType), diff --git a/build/devenv/go.mod b/build/devenv/go.mod index 60ecdfae8..1abc04515 100644 --- a/build/devenv/go.mod +++ b/build/devenv/go.mod @@ -16,9 +16,9 @@ require ( github.com/prometheus/client_golang v1.23.0 github.com/rs/zerolog v1.34.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331202459-592a42284273 - github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331202459-592a42284273 - github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331202459-592a42284273 + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260401132038-7de2f653c6c9 + github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9 + github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260401132038-7de2f653c6c9 github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 github.com/smartcontractkit/chainlink-deployments-framework v0.85.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0 @@ -36,8 +36,8 @@ require ( github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 github.com/sethvargo/go-retry v0.3.0 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331202459-592a42284273 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9 github.com/smartcontractkit/chainlink-ccv v0.0.0-20260218133052-8e7fe2f457f9 github.com/smartcontractkit/chainlink-common/keystore v1.0.0 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd diff --git a/build/devenv/go.sum b/build/devenv/go.sum index c3b9e83c7..43ba59e80 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -1127,6 +1127,8 @@ github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331194110-a89601 github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331194110-a896013896cc/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331202459-592a42284273 h1:Yq7pNEY3vudDhBwY9RwJE1rll8Cp9lDhqAzBckA+FyE= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331202459-592a42284273/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260401132038-7de2f653c6c9 h1:A6k1Ey5MTq3f5gL0RnvUa0dXJ0xfHLNImEm48iSMiH4= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260401132038-7de2f653c6c9/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808 h1:NfO2eAe1z3gDKgkYmpg/jjhNe0XVn7q6k0ySk+1F9co= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331171343-5fc2d717fb95 h1:DuWQjn0NaneGEodlPOUYJD87jRnexldwxZm0bA7Qm40= @@ -1137,6 +1139,8 @@ github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331194110- github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331194110-a896013896cc/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273 h1:2XYL4paS2OR8dv/nEhRXzVNOSrhiwIV2qYL0lW29UG4= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9 h1:CWcRIZy9LxScxkp+KDxdTX+WuSBO7ZPcwpM1KJBROO0= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 h1:E196qCqW4eUiUd8y89qAvR3Kh4lvRqJbnkpOH36nYsE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95 h1:oTF+7+OAF+gwx+jyAr700jLKpapAc63YRDqXr04CbDk= @@ -1147,6 +1151,8 @@ github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-2026 github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331194110-a896013896cc/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331202459-592a42284273 h1:5fmTwgVqmoZrfXSX8x/atiXmpgF19eU4NyS8qPWRmP0= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9 h1:efR8enl63n8ANfF51MxNkI4+hUnPlyurKrWNOpRhJnE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 h1:r3can+ynfVcXVEHN5+5Ai4Velu55TjSV7phdpCXVrjU= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95 h1:n/whT4MKiF6iHIvu2l71yaSRu6zQgBcu/htljKXEj20= @@ -1157,6 +1163,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331 github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331194110-a896013896cc/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331202459-592a42284273 h1:ArU2uhAMGWwNIeGXtlQ11wiicanQHfkmfRpC6dIr6gE= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9 h1:A58Lf4yZsdx5Mnvl5xh84q1mtySFZRSvJZTMlNNrkR0= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 h1:jkChf04hhdiMBApbb+lLDxHMY62Md6UeM7v++GSw3K8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= @@ -1171,6 +1179,8 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331194110-a896 github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331194110-a896013896cc/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331202459-592a42284273 h1:to49m40lVlKAfv5NO5LmbNY76J3s+tITtrl9es2LbMo= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260401132038-7de2f653c6c9 h1:vOguLB7GsttJbYg+CjoFnk+K5QIb5a6xfv6vylWDnhE= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0/go.mod h1:0ghbAr7tRO0tT5ZqBXhOyzgUO37tNNe33Yn0hskauVM= github.com/smartcontractkit/chainlink-common/keystore v1.0.0 h1:sVa3j2FWK/5OxXpnlfDkF1deDAkuXEfaLKzYqBTA880= diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index 905c9bef9..e2a809790 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -12,7 +12,6 @@ import ( ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" - "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-deployments-framework/operations" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" @@ -134,7 +133,7 @@ func buildPartialChainConfig( } local := localEntry.profile - remoteChains := make(map[uint64]ccipAdapters.RemoteChainConfig[datastore.AddressRef, datastore.AddressRef], len(remoteSels)) + remoteChains := make(map[uint64]ccipChangesets.PartialRemoteChainConfig, len(remoteSels)) for _, rs := range remoteSels { remoteEntry, ok := profiles[rs] if !ok { @@ -142,13 +141,11 @@ func buildPartialChainConfig( } remote := remoteEntry.profile allowTrafficFrom := true - remoteChains[rs] = ccipAdapters.RemoteChainConfig[datastore.AddressRef, datastore.AddressRef]{ + remoteChains[rs] = ccipChangesets.PartialRemoteChainConfig{ AllowTrafficFrom: &allowTrafficFrom, - OnRamps: []datastore.AddressRef{remote.OnRamp}, - OffRamp: remote.OffRamp, DefaultInboundCCVs: local.DefaultInboundCCVs, DefaultOutboundCCVs: local.DefaultOutboundCCVs, - DefaultExecutor: local.DefaultExecutor, + DefaultExecutorQualifier: local.DefaultExecutorQualifier, FeeQuoterDestChainConfig: remote.FeeQuoterDestChainConfig, ExecutorDestChainConfig: local.ExecutorDestChainConfig, AddressBytesLength: remote.AddressBytesLength, @@ -178,10 +175,6 @@ func buildPartialChainConfig( return ccipChangesets.PartialChainConfig{ ChainSelector: localSel, - Router: local.Router, - OnRamp: local.OnRamp, - FeeQuoter: local.FeeQuoter, - OffRamp: local.OffRamp, CommitteeVerifiers: cvConfigs, RemoteChains: remoteChains, }, nil diff --git a/go.mod b/go.mod index 0a4450b44..5a81f751c 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/pressly/goose/v3 v3.26.0 github.com/prometheus/client_golang v1.23.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9 github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260115212037-5e3a1db0e079 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251222115927-36a18321243c // indirect diff --git a/go.sum b/go.sum index a29ed2963..2838b4378 100644 --- a/go.sum +++ b/go.sum @@ -724,6 +724,8 @@ github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331194110- github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331194110-a896013896cc/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273 h1:2XYL4paS2OR8dv/nEhRXzVNOSrhiwIV2qYL0lW29UG4= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9 h1:CWcRIZy9LxScxkp+KDxdTX+WuSBO7ZPcwpM1KJBROO0= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 h1:f8ak6g6P2KT4HjUbleU+Bh0gUJXMoGuoriMSyGxxD4M= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:Ve1xD71bl193YIZQEoJMmBqLGQJdNs29bwbuObwvbhQ= github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 h1:VINIWIvYhgbGJpaI7O3aBuBOAZgMEN6BGA61zQIqvFw= From 1f0d612ea7d22052ec5072faad1182bec0c41afc Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Fri, 27 Mar 2026 12:07:49 -0400 Subject: [PATCH 03/28] Add tests to reconfigure environment, remove nop, allowlist and TestRouter --- .github/workflows/test-cl-smoke.yaml | 12 + build/devenv/environment.go | 205 +++---- .../devenv/environment_change_requirements.go | 45 ++ build/devenv/evm/impl.go | 19 +- build/devenv/implcommon.go | 140 +---- build/devenv/lane_topology.go | 253 ++++++++ build/devenv/reconcile_offchain.go | 366 +++++++++++ build/devenv/reconcile_onchain.go | 146 +++++ build/devenv/services/aggregator.go | 53 ++ .../devenv/services/committeeverifier/base.go | 21 + build/devenv/services/docker.go | 42 ++ build/devenv/services/executor.go | 55 +- build/devenv/services/indexer.go | 114 +++- .../e2e/environment_change_reconcile_test.go | 566 ++++++++++++++++++ build/devenv/tests/e2e/tcapi/basic/v3.go | 10 +- build/devenv/tests/e2e/tcapi/contracts.go | 2 + build/devenv/tests/e2e/tcapi/types.go | 2 +- 17 files changed, 1774 insertions(+), 277 deletions(-) create mode 100644 build/devenv/environment_change_requirements.go create mode 100644 build/devenv/lane_topology.go create mode 100644 build/devenv/reconcile_offchain.go create mode 100644 build/devenv/reconcile_onchain.go create mode 100644 build/devenv/services/docker.go create mode 100644 build/devenv/tests/e2e/environment_change_reconcile_test.go diff --git a/.github/workflows/test-cl-smoke.yaml b/.github/workflows/test-cl-smoke.yaml index d3d6724e9..d99a194d2 100644 --- a/.github/workflows/test-cl-smoke.yaml +++ b/.github/workflows/test-cl-smoke.yaml @@ -79,6 +79,18 @@ jobs: run_cmd: TestHA_CrossComponentDown config: "env.toml,env-HA.toml,env-cl.toml,env-cl-ci.toml" timeout: 10m + - name: TestEnvironmentChangeReconcile_CommitteeVerifierAllowlistDecoyExpectErrorThenDeployerHappyPath + run_cmd: TestEnvironmentChangeReconcile_CommitteeVerifierAllowlistDecoyExpectErrorThenDeployerHappyPath + config: "env.toml,env-cl.toml,env-cl-ci.toml" + timeout: 10m + - name: TestEnvironmentChangeReconcile_TestRouterLaneThenProductionRouterExpectMessagesSucceedEachStage + run_cmd: TestEnvironmentChangeReconcile_TestRouterLaneThenProductionRouterExpectMessagesSucceedEachStage + config: "env.toml,env-cl.toml,env-cl-ci.toml" + timeout: 10m + - name: TestEnvironmentChangeReconcile_RemoveDefaultCommitteeNOPAndLowerThresholdExpectMessageSuccessWithoutRemovedNOPVerification + run_cmd: TestEnvironmentChangeReconcile_RemoveDefaultCommitteeNOPAndLowerThresholdExpectMessageSuccessWithoutRemovedNOPVerification + config: "env.toml,env-cl.toml,env-cl-ci.toml" + timeout: 10m # We need to configure HeadTracker for the CL tests to have finality depth. Otherwise, it does instant finality. # - name: TestE2EReorg # config: "env.toml,env-src-auto-mine.toml,env-cl.toml,env-cl-ci.toml" diff --git a/build/devenv/environment.go b/build/devenv/environment.go index 138321b87..adb96e718 100644 --- a/build/devenv/environment.go +++ b/build/devenv/environment.go @@ -474,12 +474,12 @@ func enrichEnvironmentTopology(cfg *ccipOffchain.EnvironmentTopology, verifiers } } -// buildEnvironmentTopology creates a copy of the EnvironmentTopology from the Cfg, +// BuildEnvironmentTopology creates a copy of the EnvironmentTopology from the Cfg, // enriches it with signer addresses, and returns it. This is used by both executor // and verifier changesets as the single source of truth. // For each chain_config entry that lacks a FeeAggregator, the corresponding // chain's deployer key is used as a fallback. -func buildEnvironmentTopology(in *Cfg, e *deployment.Environment) *ccipOffchain.EnvironmentTopology { +func BuildEnvironmentTopology(in *Cfg, e *deployment.Environment) *ccipOffchain.EnvironmentTopology { if in.EnvironmentTopology == nil { return nil } @@ -514,22 +514,16 @@ func buildEnvironmentTopology(in *Cfg, e *deployment.Environment) *ccipOffchain. } // generateExecutorJobSpecs generates job specs for all executors using the changeset. -// It returns a map of container name -> job spec for use in CL mode. // For standalone mode, it also sets GeneratedConfig on each executor. // The ds parameter is a mutable datastore that will be updated with the changeset output. func generateExecutorJobSpecs( - ctx context.Context, e *deployment.Environment, in *Cfg, - selectors []uint64, - impls []cciptestinterfaces.CCIP17Configuration, topology *ccipOffchain.EnvironmentTopology, ds datastore.MutableDataStore, -) (map[string]string, error) { - executorJobSpecs := make(map[string]string) - +) error { if len(in.Executor) == 0 { - return executorJobSpecs, nil + return nil } // Group executors by qualifier @@ -556,32 +550,31 @@ func generateExecutorJobSpecs( TargetNOPs: shared.ConvertStringToNopAliases(execNOPAliases), }) if err != nil { - return nil, fmt.Errorf("failed to generate executor configs for qualifier %s: %w", qualifier, err) + return fmt.Errorf("failed to generate executor configs for qualifier %s: %w", qualifier, err) } if err := ds.Merge(output.DataStore.Seal()); err != nil { - return nil, fmt.Errorf("failed to merge executor job specs datastore: %w", err) + return fmt.Errorf("failed to merge executor job specs datastore: %w", err) } for _, exec := range qualifierExecutors { jobSpecID := shared.NewExecutorJobID(shared.NOPAlias(exec.NOPAlias), shared.ExecutorJobScope{ExecutorQualifier: qualifier}) job, err := ccipOffchain.GetJob(output.DataStore.Seal(), shared.NOPAlias(exec.NOPAlias), jobSpecID.ToJobID()) if err != nil { - return nil, fmt.Errorf("failed to get executor job spec for %s: %w", exec.ContainerName, err) + return fmt.Errorf("failed to get executor job spec for %s: %w", exec.ContainerName, err) } jobSpec := job.Spec - executorJobSpecs[exec.ContainerName] = jobSpec // Extract inner config from job spec for standalone mode execCfg, err := ParseExecutorConfigFromJobSpec(jobSpec) if err != nil { - return nil, fmt.Errorf("failed to parse executor config from job spec: %w", err) + return fmt.Errorf("failed to parse executor config from job spec: %w", err) } // Marshal the inner config back to TOML for standalone mode configBytes, err := toml.Marshal(execCfg) if err != nil { - return nil, fmt.Errorf("failed to marshal executor config: %w", err) + return fmt.Errorf("failed to marshal executor config: %w", err) } exec.GeneratedConfig = string(configBytes) } @@ -590,30 +583,41 @@ func generateExecutorJobSpecs( // Set transmitter keys for standalone mode _, err := services.SetTransmitterPrivateKey(in.Executor) if err != nil { - return nil, fmt.Errorf("failed to set transmitter private key: %w", err) + return fmt.Errorf("failed to set transmitter private key: %w", err) } - // Fund executor addresses for standalone mode + return nil +} + +func fundStandaloneExecutorAddresses( + ctx context.Context, + in *Cfg, + impls []cciptestinterfaces.CCIP17Configuration, +) error { addresses := make([]protocol.UnknownAddress, 0, len(in.Executor)) for _, exec := range in.Executor { + if exec == nil || exec.Mode != services.Standalone { + continue + } addresses = append(addresses, exec.GetTransmitterAddress()) } + if len(addresses) == 0 { + return nil + } + Plog.Info().Any("Addresses", addresses).Int("ImplsLen", len(impls)).Msg("Funding executors") for i, impl := range impls { if in.Blockchains[i].Type == blockchain.TypeCanton { - // Executor doesn't support Canton. continue } Plog.Info().Int("ImplIndex", i).Msg("Funding executor") - err = impl.FundAddresses(ctx, in.Blockchains[i], addresses, big.NewInt(5)) - if err != nil { - return nil, fmt.Errorf("failed to fund addresses for executors: %w", err) + if err := impl.FundAddresses(ctx, in.Blockchains[i], addresses, big.NewInt(5)); err != nil { + return fmt.Errorf("failed to fund addresses for executors: %w", err) } Plog.Info().Int("ImplIndex", i).Msg("Funded executors") } - - return executorJobSpecs, nil + return nil } // generateVerifierJobSpecs generates job specs for all verifiers using the changeset. @@ -624,7 +628,6 @@ func generateExecutorJobSpecs( func generateVerifierJobSpecs( e *deployment.Environment, in *Cfg, - selectors []uint64, topology *ccipOffchain.EnvironmentTopology, sharedTLSCerts *services.TLSCertPaths, ds datastore.MutableDataStore, @@ -656,11 +659,30 @@ func generateVerifierJobSpecs( } for family := range families { + activeNOPAliases, err := topologyVerifierNOPAliasesForCommitteeFamily(topology, committeeName, family) + if err != nil { + return nil, err + } + + activeFamilyVerifiers := make([]*committeeverifier.Input, 0, len(committeeVerifiers)) verNOPAliases := make([]shared.NOPAlias, 0, len(committeeVerifiers)) for _, ver := range committeeVerifiers { - if ver.ChainFamily == family { - verNOPAliases = append(verNOPAliases, shared.NOPAlias(ver.NOPAlias)) + if ver.ChainFamily != family { + continue } + if _, ok := activeNOPAliases[ver.NOPAlias]; !ok { + ver.GeneratedJobSpecs = nil + ver.GeneratedConfig = "" + if ver.Out != nil { + ver.Out.VerifierID = "" + } + continue + } + activeFamilyVerifiers = append(activeFamilyVerifiers, ver) + verNOPAliases = append(verNOPAliases, shared.NOPAlias(ver.NOPAlias)) + } + if len(activeFamilyVerifiers) == 0 { + continue } disableFinalityCheckers := disableFinalityCheckersPerFamily[family] @@ -689,16 +711,12 @@ func generateVerifierJobSpecs( // 1:1 verifier-to-aggregator mapping. For single-aggregator committees // this constraint doesn't apply — all verifiers share the one aggregator. if len(aggNames) > 1 { - if err := validateStandaloneVerifierNodeIndices(committeeName, committeeVerifiers, len(aggNames)); err != nil { + if err := validateStandaloneVerifierNodeIndices(committeeName, activeFamilyVerifiers, len(aggNames)); err != nil { return nil, err } } - for _, ver := range committeeVerifiers { - if ver.ChainFamily != family { - continue - } - + for _, ver := range activeFamilyVerifiers { allJobSpecs := make([]string, 0, len(aggNames)) for _, aggName := range aggNames { jobSpecID := shared.NewVerifierJobID(shared.NOPAlias(ver.NOPAlias), aggName, shared.VerifierJobScope{CommitteeQualifier: committeeName}) @@ -742,6 +760,48 @@ func generateVerifierJobSpecs( return verifierJobSpecs, nil } +func topologyVerifierNOPAliasesForCommitteeFamily( + topology *ccipOffchain.EnvironmentTopology, + committeeName string, + family string, +) (map[string]struct{}, error) { + activeNOPAliases := make(map[string]struct{}) + if topology == nil || topology.NOPTopology == nil { + return activeNOPAliases, nil + } + + var committee *ccipOffchain.CommitteeConfig + for _, candidate := range topology.NOPTopology.Committees { + if strings.EqualFold(candidate.Qualifier, committeeName) { + candidateCopy := candidate + committee = &candidateCopy + break + } + } + if committee == nil { + return nil, fmt.Errorf("committee %s not found in topology", committeeName) + } + + for selectorStr, chainCfg := range committee.ChainConfigs { + selector, err := strconv.ParseUint(selectorStr, 10, 64) + if err != nil { + return nil, fmt.Errorf("parse committee %s chain selector %q: %w", committeeName, selectorStr, err) + } + selectorFamily, err := chainsel.GetSelectorFamily(selector) + if err != nil { + return nil, fmt.Errorf("get chain family for selector %d: %w", selector, err) + } + if selectorFamily != family { + continue + } + for _, nopAlias := range chainCfg.NOPAliases { + activeNOPAliases[nopAlias] = struct{}{} + } + } + + return activeNOPAliases, nil +} + // NewEnvironment creates a new CCIP CCV environment locally in Docker. func NewEnvironment() (in *Cfg, err error) { ctx := context.Background() @@ -1007,7 +1067,7 @@ func NewEnvironment() (in *Cfg, err error) { } L.Info().Any("Selectors", selectors).Msg("Deploying for chain selectors") - topology := buildEnvironmentTopology(in, e) + topology := BuildEnvironmentTopology(in, e) if topology == nil { return nil, fmt.Errorf("failed to build environment topology") } @@ -1132,29 +1192,15 @@ func NewEnvironment() (in *Cfg, err error) { } } - // Generate aggregator configs using changesets (on-chain state as source of truth) - for _, aggregatorInput := range in.Aggregator { - aggregatorInput.SharedTLSCerts = sharedTLSCerts - - // Use changeset to generate committee config from on-chain state - instanceName := aggregatorInput.InstanceName() - cs := ccipChangesets.GenerateAggregatorConfig(ccipAdapters.GetAggregatorConfigRegistry()) - output, err := cs.Apply(*e, ccipChangesets.GenerateAggregatorConfigInput{ - ServiceIdentifier: instanceName + "-aggregator", - CommitteeQualifier: aggregatorInput.CommitteeName, - Topology: topology, - }) - if err != nil { - return nil, fmt.Errorf("failed to generate aggregator config for %s (committee %s): %w", instanceName, aggregatorInput.CommitteeName, err) - } - - // Get generated config from output datastore - aggCfg, err := offchainloader.GetAggregatorConfig(output.DataStore.Seal(), instanceName+"-aggregator") - if err != nil { - return nil, fmt.Errorf("failed to get aggregator config from output: %w", err) - } - aggregatorInput.GeneratedCommittee = aggCfg + verifierJobSpecs, err := configureOffchainFromTopology(e, in, topology, sharedTLSCerts, ds) + if err != nil { + return nil, fmt.Errorf("failed to regenerate offchain config: %w", err) + } + if err := fundStandaloneExecutorAddresses(ctx, in, impls); err != nil { + return nil, fmt.Errorf("failed to fund standalone executor addresses: %w", err) + } + for _, aggregatorInput := range in.Aggregator { out, err := services.NewAggregator(aggregatorInput) if err != nil { return nil, fmt.Errorf("failed to create aggregator service for committee %s: %w", aggregatorInput.CommitteeName, err) @@ -1163,7 +1209,6 @@ func NewEnvironment() (in *Cfg, err error) { if out.TLSCACertFile != "" { in.AggregatorCACertFiles[aggregatorInput.CommitteeName] = out.TLSCACertFile } - e.DataStore = output.DataStore.Seal() } /////////////////////////////// @@ -1175,31 +1220,6 @@ func NewEnvironment() (in *Cfg, err error) { // start up the indexer(s) after the aggregators are up to avoid spamming of errors // in the logs when they start before the aggregators are up. /////////////////////////// - // Generate indexer config using changeset (on-chain state as source of truth). - // One shared config is generated; all indexers use the same config and duplicated secrets/auth. - if len(in.Aggregator) > 0 && len(in.Indexer) > 0 { - firstIdx := in.Indexer[0] - cs := ccipChangesets.GenerateIndexerConfig(ccipAdapters.GetIndexerConfigRegistry()) - output, err := cs.Apply(*e, ccipChangesets.GenerateIndexerConfigInput{ - ServiceIdentifier: "indexer", - CommitteeVerifierNameToQualifier: firstIdx.CommitteeVerifierNameToQualifier, - CCTPVerifierNameToQualifier: firstIdx.CCTPVerifierNameToQualifier, - LombardVerifierNameToQualifier: firstIdx.LombardVerifierNameToQualifier, - }) - if err != nil { - return nil, fmt.Errorf("failed to generate indexer config: %w", err) - } - - idxCfg, err := offchainloader.GetIndexerConfig(output.DataStore.Seal(), "indexer") - if err != nil { - return nil, fmt.Errorf("failed to get indexer config from output: %w", err) - } - e.DataStore = output.DataStore.Seal() - for _, idxIn := range in.Indexer { - idxIn.GeneratedCfg = idxCfg - } - } - if len(in.Indexer) < 1 { return nil, fmt.Errorf("at least one indexer is required") } @@ -1317,11 +1337,6 @@ func NewEnvironment() (in *Cfg, err error) { // START: Launch executors // ///////////////////////////// - _, err = generateExecutorJobSpecs(ctx, e, in, selectors, impls, topology, ds) - if err != nil { - return nil, err - } - _, err = launchStandaloneExecutors(in.Executor, blockchainOutputs) if err != nil { return nil, fmt.Errorf("failed to create standalone executor: %w", err) @@ -1335,11 +1350,6 @@ func NewEnvironment() (in *Cfg, err error) { // START: Launch verifiers // ///////////////////////////// - verifierJobSpecs, err := generateVerifierJobSpecs(e, in, selectors, topology, sharedTLSCerts, ds) - if err != nil { - return nil, err - } - // Each verifier owns one aggregator (NodeIndex % numAggs). Select the // corresponding job spec so proposeJobsToStandaloneVerifiers gets a // single spec per container. @@ -1444,15 +1454,10 @@ func NewEnvironment() (in *Cfg, err error) { //////////////////////////////////////////////////// e.DataStore = ds.Seal() + in.CLDF.DataStore = e.DataStore - if in.JDInfra != nil { - if err := jobs.AcceptPendingJobs(ctx, in.ClientLookup); err != nil { - return nil, fmt.Errorf("failed to accept pending jobs: %w", err) - } - - if err := jobs.SyncAndVerifyJobProposals(e); err != nil { - return nil, fmt.Errorf("failed to sync/verify job proposals: %w", err) - } + if err := acceptPendingJobsAndSync(ctx, e, in); err != nil { + return nil, fmt.Errorf("failed to accept pending jobs: %w", err) } timeTrack.Print() diff --git a/build/devenv/environment_change_requirements.go b/build/devenv/environment_change_requirements.go new file mode 100644 index 000000000..7ef6dacc3 --- /dev/null +++ b/build/devenv/environment_change_requirements.go @@ -0,0 +1,45 @@ +package ccv + +import ( + "fmt" + + "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain/shared" + "github.com/smartcontractkit/chainlink-ccv/build/devenv/services" +) + +// RequireFullCLModeForEnvironmentChangeReconcile returns an error if the loaded env-out is not a +// fully Chainlink-backed devenv (topology NOPs CL, verifier and executor services in CL mode, node sets present). +// Environment-change reconcile E2E tests use this to skip standalone smoke env-outs. +func RequireFullCLModeForEnvironmentChangeReconcile(in *Cfg) error { + if in == nil { + return fmt.Errorf("cfg is nil") + } + if in.EnvironmentTopology == nil || in.EnvironmentTopology.NOPTopology == nil { + return fmt.Errorf("environment_topology.nop_topology is required") + } + for _, nop := range in.EnvironmentTopology.NOPTopology.NOPs { + if nop.GetMode() != shared.NOPModeCL { + ident := nop.Alias + if ident == "" { + ident = nop.Name + } + return fmt.Errorf("NOP %q must use topology mode %q for environment-change reconcile tests (got %q)", + ident, shared.NOPModeCL, nop.GetMode()) + } + } + for _, v := range in.Verifier { + if v.Mode != services.CL { + return fmt.Errorf("verifier for nop_alias %q must use mode %q (got %q)", + v.NOPAlias, services.CL, v.Mode) + } + } + for _, ex := range in.Executor { + if ex.Mode != services.CL { + return fmt.Errorf("executor must use mode %q (got %q)", services.CL, ex.Mode) + } + } + if len(in.NodeSets) == 0 { + return fmt.Errorf("at least one nodeset is required for CL mode") + } + return nil +} diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index eb34b6833..e3fe5a4a9 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -287,10 +287,11 @@ func (m *CCIP17EVM) getOrCreateOffRampPoller() (*eventPoller[cciptestinterfaces. event := filter.Event key := eventKey{chainSelector: event.SourceChainSelector, msgNum: event.MessageNumber} events[key] = cciptestinterfaces.ExecutionStateChangedEvent{ - MessageID: event.MessageId, - MessageNumber: event.MessageNumber, - State: cciptestinterfaces.MessageExecutionState(event.State), - ReturnData: event.ReturnData, + SourceChainSelector: protocol.ChainSelector(event.SourceChainSelector), + MessageID: event.MessageId, + MessageNumber: event.MessageNumber, + State: cciptestinterfaces.MessageExecutionState(event.State), + ReturnData: event.ReturnData, } } @@ -1121,6 +1122,7 @@ func (m *CCIP17EVMConfig) DeployContractsForSelector(ctx context.Context, env *d DefaultCfg: ccipChangesets.DeployChainContractsPerChainCfg{ DeployerContract: create2FactoryRep.Output.Address, DeployerKeyOwned: true, + DeployTestRouter: true, RMNRemote: adapters.RMNRemoteDeployParams{ Version: semver.MustParse(rmn_remote.Deploy.Version()), }, @@ -1630,10 +1632,11 @@ func (m *CCIP17EVM) ManuallyExecuteMessage( continue } event = cciptestinterfaces.ExecutionStateChangedEvent{ - MessageID: parsedLog.MessageId, - MessageNumber: parsedLog.MessageNumber, - State: cciptestinterfaces.MessageExecutionState(parsedLog.State), - ReturnData: parsedLog.ReturnData, + SourceChainSelector: protocol.ChainSelector(parsedLog.SourceChainSelector), + MessageID: parsedLog.MessageId, + MessageNumber: parsedLog.MessageNumber, + State: cciptestinterfaces.MessageExecutionState(parsedLog.State), + ReturnData: parsedLog.ReturnData, } break } diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index e2a809790..66106d3fe 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -3,9 +3,6 @@ package ccv import ( "context" "fmt" - "sort" - - chainsel "github.com/smartcontractkit/chain-selectors" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" ccipAdapters "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" @@ -23,10 +20,9 @@ type chainProfile struct { profile cciptestinterfaces.ChainLaneProfile } -// connectAllChains configures lanes incrementally: each iteration adds one -// chain to the mesh, mirroring how production environments grow. The -// underlying ConfigureChainForLanes sequence is fully idempotent, so -// re-running for already-configured contracts is a no-op. +// connectAllChains collects a ChainLaneProfile from each impl, assembles +// PartialChainConfig entries for the ConfigureChainsForLanesFromTopology +// changeset, applies it once, then runs each impl's PostConnect. func connectAllChains( impls []cciptestinterfaces.CCIP17Configuration, blockchains []*blockchain.Input, @@ -41,30 +37,14 @@ func connectAllChains( return fmt.Errorf("connectAllChains: selectors must be non-empty") } - profiles := make(map[uint64]chainProfile, len(impls)) - orderedSelectors := make([]uint64, 0, len(impls)) - for i, impl := range impls { - networkInfo, err := chainsel.GetChainDetailsByChainIDAndFamily(blockchains[i].ChainID, impl.ChainFamily()) - if err != nil { - return fmt.Errorf("chain %d: %w", i, err) - } - sel := networkInfo.ChainSelector - remotes := make([]uint64, 0, len(selectors)) - for _, s := range selectors { - if s != sel { - remotes = append(remotes, s) - } - } - profile, err := impl.GetChainLaneProfile(e, sel) - if err != nil { - return fmt.Errorf("get chain lane profile for chain %d: %w", sel, err) - } - profiles[sel] = chainProfile{ - remotes: remotes, - impl: impl, - profile: profile, - } - orderedSelectors = append(orderedSelectors, sel) + orderedSelectors, profiles, err := buildConnectionProfilesFromImpls(impls, blockchains, selectors, e) + if err != nil { + return fmt.Errorf("connectAllChains: %w", err) + } + + partialChains, err := buildPartialChainConfigsFromProfiles(topology, orderedSelectors, profiles, ReconfigureLanesParams{}) + if err != nil { + return fmt.Errorf("connectAllChains: %w", err) } e.OperationsBundle = operations.NewBundle( @@ -79,36 +59,15 @@ func connectAllChains( changesetscore.GetRegistry(), ) - for i := 1; i < len(orderedSelectors); i++ { - newSel := orderedSelectors[i] - previousSels := orderedSelectors[:i] - - var configs []ccipChangesets.PartialChainConfig - - newChainCfg, err := buildPartialChainConfig(newSel, previousSels, profiles, topology) - if err != nil { - return fmt.Errorf("round %d: build config for new chain %d: %w", i, newSel, err) - } - configs = append(configs, newChainCfg) - - for _, prevSel := range previousSels { - prevChainCfg, err := buildPartialChainConfig(prevSel, []uint64{newSel}, profiles, topology) - if err != nil { - return fmt.Errorf("round %d: build config for existing chain %d: %w", i, prevSel, err) - } - configs = append(configs, prevChainCfg) - } - - cfg := ccipChangesets.ConfigureChainsForLanesFromTopologyConfig{ - Topology: topology, - Chains: configs, - } - if err := cs.VerifyPreconditions(*e, cfg); err != nil { - return fmt.Errorf("round %d (adding chain %d): precondition check failed: %w", i, newSel, err) - } - if _, err := cs.Apply(*e, cfg); err != nil { - return fmt.Errorf("round %d (adding chain %d): configure chains for lanes: %w", i, newSel, err) - } + cfg := ccipChangesets.ConfigureChainsForLanesFromTopologyConfig{ + Topology: topology, + Chains: partialChains, + } + if err := cs.VerifyPreconditions(*e, cfg); err != nil { + return fmt.Errorf("connectAllChains: precondition check failed: %w", err) + } + if _, err := cs.Apply(*e, cfg); err != nil { + return fmt.Errorf("connectAllChains: configure chains for lanes: %w", err) } for _, sel := range orderedSelectors { @@ -120,62 +79,3 @@ func connectAllChains( return nil } - -func buildPartialChainConfig( - localSel uint64, - remoteSels []uint64, - profiles map[uint64]chainProfile, - topology *ccipOffchain.EnvironmentTopology, -) (ccipChangesets.PartialChainConfig, error) { - localEntry, ok := profiles[localSel] - if !ok { - return ccipChangesets.PartialChainConfig{}, fmt.Errorf("no profile for local chain %d", localSel) - } - local := localEntry.profile - - remoteChains := make(map[uint64]ccipChangesets.PartialRemoteChainConfig, len(remoteSels)) - for _, rs := range remoteSels { - remoteEntry, ok := profiles[rs] - if !ok { - return ccipChangesets.PartialChainConfig{}, fmt.Errorf("no profile for remote chain %d", rs) - } - remote := remoteEntry.profile - allowTrafficFrom := true - remoteChains[rs] = ccipChangesets.PartialRemoteChainConfig{ - AllowTrafficFrom: &allowTrafficFrom, - DefaultInboundCCVs: local.DefaultInboundCCVs, - DefaultOutboundCCVs: local.DefaultOutboundCCVs, - DefaultExecutorQualifier: local.DefaultExecutorQualifier, - FeeQuoterDestChainConfig: remote.FeeQuoterDestChainConfig, - ExecutorDestChainConfig: local.ExecutorDestChainConfig, - AddressBytesLength: remote.AddressBytesLength, - BaseExecutionGasCost: remote.BaseExecutionGasCost, - } - } - - qualifiers := make([]string, 0, len(topology.NOPTopology.Committees)) - for qualifier := range topology.NOPTopology.Committees { - qualifiers = append(qualifiers, qualifier) - } - sort.Strings(qualifiers) - - cvConfigs := make([]ccipChangesets.CommitteeVerifierInputConfig, 0, len(qualifiers)) - for _, qualifier := range qualifiers { - remoteCV := make(map[uint64]ccipChangesets.CommitteeVerifierRemoteChainConfig, len(remoteSels)) - for _, rs := range remoteSels { - remoteCV[rs] = ccipChangesets.CommitteeVerifierRemoteChainConfig{ - GasForVerification: profiles[rs].profile.GasForVerification, - } - } - cvConfigs = append(cvConfigs, ccipChangesets.CommitteeVerifierInputConfig{ - CommitteeQualifier: qualifier, - RemoteChains: remoteCV, - }) - } - - return ccipChangesets.PartialChainConfig{ - ChainSelector: localSel, - CommitteeVerifiers: cvConfigs, - RemoteChains: remoteChains, - }, nil -} diff --git a/build/devenv/lane_topology.go b/build/devenv/lane_topology.go new file mode 100644 index 000000000..d91b7c05b --- /dev/null +++ b/build/devenv/lane_topology.go @@ -0,0 +1,253 @@ +package ccv + +import ( + "fmt" + "maps" + "sort" + + chainsel "github.com/smartcontractkit/chain-selectors" + + ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" + ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" + "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" + "github.com/smartcontractkit/chainlink-deployments-framework/deployment" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" +) + +// LanePartialConfigOverrides are per-local-chain deltas layered on GetChainLaneProfile baselines. +type LanePartialConfigOverrides struct { + CommitteeRemotePatches map[uint64]ccipChangesets.CommitteeVerifierRemoteChainConfig + UseTestRouter bool +} + +func mapsCloneCV(m map[uint64]ccipChangesets.CommitteeVerifierRemoteChainConfig) map[uint64]ccipChangesets.CommitteeVerifierRemoteChainConfig { + out := make(map[uint64]ccipChangesets.CommitteeVerifierRemoteChainConfig, len(m)) + maps.Copy(out, m) + return out +} + +func mergeCommitteeVerifierRemoteChainConfigForReconcile( + base, patch ccipChangesets.CommitteeVerifierRemoteChainConfig, +) ccipChangesets.CommitteeVerifierRemoteChainConfig { + out := base + out.AllowlistEnabled = patch.AllowlistEnabled + if len(patch.AddedAllowlistedSenders) > 0 { + out.AddedAllowlistedSenders = patch.AddedAllowlistedSenders + } + if len(patch.RemovedAllowlistedSenders) > 0 { + out.RemovedAllowlistedSenders = patch.RemovedAllowlistedSenders + } + if patch.GasForVerification != 0 { + out.GasForVerification = patch.GasForVerification + } + if patch.FeeUSDCents != 0 { + out.FeeUSDCents = patch.FeeUSDCents + } + if patch.PayloadSizeBytes != 0 { + out.PayloadSizeBytes = patch.PayloadSizeBytes + } + return out +} + +func committeeVerifiersForTopology( + topology *ccipOffchain.EnvironmentTopology, + remoteSelectors []uint64, + profiles map[uint64]chainProfile, +) ([]ccipChangesets.CommitteeVerifierInputConfig, error) { + if topology == nil || topology.NOPTopology == nil { + return nil, fmt.Errorf("topology with NOPTopology is required") + } + + qualifiers := make([]string, 0, len(topology.NOPTopology.Committees)) + for qualifier := range topology.NOPTopology.Committees { + qualifiers = append(qualifiers, qualifier) + } + sort.Strings(qualifiers) + + verifiers := make([]ccipChangesets.CommitteeVerifierInputConfig, 0, len(qualifiers)) + for _, qualifier := range qualifiers { + remoteCV := make(map[uint64]ccipChangesets.CommitteeVerifierRemoteChainConfig, len(remoteSelectors)) + for _, rs := range remoteSelectors { + remoteCV[rs] = ccipChangesets.CommitteeVerifierRemoteChainConfig{ + GasForVerification: profiles[rs].profile.GasForVerification, + } + } + verifiers = append(verifiers, ccipChangesets.CommitteeVerifierInputConfig{ + CommitteeQualifier: qualifier, + RemoteChains: mapsCloneCV(remoteCV), + }) + } + return verifiers, nil +} + +// partialChainConfigFromProfile builds one PartialChainConfig for localSelector +// using ChainLaneProfile data. Committee verifiers use each peer's +// GasForVerification; remote chain configs use the remote's FeeQuoterDestChainConfig +// and the local chain's executor/CCV defaults. LanePartialConfigOverrides are merged. +func partialChainConfigFromProfile( + localSelector uint64, + remoteSelectors []uint64, + topology *ccipOffchain.EnvironmentTopology, + local cciptestinterfaces.ChainLaneProfile, + profiles map[uint64]chainProfile, + o LanePartialConfigOverrides, +) (ccipChangesets.PartialChainConfig, error) { + committeeVerifiers, err := committeeVerifiersForTopology(topology, remoteSelectors, profiles) + if err != nil { + return ccipChangesets.PartialChainConfig{}, err + } + if len(o.CommitteeRemotePatches) > 0 { + for i := range committeeVerifiers { + merged := make(map[uint64]ccipChangesets.CommitteeVerifierRemoteChainConfig, len(committeeVerifiers[i].RemoteChains)) + for rs, cfg := range committeeVerifiers[i].RemoteChains { + merged[rs] = cfg + if patch, ok := o.CommitteeRemotePatches[rs]; ok { + merged[rs] = mergeCommitteeVerifierRemoteChainConfigForReconcile(merged[rs], patch) + } + } + committeeVerifiers[i].RemoteChains = merged + } + } + + remoteChains := make(map[uint64]ccipChangesets.PartialRemoteChainConfig, len(remoteSelectors)) + for _, rs := range remoteSelectors { + remoteProfile, ok := profiles[rs] + if !ok { + return ccipChangesets.PartialChainConfig{}, fmt.Errorf("missing profile for remote selector %d", rs) + } + remote := remoteProfile.profile + allowTrafficFrom := true + remoteChains[rs] = ccipChangesets.PartialRemoteChainConfig{ + AllowTrafficFrom: &allowTrafficFrom, + DefaultInboundCCVs: local.DefaultInboundCCVs, + DefaultOutboundCCVs: local.DefaultOutboundCCVs, + DefaultExecutorQualifier: local.DefaultExecutorQualifier, + FeeQuoterDestChainConfig: remote.FeeQuoterDestChainConfig, + ExecutorDestChainConfig: local.ExecutorDestChainConfig, + AddressBytesLength: remote.AddressBytesLength, + BaseExecutionGasCost: remote.BaseExecutionGasCost, + } + } + + return ccipChangesets.PartialChainConfig{ + ChainSelector: localSelector, + UseTestRouter: o.UseTestRouter, + CommitteeVerifiers: committeeVerifiers, + RemoteChains: remoteChains, + }, nil +} + +// buildConnectionProfilesFromImpls resolves selectors from blockchains and impls, +// builds the peer mesh remote selector lists, and loads GetChainLaneProfile per chain. +func buildConnectionProfilesFromImpls( + impls []cciptestinterfaces.CCIP17Configuration, + blockchains []*blockchain.Input, + selectors []uint64, + e *deployment.Environment, +) ([]uint64, map[uint64]chainProfile, error) { + if len(blockchains) != len(impls) { + return nil, nil, fmt.Errorf("connection profiles: mismatched lengths: %d impls and %d blockchains", len(impls), len(blockchains)) + } + profiles := make(map[uint64]chainProfile, len(impls)) + orderedSelectors := make([]uint64, 0, len(impls)) + for i, impl := range impls { + networkInfo, err := chainsel.GetChainDetailsByChainIDAndFamily(blockchains[i].ChainID, impl.ChainFamily()) + if err != nil { + return nil, nil, fmt.Errorf("chain %d: %w", i, err) + } + sel := networkInfo.ChainSelector + remotes := make([]uint64, 0, len(selectors)) + for _, s := range selectors { + if s != sel { + remotes = append(remotes, s) + } + } + profile, err := impl.GetChainLaneProfile(e, sel) + if err != nil { + return nil, nil, fmt.Errorf("get chain lane profile for chain %d: %w", sel, err) + } + profiles[sel] = chainProfile{ + remotes: remotes, + impl: impl, + profile: profile, + } + orderedSelectors = append(orderedSelectors, sel) + } + return orderedSelectors, profiles, nil +} + +func assertConnectionProfilesCoverSelectors( + orderedSelectors []uint64, + profiles map[uint64]chainProfile, + selectors []uint64, +) error { + want := make(map[uint64]struct{}, len(selectors)) + for _, s := range selectors { + want[s] = struct{}{} + } + got := make(map[uint64]struct{}, len(orderedSelectors)) + for _, s := range orderedSelectors { + got[s] = struct{}{} + } + if len(want) != len(got) { + return fmt.Errorf("reconfigure lanes: selectors set does not match configured chains") + } + for s := range want { + if _, ok := got[s]; !ok { + return fmt.Errorf("reconfigure lanes: selector %d not found in blockchains/impls", s) + } + } + return nil +} + +func lanePartialOverridesFromReconfigureParams(params ReconfigureLanesParams, localSel uint64) LanePartialConfigOverrides { + var o LanePartialConfigOverrides + if params.CommitteePatches != nil { + if inner, ok := params.CommitteePatches[localSel]; ok && len(inner) > 0 { + o.CommitteeRemotePatches = inner + } + } + if params.TestRouterByLane != nil { + if inner, ok := params.TestRouterByLane[localSel]; ok { + for _, v := range inner { + if v { + o.UseTestRouter = true + break + } + } + } + } + return o +} + +// buildPartialChainConfigsFromProfiles builds ConfigureChainsForLanesFromTopology +// partial configs for every chain in orderedSelectors. Zero ReconfigureLanesParams +// matches fresh deploy (production Router lanes). +func buildPartialChainConfigsFromProfiles( + topology *ccipOffchain.EnvironmentTopology, + orderedSelectors []uint64, + profiles map[uint64]chainProfile, + params ReconfigureLanesParams, +) ([]ccipChangesets.PartialChainConfig, error) { + chains := make([]ccipChangesets.PartialChainConfig, 0, len(orderedSelectors)) + for _, localSel := range orderedSelectors { + entry, ok := profiles[localSel] + if !ok { + return nil, fmt.Errorf("no profile for local chain %d", localSel) + } + o := lanePartialOverridesFromReconfigureParams(params, localSel) + pc, err := partialChainConfigFromProfile( + localSel, + entry.remotes, + topology, + entry.profile, + profiles, + o, + ) + if err != nil { + return nil, fmt.Errorf("partial chain config for selector %d: %w", localSel, err) + } + chains = append(chains, pc) + } + return chains, nil +} diff --git a/build/devenv/reconcile_offchain.go b/build/devenv/reconcile_offchain.go new file mode 100644 index 000000000..1bb7e71b7 --- /dev/null +++ b/build/devenv/reconcile_offchain.go @@ -0,0 +1,366 @@ +package ccv + +import ( + "context" + "fmt" + + "google.golang.org/grpc/credentials/insecure" + + ccipAdapters "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" + ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" + ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" + "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain/shared" + "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" + "github.com/smartcontractkit/chainlink-ccv/build/devenv/jobs" + "github.com/smartcontractkit/chainlink-ccv/build/devenv/offchainloader" + "github.com/smartcontractkit/chainlink-ccv/build/devenv/services" + "github.com/smartcontractkit/chainlink-deployments-framework/datastore" + "github.com/smartcontractkit/chainlink-deployments-framework/deployment" + "github.com/smartcontractkit/chainlink-deployments-framework/offchain" + cldfjd "github.com/smartcontractkit/chainlink-deployments-framework/offchain/jd" + nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" +) + +// ConfigureOffchainOptions controls off-chain configuration after an environment change (on-chain or topology). +// +// By default (RestartTomlConsumers nil), after TOML is regenerated this function updates aggregator +// generated TOML in running containers, writes fresh standalone config files to disk, then restarts +// only TOML-bound Docker services: aggregators, +// indexers, standalone executors, and standalone verifiers. +// Set RestartTomlConsumers to a non-nil false when Docker is unavailable or to avoid restarting consumers +// (e.g. out-of-band reload or diagnostics). +type ConfigureOffchainOptions struct { + FundExecutors bool + + // RestartTomlConsumers when nil means true: docker restart TOML-bound service containers after a successful reconcile. + RestartTomlConsumers *bool +} + +func (o ConfigureOffchainOptions) effectiveRestartTomlConsumers() bool { + if o.RestartTomlConsumers == nil { + return true + } + return *o.RestartTomlConsumers +} + +// ConfigureTopologyLanesAndOffchain applies on-chain lane changes from topology and params, then runs off-chain +// regeneration (aggregator, indexer, executor, verifier) and restarts TOML-bound Docker services by default. +func ConfigureTopologyLanesAndOffchain( + ctx context.Context, + e *deployment.Environment, + in *Cfg, + topology *ccipOffchain.EnvironmentTopology, + selectors []uint64, + blockchains []*blockchain.Input, + impls []cciptestinterfaces.CCIP17Configuration, + laneParams ReconfigureLanesParams, + sharedTLSCerts *services.TLSCertPaths, + offchainOpts ConfigureOffchainOptions, +) error { + if err := reconfigureLanesFromTopology(ctx, e, topology, selectors, blockchains, impls, laneParams); err != nil { + return fmt.Errorf("configure topology lanes and offchain: on-chain: %w", err) + } + if err := configureOffchainAfterOnChainChange(ctx, e, in, impls, topology, sharedTLSCerts, offchainOpts); err != nil { + return fmt.Errorf("configure topology lanes and offchain: off-chain: %w", err) + } + return nil +} + +// configureOffchainAfterOnChainChange re-runs GenerateAggregatorConfig, GenerateIndexerConfig, +// executor and verifier job-spec changesets, merges outputs into e.DataStore, and by default restarts TOML-bound Docker services. +func configureOffchainAfterOnChainChange( + ctx context.Context, + e *deployment.Environment, + in *Cfg, + impls []cciptestinterfaces.CCIP17Configuration, + topology *ccipOffchain.EnvironmentTopology, + sharedTLSCerts *services.TLSCertPaths, + opts ConfigureOffchainOptions, +) error { + if e == nil || in == nil || topology == nil { + return fmt.Errorf("reconcile: environment, config, and topology are required") + } + mds := datastore.NewMemoryDataStore() + if err := mds.Merge(e.DataStore); err != nil { + return fmt.Errorf("reconcile: merge initial datastore: %w", err) + } + if _, err := configureOffchainFromTopology(e, in, topology, sharedTLSCerts, mds); err != nil { + return fmt.Errorf("reconcile: configure offchain: %w", err) + } + if opts.FundExecutors { + if err := fundStandaloneExecutorAddresses(ctx, in, impls); err != nil { + return fmt.Errorf("reconcile: fund standalone executors: %w", err) + } + } + if err := acceptPendingJobsAndSync(ctx, e, in); err != nil { + return fmt.Errorf("reconcile: accept pending jobs: %w", err) + } + + if opts.effectiveRestartTomlConsumers() { + if err := configureTomlBoundServiceFiles(ctx, in); err != nil { + return fmt.Errorf("reconcile: configure TOML-bound services: %w", err) + } + if err := restartTomlBoundServices(ctx, in); err != nil { + return fmt.Errorf("reconcile: restart toml-bound services: %w", err) + } + } + return nil +} + +type restartable interface { + Restart(context.Context) error +} + +type refreshable interface { + RefreshConfig(context.Context) error +} + +func restartTomlBoundServices(ctx context.Context, in *Cfg) error { + if in == nil { + return nil + } + restartables := make([]restartable, 0, len(in.Aggregator)+len(in.Indexer)+len(in.Executor)+len(in.Verifier)) + for _, service := range in.Aggregator { + if service != nil { + restartables = append(restartables, service) + } + } + for _, service := range in.Indexer { + if service != nil { + restartables = append(restartables, service) + } + } + for _, service := range in.Executor { + if service != nil { + restartables = append(restartables, service) + } + } + for _, service := range in.Verifier { + if service != nil { + restartables = append(restartables, service) + } + } + for _, service := range restartables { + if err := service.Restart(ctx); err != nil { + return err + } + } + return nil +} + +// OpenDeploymentEnvironmentFromCfg builds selectors and a CLDF operations environment from a loaded env-out Cfg. +func OpenDeploymentEnvironmentFromCfg(cfg *Cfg) ([]uint64, *deployment.Environment, error) { + if cfg == nil { + return nil, nil, fmt.Errorf("open deployment environment: cfg is nil") + } + var ( + offchainClient offchain.Client + nodeIDs []string + ) + jdClient, err := jdClientFromCfg(cfg) + if err != nil { + return nil, nil, fmt.Errorf("open deployment environment: %w", err) + } + if jdClient != nil { + offchainClient = jdClient + nodeIDs, err = jdNodeIDs(jdClient) + if err != nil { + return nil, nil, fmt.Errorf("open deployment environment: list JD nodes: %w", err) + } + } + if cfg.ClientLookup == nil { + clAliases := clModeNOPAliases(cfg.EnvironmentTopology) + if len(clAliases) > 0 { + clientLookup, err := jobs.NewNodeSetClientLookup(cfg.NodeSets, clAliases) + if err != nil { + return nil, nil, fmt.Errorf("open deployment environment: build CL client lookup: %w", err) + } + cfg.ClientLookup = clientLookup + } + } + return NewCLDFOperationsEnvironmentWithOffchain(CLDFEnvironmentConfig{ + Blockchains: cfg.Blockchains, + DataStore: cfg.CLDF.DataStore, + OffchainClient: offchainClient, + NodeIDs: nodeIDs, + }) +} + +// ImplConfigurationsFromCfg returns one CCIP17Configuration per blockchain (same order as connectAllChains / NewEnvironment). +func ImplConfigurationsFromCfg(in *Cfg) ([]cciptestinterfaces.CCIP17Configuration, error) { + if in == nil { + return nil, fmt.Errorf("impl configurations: cfg is nil") + } + impls := make([]cciptestinterfaces.CCIP17Configuration, 0, len(in.Blockchains)) + for _, bc := range in.Blockchains { + impl, err := NewProductConfigurationFromNetwork(bc.Type) + if err != nil { + return nil, err + } + impls = append(impls, impl) + } + return impls, nil +} + +func configureOffchainFromTopology( + e *deployment.Environment, + in *Cfg, + topology *ccipOffchain.EnvironmentTopology, + sharedTLSCerts *services.TLSCertPaths, + ds datastore.MutableDataStore, +) (map[string][]string, error) { + if e == nil || in == nil || topology == nil { + return nil, fmt.Errorf("environment, config, and topology are required") + } + if ds == nil { + ds = datastore.NewMemoryDataStore() + if err := ds.Merge(e.DataStore); err != nil { + return nil, fmt.Errorf("merge initial datastore: %w", err) + } + } + + ResetMemoryOperationsBundle(e) + + for _, aggregatorInput := range in.Aggregator { + if sharedTLSCerts != nil { + aggregatorInput.SharedTLSCerts = sharedTLSCerts + } + e.DataStore = ds.Seal() + instanceName := aggregatorInput.InstanceName() + output, err := ccipChangesets.GenerateAggregatorConfig(ccipAdapters.GetAggregatorConfigRegistry()).Apply(*e, ccipChangesets.GenerateAggregatorConfigInput{ + ServiceIdentifier: instanceName + "-aggregator", + CommitteeQualifier: aggregatorInput.CommitteeName, + Topology: topology, + }) + if err != nil { + return nil, fmt.Errorf("generate aggregator config %s: %w", instanceName, err) + } + aggCfg, err := offchainloader.GetAggregatorConfig(output.DataStore.Seal(), instanceName+"-aggregator") + if err != nil { + return nil, fmt.Errorf("get aggregator config %s: %w", instanceName, err) + } + aggregatorInput.GeneratedCommittee = aggCfg + if err := ds.Merge(output.DataStore.Seal()); err != nil { + return nil, fmt.Errorf("merge aggregator datastore: %w", err) + } + } + + if len(in.Aggregator) > 0 && len(in.Indexer) > 0 { + e.DataStore = ds.Seal() + firstIdx := in.Indexer[0] + output, err := ccipChangesets.GenerateIndexerConfig(ccipAdapters.GetIndexerConfigRegistry()).Apply(*e, ccipChangesets.GenerateIndexerConfigInput{ + ServiceIdentifier: "indexer", + CommitteeVerifierNameToQualifier: firstIdx.CommitteeVerifierNameToQualifier, + CCTPVerifierNameToQualifier: firstIdx.CCTPVerifierNameToQualifier, + LombardVerifierNameToQualifier: firstIdx.LombardVerifierNameToQualifier, + }) + if err != nil { + return nil, fmt.Errorf("generate indexer config: %w", err) + } + idxCfg, err := offchainloader.GetIndexerConfig(output.DataStore.Seal(), "indexer") + if err != nil { + return nil, fmt.Errorf("get indexer config: %w", err) + } + for _, idxIn := range in.Indexer { + idxIn.GeneratedCfg = idxCfg + } + if err := ds.Merge(output.DataStore.Seal()); err != nil { + return nil, fmt.Errorf("merge indexer datastore: %w", err) + } + } + + e.DataStore = ds.Seal() + if err := generateExecutorJobSpecs(e, in, topology, ds); err != nil { + return nil, fmt.Errorf("executor job specs: %w", err) + } + e.DataStore = ds.Seal() + + verifierJobSpecs, err := generateVerifierJobSpecs(e, in, topology, sharedTLSCerts, ds) + if err != nil { + return nil, fmt.Errorf("verifier job specs: %w", err) + } + e.DataStore = ds.Seal() + in.CLDF.DataStore = e.DataStore + + return verifierJobSpecs, nil +} + +func configureTomlBoundServiceFiles(ctx context.Context, in *Cfg) error { + if in == nil { + return nil + } + refreshables := make([]refreshable, 0, len(in.Aggregator)+len(in.Indexer)) + for _, service := range in.Aggregator { + if service != nil { + refreshables = append(refreshables, service) + } + } + for _, service := range in.Indexer { + if service != nil { + refreshables = append(refreshables, service) + } + } + for _, service := range refreshables { + if err := service.RefreshConfig(ctx); err != nil { + return fmt.Errorf("refresh TOML-bound service config: %w", err) + } + } + return nil +} + +func acceptPendingJobsAndSync(ctx context.Context, e *deployment.Environment, in *Cfg) error { + if err := jobs.AcceptPendingJobs(ctx, in.ClientLookup); err != nil { + return err + } + return nil +} + +func clModeNOPAliases(topology *ccipOffchain.EnvironmentTopology) []string { + if topology == nil || topology.NOPTopology == nil { + return nil + } + aliases := make([]string, 0, len(topology.NOPTopology.NOPs)) + for _, nop := range topology.NOPTopology.NOPs { + if nop.GetMode() == shared.NOPModeCL { + alias := nop.Alias + if alias == "" { + alias = nop.Name + } + aliases = append(aliases, alias) + } + } + return aliases +} + +func jdClientFromCfg(cfg *Cfg) (offchain.Client, error) { + if cfg == nil || cfg.JD == nil || cfg.JD.Out == nil { + return nil, nil + } + client, err := cldfjd.NewJDClient(cldfjd.JDConfig{ + GRPC: cfg.JD.Out.ExternalGRPCUrl, + WSRPC: cfg.JD.Out.ExternalWSRPCUrl, + Creds: insecure.NewCredentials(), + }) + if err != nil { + return nil, fmt.Errorf("create JD client from env-out: %w", err) + } + return client, nil +} + +func jdNodeIDs(client offchain.Client) ([]string, error) { + if client == nil { + return nil, nil + } + resp, err := client.ListNodes(context.Background(), &nodev1.ListNodesRequest{}) + if err != nil { + return nil, err + } + nodeIDs := make([]string, 0, len(resp.Nodes)) + for _, node := range resp.Nodes { + if node != nil && node.Id != "" { + nodeIDs = append(nodeIDs, node.Id) + } + } + return nodeIDs, nil +} diff --git a/build/devenv/reconcile_onchain.go b/build/devenv/reconcile_onchain.go new file mode 100644 index 000000000..3070ae8fd --- /dev/null +++ b/build/devenv/reconcile_onchain.go @@ -0,0 +1,146 @@ +package ccv + +import ( + "context" + "fmt" + + "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/committee_verifier" + changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" + ccipAdapters "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" + ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" + ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" + "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" + "github.com/smartcontractkit/chainlink-deployments-framework/datastore" + "github.com/smartcontractkit/chainlink-deployments-framework/deployment" + "github.com/smartcontractkit/chainlink-deployments-framework/operations" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" +) + +// CommitteeRemotePatches maps local chain selector -> remote chain selector -> committee verifier remote patch. +type CommitteeRemotePatches map[uint64]map[uint64]ccipChangesets.CommitteeVerifierRemoteChainConfig + +// ReconfigureLanesParams configures reconfigureLanesFromTopology. Zero value is valid: production Router lanes +// (UseTestRouter false), no committee patches. To use TestRouter on a chain, set +// TestRouterByLane[localSelector][remoteSelector] = true; the deployment must include a TestRouter contract +// (DeployChainContractsPerChainCfg.DeployTestRouter) or the changeset apply can fail. +type ReconfigureLanesParams struct { + CommitteePatches CommitteeRemotePatches + TestRouterByLane map[uint64]map[uint64]bool +} + +// CommitteeRemotePatchesFromAllowlistArgs builds patches for one local chain from operation-style allowlist args. +func CommitteeRemotePatchesFromAllowlistArgs( + localSelector uint64, + args []committee_verifier.AllowlistConfigArgs, +) CommitteeRemotePatches { + if len(args) == 0 { + return nil + } + inner := make(map[uint64]ccipChangesets.CommitteeVerifierRemoteChainConfig, len(args)) + for _, a := range args { + added := make([]string, len(a.AddedAllowlistedSenders)) + for i, addr := range a.AddedAllowlistedSenders { + added[i] = addr.Hex() + } + removed := make([]string, len(a.RemovedAllowlistedSenders)) + for i, addr := range a.RemovedAllowlistedSenders { + removed[i] = addr.Hex() + } + inner[a.DestChainSelector] = ccipChangesets.CommitteeVerifierRemoteChainConfig{ + AllowlistEnabled: a.AllowlistEnabled, + AddedAllowlistedSenders: added, + RemovedAllowlistedSenders: removed, + } + } + return CommitteeRemotePatches{localSelector: inner} +} + +// ResetMemoryOperationsBundle replaces the environment operations bundle with a fresh in-memory reporter. +func ResetMemoryOperationsBundle(e *deployment.Environment) { + if e == nil { + return + } + e.OperationsBundle = operations.NewBundle( + e.GetContext, + e.Logger, + operations.NewMemoryReporter(), + ) +} + +// reconfigureLanesFromTopology runs ConfigureChainsForLanesFromTopology once with a PartialChainConfig per chain +// (full peer mesh). Selector-to-impl mapping matches connectAllChains: impls[i] with blockchains[i], +// chain selector from chain ID + ChainFamily(), GetChainLaneProfile(env, sel) on that impl. +func reconfigureLanesFromTopology( + ctx context.Context, + e *deployment.Environment, + topology *ccipOffchain.EnvironmentTopology, + selectors []uint64, + blockchains []*blockchain.Input, + impls []cciptestinterfaces.CCIP17Configuration, + params ReconfigureLanesParams, +) error { + if e == nil || topology == nil { + return fmt.Errorf("reconfigure lanes: environment and topology are required") + } + if len(selectors) == 0 { + return fmt.Errorf("reconfigure lanes: selectors is required") + } + if len(blockchains) != len(impls) { + return fmt.Errorf("reconfigure lanes: %d blockchains and %d impls", len(blockchains), len(impls)) + } + for _, sel := range selectors { + if !e.BlockChains.Exists(sel) { + return fmt.Errorf("reconfigure lanes: chain selector %d not in environment", sel) + } + } + + orderedSelectors, profiles, err := buildConnectionProfilesFromImpls(impls, blockchains, selectors, e) + if err != nil { + return fmt.Errorf("reconfigure lanes: %w", err) + } + if err := assertConnectionProfilesCoverSelectors(orderedSelectors, profiles, selectors); err != nil { + return err + } + + chains, err := buildPartialChainConfigsFromProfiles(topology, orderedSelectors, profiles, params) + if err != nil { + return fmt.Errorf("reconfigure lanes: %w", err) + } + + ResetMemoryOperationsBundle(e) + e.OperationsBundle = operations.NewBundle( + func() context.Context { return ctx }, + e.Logger, + operations.NewMemoryReporter(), + ) + + out, err := ccipChangesets.ConfigureChainsForLanesFromTopology( + ccipAdapters.GetCommitteeVerifierContractRegistry(), + ccipAdapters.GetChainFamilyRegistry(), + changesetscore.GetRegistry(), + ).Apply(*e, ccipChangesets.ConfigureChainsForLanesFromTopologyConfig{ + Topology: topology, + Chains: chains, + }) + if err != nil { + return err + } + if out.DataStore != nil { + mds := datastore.NewMemoryDataStore() + if err := mds.Merge(e.DataStore); err != nil { + return fmt.Errorf("reconfigure lanes: merge env datastore: %w", err) + } + if err := mds.Merge(out.DataStore.Seal()); err != nil { + return fmt.Errorf("reconfigure lanes: merge lane changeset datastore: %w", err) + } + e.DataStore = mds.Seal() + } + + for _, sel := range orderedSelectors { + entry := profiles[sel] + if err := entry.impl.PostConnect(e, sel, entry.remotes); err != nil { + return fmt.Errorf("reconfigure lanes: post-connect for chain %d: %w", sel, err) + } + } + return nil +} diff --git a/build/devenv/services/aggregator.go b/build/devenv/services/aggregator.go index a14525e5a..0f07a521d 100644 --- a/build/devenv/services/aggregator.go +++ b/build/devenv/services/aggregator.go @@ -47,6 +47,11 @@ const ( DefaultAggregatorGRPCPort = 50051 ) +// AggregatorGeneratedConfigContainerPath is the committee TOML path inside the aggregator container (matches NewAggregator ContainerFile). +func AggregatorGeneratedConfigContainerPath(instanceName string) string { + return "/etc/aggregator-" + instanceName + "-generated.toml" +} + type AggregatorDBInput struct { Image string `toml:"image"` // HostPort is the port on the host machine that the database will be exposed on. @@ -303,6 +308,54 @@ func (a *AggregatorInput) GenerateConfigs(generatedConfigFileName string) (*Gene }, nil } +// ConfigureGeneratedConfigFile persists only aggregator-*-generated.toml (committee). +// Main config stays the file from NewAggregator. +func (a *AggregatorInput) ConfigureGeneratedConfigFile() error { + if a == nil { + return nil + } + if a.GeneratedCommittee == nil { + return fmt.Errorf("ConfigureGeneratedConfigFile: GeneratedCommittee is required") + } + confDir := util.CCVConfigDir() + instanceName := a.InstanceName() + generatedConfigFileName := fmt.Sprintf("aggregator-%s-generated.toml", instanceName) + configResult, err := a.GenerateConfigs(generatedConfigFileName) + if err != nil { + return fmt.Errorf("write aggregator config files: generate: %w", err) + } + generatedConfigFilePath := filepath.Join(confDir, generatedConfigFileName) + if err := os.WriteFile(generatedConfigFilePath, configResult.GeneratedConfig, 0o644); err != nil { + return fmt.Errorf("write aggregator generated config: %w", err) + } + return nil +} + +// RefreshConfig refreshes the generated committee TOML on disk and syncs it into the running container. +func (a *AggregatorInput) RefreshConfig(ctx context.Context) error { + if a == nil { + return nil + } + if err := a.ConfigureGeneratedConfigFile(); err != nil { + return err + } + instanceName := a.InstanceName() + hostPath := filepath.Join(util.CCVConfigDir(), fmt.Sprintf("aggregator-%s-generated.toml", instanceName)) + containerName := fmt.Sprintf("%s-%s", instanceName, AggregatorContainerNameSuffix) + if err := DockerCopyFileToContainer(ctx, hostPath, containerName, AggregatorGeneratedConfigContainerPath(instanceName)); err != nil { + return fmt.Errorf("refresh aggregator generated config: %w", err) + } + return nil +} + +// Restart restarts the running aggregator container. +func (a *AggregatorInput) Restart(ctx context.Context) error { + if a == nil { + return nil + } + return RestartContainer(ctx, fmt.Sprintf("%s-%s", a.InstanceName(), AggregatorContainerNameSuffix)) +} + func (a *AggregatorInput) GetAPIKeys() ([]AggregatorClientConfig, error) { apiKeyConfigs := make([]AggregatorClientConfig, 0, len(a.APIClients)) for _, client := range a.APIClients { diff --git a/build/devenv/services/committeeverifier/base.go b/build/devenv/services/committeeverifier/base.go index e347061ee..9ab392097 100644 --- a/build/devenv/services/committeeverifier/base.go +++ b/build/devenv/services/committeeverifier/base.go @@ -155,6 +155,27 @@ type Output struct { JDNodeID string `toml:"jd_node_id"` } +func (in *Input) DockerContainerName() string { + if in == nil { + return "" + } + if in.Out != nil && in.Out.ContainerName != "" { + return services.NormalizeDockerContainerName(in.Out.ContainerName) + } + if in.ChainFamily == chainsel.FamilyEVM { + return fmt.Sprintf("evm-%s", in.ContainerName) + } + return services.NormalizeDockerContainerName(in.ContainerName) +} + +// Restart restarts the running verifier container. +func (in *Input) Restart(ctx context.Context) error { + if in == nil || in.Mode != services.Standalone { + return nil + } + return services.RestartContainer(ctx, in.DockerContainerName()) +} + func ApplyDefaults(in Input) Input { if in.Image == "" { in.Image = DefaultVerifierImage diff --git a/build/devenv/services/docker.go b/build/devenv/services/docker.go new file mode 100644 index 000000000..433a99e3a --- /dev/null +++ b/build/devenv/services/docker.go @@ -0,0 +1,42 @@ +package services + +import ( + "context" + "fmt" + "os/exec" + "strings" +) + +// NormalizeDockerContainerName strips leading slash from Docker inspect names so CLI calls match the container. +func NormalizeDockerContainerName(name string) string { + return strings.TrimPrefix(strings.TrimSpace(name), "/") +} + +// DockerCopyFileToContainer copies a host file into a running container path. +func DockerCopyFileToContainer(ctx context.Context, hostPath, containerName, containerPath string) error { + containerName = NormalizeDockerContainerName(containerName) + if hostPath == "" || containerName == "" || containerPath == "" { + return nil + } + dest := containerName + ":" + containerPath + cmd := exec.CommandContext(ctx, "docker", "cp", hostPath, dest) + out, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("docker cp %s -> %s: %w: %s", hostPath, dest, err, out) + } + return nil +} + +// RestartContainer restarts a running Docker container by name. +func RestartContainer(ctx context.Context, name string) error { + name = NormalizeDockerContainerName(name) + if name == "" { + return nil + } + cmd := exec.CommandContext(ctx, "docker", "restart", name) + out, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("docker restart %s: %w: %s", name, err, out) + } + return nil +} diff --git a/build/devenv/services/executor.go b/build/devenv/services/executor.go index e6e223a3a..0528c0c05 100644 --- a/build/devenv/services/executor.go +++ b/build/devenv/services/executor.go @@ -87,6 +87,39 @@ func (v *ExecutorInput) GenerateConfigWithBlockchainInfos(blockchainInfos blockc return cfg, nil } +// ConfigureConfigFile persists the current standalone executor config and returns the host path. +func (v *ExecutorInput) ConfigureConfigFile(blockchainOutputs []*ctfblockchain.Output) (string, error) { + if v == nil { + return "", nil + } + ApplyExecutorDefaults(v) + + blockchainInfos, err := ConvertBlockchainOutputsToInfo(blockchainOutputs) + if err != nil { + return "", fmt.Errorf("failed to generate blockchain infos from blockchain outputs: %w", err) + } + blockchainInfos = filterOutUnsupportedChains(blockchainInfos) + + config, err := v.GenerateConfigWithBlockchainInfos(blockchainInfos) + if err != nil { + return "", fmt.Errorf("failed to generate config for executor: %w", err) + } + confDir := util.CCVConfigDir() + configFilePath := filepath.Join(confDir, fmt.Sprintf("executor-%s-config.toml", v.ContainerName)) + if err := os.WriteFile(configFilePath, config, 0o644); err != nil { + return "", fmt.Errorf("failed to write executor config to file: %w", err) + } + return configFilePath, nil +} + +// Restart restarts the running executor container. +func (v *ExecutorInput) Restart(ctx context.Context) error { + if v == nil || v.Mode != Standalone { + return nil + } + return RestartContainer(ctx, v.ContainerName) +} + func (v *ExecutorInput) GetTransmitterAddress() protocol.UnknownAddress { // TODO: not chain agnostic. pk, err := crypto.HexToECDSA(v.TransmitterPrivateKey) @@ -136,24 +169,9 @@ func NewExecutor(in *ExecutorInput, blockchainOutputs []*ctfblockchain.Output) ( if err != nil { return in.Out, err } - - // Generate blockchain infos for standalone mode - blockchainInfos, err := ConvertBlockchainOutputsToInfo(blockchainOutputs) - if err != nil { - return nil, fmt.Errorf("failed to generate blockchain infos from blockchain outputs: %w", err) - } - - blockchainInfos = filterOutUnsupportedChains(blockchainInfos) - - // Generate and store config file with blockchain infos for standalone mode - config, err := in.GenerateConfigWithBlockchainInfos(blockchainInfos) + configFilePath, err := in.ConfigureConfigFile(blockchainOutputs) if err != nil { - return nil, fmt.Errorf("failed to generate config for executor: %w", err) - } - confDir := util.CCVConfigDir() - configFilePath := filepath.Join(confDir, fmt.Sprintf("executor-%s-config.toml", in.ContainerName)) - if err := os.WriteFile(configFilePath, config, 0o644); err != nil { - return nil, fmt.Errorf("failed to write executor config to file: %w", err) + return nil, err } /* Service */ @@ -225,6 +243,9 @@ func generateTransmitterPrivateKey() (string, error) { // SetTransmitterPrivateKey sets the transmitter private key for the provided execs array. func SetTransmitterPrivateKey(execs []*ExecutorInput) ([]*ExecutorInput, error) { for _, exec := range execs { + if exec.TransmitterPrivateKey != "" { + continue + } pk, err := generateTransmitterPrivateKey() if err != nil { return nil, fmt.Errorf("failed to generate transmitter private key: %w", err) diff --git a/build/devenv/services/indexer.go b/build/devenv/services/indexer.go index 3795b8a91..cf9f5d0d2 100644 --- a/build/devenv/services/indexer.go +++ b/build/devenv/services/indexer.go @@ -118,32 +118,21 @@ func injectPostgresURI(cfg *config.Config, uri string) { cfg.Storage.Single.Postgres.URI = uri } -// NewIndexer creates and starts a new Service container using testcontainers. -// Will be called once per indexer instance. -func NewIndexer(in *IndexerInput) (*IndexerOutput, error) { +// ConfigureConfigFiles persists the current indexer config, generated config, and secrets +// using the same paths NewIndexer mounts into the running container. +func (in *IndexerInput) ConfigureConfigFiles() (string, string, string, error) { if in == nil { - return nil, nil - } - if in.Out != nil && in.Out.UseCache { - return in.Out, nil + return "", "", "", nil } - ctx := context.Background() defaults(in) if in.GeneratedCfg == nil { - return nil, fmt.Errorf("GeneratedCfg is required for indexer") + return "", "", "", fmt.Errorf("GeneratedCfg is required for indexer") } - if in.IndexerConfig == nil { - return nil, fmt.Errorf("IndexerConfig is required for indexer") + return "", "", "", fmt.Errorf("IndexerConfig is required for indexer") } - p, err := CwdSourcePath(in.SourceCodePath) - if err != nil { - return in.Out, err - } - - // Per-instance config dir and filenames (supports multiple indexers, like NewAggregator per committee). confDir := util.CCVConfigDir() configFileName := fmt.Sprintf("indexer-%s-config.toml", in.ContainerName) generatedConfigFileName := "generated.toml" @@ -155,7 +144,6 @@ func NewIndexer(in *IndexerInput) (*IndexerOutput, error) { in.IndexerConfig.GeneratedConfigPath = generatedConfigFileName - // Per-instance DB credentials (from config or derived from container name for multi-instance isolation). dbName := in.DB.Database if dbName == "" { dbName = in.ContainerName @@ -169,7 +157,6 @@ func NewIndexer(in *IndexerInput) (*IndexerOutput, error) { dbPass = in.ContainerName } - // DB connection string: from config (StorageConnectionURL) when set, else build from DB/container (aligned with aggregator). dbContainerName := in.ContainerName + IndexerDBContainerSuffix var dbConnectionString string if in.StorageConnectionURL != "" { @@ -183,22 +170,21 @@ func NewIndexer(in *IndexerInput) (*IndexerOutput, error) { buff := new(bytes.Buffer) encoder := toml.NewEncoder(buff) encoder.Indent = "" - err = encoder.Encode(in.IndexerConfig) - if err != nil { - return nil, fmt.Errorf("failed to encode config: %w", err) + if err := encoder.Encode(in.IndexerConfig); err != nil { + return "", "", "", fmt.Errorf("failed to encode config: %w", err) } if err := os.WriteFile(configPath, buff.Bytes(), 0o644); err != nil { - return nil, fmt.Errorf("failed to write config: %w", err) + return "", "", "", fmt.Errorf("failed to write config: %w", err) } genBuff := new(bytes.Buffer) genEncoder := toml.NewEncoder(genBuff) genEncoder.Indent = "" if err := genEncoder.Encode(in.GeneratedCfg); err != nil { - return nil, fmt.Errorf("failed to encode generated config: %w", err) + return "", "", "", fmt.Errorf("failed to encode generated config: %w", err) } if err := os.WriteFile(generatedConfigPath, genBuff.Bytes(), 0o644); err != nil { - return nil, fmt.Errorf("failed to write generated config: %w", err) + return "", "", "", fmt.Errorf("failed to write generated config: %w", err) } secretsToEncode := in.Secrets @@ -209,14 +195,87 @@ func NewIndexer(in *IndexerInput) (*IndexerOutput, error) { secEncoder := toml.NewEncoder(secretsBuffer) secEncoder.Indent = "" if err := secEncoder.Encode(secretsToEncode); err != nil { - return nil, fmt.Errorf("failed to encode secrets: %w", err) + return "", "", "", fmt.Errorf("failed to encode secrets: %w", err) } if err := os.WriteFile(secretsPath, secretsBuffer.Bytes(), 0o644); err != nil { - return nil, fmt.Errorf("failed to write secrets file: %w", err) + return "", "", "", fmt.Errorf("failed to write secrets file: %w", err) + } + + return configPath, generatedConfigPath, secretsPath, nil +} + +// RefreshConfig rewrites the mounted indexer config files from the current in-memory config. +func (in *IndexerInput) RefreshConfig(context.Context) error { + if in == nil { + return nil + } + _, _, _, err := in.ConfigureConfigFiles() + return err +} + +// Restart restarts the running indexer container. +func (in *IndexerInput) Restart(ctx context.Context) error { + if in == nil { + return nil + } + name := in.ContainerName + if in.Out != nil && in.Out.ContainerName != "" { + name = in.Out.ContainerName + } + return RestartContainer(ctx, name) +} + +// NewIndexer creates and starts a new Service container using testcontainers. +// Will be called once per indexer instance. +func NewIndexer(in *IndexerInput) (*IndexerOutput, error) { + if in == nil { + return nil, nil + } + if in.Out != nil && in.Out.UseCache { + return in.Out, nil + } + ctx := context.Background() + defaults(in) + + if in.GeneratedCfg == nil { + return nil, fmt.Errorf("GeneratedCfg is required for indexer") + } + + if in.IndexerConfig == nil { + return nil, fmt.Errorf("IndexerConfig is required for indexer") + } + + p, err := CwdSourcePath(in.SourceCodePath) + if err != nil { + return in.Out, err + } + configPath, generatedConfigPath, secretsPath, err := in.ConfigureConfigFiles() + if err != nil { + return nil, err } // Database: unique name and host port per instance (like aggregator DB per committee). // one db instance per indexer. + dbName := in.DB.Database + if dbName == "" { + dbName = in.ContainerName + } + dbUser := in.DB.Username + if dbUser == "" { + dbUser = in.ContainerName + } + dbPass := in.DB.Password + if dbPass == "" { + dbPass = in.ContainerName + } + dbContainerName := in.ContainerName + IndexerDBContainerSuffix + var dbConnectionString string + if in.StorageConnectionURL != "" { + dbConnectionString = in.StorageConnectionURL + } else { + dbConnectionString = fmt.Sprintf("postgresql://%s:%s@%s:5432/%s?sslmode=disable", + dbUser, dbPass, dbContainerName, dbName) + } _, err = postgres.Run(ctx, in.DB.Image, testcontainers.WithName(dbContainerName), @@ -252,6 +311,7 @@ func NewIndexer(in *IndexerInput) (*IndexerOutput, error) { internalPortStr := strconv.Itoa(internalPort) // Container paths for mounted config (same path in every container; each has its own files). + generatedConfigFileName := "generated.toml" containerConfigPath := filepath.Join(IndexerConfigDirContainer, "config.toml") containerGeneratedPath := filepath.Join(IndexerConfigDirContainer, generatedConfigFileName) containerSecretsPath := filepath.Join(IndexerConfigDirContainer, "secrets.toml") diff --git a/build/devenv/tests/e2e/environment_change_reconcile_test.go b/build/devenv/tests/e2e/environment_change_reconcile_test.go new file mode 100644 index 000000000..043a2721e --- /dev/null +++ b/build/devenv/tests/e2e/environment_change_reconcile_test.go @@ -0,0 +1,566 @@ +package e2e + +import ( + "context" + "errors" + "fmt" + "os" + "slices" + "strings" + "testing" + "time" + + "github.com/BurntSushi/toml" + "github.com/Masterminds/semver/v3" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" + + chain_selectors "github.com/smartcontractkit/chain-selectors" + "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/sequences" + "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/versioned_verifier_resolver" + "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/committee_verifier" + "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/proxy" + routeroperations "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_2_0/operations/router" + ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" + "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain/operations/fetch_signing_keys" + ccv "github.com/smartcontractkit/chainlink-ccv/build/devenv" + "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" + devenvcommon "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" + "github.com/smartcontractkit/chainlink-ccv/build/devenv/tests/e2e/tcapi" + ccvcomm "github.com/smartcontractkit/chainlink-ccv/common" + "github.com/smartcontractkit/chainlink-ccv/common/committee" + "github.com/smartcontractkit/chainlink-ccv/protocol" + "github.com/smartcontractkit/chainlink-deployments-framework/datastore" + "github.com/smartcontractkit/chainlink-deployments-framework/deployment" + "github.com/smartcontractkit/chainlink-deployments-framework/operations" +) + +func environmentChangeSmokeConfigPath() string { + if p := os.Getenv("ENVIRONMENT_CHANGE_SMOKE_TEST_CONFIG"); p != "" { + return p + } + return GetSmokeTestConfig() +} + +func requireEnvironmentChangeEnvFile(t *testing.T) string { + t.Helper() + path := environmentChangeSmokeConfigPath() + if _, err := os.Stat(path); err != nil { + t.Skipf("environment change E2E requires env-out (missing %q: %v); run ccv up and set ENVIRONMENT_CHANGE_SMOKE_TEST_CONFIG or use SMOKE_TEST_CONFIG via GetSmokeTestConfig", path, err) + } + return path +} + +type environmentChangeReconcileHarness struct { + Cfg *ccv.Cfg + Selectors []uint64 + Env *deployment.Environment + Topology *ccipOffchain.EnvironmentTopology + Impls []cciptestinterfaces.CCIP17Configuration +} + +const ( + environmentChangeAssertMessageTimeout = 4 * time.Minute + environmentChangePostMessageExecTimeout = 2 * time.Minute +) + +var errEnvironmentChangeEOADefaultVerifierPrerequisites = errors.New("EOA default verifier message prerequisites not met") + +func newEnvironmentChangeReconcileHarness(t *testing.T) *environmentChangeReconcileHarness { + t.Helper() + path := requireEnvironmentChangeEnvFile(t) + cfg, err := ccv.LoadOutput[ccv.Cfg](path) + require.NoError(t, err) + if err := ccv.RequireFullCLModeForEnvironmentChangeReconcile(cfg); err != nil { + t.Skipf("environment change reconcile E2E requires full CL mode (topology NOPs cl, verifier/executor mode cl, nodesets): %v; use a CL env-out or set ENVIRONMENT_CHANGE_SMOKE_TEST_CONFIG", err) + } + selectors, env, err := ccv.OpenDeploymentEnvironmentFromCfg(cfg) + require.NoError(t, err) + require.NotEmpty(t, selectors) + topology := ccv.BuildEnvironmentTopology(cfg, env) + require.NotNil(t, topology) + impls, err := ccv.ImplConfigurationsFromCfg(cfg) + require.NoError(t, err) + require.Len(t, impls, len(cfg.Blockchains)) + return &environmentChangeReconcileHarness{ + Cfg: cfg, + Selectors: selectors, + Env: env, + Topology: topology, + Impls: impls, + } +} + +func testRouterDeployedOnSelector(t *testing.T, env *deployment.Environment, selector uint64) bool { + t.Helper() + _, err := env.DataStore.Addresses().Get(datastore.NewAddressRefKey( + selector, + datastore.ContractType(routeroperations.TestRouterContractType), + semver.MustParse(routeroperations.DeployTestRouter.Version()), + "", + )) + return err == nil +} + +func environmentChangeLinkedLongContext(t *testing.T) context.Context { + t.Helper() + base := t.Context() + longCtx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) + go func() { + <-base.Done() + cancel() + }() + t.Cleanup(cancel) + return longCtx +} + +func environmentChangeReconcileOpts() ccv.ConfigureOffchainOptions { + return ccv.ConfigureOffchainOptions{FundExecutors: false} +} + +func requireEnvironmentChangeReconcile(t *testing.T, ctx context.Context, h *environmentChangeReconcileHarness, lane ccv.ReconfigureLanesParams) { + t.Helper() + require.NoError(t, ccv.ConfigureTopologyLanesAndOffchain( + ctx, h.Env, h.Cfg, h.Topology, h.Selectors, h.Cfg.Blockchains, h.Impls, lane, nil, environmentChangeReconcileOpts(), + )) +} + +func requireNOPSigningKeyFromJD(t *testing.T, h *environmentChangeReconcileHarness, nopAlias string) string { + t.Helper() + require.NotNil(t, h.Env) + require.NotNil(t, h.Env.Offchain) + + report, err := operations.ExecuteOperation( + h.Env.OperationsBundle, + fetch_signing_keys.FetchNOPSigningKeys, + fetch_signing_keys.FetchSigningKeysDeps{ + JDClient: h.Env.Offchain, + Logger: h.Env.Logger, + NodeIDs: h.Env.NodeIDs, + }, + fetch_signing_keys.FetchSigningKeysInput{NOPAliases: []string{nopAlias}}, + ) + require.NoError(t, err) + + signersByFamily, ok := report.Output.SigningKeysByNOP[nopAlias] + require.True(t, ok, "NOP %q needs signing keys from JD", nopAlias) + + evmSigner := signersByFamily[chain_selectors.FamilyEVM] + require.NotEmpty(t, evmSigner, "NOP %q needs EVM signer from JD", nopAlias) + return evmSigner +} + +type environmentChangeEOADefaultVerifierInputs struct { + receiver protocol.UnknownAddress + ccvs []protocol.CCV + executor protocol.UnknownAddress +} + +func environmentChangeEOADefaultVerifierConfig(cfg *ccv.Cfg, src, dest cciptestinterfaces.CCIP17) (*environmentChangeEOADefaultVerifierInputs, error) { + receiver, err := dest.GetEOAReceiverAddress() + if err != nil { + return nil, err + } + ccvAddr, err := tcapi.GetContractAddress( + cfg, + src.ChainSelector(), + datastore.ContractType(versioned_verifier_resolver.CommitteeVerifierResolverType), + versioned_verifier_resolver.Version.String(), + devenvcommon.DefaultCommitteeVerifierQualifier, + "committee verifier proxy", + ) + if err != nil { + return nil, err + } + executorAddr, err := tcapi.GetContractAddress( + cfg, + src.ChainSelector(), + datastore.ContractType(sequences.ExecutorProxyType), + proxy.Deploy.Version(), + devenvcommon.DefaultExecutorQualifier, + "executor", + ) + if err != nil { + return nil, err + } + return &environmentChangeEOADefaultVerifierInputs{ + receiver: receiver, + ccvs: []protocol.CCV{{CCVAddress: ccvAddr, Args: []byte{}, ArgsLen: 0}}, + executor: executorAddr, + }, nil +} + +func runEnvironmentChangeEOADefaultVerifierWithIndexedResult( + ctx context.Context, + harness tcapi.TestHarness, + cfg *ccv.Cfg, + src, dest cciptestinterfaces.CCIP17, + useTestRouter bool, +) (tcapi.AssertionResult, error) { + inputs, err := environmentChangeEOADefaultVerifierConfig(cfg, src, dest) + if err != nil { + return tcapi.AssertionResult{}, fmt.Errorf("%w: %w", errEnvironmentChangeEOADefaultVerifierPrerequisites, err) + } + + seqNo, err := src.GetExpectedNextSequenceNumber(ctx, dest.ChainSelector()) + if err != nil { + return tcapi.AssertionResult{}, fmt.Errorf("failed to get expected next sequence number: %w", err) + } + sendMessageResult, err := src.SendMessage( + ctx, dest.ChainSelector(), cciptestinterfaces.MessageFields{ + Receiver: inputs.receiver, + Data: []byte("multi-verifier test"), + }, cciptestinterfaces.MessageOptions{ + Version: 3, + ExecutionGasLimit: 200_000, + FinalityConfig: 1, + Executor: inputs.executor, + CCVs: inputs.ccvs, + UseTestRouter: useTestRouter, + }, + ) + if err != nil { + return tcapi.AssertionResult{}, fmt.Errorf("failed to send message: %w", err) + } + if len(sendMessageResult.ReceiptIssuers) != 3 { + return tcapi.AssertionResult{}, fmt.Errorf("expected 3 receipt issuers, got %d", len(sendMessageResult.ReceiptIssuers)) + } + sentEvent, err := src.WaitOneSentEventBySeqNo(ctx, dest.ChainSelector(), seqNo, tcapi.DefaultSentTimeout) + if err != nil { + return tcapi.AssertionResult{}, fmt.Errorf("failed to wait for sent event: %w", err) + } + aggregatorClient := harness.AggregatorClients[devenvcommon.DefaultCommitteeVerifierQualifier] + chainMap, err := harness.Lib.ChainsMap(ctx) + if err != nil { + return tcapi.AssertionResult{}, fmt.Errorf("failed to get chains map: %w", err) + } + testCtx, cleanup := tcapi.NewTestingContext(ctx, chainMap, aggregatorClient, harness.IndexerMonitor) + defer cleanup() + + result, err := testCtx.AssertMessage(sentEvent.MessageID, tcapi.AssertMessageOptions{ + TickInterval: time.Second, + ExpectedVerifierResults: 1, + Timeout: environmentChangeAssertMessageTimeout, + AssertVerifierLogs: false, + AssertExecutorLogs: false, + }) + if err != nil { + return result, fmt.Errorf("failed to assert message: %w", err) + } + if result.AggregatedResult == nil { + return result, fmt.Errorf("aggregated result is nil") + } + if len(result.IndexedVerifications.Results) != 1 { + return result, fmt.Errorf("expected 1 indexed verification, got %d", len(result.IndexedVerifications.Results)) + } + e, err := chainMap[dest.ChainSelector()].WaitOneExecEventBySeqNo(ctx, src.ChainSelector(), seqNo, environmentChangePostMessageExecTimeout) + if err != nil { + return result, fmt.Errorf("failed to wait for exec event: %w", err) + } + if e.State != cciptestinterfaces.ExecutionStateSuccess { + return result, fmt.Errorf("expected execution state success, got %s", e.State) + } + return result, nil +} + +func twoDistinctEVMSelectorsFromHarness(t *testing.T, h *environmentChangeReconcileHarness) (srcSel, destSel uint64) { + t.Helper() + require.GreaterOrEqual(t, len(h.Cfg.Blockchains), 2, "need at least two chains") + for _, bc := range h.Cfg.Blockchains { + if bc.Out == nil || bc.Out.Family != chain_selectors.FamilyEVM { + continue + } + d, err := chain_selectors.GetChainDetailsByChainIDAndFamily(bc.ChainID, bc.Out.Family) + require.NoError(t, err) + if srcSel == 0 { + srcSel = d.ChainSelector + continue + } + if d.ChainSelector != srcSel { + destSel = d.ChainSelector + break + } + } + require.NotZero(t, destSel, "need two distinct EVM chain selectors") + return srcSel, destSel +} + +func reconfigureEnvironmentChangeCommitteeAllowlist(t *testing.T, h *environmentChangeReconcileHarness, srcSel uint64, args []committee_verifier.AllowlistConfigArgs) { + t.Helper() + ctx := ccv.Plog.WithContext(t.Context()) + patches := ccv.CommitteeRemotePatchesFromAllowlistArgs(srcSel, args) + requireEnvironmentChangeReconcile(t, ctx, h, ccv.ReconfigureLanesParams{CommitteePatches: patches}) +} + +func reconfigureEnvironmentChangeAllowlistEnabled(t *testing.T, h *environmentChangeReconcileHarness, srcSel, destSel uint64, sender common.Address) { + t.Helper() + reconfigureEnvironmentChangeCommitteeAllowlist(t, h, srcSel, []committee_verifier.AllowlistConfigArgs{ + { + DestChainSelector: destSel, + AllowlistEnabled: true, + AddedAllowlistedSenders: []common.Address{sender}, + }, + }) +} + +func reconfigureEnvironmentChangeAllowlistDisabled(t *testing.T, h *environmentChangeReconcileHarness, srcSel, destSel uint64, sender common.Address) { + t.Helper() + reconfigureEnvironmentChangeCommitteeAllowlist(t, h, srcSel, []committee_verifier.AllowlistConfigArgs{ + { + DestChainSelector: destSel, + AllowlistEnabled: false, + RemovedAllowlistedSenders: []common.Address{sender}, + }, + }) +} + +func ccip17PairForSelectors(t *testing.T, ctx context.Context, lib *ccv.Lib, srcSel, destSel uint64) (src, dest cciptestinterfaces.CCIP17) { + t.Helper() + chains, err := lib.Chains(ctx) + require.NoError(t, err) + for _, c := range chains { + if c.Details.ChainSelector == srcSel { + src = c.CCIP17 + } + if c.Details.ChainSelector == destSel { + dest = c.CCIP17 + } + } + require.NotNil(t, src, "no CCIP17 impl for source selector %d", srcSel) + require.NotNil(t, dest, "no CCIP17 impl for dest selector %d", destSel) + return src, dest +} + +func requireEnvironmentChangeEOADefaultVerifierMessage(t *testing.T, ctx context.Context, th tcapi.TestHarness, cfg *ccv.Cfg, src, dest cciptestinterfaces.CCIP17) { + t.Helper() + _, err := runEnvironmentChangeEOADefaultVerifierWithIndexedResult(ctx, th, cfg, src, dest, false) + if errors.Is(err, errEnvironmentChangeEOADefaultVerifierPrerequisites) { + t.Skip("EOA default verifier message prerequisites not met for this env") + } + require.NoError(t, err) +} + +func requireEnvironmentChangeEOADefaultVerifierMessageExpectError(t *testing.T, ctx context.Context, th tcapi.TestHarness, cfg *ccv.Cfg, src, dest cciptestinterfaces.CCIP17) { + t.Helper() + _, err := runEnvironmentChangeEOADefaultVerifierWithIndexedResult(ctx, th, cfg, src, dest, false) + if errors.Is(err, errEnvironmentChangeEOADefaultVerifierPrerequisites) { + t.Skip("EOA default verifier message prerequisites not met for this env") + } + require.Error(t, err, "EOA message must not complete end-to-end when committee allowlist excludes deployer") +} + +func requireEnvironmentChangeEOADefaultVerifierMessageWithTestRouter(t *testing.T, ctx context.Context, th tcapi.TestHarness, cfg *ccv.Cfg, src, dest cciptestinterfaces.CCIP17, useTestRouter bool) { + t.Helper() + _, err := runEnvironmentChangeEOADefaultVerifierWithIndexedResult(ctx, th, cfg, src, dest, useTestRouter) + if errors.Is(err, errEnvironmentChangeEOADefaultVerifierPrerequisites) { + t.Skip("EOA default verifier message prerequisites not met for this env") + } + require.NoError(t, err) +} + +func TestEnvironmentChangeReconcile_CommitteeVerifierAllowlistDecoyExpectErrorThenDeployerHappyPath(t *testing.T) { + h := newEnvironmentChangeReconcileHarness(t) + ctx := ccv.Plog.WithContext(t.Context()) + path := environmentChangeSmokeConfigPath() + th, err := tcapi.NewTestHarness(ctx, path, h.Cfg, chain_selectors.FamilyEVM) + if err != nil { + t.Skipf("message verification needs tcapi harness (aggregators/indexer): %v", err) + } + srcSel, destSel := twoDistinctEVMSelectorsFromHarness(t, h) + src, dest := ccip17PairForSelectors(t, ctx, th.Lib, srcSel, destSel) + deployer := h.Env.BlockChains.EVMChains()[srcSel].DeployerKey.From + decoy := common.HexToAddress("0x0000000000000000000000000000000000000001") + require.NotEqual(t, deployer, decoy, "decoy allowlist entry must not be the chain deployer used to send messages") + + requireEnvironmentChangeEOADefaultVerifierMessage(t, ctx, th, h.Cfg, src, dest) + + reconfigureEnvironmentChangeAllowlistEnabled(t, h, srcSel, destSel, decoy) + requireEnvironmentChangeEOADefaultVerifierMessageExpectError(t, ctx, th, h.Cfg, src, dest) + + reconfigureEnvironmentChangeAllowlistDisabled(t, h, srcSel, destSel, decoy) + requireEnvironmentChangeEOADefaultVerifierMessage(t, ctx, th, h.Cfg, src, dest) + + reconfigureEnvironmentChangeAllowlistEnabled(t, h, srcSel, destSel, deployer) + requireEnvironmentChangeEOADefaultVerifierMessage(t, ctx, th, h.Cfg, src, dest) + + reconfigureEnvironmentChangeAllowlistDisabled(t, h, srcSel, destSel, deployer) + requireEnvironmentChangeEOADefaultVerifierMessage(t, ctx, th, h.Cfg, src, dest) +} + +func testRouterSourceAndDestSelectors(t *testing.T, h *environmentChangeReconcileHarness) (srcSel, destSel uint64) { + t.Helper() + require.GreaterOrEqual(t, len(h.Selectors), 2, "need at least two chains for a directed lane") + for _, sel := range h.Selectors { + if !testRouterDeployedOnSelector(t, h.Env, sel) { + continue + } + for _, other := range h.Selectors { + if other != sel { + return sel, other + } + } + } + return 0, 0 +} + +func TestEnvironmentChangeReconcile_TestRouterLaneThenProductionRouterExpectMessagesSucceedEachStage(t *testing.T) { + h := newEnvironmentChangeReconcileHarness(t) + ctx := ccv.Plog.WithContext(t.Context()) + srcSel, destSel := testRouterSourceAndDestSelectors(t, h) + if srcSel == 0 { + t.Skip("no chain in topology has TestRouter in datastore; redeploy with current devenv (TestRouter is deployed by default)") + } + path := environmentChangeSmokeConfigPath() + th, err := tcapi.NewTestHarness(ctx, path, h.Cfg, chain_selectors.FamilyEVM) + if err != nil { + t.Skipf("message verification needs tcapi harness (aggregators/indexer): %v", err) + } + src, dest := ccip17PairForSelectors(t, ctx, th.Lib, srcSel, destSel) + testRouterLanes := map[uint64]map[uint64]bool{ + srcSel: {destSel: true}, + } + + requireEnvironmentChangeEOADefaultVerifierMessageWithTestRouter(t, ctx, th, h.Cfg, src, dest, false) + + requireEnvironmentChangeReconcile(t, ctx, h, ccv.ReconfigureLanesParams{TestRouterByLane: testRouterLanes}) + requireEnvironmentChangeEOADefaultVerifierMessageWithTestRouter(t, ctx, th, h.Cfg, src, dest, true) + + requireEnvironmentChangeReconcile(t, ctx, h, ccv.ReconfigureLanesParams{}) + requireEnvironmentChangeEOADefaultVerifierMessageWithTestRouter(t, ctx, th, h.Cfg, src, dest, false) +} + +func pickRemovableNOPAliasFromDefaultCommittee(t *testing.T, topo *ccipOffchain.EnvironmentTopology) string { + t.Helper() + require.NotNil(t, topo.NOPTopology) + comm, ok := topo.NOPTopology.Committees[devenvcommon.DefaultCommitteeVerifierQualifier] + require.True(t, ok, "default committee not in topology") + var refAliases []string + for sel, cc := range comm.ChainConfigs { + require.GreaterOrEqual(t, len(cc.NOPAliases), 2, "chain %s needs at least 2 NOPs in default committee", sel) + if refAliases == nil { + refAliases = append([]string(nil), cc.NOPAliases...) + continue + } + require.ElementsMatch(t, refAliases, cc.NOPAliases, "default committee NOP aliases must match across chains for this test") + } + return refAliases[len(refAliases)-1] +} + +func removeNOPAliasFromEveryCommitteeChainConfigs(t *testing.T, topo *ccipOffchain.EnvironmentTopology, removeAlias string) { + t.Helper() + require.NotNil(t, topo.NOPTopology) + for qual, comm := range topo.NOPTopology.Committees { + for sel, cc := range comm.ChainConfigs { + if !slices.Contains(cc.NOPAliases, removeAlias) { + continue + } + next := slices.Clone(cc.NOPAliases) + next = slices.DeleteFunc(next, func(a string) bool { return a == removeAlias }) + require.NotEmpty(t, next, "committee %q chain %s would have no NOPs", qual, sel) + cc.NOPAliases = next + th := cc.Threshold + if int(th) > len(cc.NOPAliases) { + th = uint8(len(cc.NOPAliases)) + } + if th < 1 { + th = 1 + } + cc.Threshold = th + comm.ChainConfigs[sel] = cc + } + topo.NOPTopology.Committees[qual] = comm + } + require.NoError(t, topo.Validate()) +} + +func requireVerifierResultsQuorumExcludesRecoveredSigner(t *testing.T, ar tcapi.AssertionResult, excludedSignerHex string) { + t.Helper() + excluded := common.HexToAddress(strings.TrimSpace(excludedSignerHex)) + require.NotEqual(t, common.Address{}, excluded, "excluded NOP signer must parse as an address") + + for i, row := range ar.IndexedVerifications.Results { + vr := row.VerifierResult + ccvData := vr.CCVData + require.Greater(t, len(ccvData), committee.VerifierVersionLength, "indexed verification %d: ccv data too short", i) + + hash, err := committee.NewSignableHash(vr.MessageID, ccvData) + require.NoError(t, err, "indexed verification %d: signable hash", i) + + rs, ss, err := protocol.DecodeSignatures(ccvData[committee.VerifierVersionLength:]) + require.NoError(t, err, "indexed verification %d: decode quorum signatures from ccv data", i) + + signers, err := protocol.RecoverECDSASigners(hash, rs, ss) + require.NoError(t, err, "indexed verification %d: recover signers from quorum signatures", i) + + for _, sgn := range signers { + require.NotEqualf(t, excluded, sgn, + "indexed verification %d: recovered quorum signer must not be removed NOP %s (got %s)", + i, excludedSignerHex, sgn.Hex()) + } + } + + if ar.AggregatedResult != nil && len(ar.AggregatedResult.CcvData) > committee.VerifierVersionLength && ar.AggregatedResult.Message != nil { + pm, err := ccvcomm.MapProtoMessageToProtocolMessage(ar.AggregatedResult.Message) + require.NoError(t, err) + mid, err := pm.MessageID() + require.NoError(t, err) + ccvData := ar.AggregatedResult.CcvData + hash, err := committee.NewSignableHash(mid, ccvData) + require.NoError(t, err) + rs, ss, err := protocol.DecodeSignatures(ccvData[committee.VerifierVersionLength:]) + require.NoError(t, err) + signers, err := protocol.RecoverECDSASigners(hash, rs, ss) + require.NoError(t, err) + for _, sgn := range signers { + require.NotEqualf(t, excluded, sgn, + "aggregated verifier result: recovered quorum signer must not be removed NOP %s (got %s)", + excludedSignerHex, sgn.Hex()) + } + } +} + +func TestEnvironmentChangeReconcile_RemoveDefaultCommitteeNOPAndLowerThresholdExpectMessageSuccessWithoutRemovedNOPVerification(t *testing.T) { + h := newEnvironmentChangeReconcileHarness(t) + topoSnap, err := toml.Marshal(*h.Cfg.EnvironmentTopology) + require.NoError(t, err) + t.Cleanup(func() { + var restored ccipOffchain.EnvironmentTopology + if err := toml.Unmarshal(topoSnap, &restored); err != nil { + t.Logf("reconcile test cleanup: restore topology: %v", err) + return + } + *h.Cfg.EnvironmentTopology = restored + h.Topology = ccv.BuildEnvironmentTopology(h.Cfg, h.Env) + cleanupCtx := ccv.Plog.WithContext(context.Background()) + if err := ccv.ConfigureTopologyLanesAndOffchain( + cleanupCtx, h.Env, h.Cfg, h.Topology, h.Selectors, h.Cfg.Blockchains, h.Impls, ccv.ReconfigureLanesParams{}, nil, environmentChangeReconcileOpts(), + ); err != nil { + t.Logf("reconcile test cleanup: reconcile: %v", err) + } + }) + + ctx := ccv.Plog.WithContext(environmentChangeLinkedLongContext(t)) + path := environmentChangeSmokeConfigPath() + th, err := tcapi.NewTestHarness(ctx, path, h.Cfg, chain_selectors.FamilyEVM) + if err != nil { + t.Skipf("message verification needs tcapi harness (aggregators/indexer): %v", err) + } + srcSel, destSel := twoDistinctEVMSelectorsFromHarness(t, h) + src, dest := ccip17PairForSelectors(t, ctx, th.Lib, srcSel, destSel) + + built := ccv.BuildEnvironmentTopology(h.Cfg, h.Env) + removeAlias := pickRemovableNOPAliasFromDefaultCommittee(t, built) + evmSigner := requireNOPSigningKeyFromJD(t, h, removeAlias) + + removeNOPAliasFromEveryCommitteeChainConfigs(t, h.Cfg.EnvironmentTopology, removeAlias) + h.Topology = ccv.BuildEnvironmentTopology(h.Cfg, h.Env) + + requireEnvironmentChangeReconcile(t, ctx, h, ccv.ReconfigureLanesParams{}) + + ar, err := runEnvironmentChangeEOADefaultVerifierWithIndexedResult(ctx, th, h.Cfg, src, dest, false) + if errors.Is(err, errEnvironmentChangeEOADefaultVerifierPrerequisites) { + t.Skip("EOA default verifier prerequisites not met for this env") + } + require.NoError(t, err) + requireVerifierResultsQuorumExcludesRecoveredSigner(t, ar, evmSigner) +} diff --git a/build/devenv/tests/e2e/tcapi/basic/v3.go b/build/devenv/tests/e2e/tcapi/basic/v3.go index c169f463d..37c99e8b3 100644 --- a/build/devenv/tests/e2e/tcapi/basic/v3.go +++ b/build/devenv/tests/e2e/tcapi/basic/v3.go @@ -37,10 +37,11 @@ type v3TestCaseBase struct { // v3TestCase is for tests that use ExtraArgsV3. type v3TestCase struct { v3TestCaseBase - receiver protocol.UnknownAddress - ccvs []protocol.CCV - executor protocol.UnknownAddress - hydrate func(ctx context.Context, tc *v3TestCase, cfg *ccv.Cfg) bool + receiver protocol.UnknownAddress + ccvs []protocol.CCV + useTestRouter bool + executor protocol.UnknownAddress + hydrate func(ctx context.Context, tc *v3TestCase, cfg *ccv.Cfg) bool } func (tc *v3TestCase) Name() string { @@ -64,6 +65,7 @@ func (tc *v3TestCase) Run(ctx context.Context, harness tcapi.TestHarness, cfg *c FinalityConfig: tc.finality, Executor: tc.executor, CCVs: tc.ccvs, + UseTestRouter: tc.useTestRouter, }) if err != nil { return fmt.Errorf("failed to send message: %w", err) diff --git a/build/devenv/tests/e2e/tcapi/contracts.go b/build/devenv/tests/e2e/tcapi/contracts.go index a08780d2b..ed71b3f06 100644 --- a/build/devenv/tests/e2e/tcapi/contracts.go +++ b/build/devenv/tests/e2e/tcapi/contracts.go @@ -14,6 +14,8 @@ import ( const ( DefaultExecTimeout = 40 * time.Second DefaultSentTimeout = 10 * time.Second + // DefaultAssertMessageTimeout bounds aggregator/indexer polling in AssertMessage (off-chain path) for smoke E2E. + DefaultAssertMessageTimeout = 180 * time.Second ) // GetContractAddress returns the contract address for the given chain and contract reference. diff --git a/build/devenv/tests/e2e/tcapi/types.go b/build/devenv/tests/e2e/tcapi/types.go index 5654d729a..8583ec55c 100644 --- a/build/devenv/tests/e2e/tcapi/types.go +++ b/build/devenv/tests/e2e/tcapi/types.go @@ -170,7 +170,7 @@ func NewTestingContext(ctx context.Context, impl map[uint64]cciptestinterfaces.C AggregatorClient: aggregatorClient, IndexerClient: indexerClient, LogAsserter: logAssert, - Timeout: 180 * time.Second, + Timeout: DefaultAssertMessageTimeout, logger: logger, } From 2087ad9a591fd5f3ca39f2c36c9e47ebcf5ba497 Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Thu, 2 Apr 2026 13:02:48 -0400 Subject: [PATCH 04/28] Bump cl-ccip --- build/devenv/go.mod | 10 +++++----- build/devenv/go.sum | 10 ++++++++++ go.mod | 2 +- go.sum | 2 ++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/build/devenv/go.mod b/build/devenv/go.mod index 1abc04515..4f969271f 100644 --- a/build/devenv/go.mod +++ b/build/devenv/go.mod @@ -16,9 +16,9 @@ require ( github.com/prometheus/client_golang v1.23.0 github.com/rs/zerolog v1.34.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260401132038-7de2f653c6c9 - github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9 - github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260401132038-7de2f653c6c9 + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402164037-112403d53ee7 + github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402164037-112403d53ee7 + github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402164037-112403d53ee7 github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 github.com/smartcontractkit/chainlink-deployments-framework v0.85.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0 @@ -36,8 +36,8 @@ require ( github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 github.com/sethvargo/go-retry v0.3.0 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402164037-112403d53ee7 github.com/smartcontractkit/chainlink-ccv v0.0.0-20260218133052-8e7fe2f457f9 github.com/smartcontractkit/chainlink-common/keystore v1.0.0 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd diff --git a/build/devenv/go.sum b/build/devenv/go.sum index 43ba59e80..8436b2f78 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -1129,6 +1129,8 @@ github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331202459-592a42 github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331202459-592a42284273/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260401132038-7de2f653c6c9 h1:A6k1Ey5MTq3f5gL0RnvUa0dXJ0xfHLNImEm48iSMiH4= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260401132038-7de2f653c6c9/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402164037-112403d53ee7 h1:Phcv77VXXm6WhvCXOMulrEZVzkyjM6iYdHramOQDtYk= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402164037-112403d53ee7/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808 h1:NfO2eAe1z3gDKgkYmpg/jjhNe0XVn7q6k0ySk+1F9co= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331171343-5fc2d717fb95 h1:DuWQjn0NaneGEodlPOUYJD87jRnexldwxZm0bA7Qm40= @@ -1141,6 +1143,8 @@ github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459- github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9 h1:CWcRIZy9LxScxkp+KDxdTX+WuSBO7ZPcwpM1KJBROO0= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7 h1:Af0r0yNh0+Rijpc2oaswH33Y5X+w+gZkXqCxDXUvdCk= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 h1:E196qCqW4eUiUd8y89qAvR3Kh4lvRqJbnkpOH36nYsE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95 h1:oTF+7+OAF+gwx+jyAr700jLKpapAc63YRDqXr04CbDk= @@ -1153,6 +1157,8 @@ github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-2026 github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9 h1:efR8enl63n8ANfF51MxNkI4+hUnPlyurKrWNOpRhJnE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402164037-112403d53ee7 h1:ZmyPsKQLk0+ZQB437qUWoiXfl+10HhxPEz+Y6UZ3AL4= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402164037-112403d53ee7/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 h1:r3can+ynfVcXVEHN5+5Ai4Velu55TjSV7phdpCXVrjU= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95 h1:n/whT4MKiF6iHIvu2l71yaSRu6zQgBcu/htljKXEj20= @@ -1165,6 +1171,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331 github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9 h1:A58Lf4yZsdx5Mnvl5xh84q1mtySFZRSvJZTMlNNrkR0= github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402164037-112403d53ee7 h1:IQocJ0d1Espgo8sDH33jEgVuLJ8qmRCNUILBye/olz4= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402164037-112403d53ee7/go.mod h1:QZxcMdY1q34P+NjMhLTzPrXi8aaCCX7hDZ60dawpO+w= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 h1:jkChf04hhdiMBApbb+lLDxHMY62Md6UeM7v++GSw3K8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= @@ -1181,6 +1189,8 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331202459-592a github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260401132038-7de2f653c6c9 h1:vOguLB7GsttJbYg+CjoFnk+K5QIb5a6xfv6vylWDnhE= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402164037-112403d53ee7 h1:n+ydYXOa5K88hqOxuSS/JT4emgMaRyX4C8x/GRHvAPM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402164037-112403d53ee7/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0/go.mod h1:0ghbAr7tRO0tT5ZqBXhOyzgUO37tNNe33Yn0hskauVM= github.com/smartcontractkit/chainlink-common/keystore v1.0.0 h1:sVa3j2FWK/5OxXpnlfDkF1deDAkuXEfaLKzYqBTA880= diff --git a/go.mod b/go.mod index 5a81f751c..d565cfcda 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/pressly/goose/v3 v3.26.0 github.com/prometheus/client_golang v1.23.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7 github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260115212037-5e3a1db0e079 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251222115927-36a18321243c // indirect diff --git a/go.sum b/go.sum index 2838b4378..9993930b3 100644 --- a/go.sum +++ b/go.sum @@ -726,6 +726,8 @@ github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459- github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9 h1:CWcRIZy9LxScxkp+KDxdTX+WuSBO7ZPcwpM1KJBROO0= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7 h1:Af0r0yNh0+Rijpc2oaswH33Y5X+w+gZkXqCxDXUvdCk= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 h1:f8ak6g6P2KT4HjUbleU+Bh0gUJXMoGuoriMSyGxxD4M= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:Ve1xD71bl193YIZQEoJMmBqLGQJdNs29bwbuObwvbhQ= github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 h1:VINIWIvYhgbGJpaI7O3aBuBOAZgMEN6BGA61zQIqvFw= From 320389a341ad01723a9b1f65099596099bab9ba3 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Thu, 2 Apr 2026 14:54:37 -0700 Subject: [PATCH 05/28] wip --- build/devenv/evm/impl.go | 69 +++++++++++++++------------------------- build/devenv/go.mod | 10 +++--- build/devenv/go.sum | 20 ++++++------ go.mod | 2 ++ go.sum | 2 -- 5 files changed, 43 insertions(+), 60 deletions(-) diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index e561d581e..80f1081da 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -29,7 +29,6 @@ import ( "github.com/rs/zerolog/log" adapters_1_6_1 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_6_1/adapters" - changesets_1_6_1 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_6_1/changesets" rmn_remote_binding "github.com/smartcontractkit/chainlink-ccip/chains/evm/gobindings/generated/v1_6_0/rmn_remote" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/create2_factory" @@ -48,8 +47,8 @@ import ( "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/utils/operations/contract" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/link" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/weth" + bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" burnminterc677ops "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" - "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/token_admin_registry" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_6_0/operations/rmn_remote" "github.com/smartcontractkit/chainlink-ccip/deployment/lanes" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" @@ -72,13 +71,13 @@ import ( chainsel "github.com/smartcontractkit/chain-selectors" evmadapters "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/adapters" - evmchangesets "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/changesets" offrampoperations "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/offramp" onrampoperations "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/onramp" feequoterwrapper "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/fee_quoter" routeroperations "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_2_0/operations/router" routerwrapper "github.com/smartcontractkit/chainlink-ccip/chains/evm/gobindings/generated/v1_2_0/router" tokenscore "github.com/smartcontractkit/chainlink-ccip/deployment/tokens" + devenvmcms "github.com/smartcontractkit/chainlink-ccip/deployment/utils/mcms" changesetsutils "github.com/smartcontractkit/chainlink-ccip/deployment/utils" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" ) @@ -1218,48 +1217,32 @@ func (m *CCIP17EVMConfig) deployTokenAndPool( return errors.New("failed to parse deployer balance") } - var out deployment.ChangesetOutput - var err error - if tokenPoolRef.Version.Equal(semver.MustParse("1.6.1")) { - out, err = changesets_1_6_1.DeployTokenAndPool(mcmsReaderRegistry).Apply(*env, changesetscore.WithMCMS[changesets_1_6_1.DeployTokenAndPoolCfg]{ - Cfg: changesets_1_6_1.DeployTokenAndPoolCfg{ - Accounts: map[common.Address]*big.Int{ - chain.DeployerKey.From: deployerBalance, + divisor := new(big.Int).Exp(big.NewInt(10), big.NewInt(DefaultDecimals), nil) + preMintTokens := new(big.Int).Div(deployerBalance, divisor).Uint64() + + out, err := tokenscore.TokenExpansion().Apply(*env, tokenscore.TokenExpansionInput{ + ChainAdapterVersion: tokenPoolRef.Version, + MCMS: devenvmcms.Input{}, + TokenExpansionInputPerChain: map[uint64]tokenscore.TokenExpansionInputPerChain{ + selector: { + TokenPoolVersion: tokenPoolRef.Version, + SkipOwnershipTransfer: true, + DeployTokenInput: &tokenscore.DeployTokenInput{ + Symbol: tokenPoolRef.Qualifier, + Name: tokenPoolRef.Qualifier, + Decimals: DefaultDecimals, + Type: bnm_drip_v1_0.ContractType, + ExternalAdmin: chain.DeployerKey.From.Hex(), + CCIPAdmin: chain.DeployerKey.From.Hex(), + PreMint: &preMintTokens, }, - ChainSel: selector, - TokenPoolType: tokenPoolRef.Type, - TokenPoolVersion: tokenPoolRef.Version, - TokenSymbol: tokenPoolRef.Qualifier, - Decimals: DefaultDecimals, - Router: datastore.AddressRef{ - Type: datastore.ContractType(routeroperations.ContractType), - Version: semver.MustParse(routeroperations.Deploy.Version()), + DeployTokenPoolInput: &tokenscore.DeployTokenPoolInput{ + PoolType: string(tokenPoolRef.Type), + TokenPoolQualifier: tokenPoolRef.Qualifier, }, }, - }) - } else { - out, err = evmchangesets.DeployTokenAndPool(mcmsReaderRegistry).Apply(*env, changesetscore.WithMCMS[evmchangesets.DeployTokenAndPoolCfg]{ - Cfg: evmchangesets.DeployTokenAndPoolCfg{ - Accounts: map[common.Address]*big.Int{ - chain.DeployerKey.From: deployerBalance, - }, - ChainSel: selector, - TokenPoolType: tokenPoolRef.Type, - TokenPoolVersion: tokenPoolRef.Version, - TokenSymbol: tokenPoolRef.Qualifier, - Decimals: DefaultDecimals, - Router: datastore.AddressRef{ - Type: datastore.ContractType(routeroperations.ContractType), - Version: semver.MustParse(routeroperations.Deploy.Version()), - }, - ThresholdAmountForAdditionalCCVs: big.NewInt(0), - TokenAdminRegistryRef: datastore.AddressRef{ - Type: datastore.ContractType(token_admin_registry.ContractType), - Version: semver.MustParse(token_admin_registry.Deploy.Version()), - }, - }, - }) - } + }, + }) if err != nil { return fmt.Errorf("failed to deploy %s token and pool: %w", tokenPoolRef.Qualifier, err) } @@ -1371,7 +1354,7 @@ func (m *CCIP17EVMConfig) PostConnect(e *deployment.Environment, selector uint64 for _, rs := range remoteSelectors { destChainSelectorsToAdd = append(destChainSelectorsToAdd, sequences.ExecutorRemoteChainConfigArgs{ DestChainSelector: rs, - Config: lanes.ExecutorDestChainConfig{ + Config: adapters.ExecutorDestChainConfig{ Enabled: true, }, }) diff --git a/build/devenv/go.mod b/build/devenv/go.mod index d2c0996d2..ed0258892 100644 --- a/build/devenv/go.mod +++ b/build/devenv/go.mod @@ -16,9 +16,9 @@ require ( github.com/prometheus/client_golang v1.23.0 github.com/rs/zerolog v1.34.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260326205122-a6b3f014b808 - github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 - github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260326205122-a6b3f014b808 + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402215113-b7805b4d61f0 + github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0 + github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402215113-b7805b4d61f0 github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 github.com/smartcontractkit/chainlink-deployments-framework v0.85.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0 @@ -36,8 +36,8 @@ require ( github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 github.com/sethvargo/go-retry v0.3.0 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402215113-b7805b4d61f0 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0 github.com/smartcontractkit/chainlink-ccv v0.0.0-20260218133052-8e7fe2f457f9 github.com/smartcontractkit/chainlink-common/keystore v1.0.0 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd diff --git a/build/devenv/go.sum b/build/devenv/go.sum index 2e8236200..0a0cce2b3 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -1117,20 +1117,20 @@ github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0ku github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3 h1:bbVSKb++R+rpLkydNvyS4nZPNkcjtolUuFC8YVwtMVk= github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3/go.mod h1:OywVThRaVXwknATT2B8QAwjOJ1LoYBB9bTsmRpf6RPw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260326205122-a6b3f014b808 h1:L41P/gvHKlmYLv05HPW/RK+OycM0sFNIKsGyJPS9IjE= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260326205122-a6b3f014b808/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808 h1:NfO2eAe1z3gDKgkYmpg/jjhNe0XVn7q6k0ySk+1F9co= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 h1:E196qCqW4eUiUd8y89qAvR3Kh4lvRqJbnkpOH36nYsE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 h1:r3can+ynfVcXVEHN5+5Ai4Velu55TjSV7phdpCXVrjU= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402215113-b7805b4d61f0 h1:/cZYcPG/r63d+cIzO/V58pRcByiPAAsPE7BL1+557kg= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402215113-b7805b4d61f0/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402215113-b7805b4d61f0 h1:usJ42YDKv7opoo2lgtTmueHBiLseWNIDjMpMBwr2YpI= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402215113-b7805b4d61f0/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0 h1:OJinWJHguvNwsLzb5CUbraDZgk3GGw7LqlKAeWQItAQ= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0 h1:57/addIAAvXAzzj71VbeO1FHqybO3NaaDf7SKtPeek4= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0/go.mod h1:QZxcMdY1q34P+NjMhLTzPrXi8aaCCX7hDZ60dawpO+w= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 h1:jkChf04hhdiMBApbb+lLDxHMY62Md6UeM7v++GSw3K8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139/go.mod h1:1WcontO9PeuKdUf5HXfs3nuICtzUvFNnyCmrHkTCF9Y= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260326205122-a6b3f014b808 h1:wa86USykquE4t+ndaAdVXH2TKheOjDZYQXWDiWyoZ7s= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402215113-b7805b4d61f0 h1:xOclOUEGbbj+/bD58HARtbRJkZPIOWXv9yIpVXSNqvw= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402215113-b7805b4d61f0/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0/go.mod h1:0ghbAr7tRO0tT5ZqBXhOyzgUO37tNNe33Yn0hskauVM= github.com/smartcontractkit/chainlink-common/keystore v1.0.0 h1:sVa3j2FWK/5OxXpnlfDkF1deDAkuXEfaLKzYqBTA880= diff --git a/go.mod b/go.mod index 3fa199e84..7e67e060e 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module github.com/smartcontractkit/chainlink-ccv go 1.25.6 +replace github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm => /Users/ttata/dev/chainlink-ccip/ccv/chains/evm + replace github.com/fbsobreira/gotron-sdk => github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.5-0.20251014124537-af6b1684fe15 replace ( diff --git a/go.sum b/go.sum index 1a5d3d15c..877c0744f 100644 --- a/go.sum +++ b/go.sum @@ -714,8 +714,6 @@ github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0ku github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260107192940-0be702ef3ff5 h1:zn5uuemiuL/Rda48li8Gql929DeYPTRhR2ZGrO3Tgz4= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260107192940-0be702ef3ff5/go.mod h1:k5Ln240ZCu7weL16IgR1EN5xUsgVMjU9qr84eYZfCto= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808 h1:NfO2eAe1z3gDKgkYmpg/jjhNe0XVn7q6k0ySk+1F9co= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 h1:f8ak6g6P2KT4HjUbleU+Bh0gUJXMoGuoriMSyGxxD4M= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:Ve1xD71bl193YIZQEoJMmBqLGQJdNs29bwbuObwvbhQ= github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 h1:VINIWIvYhgbGJpaI7O3aBuBOAZgMEN6BGA61zQIqvFw= From 536b9f815fadefa9cc78750fe3294f1757c42c95 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Thu, 2 Apr 2026 14:58:00 -0700 Subject: [PATCH 06/28] gomod --- go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.mod b/go.mod index 33a83a0e8..d565cfcda 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module github.com/smartcontractkit/chainlink-ccv go 1.25.6 -replace github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm => /Users/ttata/dev/chainlink-ccip/ccv/chains/evm - replace github.com/fbsobreira/gotron-sdk => github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.5-0.20251014124537-af6b1684fe15 replace ( From 2f3c921e76550b0f1800cee6fa5339c0760961a5 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Thu, 2 Apr 2026 15:07:52 -0700 Subject: [PATCH 07/28] gomod --- go.sum | 2 ++ 1 file changed, 2 insertions(+) diff --git a/go.sum b/go.sum index 877c0744f..689663067 100644 --- a/go.sum +++ b/go.sum @@ -714,6 +714,8 @@ github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0ku github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260107192940-0be702ef3ff5 h1:zn5uuemiuL/Rda48li8Gql929DeYPTRhR2ZGrO3Tgz4= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260107192940-0be702ef3ff5/go.mod h1:k5Ln240ZCu7weL16IgR1EN5xUsgVMjU9qr84eYZfCto= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7 h1:Af0r0yNh0+Rijpc2oaswH33Y5X+w+gZkXqCxDXUvdCk= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 h1:f8ak6g6P2KT4HjUbleU+Bh0gUJXMoGuoriMSyGxxD4M= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:Ve1xD71bl193YIZQEoJMmBqLGQJdNs29bwbuObwvbhQ= github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 h1:VINIWIvYhgbGJpaI7O3aBuBOAZgMEN6BGA61zQIqvFw= From 3ad224e239db4617ab9972c564d788f650337455 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Thu, 2 Apr 2026 15:20:53 -0700 Subject: [PATCH 08/28] fix --- build/devenv/evm/impl.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index e231c8cf1..9c8c94298 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -48,7 +48,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/link" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/weth" bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" - burnminterc677ops "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" + "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_6_0/operations/rmn_remote" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" @@ -1553,8 +1553,8 @@ func (m *CCIP17EVMConfig) fundLockReleaseTokenPool( ) error { poolType := datastore.ContractType(lock_release_token_pool.ContractType) qualifier := tokenPoolRef.Qualifier - // Get token address reference - tokenRef, err := env.DataStore.Addresses().Get(datastore.NewAddressRefKey(selector, datastore.ContractType(burnminterc677ops.ContractType), semver.MustParse(burnminterc677ops.Deploy.Version()), qualifier)) + // Get token address reference (token deployed via TokenExpansion uses v1.0.0 contract type) + tokenRef, err := env.DataStore.Addresses().Get(datastore.NewAddressRefKey(selector, datastore.ContractType(bnm_drip_v1_0.ContractType), semver.MustParse(bnm_drip_v1_0.Deploy.Version()), qualifier)) if err != nil { return fmt.Errorf("failed to get token address for %s %s pool: %w", qualifier, poolType, err) } From c6bb5469d8b05158f05587491541ba27d0b2bec3 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Thu, 2 Apr 2026 15:42:55 -0700 Subject: [PATCH 09/28] tidy --- build/devenv/evm/impl.go | 4 ++-- build/devenv/go.mod | 10 +++++----- build/devenv/go.sum | 20 ++++++++++---------- go.mod | 2 +- go.sum | 4 ++-- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index 9c8c94298..471cccdb7 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -45,9 +45,9 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/offramp" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/onramp" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/utils/operations/contract" + bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/link" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/weth" - bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_6_0/operations/rmn_remote" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" @@ -77,9 +77,9 @@ import ( routerwrapper "github.com/smartcontractkit/chainlink-ccip/chains/evm/gobindings/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink-ccip/deployment/lanes" tokenscore "github.com/smartcontractkit/chainlink-ccip/deployment/tokens" - devenvmcms "github.com/smartcontractkit/chainlink-ccip/deployment/utils/mcms" changesetsutils "github.com/smartcontractkit/chainlink-ccip/deployment/utils" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" + devenvmcms "github.com/smartcontractkit/chainlink-ccip/deployment/utils/mcms" ) const ( diff --git a/build/devenv/go.mod b/build/devenv/go.mod index ed0258892..df273d42c 100644 --- a/build/devenv/go.mod +++ b/build/devenv/go.mod @@ -16,9 +16,9 @@ require ( github.com/prometheus/client_golang v1.23.0 github.com/rs/zerolog v1.34.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402215113-b7805b4d61f0 - github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0 - github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402215113-b7805b4d61f0 + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402223727-b875aa99b74c + github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c + github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402223727-b875aa99b74c github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 github.com/smartcontractkit/chainlink-deployments-framework v0.85.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0 @@ -36,8 +36,8 @@ require ( github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 github.com/sethvargo/go-retry v0.3.0 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402215113-b7805b4d61f0 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c github.com/smartcontractkit/chainlink-ccv v0.0.0-20260218133052-8e7fe2f457f9 github.com/smartcontractkit/chainlink-common/keystore v1.0.0 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd diff --git a/build/devenv/go.sum b/build/devenv/go.sum index 0a0cce2b3..c18b287b7 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -1117,20 +1117,20 @@ github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0ku github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3 h1:bbVSKb++R+rpLkydNvyS4nZPNkcjtolUuFC8YVwtMVk= github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3/go.mod h1:OywVThRaVXwknATT2B8QAwjOJ1LoYBB9bTsmRpf6RPw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402215113-b7805b4d61f0 h1:/cZYcPG/r63d+cIzO/V58pRcByiPAAsPE7BL1+557kg= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402215113-b7805b4d61f0/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402215113-b7805b4d61f0 h1:usJ42YDKv7opoo2lgtTmueHBiLseWNIDjMpMBwr2YpI= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402215113-b7805b4d61f0/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0 h1:OJinWJHguvNwsLzb5CUbraDZgk3GGw7LqlKAeWQItAQ= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0 h1:57/addIAAvXAzzj71VbeO1FHqybO3NaaDf7SKtPeek4= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402215113-b7805b4d61f0/go.mod h1:QZxcMdY1q34P+NjMhLTzPrXi8aaCCX7hDZ60dawpO+w= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402223727-b875aa99b74c h1:dsU/P4xXL/yM+anRSqJZtMWCsyKJ0ph6m4VaLiEwq9Y= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402223727-b875aa99b74c/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c h1:FovWq3VisffT6TysAUnOH6kQr2yK4AFWLrf2dqo6wpI= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c h1:ygjG4y9aI+UmTzzBs/CJNkT600gZAiN7zcj/tQUAJ2Y= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c h1:5nEdTdeZtqtA94OdjUGQ/SSm58hd0x/X7ZvXx1+3omg= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c/go.mod h1:QZxcMdY1q34P+NjMhLTzPrXi8aaCCX7hDZ60dawpO+w= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 h1:jkChf04hhdiMBApbb+lLDxHMY62Md6UeM7v++GSw3K8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139/go.mod h1:1WcontO9PeuKdUf5HXfs3nuICtzUvFNnyCmrHkTCF9Y= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402215113-b7805b4d61f0 h1:xOclOUEGbbj+/bD58HARtbRJkZPIOWXv9yIpVXSNqvw= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402215113-b7805b4d61f0/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402223727-b875aa99b74c h1:zd4kTL/xt6b4XcPHkU7OmUsqzfYva0cQpyqtbDqch6c= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402223727-b875aa99b74c/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0/go.mod h1:0ghbAr7tRO0tT5ZqBXhOyzgUO37tNNe33Yn0hskauVM= github.com/smartcontractkit/chainlink-common/keystore v1.0.0 h1:sVa3j2FWK/5OxXpnlfDkF1deDAkuXEfaLKzYqBTA880= diff --git a/go.mod b/go.mod index d565cfcda..5436c12bf 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/pressly/goose/v3 v3.26.0 github.com/prometheus/client_golang v1.23.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260115212037-5e3a1db0e079 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251222115927-36a18321243c // indirect diff --git a/go.sum b/go.sum index 689663067..6781810bd 100644 --- a/go.sum +++ b/go.sum @@ -714,8 +714,8 @@ github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0ku github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260107192940-0be702ef3ff5 h1:zn5uuemiuL/Rda48li8Gql929DeYPTRhR2ZGrO3Tgz4= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260107192940-0be702ef3ff5/go.mod h1:k5Ln240ZCu7weL16IgR1EN5xUsgVMjU9qr84eYZfCto= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7 h1:Af0r0yNh0+Rijpc2oaswH33Y5X+w+gZkXqCxDXUvdCk= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c h1:FovWq3VisffT6TysAUnOH6kQr2yK4AFWLrf2dqo6wpI= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 h1:f8ak6g6P2KT4HjUbleU+Bh0gUJXMoGuoriMSyGxxD4M= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:Ve1xD71bl193YIZQEoJMmBqLGQJdNs29bwbuObwvbhQ= github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 h1:VINIWIvYhgbGJpaI7O3aBuBOAZgMEN6BGA61zQIqvFw= From 35f9024842a200a2f000a921e8da99248e366679 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Fri, 3 Apr 2026 03:38:00 -0700 Subject: [PATCH 10/28] refactor token combos --- build/devenv/cciptestinterfaces/interface.go | 38 ++ build/devenv/common/common.go | 373 +++++++++++++----- build/devenv/environment.go | 75 ++-- build/devenv/evm/impl.go | 190 ++++++--- build/devenv/implcommon.go | 150 +++++++ build/devenv/tests/e2e/smoke_test.go | 6 +- .../tests/e2e/tcapi/token_transfer/v3.go | 41 +- build/devenv/tokenconfig/config.go | 136 ------- 8 files changed, 670 insertions(+), 339 deletions(-) delete mode 100644 build/devenv/tokenconfig/config.go diff --git a/build/devenv/cciptestinterfaces/interface.go b/build/devenv/cciptestinterfaces/interface.go index dff25ffa3..c07061844 100644 --- a/build/devenv/cciptestinterfaces/interface.go +++ b/build/devenv/cciptestinterfaces/interface.go @@ -11,8 +11,10 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/smartcontractkit/chainlink-ccip/deployment/lanes" + tokensapi "github.com/smartcontractkit/chainlink-ccip/deployment/tokens" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" + devenvcommon "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" "github.com/smartcontractkit/chainlink-ccv/protocol" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-deployments-framework/deployment" @@ -218,9 +220,45 @@ type ChainLaneProfile struct { GasForVerification uint32 } +// TokenConfigProvider abstracts the chain-specific decisions that feed into +// TokenExpansion (token type, decimals, admin addresses, pre-mint amounts) +// and any post-deployment work (e.g. funding lock-release pools on EVM). +type TokenConfigProvider interface { + // GetSupportedPools returns pool types and versions this chain can deploy. + GetSupportedPools() []devenvcommon.PoolCapability + + // GetTokenExpansionConfigs returns one TokenExpansionInputPerChain per + // token/pool that should be deployed on the given chain, driven by the + // pre-computed token combinations. Return nil, nil if token transfers + // are not supported. + GetTokenExpansionConfigs( + env *deployment.Environment, + selector uint64, + combos []devenvcommon.TokenCombination, + ) ([]tokensapi.TokenExpansionInputPerChain, error) + + // PostTokenDeploy runs chain-specific work after all tokens and pools have + // been deployed via TokenExpansion (e.g. funding lock-release pools on EVM). + PostTokenDeploy( + env *deployment.Environment, + selector uint64, + deployedRefs []datastore.AddressRef, + ) error + + // GetTokenTransferConfigs builds TokenTransferConfig entries for all pools + // deployed on this chain, using chain-specific registry and CCV refs. + GetTokenTransferConfigs( + env *deployment.Environment, + selector uint64, + remoteSelectors []uint64, + topology *offchain.EnvironmentTopology, + ) ([]tokensapi.TokenTransferConfig, error) +} + // OnChainConfigurable defines methods that allows devenv to // deploy, configure Chainlink product and connect on-chain part with other chains. type OnChainConfigurable interface { + TokenConfigProvider // ChainFamily returns the family of the chain. ChainFamily() string // DeployContractsForSelector deploys contracts for chain X using topology for CommitteeVerifier configuration. diff --git a/build/devenv/common/common.go b/build/devenv/common/common.go index b3eee7c3e..4c632b438 100644 --- a/build/devenv/common/common.go +++ b/build/devenv/common/common.go @@ -2,11 +2,10 @@ package common import ( "fmt" + "sort" "github.com/Masterminds/semver/v3" - "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/burn_mint_token_pool" - "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/lock_release_token_pool" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" @@ -37,56 +36,70 @@ const ( LombardContractsQualifier = "Lombard" LombardPrimaryReceiverQualifier = "lombard-primary" + + // Pool type identifiers used across all chain families. These are logical + // identifiers stored in the datastore; each chain's adapter maps them to + // the concrete contract implementation. + BurnMintTokenPoolType = "BurnMintTokenPool" + LockReleaseTokenPoolType = "LockReleaseTokenPool" ) -// TokenCombination represents a source and destination pool combination. +// PoolCapability describes a token pool type and version a chain can deploy. +type PoolCapability struct { + PoolType string + PoolVersion *semver.Version +} + +// TokenCombination represents a local/remote pool pairing. "Local" is the pool +// on the chain being configured; "remote" is the counterpart on the other chain. +// Because every chain deploys both pools, a transfer can flow in either direction. type TokenCombination struct { - sourcePoolType string - sourcePoolVersion string - sourcePoolQualifier string - sourcePoolCCVQualifiers []string - destPoolType string - destPoolVersion string - destPoolQualifier string - destPoolCCVQualifiers []string + localPoolType string + localPoolVersion string + localPoolQualifier string + localPoolCCVQualifiers []string + remotePoolType string + remotePoolVersion string + remotePoolQualifier string + remotePoolCCVQualifiers []string expectedReceiptIssuers int expectedVerifierResults int } -// SourcePoolAddressRef returns the address ref for the source token pool that can be used to query the datastore. -func (s TokenCombination) SourcePoolAddressRef() datastore.AddressRef { - qualifier := s.sourcePoolQualifier +// LocalPoolAddressRef returns the address ref for the local token pool. +func (s TokenCombination) LocalPoolAddressRef() datastore.AddressRef { + qualifier := s.localPoolQualifier if qualifier == "" { - qualifier = fmt.Sprintf("TEST (%s %s %v to %s %s %v)", s.sourcePoolType, s.sourcePoolVersion, s.sourcePoolCCVQualifiers, s.destPoolType, s.destPoolVersion, s.destPoolCCVQualifiers) + qualifier = fmt.Sprintf("TEST (%s %s %v to %s %s %v)", s.localPoolType, s.localPoolVersion, s.localPoolCCVQualifiers, s.remotePoolType, s.remotePoolVersion, s.remotePoolCCVQualifiers) } return datastore.AddressRef{ - Type: datastore.ContractType(s.sourcePoolType), - Version: semver.MustParse(s.sourcePoolVersion), + Type: datastore.ContractType(s.localPoolType), + Version: semver.MustParse(s.localPoolVersion), Qualifier: qualifier, } } -// DestPoolAddressRef returns the address ref for the destination token pool that can be used to query the datastore. -func (s TokenCombination) DestPoolAddressRef() datastore.AddressRef { - qualifier := s.destPoolQualifier +// RemotePoolAddressRef returns the address ref for the remote (counterpart) token pool. +func (s TokenCombination) RemotePoolAddressRef() datastore.AddressRef { + qualifier := s.remotePoolQualifier if qualifier == "" { - qualifier = fmt.Sprintf("TEST (%s %s %v to %s %s %v)", s.destPoolType, s.destPoolVersion, s.destPoolCCVQualifiers, s.sourcePoolType, s.sourcePoolVersion, s.sourcePoolCCVQualifiers) + qualifier = fmt.Sprintf("TEST (%s %s %v to %s %s %v)", s.remotePoolType, s.remotePoolVersion, s.remotePoolCCVQualifiers, s.localPoolType, s.localPoolVersion, s.localPoolCCVQualifiers) } return datastore.AddressRef{ - Type: datastore.ContractType(s.destPoolType), - Version: semver.MustParse(s.destPoolVersion), + Type: datastore.ContractType(s.remotePoolType), + Version: semver.MustParse(s.remotePoolVersion), Qualifier: qualifier, } } -// SourcePoolCCVQualifiers returns the CCV qualifiers for the source token pool. -func (s TokenCombination) SourcePoolCCVQualifiers() []string { - return s.sourcePoolCCVQualifiers +// LocalPoolCCVQualifiers returns the CCV qualifiers for the local token pool. +func (s TokenCombination) LocalPoolCCVQualifiers() []string { + return s.localPoolCCVQualifiers } -// DestPoolCCVQualifiers returns the CCV qualifiers for the destination token pool. -func (s TokenCombination) DestPoolCCVQualifiers() []string { - return s.destPoolCCVQualifiers +// RemotePoolCCVQualifiers returns the CCV qualifiers for the remote token pool. +func (s TokenCombination) RemotePoolCCVQualifiers() []string { + return s.remotePoolCCVQualifiers } // ExpectedReceiptIssuers returns the expected number of receipt issuers for the token combination. @@ -100,8 +113,8 @@ func (s TokenCombination) ExpectedVerifierResults() int { } func (s TokenCombination) FinalityConfig() protocol.Finality { - if semver.MustParse(s.sourcePoolVersion).GreaterThanEqual(semver.MustParse("2.0.0")) { - return 1 // We can use fast-finality if source pool is 2.0.0 or higher + if semver.MustParse(s.localPoolVersion).GreaterThanEqual(semver.MustParse("2.0.0")) { + return 1 // We can use fast-finality if local pool is 2.0.0 or higher } return 0 // Otherwise use default finality } @@ -109,105 +122,267 @@ func (s TokenCombination) FinalityConfig() protocol.Finality { // AllTokenCombinations returns all possible token combinations. func AllTokenCombinations() []TokenCombination { return []TokenCombination{ - { // 1.6.1 burn -> 1.6.1 mint - sourcePoolType: string(burn_mint_token_pool.ContractType), - sourcePoolVersion: "1.6.1", - destPoolType: string(burn_mint_token_pool.ContractType), - destPoolVersion: "1.6.1", + { // 1.6.1 burn <-> 1.6.1 burn + localPoolType: BurnMintTokenPoolType, + localPoolVersion: "1.6.1", + remotePoolType: BurnMintTokenPoolType, + remotePoolVersion: "1.6.1", expectedReceiptIssuers: 4, // default CCV, token pool, executor, network fee expectedVerifierResults: 1, // default CCV }, - { // 1.6.1 burn -> 2.0.0 mint - sourcePoolType: string(burn_mint_token_pool.ContractType), - sourcePoolVersion: "1.6.1", - destPoolType: string(burn_mint_token_pool.ContractType), - destPoolVersion: "2.0.0", - destPoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, + { // 1.6.1 burn <-> 2.0.0 burn + localPoolType: BurnMintTokenPoolType, + localPoolVersion: "1.6.1", + remotePoolType: BurnMintTokenPoolType, + remotePoolVersion: "2.0.0", + remotePoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, expectedReceiptIssuers: 4, // default CCV, token pool, executor, network fee expectedVerifierResults: 1, // default CCV }, - { // 2.0.0 burn -> 1.6.1 mint - sourcePoolType: string(burn_mint_token_pool.ContractType), - sourcePoolVersion: "2.0.0", - sourcePoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, - destPoolType: string(burn_mint_token_pool.ContractType), - destPoolVersion: "1.6.1", + { // 2.0.0 burn <-> 1.6.1 burn + localPoolType: BurnMintTokenPoolType, + localPoolVersion: "2.0.0", + localPoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, + remotePoolType: BurnMintTokenPoolType, + remotePoolVersion: "1.6.1", expectedReceiptIssuers: 4, // default CCV, token pool, executor, network fee expectedVerifierResults: 1, // default CCV }, - { // 2.0.0 lock -> 2.0.0 burn - sourcePoolType: string(lock_release_token_pool.ContractType), - sourcePoolVersion: "2.0.0", - sourcePoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, - destPoolType: string(burn_mint_token_pool.ContractType), - destPoolVersion: "2.0.0", - destPoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, + { // 2.0.0 lock <-> 2.0.0 burn + localPoolType: LockReleaseTokenPoolType, + localPoolVersion: "2.0.0", + localPoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, + remotePoolType: BurnMintTokenPoolType, + remotePoolVersion: "2.0.0", + remotePoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, expectedReceiptIssuers: 4, // default CCV, token pool, executor, network fee expectedVerifierResults: 1, // default CCV }, - { // 2.0.0 burn -> 2.0.0 release - sourcePoolType: string(burn_mint_token_pool.ContractType), - sourcePoolVersion: "2.0.0", - sourcePoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, - destPoolType: string(lock_release_token_pool.ContractType), - destPoolVersion: "2.0.0", - destPoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, + { // 2.0.0 burn <-> 2.0.0 release + localPoolType: BurnMintTokenPoolType, + localPoolVersion: "2.0.0", + localPoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, + remotePoolType: LockReleaseTokenPoolType, + remotePoolVersion: "2.0.0", + remotePoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, expectedReceiptIssuers: 4, // default CCV, token pool, executor, network fee expectedVerifierResults: 1, // default CCV }, - { // 2.0.0 burn -> 2.0.0 mint - sourcePoolType: string(burn_mint_token_pool.ContractType), - sourcePoolVersion: "2.0.0", - sourcePoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, - destPoolType: string(burn_mint_token_pool.ContractType), - destPoolVersion: "2.0.0", - destPoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, + { // 2.0.0 burn <-> 2.0.0 burn + localPoolType: BurnMintTokenPoolType, + localPoolVersion: "2.0.0", + localPoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, + remotePoolType: BurnMintTokenPoolType, + remotePoolVersion: "2.0.0", + remotePoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier}, expectedReceiptIssuers: 4, // default CCV, token pool, executor, network fee expectedVerifierResults: 1, // default CCV }, - { // 2.0.0 burn -> 2.0.0 mint (Default and Secondary CCV) - sourcePoolType: string(burn_mint_token_pool.ContractType), - sourcePoolVersion: "2.0.0", - sourcePoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier, SecondaryCommitteeVerifierQualifier}, - destPoolType: string(burn_mint_token_pool.ContractType), - destPoolVersion: "2.0.0", - destPoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier, SecondaryCommitteeVerifierQualifier}, + { // 2.0.0 burn <-> 2.0.0 burn (Default and Secondary CCV) + localPoolType: BurnMintTokenPoolType, + localPoolVersion: "2.0.0", + localPoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier, SecondaryCommitteeVerifierQualifier}, + remotePoolType: BurnMintTokenPoolType, + remotePoolVersion: "2.0.0", + remotePoolCCVQualifiers: []string{DefaultCommitteeVerifierQualifier, SecondaryCommitteeVerifierQualifier}, expectedReceiptIssuers: 5, // default CCV, secondary CCV, token pool, executor, network fee expectedVerifierResults: 2, // default CCV, secondary CCV }, - { // 2.0.0 burn -> 2.0.0 mint (No CCV) - sourcePoolType: string(burn_mint_token_pool.ContractType), - sourcePoolVersion: "2.0.0", - sourcePoolCCVQualifiers: []string{}, - destPoolType: string(burn_mint_token_pool.ContractType), - destPoolVersion: "2.0.0", - destPoolCCVQualifiers: []string{}, + { // 2.0.0 burn <-> 2.0.0 burn (No CCV) + localPoolType: BurnMintTokenPoolType, + localPoolVersion: "2.0.0", + localPoolCCVQualifiers: []string{}, + remotePoolType: BurnMintTokenPoolType, + remotePoolVersion: "2.0.0", + remotePoolCCVQualifiers: []string{}, expectedReceiptIssuers: 4, // default CCV, token pool, executor, network fee expectedVerifierResults: 1, // default CCV }, - { // 2.0.0 burn -> 2.0.0 mint (Secondary CCV) - sourcePoolType: string(burn_mint_token_pool.ContractType), - sourcePoolVersion: "2.0.0", - sourcePoolCCVQualifiers: []string{SecondaryCommitteeVerifierQualifier}, - destPoolType: string(burn_mint_token_pool.ContractType), - destPoolVersion: "2.0.0", - destPoolCCVQualifiers: []string{SecondaryCommitteeVerifierQualifier}, + { // 2.0.0 burn <-> 2.0.0 burn (Secondary CCV) + localPoolType: BurnMintTokenPoolType, + localPoolVersion: "2.0.0", + localPoolCCVQualifiers: []string{SecondaryCommitteeVerifierQualifier}, + remotePoolType: BurnMintTokenPoolType, + remotePoolVersion: "2.0.0", + remotePoolCCVQualifiers: []string{SecondaryCommitteeVerifierQualifier}, expectedReceiptIssuers: 5, // secondary CCV, default CCV, token pool, executor, network fee expectedVerifierResults: 2, // secondary CCV, default CCV (defaultCCV included because ccipReceiveGasLimit > 0) }, } } +// Is17Combination returns true when both local and remote pools are v2.0.0. +func Is17Combination(tc TokenCombination) bool { + return semver.MustParse(tc.localPoolVersion).Equal(semver.MustParse("2.0.0")) && + semver.MustParse(tc.remotePoolVersion).Equal(semver.MustParse("2.0.0")) +} + func All17TokenCombinations() []TokenCombination { combinations := []TokenCombination{} for _, tc := range AllTokenCombinations() { - if semver.MustParse(tc.sourcePoolVersion).Equal(semver.MustParse("2.0.0")) && semver.MustParse(tc.destPoolVersion).Equal(semver.MustParse("2.0.0")) { + if Is17Combination(tc) { combinations = append(combinations, tc) } } return combinations } +// ComputeTokenCombinations derives valid token pool pairings from per-chain capabilities. +// It generates combinations for every compatible (local, remote) pair where at least two +// chains support the required types. CCV qualifiers are assigned based on pool version +// (2.0.0 pools use the available committee qualifiers from the topology). +// +// Pairing rules: +// - BurnMint pairs with BurnMint (any version combination) +// - LockRelease pairs with BurnMint (in both directions) +func ComputeTokenCombinations( + capabilities map[uint64][]PoolCapability, + topology *offchain.EnvironmentTopology, +) []TokenCombination { + // Collect the set of distinct pool capabilities across all chains. + type capKey struct { + poolType string + version string + } + capSet := make(map[capKey]bool) + for _, caps := range capabilities { + for _, c := range caps { + capSet[capKey{c.PoolType, c.PoolVersion.String()}] = true + } + } + + // Convert to a sorted slice for deterministic output. + allCaps := make([]capKey, 0, len(capSet)) + for k := range capSet { + allCaps = append(allCaps, k) + } + sort.Slice(allCaps, func(i, j int) bool { + if allCaps[i].poolType != allCaps[j].poolType { + return allCaps[i].poolType < allCaps[j].poolType + } + return allCaps[i].version < allCaps[j].version + }) + + isCompatible := func(localType, remoteType string) bool { + if localType == BurnMintTokenPoolType && remoteType == BurnMintTokenPoolType { + return true + } + if localType == LockReleaseTokenPoolType && remoteType == BurnMintTokenPoolType { + return true + } + if localType == BurnMintTokenPoolType && remoteType == LockReleaseTokenPoolType { + return true + } + return false + } + + // Determine CCV qualifier permutations available from the topology. + ccvQualifierSets := ccvQualifierPermutations(topology) + + var combos []TokenCombination + for _, local := range allCaps { + for _, remote := range allCaps { + if !isCompatible(local.poolType, remote.poolType) { + continue + } + // At least two chains must support the required types. + localCount, remoteCount := 0, 0 + for _, caps := range capabilities { + hasLocal, hasRemote := false, false + for _, c := range caps { + if c.PoolType == local.poolType && c.PoolVersion.String() == local.version { + hasLocal = true + } + if c.PoolType == remote.poolType && c.PoolVersion.String() == remote.version { + hasRemote = true + } + } + if hasLocal { + localCount++ + } + if hasRemote { + remoteCount++ + } + } + if localCount == 0 || remoteCount == 0 || (localCount+remoteCount) < 2 { + continue + } + + localV := semver.MustParse(local.version) + remoteV := semver.MustParse(remote.version) + v200 := semver.MustParse("2.0.0") + localNeedsCCV := localV.GreaterThanEqual(v200) + remoteNeedsCCV := remoteV.GreaterThanEqual(v200) + + if !localNeedsCCV && !remoteNeedsCCV { + combos = append(combos, newTokenCombination(local.poolType, local.version, nil, remote.poolType, remote.version, nil)) + } else { + for _, qs := range ccvQualifierSets { + var localQ, remoteQ []string + if localNeedsCCV { + localQ = qs + } + if remoteNeedsCCV { + remoteQ = qs + } + combos = append(combos, newTokenCombination(local.poolType, local.version, localQ, remote.poolType, remote.version, remoteQ)) + } + } + } + } + return combos +} + +func newTokenCombination(localType, localVersion string, localCCVs []string, remoteType, remoteVersion string, remoteCCVs []string) TokenCombination { + baseCCVCount := 1 // default CCV always present + extraIssuers := 3 // token pool, executor, network fee + + localCCVCount := len(localCCVs) + if localCCVCount == 0 { + localCCVCount = baseCCVCount + } + + return TokenCombination{ + localPoolType: localType, + localPoolVersion: localVersion, + localPoolCCVQualifiers: localCCVs, + remotePoolType: remoteType, + remotePoolVersion: remoteVersion, + remotePoolCCVQualifiers: remoteCCVs, + expectedReceiptIssuers: localCCVCount + extraIssuers, + expectedVerifierResults: localCCVCount, + } +} + +// ccvQualifierPermutations returns the set of CCV qualifier slices to exercise, +// derived from the topology's available committees. It always includes the +// empty-qualifier case (no explicit CCVs) for pools that support it. +func ccvQualifierPermutations(topology *offchain.EnvironmentTopology) [][]string { + result := [][]string{ + {}, // no explicit CCVs + } + if topology == nil || topology.NOPTopology == nil { + return result + } + + qualifiers := make([]string, 0, len(topology.NOPTopology.Committees)) + for q := range topology.NOPTopology.Committees { + qualifiers = append(qualifiers, q) + } + sort.Strings(qualifiers) + + // Single-qualifier sets. + for _, q := range qualifiers { + result = append(result, []string{q}) + } + // If there are at least two committees, also add the "all qualifiers" set. + if len(qualifiers) >= 2 { + result = append(result, qualifiers) + } + + return result +} + // qualifiersAvailable returns true if all qualifiers exist as committees in the topology. func qualifiersAvailable(qualifiers []string, topology *offchain.EnvironmentTopology) bool { if topology == nil || topology.NOPTopology == nil { @@ -222,15 +397,15 @@ func qualifiersAvailable(qualifiers []string, topology *offchain.EnvironmentTopo } // FilterTokenCombinations returns only the token combinations whose CCV qualifiers -// all exist as committees in the topology, and when ds is non-nil, whose source and -// destination pool address refs exist in ds for every selector (each chain acts as both -// local pools across bidirectional transfer configs). +// all exist as committees in the topology, and when ds is non-nil, whose local and +// remote pool address refs exist in ds for every selector (each chain deploys both +// pools across bidirectional transfer configs). // Pass ds nil to skip the datastore check. func FilterTokenCombinations(combos []TokenCombination, topology *offchain.EnvironmentTopology, ds datastore.DataStore, selectors []uint64) []TokenCombination { filtered := make([]TokenCombination, 0, len(combos)) for _, combo := range combos { - if !qualifiersAvailable(combo.SourcePoolCCVQualifiers(), topology) || - !qualifiersAvailable(combo.DestPoolCCVQualifiers(), topology) { + if !qualifiersAvailable(combo.LocalPoolCCVQualifiers(), topology) || + !qualifiersAvailable(combo.RemotePoolCCVQualifiers(), topology) { continue } if ds != nil && len(selectors) > 0 && !tokenCombinationPoolsExistInDataStore(ds, selectors, combo) { @@ -242,10 +417,10 @@ func FilterTokenCombinations(combos []TokenCombination, topology *offchain.Envir } func tokenCombinationPoolsExistInDataStore(ds datastore.DataStore, selectors []uint64, combo TokenCombination) bool { - src := combo.SourcePoolAddressRef() - dst := combo.DestPoolAddressRef() + local := combo.LocalPoolAddressRef() + remote := combo.RemotePoolAddressRef() for _, sel := range selectors { - if !dataStoreHasAddressRef(ds, sel, src) || !dataStoreHasAddressRef(ds, sel, dst) { + if !dataStoreHasAddressRef(ds, sel, local) || !dataStoreHasAddressRef(ds, sel, remote) { return false } } diff --git a/build/devenv/environment.go b/build/devenv/environment.go index ad32f0a0a..060d6d3c8 100644 --- a/build/devenv/environment.go +++ b/build/devenv/environment.go @@ -22,8 +22,6 @@ import ( chainsel "github.com/smartcontractkit/chain-selectors" - tokenscore "github.com/smartcontractkit/chainlink-ccip/deployment/tokens" - changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" ccipAdapters "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" @@ -37,7 +35,6 @@ import ( "github.com/smartcontractkit/chainlink-ccv/build/devenv/services/chainconfig" "github.com/smartcontractkit/chainlink-ccv/build/devenv/services/committeeverifier" executorsvc "github.com/smartcontractkit/chainlink-ccv/build/devenv/services/executor" - "github.com/smartcontractkit/chainlink-ccv/build/devenv/tokenconfig" "github.com/smartcontractkit/chainlink-ccv/build/devenv/util" "github.com/smartcontractkit/chainlink-ccv/executor" "github.com/smartcontractkit/chainlink-ccv/indexer/pkg/config" @@ -1017,6 +1014,17 @@ func NewEnvironment() (in *Cfg, err error) { } timeTrack.Record("[infra] deploying blockchains") + // Collect pool capabilities from all impls and compute valid cross-chain combinations. + capsBySelector := make(map[uint64][]devenvcommon.PoolCapability, len(impls)) + for i, impl := range impls { + networkInfo, lookupErr := chainsel.GetChainDetailsByChainIDAndFamily(in.Blockchains[i].ChainID, impl.ChainFamily()) + if lookupErr != nil { + return nil, lookupErr + } + capsBySelector[networkInfo.ChainSelector] = impl.GetSupportedPools() + } + combos := devenvcommon.ComputeTokenCombinations(capsBySelector, topology) + ds := datastore.NewMemoryDataStore() for i, impl := range impls { var networkInfo chainsel.ChainDetails @@ -1033,13 +1041,39 @@ func NewEnvironment() (in *Cfg, err error) { return nil, fmt.Errorf("failed to bump deployer nonce for chain %d: %w", networkInfo.ChainSelector, err) } } + // Per-chain accumulator so we can report all addresses deployed in + // this iteration (core contracts + tokens) to in.CLDF. + chainDS := datastore.NewMemoryDataStore() + var dsi datastore.DataStore dsi, err = impl.DeployContractsForSelector(ctx, e, networkInfo.ChainSelector, topology) if err != nil { return nil, err } + if err = ds.Merge(dsi); err != nil { + return nil, err + } + if err = chainDS.Merge(dsi); err != nil { + return nil, err + } + e.DataStore = ds.Seal() + + // Deploy generic tokens and pools via the chain-agnostic path. + // USDC and Lombard stay inside DeployContractsForSelector. + tokenDS := datastore.NewMemoryDataStore() + if err = DeployTokensAndPools(impl, e, networkInfo.ChainSelector, combos, tokenDS); err != nil { + return nil, fmt.Errorf("deploy tokens and pools for selector %d: %w", networkInfo.ChainSelector, err) + } + if err = ds.Merge(tokenDS.Seal()); err != nil { + return nil, err + } + if err = chainDS.Merge(tokenDS.Seal()); err != nil { + return nil, err + } + e.DataStore = ds.Seal() + var addresses []datastore.AddressRef - addresses, err = dsi.Addresses().Fetch() + addresses, err = chainDS.Seal().Addresses().Fetch() if err != nil { return nil, err } @@ -1049,9 +1083,6 @@ func NewEnvironment() (in *Cfg, err error) { return nil, err } in.CLDF.AddAddresses(string(a)) - if err = ds.Merge(dsi); err != nil { - return nil, err - } } e.DataStore = ds.Seal() /////////////////////////// @@ -1062,32 +1093,10 @@ func NewEnvironment() (in *Cfg, err error) { // START: Connect chains to each other // ///////////////////////////////////////// - // ConfigureTokensForTransfers must run first so token pools (including those used by CCTP/Lombard) - // have remote chain allowlists set. Otherwise sends can revert with custom error 0xa9902c7e (chain - // not allowed), where the error argument is the destination chain selector. - // Call it once per pool-identity group (e.g. all chains' configs for "BurnMintTokenPool 2.0.0 default"): - // an internal mapping is keyed such that the last config in the list gets the index for a given chain - // selector, so we invoke once per setup with all counterpart configs (same pool type on every chain) - // so remote tokens and mapping slots are correct. - // TODO: this code contains EVM specific logic and should be moved to EVM's impl.go, environment should - // fetch the token configs from impls and just run the changeset. - allTokenConfigs := tokenconfig.BuildTokenTransferConfigs(topology, selectors, e.DataStore) - if len(allTokenConfigs) > 0 { - byPoolIdentity := make(map[string][]tokenscore.TokenTransferConfig) - for i := range allTokenConfigs { - key := tokenconfig.PoolIdentityKey(&allTokenConfigs[i]) - byPoolIdentity[key] = append(byPoolIdentity[key], allTokenConfigs[i]) - } - tokenAdapterRegistry := tokenscore.GetTokenAdapterRegistry() - mcmsReaderRegistry := changesetscore.GetRegistry() - for _, group := range byPoolIdentity { - _, err = tokenscore.ConfigureTokensForTransfers(tokenAdapterRegistry, mcmsReaderRegistry).Apply(*e, tokenscore.ConfigureTokensForTransfersConfig{ - Tokens: group, - }) - if err != nil { - return nil, fmt.Errorf("configure tokens for transfers: %w", err) - } - } + // Configure cross-chain token transfers: each chain impl builds its own + // TokenTransferConfigs using chain-specific registry and CCV refs. + if err = ConfigureAllTokenTransfers(impls, selectors, e, topology); err != nil { + return nil, fmt.Errorf("configure all token transfers: %w", err) } var connectErr error diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index 471cccdb7..61ec0861c 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -48,6 +48,7 @@ import ( bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/link" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/weth" + "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/token_admin_registry" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_6_0/operations/rmn_remote" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" @@ -79,7 +80,6 @@ import ( tokenscore "github.com/smartcontractkit/chainlink-ccip/deployment/tokens" changesetsutils "github.com/smartcontractkit/chainlink-ccip/deployment/utils" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" - devenvmcms "github.com/smartcontractkit/chainlink-ccip/deployment/utils/mcms" ) const ( @@ -1178,16 +1178,10 @@ func (m *CCIP17EVMConfig) DeployContractsForSelector(ctx context.Context, env *d } env.DataStore = runningDS.Seal() - applicableCombos := devenvcommon.FilterTokenCombinations(devenvcommon.AllTokenCombinations(), topology, nil, nil) - for _, combo := range applicableCombos { - // For any given token combination, every chain needs to support the source and destination pools. - if err := m.deployTokenAndPool(env, mcmsReaderRegistry, runningDS, selector, combo.SourcePoolAddressRef()); err != nil { - return nil, fmt.Errorf("failed to deploy %s token: %w", combo.SourcePoolAddressRef().Qualifier, err) - } - if err := m.deployTokenAndPool(env, mcmsReaderRegistry, runningDS, selector, combo.DestPoolAddressRef()); err != nil { - return nil, fmt.Errorf("failed to deploy %s token: %w", combo.DestPoolAddressRef().Qualifier, err) - } - } + // Generic token + pool deployment is handled by the chain-agnostic + // DeployTokensAndPools function called from environment.go after this + // method returns. Only USDC and Lombard (which have bespoke deployment + // flows) remain here. if err := m.deployUSDCTokenAndPool(env, mcmsReaderRegistry, runningDS, create2FactoryRep.Output, selector); err != nil { return nil, fmt.Errorf("failed to deploy USDC token and pool: %w", err) @@ -1200,36 +1194,52 @@ func (m *CCIP17EVMConfig) DeployContractsForSelector(ctx context.Context, env *d return runningDS.Seal(), nil } -func (m *CCIP17EVMConfig) deployTokenAndPool( +// GetSupportedPools returns the pool types and versions the EVM chain can deploy. +func (m *CCIP17EVMConfig) GetSupportedPools() []devenvcommon.PoolCapability { + return []devenvcommon.PoolCapability{ + {PoolType: devenvcommon.BurnMintTokenPoolType, PoolVersion: semver.MustParse("1.6.1")}, + {PoolType: devenvcommon.BurnMintTokenPoolType, PoolVersion: semver.MustParse("2.0.0")}, + {PoolType: devenvcommon.LockReleaseTokenPoolType, PoolVersion: semver.MustParse("2.0.0")}, + } +} + +// GetTokenExpansionConfigs returns one TokenExpansionInputPerChain per token/pool +// that should be deployed on the given EVM chain, driven by the pre-computed +// token combinations. +func (m *CCIP17EVMConfig) GetTokenExpansionConfigs( env *deployment.Environment, - mcmsReaderRegistry *changesetscore.MCMSReaderRegistry, - runningDS *datastore.MemoryDataStore, selector uint64, - tokenPoolRef datastore.AddressRef, -) error { + combos []devenvcommon.TokenCombination, +) ([]tokenscore.TokenExpansionInputPerChain, error) { chain, ok := env.BlockChains.EVMChains()[selector] if !ok { - return fmt.Errorf("evm chain not found for selector %d", selector) + return nil, fmt.Errorf("evm chain not found for selector %d", selector) } deployerBalance, ok := big.NewInt(0).SetString(TokenDeployerBalance, 10) if !ok { - return errors.New("failed to parse deployer balance") + return nil, errors.New("failed to parse deployer balance") } - divisor := new(big.Int).Exp(big.NewInt(10), big.NewInt(DefaultDecimals), nil) preMintTokens := new(big.Int).Div(deployerBalance, divisor).Uint64() - out, err := tokenscore.TokenExpansion().Apply(*env, tokenscore.TokenExpansionInput{ - ChainAdapterVersion: tokenPoolRef.Version, - MCMS: devenvmcms.Input{}, - TokenExpansionInputPerChain: map[uint64]tokenscore.TokenExpansionInputPerChain{ - selector: { - TokenPoolVersion: tokenPoolRef.Version, + seen := make(map[string]bool) + var configs []tokenscore.TokenExpansionInputPerChain + + for _, combo := range combos { + for _, poolRef := range []datastore.AddressRef{combo.LocalPoolAddressRef(), combo.RemotePoolAddressRef()} { + key := string(poolRef.Type) + "\x00" + poolRef.Version.String() + "\x00" + poolRef.Qualifier + if seen[key] { + continue + } + seen[key] = true + + configs = append(configs, tokenscore.TokenExpansionInputPerChain{ + TokenPoolVersion: poolRef.Version, SkipOwnershipTransfer: true, DeployTokenInput: &tokenscore.DeployTokenInput{ - Symbol: tokenPoolRef.Qualifier, - Name: tokenPoolRef.Qualifier, + Symbol: poolRef.Qualifier, + Name: poolRef.Qualifier, Decimals: DefaultDecimals, Type: bnm_drip_v1_0.ContractType, ExternalAdmin: chain.DeployerKey.From.Hex(), @@ -1237,40 +1247,118 @@ func (m *CCIP17EVMConfig) deployTokenAndPool( PreMint: &preMintTokens, }, DeployTokenPoolInput: &tokenscore.DeployTokenPoolInput{ - PoolType: string(tokenPoolRef.Type), - TokenPoolQualifier: tokenPoolRef.Qualifier, + PoolType: string(poolRef.Type), + TokenPoolQualifier: poolRef.Qualifier, }, - }, - }, - }) - if err != nil { - return fmt.Errorf("failed to deploy %s token and pool: %w", tokenPoolRef.Qualifier, err) + }) + } } - err = runningDS.Merge(out.DataStore.Seal()) - if err != nil { - return fmt.Errorf("failed to merge datastore for %s token: %w", tokenPoolRef.Qualifier, err) + return configs, nil +} + +// PostTokenDeploy funds any lock-release token pools that were deployed on this EVM chain. +func (m *CCIP17EVMConfig) PostTokenDeploy( + env *deployment.Environment, + selector uint64, + deployedRefs []datastore.AddressRef, +) error { + deployerBalance, ok := big.NewInt(0).SetString(TokenDeployerBalance, 10) + if !ok { + return errors.New("failed to parse deployer balance") } + fundAmount := new(big.Int).Div(deployerBalance, big.NewInt(10)) - tokenPoolRef, err = runningDS.Addresses().Get(datastore.NewAddressRefKey(selector, tokenPoolRef.Type, tokenPoolRef.Version, tokenPoolRef.Qualifier)) - if err != nil { - return fmt.Errorf("failed to get deployed token pool ref for %s token: %w", tokenPoolRef.Qualifier, err) + for _, ref := range deployedRefs { + if ref.Type == datastore.ContractType(lock_release_token_pool.ContractType) { + if err := m.fundLockReleaseTokenPool(env, selector, ref, fundAmount); err != nil { + return fmt.Errorf("failed to fund lock-release token pool for %s token: %w", ref.Qualifier, err) + } + } } + return nil +} - if tokenPoolRef.Type == datastore.ContractType(lock_release_token_pool.ContractType) { - err = m.fundLockReleaseTokenPool( - env, - selector, - tokenPoolRef, - new(big.Int).Div(deployerBalance, big.NewInt(10)), - ) - if err != nil { - return fmt.Errorf("failed to fund lock-release token pool for %s token: %w", tokenPoolRef.Qualifier, err) +// GetTokenTransferConfigs builds TokenTransferConfig entries for all generic +// token pools deployed on this EVM chain, using EVM-specific registry and CCV refs. +func (m *CCIP17EVMConfig) GetTokenTransferConfigs( + env *deployment.Environment, + selector uint64, + remoteSelectors []uint64, + topology *ccipOffchain.EnvironmentTopology, +) ([]tokenscore.TokenTransferConfig, error) { + applicableCombos := devenvcommon.FilterTokenCombinations( + devenvcommon.AllTokenCombinations(), topology, env.DataStore, append([]uint64{selector}, remoteSelectors...), + ) + merged := make(map[string]tokenscore.TokenTransferConfig) + + for _, combo := range applicableCombos { + for _, pair := range []struct { + local, remote datastore.AddressRef + ccvQuals []string + }{ + {combo.LocalPoolAddressRef(), combo.RemotePoolAddressRef(), combo.LocalPoolCCVQualifiers()}, + {combo.RemotePoolAddressRef(), combo.LocalPoolAddressRef(), combo.RemotePoolCCVQualifiers()}, + } { + cfg := m.buildEVMTokenTransferConfig(selector, remoteSelectors, pair.local, pair.remote, pair.ccvQuals) + key := string(cfg.TokenPoolRef.Type) + "\x00" + cfg.TokenPoolRef.Version.String() + "\x00" + cfg.TokenPoolRef.Qualifier + if existing, ok := merged[key]; ok { + for k, v := range cfg.RemoteChains { + existing.RemoteChains[k] = v + } + merged[key] = existing + } else { + merged[key] = cfg + } } - return nil } - return nil + configs := make([]tokenscore.TokenTransferConfig, 0, len(merged)) + for _, cfg := range merged { + configs = append(configs, cfg) + } + return configs, nil +} + +func (m *CCIP17EVMConfig) buildEVMTokenTransferConfig( + selector uint64, + remoteSelectors []uint64, + localRef datastore.AddressRef, + remoteRef datastore.AddressRef, + ccvQualifiers []string, +) tokenscore.TokenTransferConfig { + remoteChains := make(map[uint64]tokenscore.RemoteChainConfig[*datastore.AddressRef, datastore.AddressRef]) + for _, rs := range remoteSelectors { + ccvRefs := make([]datastore.AddressRef, 0, len(ccvQualifiers)) + for _, qualifier := range ccvQualifiers { + ccvRefs = append(ccvRefs, datastore.AddressRef{ + Type: datastore.ContractType(versioned_verifier_resolver.CommitteeVerifierResolverType), + Version: versioned_verifier_resolver.Version, + Qualifier: qualifier, + }) + } + + remoteChains[rs] = tokenscore.RemoteChainConfig[*datastore.AddressRef, datastore.AddressRef]{ + RemotePool: &remoteRef, + DefaultFinalityInboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{}, + DefaultFinalityOutboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{}, + CustomFinalityInboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{}, + CustomFinalityOutboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{}, + OutboundCCVs: ccvRefs, + InboundCCVs: ccvRefs, + } + } + + return tokenscore.TokenTransferConfig{ + ChainSelector: selector, + TokenPoolRef: localRef, + RegistryRef: datastore.AddressRef{ + Type: datastore.ContractType(token_admin_registry.ContractType), + Version: semver.MustParse(token_admin_registry.Deploy.Version()), + }, + RemoteChains: remoteChains, + MinFinalityValue: 1, + } } func (m *CCIP17EVM) GetMaxDataBytes(ctx context.Context, remoteChainSelector uint64) (uint32, error) { diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index 084cc2c26..f99e5308a 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -10,11 +10,15 @@ import ( chainsel "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink-ccip/deployment/lanes" + tokenscore "github.com/smartcontractkit/chainlink-ccip/deployment/tokens" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" + devenvmcms "github.com/smartcontractkit/chainlink-ccip/deployment/utils/mcms" ccipAdapters "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" + devenvcommon "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" + "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-deployments-framework/operations" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" @@ -321,3 +325,149 @@ func buildCommitteeVerifierInputs( return verifiers } + +// --------------------------------------------------------------------------- +// Chain-agnostic token & pool deployment +// --------------------------------------------------------------------------- + +// DeployTokensAndPools collects TokenExpansion configs from each chain impl +// and deploys tokens and pools via the chain-agnostic TokenExpansion API. +// Each impl provides its chain-specific config (token type, decimals, admins, +// etc.) via GetTokenExpansionConfigs and handles post-deploy work (e.g. +// funding lock-release pools) via PostTokenDeploy. +// +// deltaDS accumulates only the addresses deployed by this function (the +// caller uses it to track per-chain additions). env.DataStore is kept +// up-to-date with the full state so that each TokenExpansion call can +// resolve previously deployed contracts. +func DeployTokensAndPools( + impl cciptestinterfaces.CCIP17Configuration, + env *deployment.Environment, + selector uint64, + combos []devenvcommon.TokenCombination, + deltaDS *datastore.MemoryDataStore, +) error { + configs, err := impl.GetTokenExpansionConfigs(env, selector, combos) + if err != nil { + return fmt.Errorf("get token expansion configs for selector %d: %w", selector, err) + } + if len(configs) == 0 { + return nil + } + + var deployedRefs []datastore.AddressRef + + for _, cfg := range configs { + poolInput := cfg.DeployTokenPoolInput + qualifier := "" + if poolInput != nil { + qualifier = poolInput.TokenPoolQualifier + } + + out, err := tokenscore.TokenExpansion().Apply(*env, tokenscore.TokenExpansionInput{ + ChainAdapterVersion: cfg.TokenPoolVersion, + MCMS: devenvmcms.Input{}, + TokenExpansionInputPerChain: map[uint64]tokenscore.TokenExpansionInputPerChain{ + selector: cfg, + }, + }) + if err != nil { + return fmt.Errorf("failed to deploy %s token and pool: %w", qualifier, err) + } + + if err := deltaDS.Merge(out.DataStore.Seal()); err != nil { + return fmt.Errorf("failed to merge delta datastore for %s token: %w", qualifier, err) + } + + fullDS := datastore.NewMemoryDataStore() + if err := fullDS.Merge(env.DataStore); err != nil { + return fmt.Errorf("failed to merge env datastore: %w", err) + } + if err := fullDS.Merge(out.DataStore.Seal()); err != nil { + return fmt.Errorf("failed to merge output datastore: %w", err) + } + env.DataStore = fullDS.Seal() + + if poolInput != nil { + ref, err := env.DataStore.Addresses().Get( + datastore.NewAddressRefKey( + selector, + datastore.ContractType(poolInput.PoolType), + cfg.TokenPoolVersion, + poolInput.TokenPoolQualifier, + ), + ) + if err != nil { + return fmt.Errorf("failed to get deployed token pool ref for %s: %w", qualifier, err) + } + deployedRefs = append(deployedRefs, ref) + } + } + + if err := impl.PostTokenDeploy(env, selector, deployedRefs); err != nil { + return fmt.Errorf("post-token-deploy for selector %d: %w", selector, err) + } + + return nil +} + +// --------------------------------------------------------------------------- +// Chain-agnostic token transfer configuration +// --------------------------------------------------------------------------- + +// ConfigureAllTokenTransfers collects TokenTransferConfigs from all chain +// impls, groups them by pool identity, and calls ConfigureTokensForTransfers +// once per group. This replaces the EVM-specific BuildTokenTransferConfigs +// call that previously lived in environment.go. +func ConfigureAllTokenTransfers( + impls []cciptestinterfaces.CCIP17Configuration, + selectors []uint64, + env *deployment.Environment, + topology *ccipOffchain.EnvironmentTopology, +) error { + // poolIdentityKey returns a key that groups configs across chains for the + // same pool type+version+qualifier. + poolIdentityKey := func(cfg *tokenscore.TokenTransferConfig) string { + v := "" + if cfg.TokenPoolRef.Version != nil { + v = cfg.TokenPoolRef.Version.String() + } + return string(cfg.TokenPoolRef.Type) + "\x00" + v + "\x00" + cfg.TokenPoolRef.Qualifier + } + + byPoolIdentity := make(map[string][]tokenscore.TokenTransferConfig) + + for i, impl := range impls { + remoteSelectors := make([]uint64, 0, len(selectors)-1) + for _, s := range selectors { + if s != selectors[i] { + remoteSelectors = append(remoteSelectors, s) + } + } + + cfgs, err := impl.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, topology) + if err != nil { + return fmt.Errorf("get token transfer configs for selector %d: %w", selectors[i], err) + } + for _, cfg := range cfgs { + key := poolIdentityKey(&cfg) + byPoolIdentity[key] = append(byPoolIdentity[key], cfg) + } + } + + if len(byPoolIdentity) == 0 { + return nil + } + + tokenAdapterRegistry := tokenscore.GetTokenAdapterRegistry() + mcmsReaderRegistry := changesetscore.GetRegistry() + for _, group := range byPoolIdentity { + _, err := tokenscore.ConfigureTokensForTransfers(tokenAdapterRegistry, mcmsReaderRegistry).Apply(*env, tokenscore.ConfigureTokensForTransfersConfig{ + Tokens: group, + }) + if err != nil { + return fmt.Errorf("configure tokens for transfers: %w", err) + } + } + return nil +} diff --git a/build/devenv/tests/e2e/smoke_test.go b/build/devenv/tests/e2e/smoke_test.go index 366d906e4..0c2c9e5c0 100644 --- a/build/devenv/tests/e2e/smoke_test.go +++ b/build/devenv/tests/e2e/smoke_test.go @@ -12,6 +12,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" ccv "github.com/smartcontractkit/chainlink-ccv/build/devenv" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" + "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" "github.com/smartcontractkit/chainlink-ccv/build/devenv/tests/e2e/tcapi" "github.com/smartcontractkit/chainlink-ccv/build/devenv/tests/e2e/tcapi/basic" "github.com/smartcontractkit/chainlink-ccv/build/devenv/tests/e2e/tcapi/token_transfer" @@ -58,7 +59,8 @@ func TestE2ESmoke_Basic(t *testing.T) { }) t.Run("extra args v3 token transfer", func(t *testing.T) { - for _, tc := range token_transfer.All(src, dest) { + combos := common.AllTokenCombinations() + for _, tc := range token_transfer.All(src, dest, combos) { if tc.HavePrerequisites(ctx, cfg) { t.Run(tc.Name(), func(t *testing.T) { subtestCtx := ccv.Plog.WithContext(t.Context()) @@ -68,7 +70,7 @@ func TestE2ESmoke_Basic(t *testing.T) { t.Logf("Skipping %s because current environment does not have the prerequisites", tc.Name()) } } - for _, tc := range token_transfer.All17(src, dest) { + for _, tc := range token_transfer.All17(src, dest, combos) { if tc.HavePrerequisites(ctx, cfg) { t.Run(tc.Name(), func(t *testing.T) { subtestCtx := ccv.Plog.WithContext(t.Context()) diff --git a/build/devenv/tests/e2e/tcapi/token_transfer/v3.go b/build/devenv/tests/e2e/tcapi/token_transfer/v3.go index 714381455..3cf032796 100644 --- a/build/devenv/tests/e2e/tcapi/token_transfer/v3.go +++ b/build/devenv/tests/e2e/tcapi/token_transfer/v3.go @@ -56,19 +56,19 @@ func (tc *tokenTransferV3TestCase) Run(ctx context.Context, harness tcapi.TestHa if err != nil { return fmt.Errorf("get receiver start balance: %w", err) } - l.Info().Str("Receiver", tc.receiver.String()).Uint64("StartBalance", startBal.Uint64()).Str("Token", tc.combo.DestPoolAddressRef().Qualifier).Msg("receiver start balance") + l.Info().Str("Receiver", tc.receiver.String()).Uint64("StartBalance", startBal.Uint64()).Str("Token", tc.combo.RemotePoolAddressRef().Qualifier).Msg("receiver start balance") srcStartBal, err := tc.src.GetTokenBalance(ctx, tc.sender, tc.srcToken) if err != nil { return fmt.Errorf("get sender start balance: %w", err) } - l.Info().Str("Sender", tc.sender.String()).Uint64("SrcStartBalance", srcStartBal.Uint64()).Str("Token", tc.combo.SourcePoolAddressRef().Qualifier).Msg("sender start balance") + l.Info().Str("Sender", tc.sender.String()).Uint64("SrcStartBalance", srcStartBal.Uint64()).Str("Token", tc.combo.LocalPoolAddressRef().Qualifier).Msg("sender start balance") seqNo, err := tc.src.GetExpectedNextSequenceNumber(ctx, tc.dst.ChainSelector()) if err != nil { return fmt.Errorf("get expected next sequence number: %w", err) } - l.Info().Uint64("SeqNo", seqNo).Str("Token", tc.combo.SourcePoolAddressRef().Qualifier).Msg("expecting sequence number") + l.Info().Uint64("SeqNo", seqNo).Str("Token", tc.combo.LocalPoolAddressRef().Qualifier).Msg("expecting sequence number") sendRes, err := tc.src.SendMessage( ctx, tc.dst.ChainSelector(), @@ -138,7 +138,7 @@ func (tc *tokenTransferV3TestCase) Run(ctx context.Context, harness tcapi.TestHa if endBal.Cmp(expectedEndBal) != 0 { return fmt.Errorf("receiver end balance: expected %s, got %s", expectedEndBal.String(), endBal.String()) } - l.Info().Uint64("EndBalance", endBal.Uint64()).Str("Token", tc.combo.DestPoolAddressRef().Qualifier).Msg("receiver end balance") + l.Info().Uint64("EndBalance", endBal.Uint64()).Str("Token", tc.combo.RemotePoolAddressRef().Qualifier).Msg("receiver end balance") srcEndBal, err := tc.src.GetTokenBalance(ctx, tc.sender, tc.srcToken) if err != nil { @@ -148,7 +148,7 @@ func (tc *tokenTransferV3TestCase) Run(ctx context.Context, harness tcapi.TestHa if srcEndBal.Cmp(expectedSrcEndBal) != 0 { return fmt.Errorf("sender end balance: expected %s, got %s", expectedSrcEndBal.String(), srcEndBal.String()) } - l.Info().Uint64("SrcEndBalance", srcEndBal.Uint64()).Str("Token", tc.combo.SourcePoolAddressRef().Qualifier).Msg("sender end balance") + l.Info().Uint64("SrcEndBalance", srcEndBal.Uint64()).Str("Token", tc.combo.LocalPoolAddressRef().Qualifier).Msg("sender end balance") return nil } @@ -198,12 +198,12 @@ func tokenTransferCase(src, dest cciptestinterfaces.CCIP17, combo common.TokenCo return false } - srcQualifier := tc.combo.SourcePoolAddressRef().Qualifier + srcQualifier := tc.combo.LocalPoolAddressRef().Qualifier tc.srcToken, err = getTokenAddress(cfg, tc.src.ChainSelector(), srcQualifier) if err != nil { return false } - destQualifier := tc.combo.DestPoolAddressRef().Qualifier + destQualifier := tc.combo.RemotePoolAddressRef().Qualifier tc.destToken, err = getTokenAddress(cfg, tc.dst.ChainSelector(), destQualifier) if err != nil { return false @@ -215,22 +215,27 @@ func tokenTransferCase(src, dest cciptestinterfaces.CCIP17, combo common.TokenCo } } -// All returns test cases for all token combinations with EOA receiver and combo finality. -func All(src, dest cciptestinterfaces.CCIP17) []tcapi.TestCase { - out := make([]tcapi.TestCase, 0, len(common.AllTokenCombinations())) - for _, combo := range common.AllTokenCombinations() { - name := fmt.Sprintf("token transfer EOA (%s)", combo.SourcePoolAddressRef().Qualifier) +// All returns test cases for the given token combinations with EOA receiver and combo finality. +func All(src, dest cciptestinterfaces.CCIP17, combos []common.TokenCombination) []tcapi.TestCase { + out := make([]tcapi.TestCase, 0, len(combos)) + for _, combo := range combos { + name := fmt.Sprintf("token transfer EOA (%s)", combo.LocalPoolAddressRef().Qualifier) out = append(out, tokenTransferCase(src, dest, combo, combo.FinalityConfig(), true, name)) } return out } -// All17 returns test cases for 1.7.0 token combinations: EOA and mock receiver with default finality (0). -func All17(src, dest cciptestinterfaces.CCIP17) []tcapi.TestCase { - combos := common.All17TokenCombinations() - out := make([]tcapi.TestCase, 0, len(combos)*2) - for _, combo := range combos { - qual := combo.SourcePoolAddressRef().Qualifier +// All17 returns test cases for 2.0.0-only token combinations: EOA and mock receiver with default finality (0). +func All17(src, dest cciptestinterfaces.CCIP17, combos []common.TokenCombination) []tcapi.TestCase { + var filtered []common.TokenCombination + for _, tc := range combos { + if common.Is17Combination(tc) { + filtered = append(filtered, tc) + } + } + out := make([]tcapi.TestCase, 0, len(filtered)*2) + for _, combo := range filtered { + qual := combo.LocalPoolAddressRef().Qualifier out = append(out, tokenTransferCase(src, dest, combo, 0, true, fmt.Sprintf("token transfer 1.7.0 EOA default finality (%s)", qual)), tokenTransferCase(src, dest, combo, 0, false, fmt.Sprintf("token transfer 1.7.0 mock receiver default finality (%s)", qual)), diff --git a/build/devenv/tokenconfig/config.go b/build/devenv/tokenconfig/config.go deleted file mode 100644 index a000fb969..000000000 --- a/build/devenv/tokenconfig/config.go +++ /dev/null @@ -1,136 +0,0 @@ -package tokenconfig - -import ( - "maps" - - "github.com/Masterminds/semver/v3" - - "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/versioned_verifier_resolver" - "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/token_admin_registry" - tokenscore "github.com/smartcontractkit/chainlink-ccip/deployment/tokens" - "github.com/smartcontractkit/chainlink-deployments-framework/datastore" - - "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" - "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" -) - -// poolConfigKey uniquely identifies a token pool (for merging configs per chain). -type poolConfigKey struct { - chainSelector uint64 - poolType datastore.ContractType - poolVersion string - poolQualifier string -} - -// BuildTokenTransferConfigs returns token transfer configs for all chains implied by selectors, -// based on topology and token combinations. Configs for the same (chain, pool) are merged so -// each pool has one config with all remote chains (remote tokens included). Caller should call -// ConfigureTokensForTransfers once per pool-identity group (all chains' configs for that pool type) -// so each setup gets its own mapping slot. Chain-agnostic: no EVM or other chain impl is used. -// Combinations are dropped when ds is non-nil if any selector is missing either pool from the -// pair in the datastore (see common.FilterTokenCombinations). -func BuildTokenTransferConfigs(topology *offchain.EnvironmentTopology, selectors []uint64, ds datastore.DataStore) []tokenscore.TokenTransferConfig { - applicableCombos := common.FilterTokenCombinations(common.AllTokenCombinations(), topology, ds, selectors) - merged := make(map[poolConfigKey]tokenscore.TokenTransferConfig) - for _, selector := range selectors { - remoteSelectors := make([]uint64, 0, len(selectors)-1) - for _, s := range selectors { - if s != selector { - remoteSelectors = append(remoteSelectors, s) - } - } - for _, combo := range applicableCombos { - // Both directions so LockRelease<->BurnMint: local LockRelease has remote BurnMint, local BurnMint has remote LockRelease. - for _, cfg := range []tokenscore.TokenTransferConfig{ - buildTokenTransferConfig(selector, remoteSelectors, combo.SourcePoolAddressRef(), combo.DestPoolAddressRef(), combo.SourcePoolCCVQualifiers()), - buildTokenTransferConfig(selector, remoteSelectors, combo.DestPoolAddressRef(), combo.SourcePoolAddressRef(), combo.DestPoolCCVQualifiers()), - } { - key := poolConfigKey{ - chainSelector: cfg.ChainSelector, - poolType: cfg.TokenPoolRef.Type, - poolVersion: cfg.TokenPoolRef.Version.String(), - poolQualifier: cfg.TokenPoolRef.Qualifier, - } - existing, ok := merged[key] - if !ok { - merged[key] = cfg - continue - } - maps.Copy(existing.RemoteChains, cfg.RemoteChains) - merged[key] = existing - } - } - } - configs := make([]tokenscore.TokenTransferConfig, 0, len(merged)) - for _, cfg := range merged { - configs = append(configs, cfg) - } - return configs -} - -// PoolIdentityKey returns a key that identifies the pool type (same across chains). Used to group -// configs so ConfigureTokensForTransfers is called once per setup with all counterpart configs. -func PoolIdentityKey(cfg *tokenscore.TokenTransferConfig) string { - v := "" - if cfg.TokenPoolRef.Version != nil { - v = cfg.TokenPoolRef.Version.String() - } - return string(cfg.TokenPoolRef.Type) + "\x00" + v + "\x00" + cfg.TokenPoolRef.Qualifier -} - -func buildTokenTransferConfig( - selector uint64, - remoteSelectors []uint64, - localRef datastore.AddressRef, - remoteRef datastore.AddressRef, - ccvQualifiers []string, -) tokenscore.TokenTransferConfig { - tokensRemoteChains := make(map[uint64]tokenscore.RemoteChainConfig[*datastore.AddressRef, datastore.AddressRef]) - for _, rs := range remoteSelectors { - ccvRefs := make([]datastore.AddressRef, 0, len(ccvQualifiers)) - for _, qualifier := range ccvQualifiers { - ccvRefs = append(ccvRefs, datastore.AddressRef{ - Type: datastore.ContractType(versioned_verifier_resolver.CommitteeVerifierResolverType), - Version: versioned_verifier_resolver.Version, - Qualifier: qualifier, - }) - } - - tokensRemoteChains[rs] = tokenscore.RemoteChainConfig[*datastore.AddressRef, datastore.AddressRef]{ - RemotePool: &remoteRef, - DefaultFinalityInboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{ - IsEnabled: false, - Capacity: 0, - Rate: 0, - }, - DefaultFinalityOutboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{ - IsEnabled: false, - Capacity: 0, - Rate: 0, - }, - CustomFinalityInboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{ - IsEnabled: false, - Capacity: 0, - Rate: 0, - }, - CustomFinalityOutboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{ - IsEnabled: false, - Capacity: 0, - Rate: 0, - }, - OutboundCCVs: ccvRefs, - InboundCCVs: ccvRefs, - } - } - - return tokenscore.TokenTransferConfig{ - ChainSelector: selector, - TokenPoolRef: localRef, - RegistryRef: datastore.AddressRef{ - Type: datastore.ContractType(token_admin_registry.ContractType), - Version: semver.MustParse(token_admin_registry.Deploy.Version()), - }, - RemoteChains: tokensRemoteChains, - MinFinalityValue: 1, - } -} From ef4edd90b44d4341e1a83c0e37b1cc4e6da8eea3 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Fri, 3 Apr 2026 03:54:56 -0700 Subject: [PATCH 11/28] lint --- build/devenv/common/common.go | 22 +++++++++++----------- build/devenv/evm/impl.go | 11 +++++------ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/build/devenv/common/common.go b/build/devenv/common/common.go index 4c632b438..d7d3caedc 100644 --- a/build/devenv/common/common.go +++ b/build/devenv/common/common.go @@ -54,13 +54,13 @@ type PoolCapability struct { // on the chain being configured; "remote" is the counterpart on the other chain. // Because every chain deploys both pools, a transfer can flow in either direction. type TokenCombination struct { - localPoolType string - localPoolVersion string - localPoolQualifier string - localPoolCCVQualifiers []string - remotePoolType string - remotePoolVersion string - remotePoolQualifier string + localPoolType string + localPoolVersion string + localPoolQualifier string + localPoolCCVQualifiers []string + remotePoolType string + remotePoolVersion string + remotePoolQualifier string remotePoolCCVQualifiers []string expectedReceiptIssuers int expectedVerifierResults int @@ -123,10 +123,10 @@ func (s TokenCombination) FinalityConfig() protocol.Finality { func AllTokenCombinations() []TokenCombination { return []TokenCombination{ { // 1.6.1 burn <-> 1.6.1 burn - localPoolType: BurnMintTokenPoolType, - localPoolVersion: "1.6.1", - remotePoolType: BurnMintTokenPoolType, - remotePoolVersion: "1.6.1", + localPoolType: BurnMintTokenPoolType, + localPoolVersion: "1.6.1", + remotePoolType: BurnMintTokenPoolType, + remotePoolVersion: "1.6.1", expectedReceiptIssuers: 4, // default CCV, token pool, executor, network fee expectedVerifierResults: 1, // default CCV }, diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index 61ec0861c..d0a968ca4 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "maps" "math" "math/big" "os" @@ -1303,9 +1304,7 @@ func (m *CCIP17EVMConfig) GetTokenTransferConfigs( cfg := m.buildEVMTokenTransferConfig(selector, remoteSelectors, pair.local, pair.remote, pair.ccvQuals) key := string(cfg.TokenPoolRef.Type) + "\x00" + cfg.TokenPoolRef.Version.String() + "\x00" + cfg.TokenPoolRef.Qualifier if existing, ok := merged[key]; ok { - for k, v := range cfg.RemoteChains { - existing.RemoteChains[k] = v - } + maps.Copy(existing.RemoteChains, cfg.RemoteChains) merged[key] = existing } else { merged[key] = cfg @@ -1339,13 +1338,13 @@ func (m *CCIP17EVMConfig) buildEVMTokenTransferConfig( } remoteChains[rs] = tokenscore.RemoteChainConfig[*datastore.AddressRef, datastore.AddressRef]{ - RemotePool: &remoteRef, + RemotePool: &remoteRef, DefaultFinalityInboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{}, DefaultFinalityOutboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{}, CustomFinalityInboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{}, CustomFinalityOutboundRateLimiterConfig: tokenscore.RateLimiterConfigFloatInput{}, - OutboundCCVs: ccvRefs, - InboundCCVs: ccvRefs, + OutboundCCVs: ccvRefs, + InboundCCVs: ccvRefs, } } From 8d78711799fd2ca0ce9572ff1adcf18f89464e74 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Fri, 3 Apr 2026 09:05:48 -0700 Subject: [PATCH 12/28] comments --- build/devenv/cciptestinterfaces/interface.go | 4 +++- build/devenv/common/common.go | 24 +++++++++---------- build/devenv/environment.go | 3 ++- build/devenv/evm/impl.go | 8 +++---- build/devenv/implcommon.go | 4 ++-- .../tests/e2e/tcapi/token_transfer/v3.go | 8 +++---- 6 files changed, 26 insertions(+), 25 deletions(-) diff --git a/build/devenv/cciptestinterfaces/interface.go b/build/devenv/cciptestinterfaces/interface.go index c07061844..6ed7be892 100644 --- a/build/devenv/cciptestinterfaces/interface.go +++ b/build/devenv/cciptestinterfaces/interface.go @@ -247,11 +247,13 @@ type TokenConfigProvider interface { // GetTokenTransferConfigs builds TokenTransferConfig entries for all pools // deployed on this chain, using chain-specific registry and CCV refs. + // combos should be the same set used during deployment so transfer + // configuration is derived from the same source of truth. GetTokenTransferConfigs( env *deployment.Environment, selector uint64, remoteSelectors []uint64, - topology *offchain.EnvironmentTopology, + combos []devenvcommon.TokenCombination, ) ([]tokensapi.TokenTransferConfig, error) } diff --git a/build/devenv/common/common.go b/build/devenv/common/common.go index d7d3caedc..30fcf6d41 100644 --- a/build/devenv/common/common.go +++ b/build/devenv/common/common.go @@ -285,26 +285,24 @@ func ComputeTokenCombinations( if !isCompatible(local.poolType, remote.poolType) { continue } - // At least two chains must support the required types. - localCount, remoteCount := 0, 0 - for _, caps := range capabilities { - hasLocal, hasRemote := false, false + // At least two distinct chains must participate: one supporting + // the local pool type and one supporting the remote pool type + // (they may be the same chain if it supports both). + distinctChains := make(map[uint64]bool) + localSupported, remoteSupported := false, false + for sel, caps := range capabilities { for _, c := range caps { if c.PoolType == local.poolType && c.PoolVersion.String() == local.version { - hasLocal = true + localSupported = true + distinctChains[sel] = true } if c.PoolType == remote.poolType && c.PoolVersion.String() == remote.version { - hasRemote = true + remoteSupported = true + distinctChains[sel] = true } } - if hasLocal { - localCount++ - } - if hasRemote { - remoteCount++ - } } - if localCount == 0 || remoteCount == 0 || (localCount+remoteCount) < 2 { + if !localSupported || !remoteSupported || len(distinctChains) < 2 { continue } diff --git a/build/devenv/environment.go b/build/devenv/environment.go index 060d6d3c8..1d6fe89e0 100644 --- a/build/devenv/environment.go +++ b/build/devenv/environment.go @@ -1095,7 +1095,8 @@ func NewEnvironment() (in *Cfg, err error) { // Configure cross-chain token transfers: each chain impl builds its own // TokenTransferConfigs using chain-specific registry and CCV refs. - if err = ConfigureAllTokenTransfers(impls, selectors, e, topology); err != nil { + // Pass the same combos used for deployment so both steps use the same source of truth. + if err = ConfigureAllTokenTransfers(impls, selectors, e, combos); err != nil { return nil, fmt.Errorf("configure all token transfers: %w", err) } diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index d0a968ca4..1792589ab 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -1282,15 +1282,15 @@ func (m *CCIP17EVMConfig) PostTokenDeploy( // GetTokenTransferConfigs builds TokenTransferConfig entries for all generic // token pools deployed on this EVM chain, using EVM-specific registry and CCV refs. +// combos should be the same set used during deployment. func (m *CCIP17EVMConfig) GetTokenTransferConfigs( env *deployment.Environment, selector uint64, remoteSelectors []uint64, - topology *ccipOffchain.EnvironmentTopology, + combos []devenvcommon.TokenCombination, ) ([]tokenscore.TokenTransferConfig, error) { - applicableCombos := devenvcommon.FilterTokenCombinations( - devenvcommon.AllTokenCombinations(), topology, env.DataStore, append([]uint64{selector}, remoteSelectors...), - ) + allSelectors := append([]uint64{selector}, remoteSelectors...) + applicableCombos := devenvcommon.FilterTokenCombinations(combos, nil, env.DataStore, allSelectors) merged := make(map[string]tokenscore.TokenTransferConfig) for _, combo := range applicableCombos { diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index f99e5308a..2d819f784 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -423,7 +423,7 @@ func ConfigureAllTokenTransfers( impls []cciptestinterfaces.CCIP17Configuration, selectors []uint64, env *deployment.Environment, - topology *ccipOffchain.EnvironmentTopology, + combos []devenvcommon.TokenCombination, ) error { // poolIdentityKey returns a key that groups configs across chains for the // same pool type+version+qualifier. @@ -445,7 +445,7 @@ func ConfigureAllTokenTransfers( } } - cfgs, err := impl.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, topology) + cfgs, err := impl.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, combos) if err != nil { return fmt.Errorf("get token transfer configs for selector %d: %w", selectors[i], err) } diff --git a/build/devenv/tests/e2e/tcapi/token_transfer/v3.go b/build/devenv/tests/e2e/tcapi/token_transfer/v3.go index 3cf032796..e86e59f45 100644 --- a/build/devenv/tests/e2e/tcapi/token_transfer/v3.go +++ b/build/devenv/tests/e2e/tcapi/token_transfer/v3.go @@ -11,7 +11,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/sequences" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/mock_receiver_v2" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/proxy" - "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" + bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" ccv "github.com/smartcontractkit/chainlink-ccv/build/devenv" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" @@ -159,10 +159,10 @@ func (tc *tokenTransferV3TestCase) HavePrerequisites(ctx context.Context, cfg *c func getTokenAddress(cfg *ccv.Cfg, chainSelector uint64, qualifier string) (protocol.UnknownAddress, error) { return tcapi.GetContractAddress(cfg, chainSelector, - datastore.ContractType(burn_mint_erc20_with_drip.ContractType), - burn_mint_erc20_with_drip.Deploy.Version(), + datastore.ContractType(bnm_drip_v1_0.ContractType), + bnm_drip_v1_0.Deploy.Version(), qualifier, - "burn mint erc677") + "burn mint erc20 with drip") } // TokenTransfer returns a single token transfer test case for the given combo, finality, receiver type, and name. From 73aca1eb6aef8316e8c9dbc44471858cdc075d54 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Fri, 3 Apr 2026 09:42:42 -0700 Subject: [PATCH 13/28] Revert "comments" This reverts commit 8d78711799fd2ca0ce9572ff1adcf18f89464e74. --- build/devenv/cciptestinterfaces/interface.go | 4 +--- build/devenv/common/common.go | 24 ++++++++++--------- build/devenv/environment.go | 3 +-- build/devenv/evm/impl.go | 8 +++---- build/devenv/implcommon.go | 4 ++-- .../tests/e2e/tcapi/token_transfer/v3.go | 8 +++---- 6 files changed, 25 insertions(+), 26 deletions(-) diff --git a/build/devenv/cciptestinterfaces/interface.go b/build/devenv/cciptestinterfaces/interface.go index 6ed7be892..c07061844 100644 --- a/build/devenv/cciptestinterfaces/interface.go +++ b/build/devenv/cciptestinterfaces/interface.go @@ -247,13 +247,11 @@ type TokenConfigProvider interface { // GetTokenTransferConfigs builds TokenTransferConfig entries for all pools // deployed on this chain, using chain-specific registry and CCV refs. - // combos should be the same set used during deployment so transfer - // configuration is derived from the same source of truth. GetTokenTransferConfigs( env *deployment.Environment, selector uint64, remoteSelectors []uint64, - combos []devenvcommon.TokenCombination, + topology *offchain.EnvironmentTopology, ) ([]tokensapi.TokenTransferConfig, error) } diff --git a/build/devenv/common/common.go b/build/devenv/common/common.go index 30fcf6d41..d7d3caedc 100644 --- a/build/devenv/common/common.go +++ b/build/devenv/common/common.go @@ -285,24 +285,26 @@ func ComputeTokenCombinations( if !isCompatible(local.poolType, remote.poolType) { continue } - // At least two distinct chains must participate: one supporting - // the local pool type and one supporting the remote pool type - // (they may be the same chain if it supports both). - distinctChains := make(map[uint64]bool) - localSupported, remoteSupported := false, false - for sel, caps := range capabilities { + // At least two chains must support the required types. + localCount, remoteCount := 0, 0 + for _, caps := range capabilities { + hasLocal, hasRemote := false, false for _, c := range caps { if c.PoolType == local.poolType && c.PoolVersion.String() == local.version { - localSupported = true - distinctChains[sel] = true + hasLocal = true } if c.PoolType == remote.poolType && c.PoolVersion.String() == remote.version { - remoteSupported = true - distinctChains[sel] = true + hasRemote = true } } + if hasLocal { + localCount++ + } + if hasRemote { + remoteCount++ + } } - if !localSupported || !remoteSupported || len(distinctChains) < 2 { + if localCount == 0 || remoteCount == 0 || (localCount+remoteCount) < 2 { continue } diff --git a/build/devenv/environment.go b/build/devenv/environment.go index 1d6fe89e0..060d6d3c8 100644 --- a/build/devenv/environment.go +++ b/build/devenv/environment.go @@ -1095,8 +1095,7 @@ func NewEnvironment() (in *Cfg, err error) { // Configure cross-chain token transfers: each chain impl builds its own // TokenTransferConfigs using chain-specific registry and CCV refs. - // Pass the same combos used for deployment so both steps use the same source of truth. - if err = ConfigureAllTokenTransfers(impls, selectors, e, combos); err != nil { + if err = ConfigureAllTokenTransfers(impls, selectors, e, topology); err != nil { return nil, fmt.Errorf("configure all token transfers: %w", err) } diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index 1792589ab..d0a968ca4 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -1282,15 +1282,15 @@ func (m *CCIP17EVMConfig) PostTokenDeploy( // GetTokenTransferConfigs builds TokenTransferConfig entries for all generic // token pools deployed on this EVM chain, using EVM-specific registry and CCV refs. -// combos should be the same set used during deployment. func (m *CCIP17EVMConfig) GetTokenTransferConfigs( env *deployment.Environment, selector uint64, remoteSelectors []uint64, - combos []devenvcommon.TokenCombination, + topology *ccipOffchain.EnvironmentTopology, ) ([]tokenscore.TokenTransferConfig, error) { - allSelectors := append([]uint64{selector}, remoteSelectors...) - applicableCombos := devenvcommon.FilterTokenCombinations(combos, nil, env.DataStore, allSelectors) + applicableCombos := devenvcommon.FilterTokenCombinations( + devenvcommon.AllTokenCombinations(), topology, env.DataStore, append([]uint64{selector}, remoteSelectors...), + ) merged := make(map[string]tokenscore.TokenTransferConfig) for _, combo := range applicableCombos { diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index 2d819f784..f99e5308a 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -423,7 +423,7 @@ func ConfigureAllTokenTransfers( impls []cciptestinterfaces.CCIP17Configuration, selectors []uint64, env *deployment.Environment, - combos []devenvcommon.TokenCombination, + topology *ccipOffchain.EnvironmentTopology, ) error { // poolIdentityKey returns a key that groups configs across chains for the // same pool type+version+qualifier. @@ -445,7 +445,7 @@ func ConfigureAllTokenTransfers( } } - cfgs, err := impl.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, combos) + cfgs, err := impl.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, topology) if err != nil { return fmt.Errorf("get token transfer configs for selector %d: %w", selectors[i], err) } diff --git a/build/devenv/tests/e2e/tcapi/token_transfer/v3.go b/build/devenv/tests/e2e/tcapi/token_transfer/v3.go index e86e59f45..3cf032796 100644 --- a/build/devenv/tests/e2e/tcapi/token_transfer/v3.go +++ b/build/devenv/tests/e2e/tcapi/token_transfer/v3.go @@ -11,7 +11,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/sequences" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/mock_receiver_v2" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/proxy" - bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" + "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" ccv "github.com/smartcontractkit/chainlink-ccv/build/devenv" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" @@ -159,10 +159,10 @@ func (tc *tokenTransferV3TestCase) HavePrerequisites(ctx context.Context, cfg *c func getTokenAddress(cfg *ccv.Cfg, chainSelector uint64, qualifier string) (protocol.UnknownAddress, error) { return tcapi.GetContractAddress(cfg, chainSelector, - datastore.ContractType(bnm_drip_v1_0.ContractType), - bnm_drip_v1_0.Deploy.Version(), + datastore.ContractType(burn_mint_erc20_with_drip.ContractType), + burn_mint_erc20_with_drip.Deploy.Version(), qualifier, - "burn mint erc20 with drip") + "burn mint erc677") } // TokenTransfer returns a single token transfer test case for the given combo, finality, receiver type, and name. From eb6bad7cdc7e44345da9dc1dd7676ffe68e07c64 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Fri, 3 Apr 2026 10:59:19 -0700 Subject: [PATCH 14/28] comments --- build/devenv/cciptestinterfaces/interface.go | 4 ++- build/devenv/common/common.go | 25 ++++++++++++------- build/devenv/environment.go | 2 +- build/devenv/evm/impl.go | 8 +++--- build/devenv/implcommon.go | 4 +-- .../tests/e2e/tcapi/token_transfer/v3.go | 6 ++--- 6 files changed, 29 insertions(+), 20 deletions(-) diff --git a/build/devenv/cciptestinterfaces/interface.go b/build/devenv/cciptestinterfaces/interface.go index c07061844..6ed7be892 100644 --- a/build/devenv/cciptestinterfaces/interface.go +++ b/build/devenv/cciptestinterfaces/interface.go @@ -247,11 +247,13 @@ type TokenConfigProvider interface { // GetTokenTransferConfigs builds TokenTransferConfig entries for all pools // deployed on this chain, using chain-specific registry and CCV refs. + // combos should be the same set used during deployment so transfer + // configuration is derived from the same source of truth. GetTokenTransferConfigs( env *deployment.Environment, selector uint64, remoteSelectors []uint64, - topology *offchain.EnvironmentTopology, + combos []devenvcommon.TokenCombination, ) ([]tokensapi.TokenTransferConfig, error) } diff --git a/build/devenv/common/common.go b/build/devenv/common/common.go index d7d3caedc..7b95f6ec0 100644 --- a/build/devenv/common/common.go +++ b/build/devenv/common/common.go @@ -285,9 +285,10 @@ func ComputeTokenCombinations( if !isCompatible(local.poolType, remote.poolType) { continue } - // At least two chains must support the required types. - localCount, remoteCount := 0, 0 - for _, caps := range capabilities { + // At least two *distinct* chains must support the required types. + localSupported, remoteSupported := false, false + distinctChains := make(map[uint64]bool) + for sel, caps := range capabilities { hasLocal, hasRemote := false, false for _, c := range caps { if c.PoolType == local.poolType && c.PoolVersion.String() == local.version { @@ -298,13 +299,15 @@ func ComputeTokenCombinations( } } if hasLocal { - localCount++ + localSupported = true + distinctChains[sel] = true } if hasRemote { - remoteCount++ + remoteSupported = true + distinctChains[sel] = true } } - if localCount == 0 || remoteCount == 0 || (localCount+remoteCount) < 2 { + if !localSupported || !remoteSupported || len(distinctChains) < 2 { continue } @@ -400,13 +403,17 @@ func qualifiersAvailable(qualifiers []string, topology *offchain.EnvironmentTopo // all exist as committees in the topology, and when ds is non-nil, whose local and // remote pool address refs exist in ds for every selector (each chain deploys both // pools across bidirectional transfer configs). +// Pass topology nil to skip the topology/qualifier check (e.g. when combos were +// already computed with topology taken into account). // Pass ds nil to skip the datastore check. func FilterTokenCombinations(combos []TokenCombination, topology *offchain.EnvironmentTopology, ds datastore.DataStore, selectors []uint64) []TokenCombination { filtered := make([]TokenCombination, 0, len(combos)) for _, combo := range combos { - if !qualifiersAvailable(combo.LocalPoolCCVQualifiers(), topology) || - !qualifiersAvailable(combo.RemotePoolCCVQualifiers(), topology) { - continue + if topology != nil { + if !qualifiersAvailable(combo.LocalPoolCCVQualifiers(), topology) || + !qualifiersAvailable(combo.RemotePoolCCVQualifiers(), topology) { + continue + } } if ds != nil && len(selectors) > 0 && !tokenCombinationPoolsExistInDataStore(ds, selectors, combo) { continue diff --git a/build/devenv/environment.go b/build/devenv/environment.go index 060d6d3c8..2194f205e 100644 --- a/build/devenv/environment.go +++ b/build/devenv/environment.go @@ -1095,7 +1095,7 @@ func NewEnvironment() (in *Cfg, err error) { // Configure cross-chain token transfers: each chain impl builds its own // TokenTransferConfigs using chain-specific registry and CCV refs. - if err = ConfigureAllTokenTransfers(impls, selectors, e, topology); err != nil { + if err = ConfigureAllTokenTransfers(impls, selectors, e, combos); err != nil { return nil, fmt.Errorf("configure all token transfers: %w", err) } diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index d0a968ca4..1792589ab 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -1282,15 +1282,15 @@ func (m *CCIP17EVMConfig) PostTokenDeploy( // GetTokenTransferConfigs builds TokenTransferConfig entries for all generic // token pools deployed on this EVM chain, using EVM-specific registry and CCV refs. +// combos should be the same set used during deployment. func (m *CCIP17EVMConfig) GetTokenTransferConfigs( env *deployment.Environment, selector uint64, remoteSelectors []uint64, - topology *ccipOffchain.EnvironmentTopology, + combos []devenvcommon.TokenCombination, ) ([]tokenscore.TokenTransferConfig, error) { - applicableCombos := devenvcommon.FilterTokenCombinations( - devenvcommon.AllTokenCombinations(), topology, env.DataStore, append([]uint64{selector}, remoteSelectors...), - ) + allSelectors := append([]uint64{selector}, remoteSelectors...) + applicableCombos := devenvcommon.FilterTokenCombinations(combos, nil, env.DataStore, allSelectors) merged := make(map[string]tokenscore.TokenTransferConfig) for _, combo := range applicableCombos { diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index f99e5308a..2d819f784 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -423,7 +423,7 @@ func ConfigureAllTokenTransfers( impls []cciptestinterfaces.CCIP17Configuration, selectors []uint64, env *deployment.Environment, - topology *ccipOffchain.EnvironmentTopology, + combos []devenvcommon.TokenCombination, ) error { // poolIdentityKey returns a key that groups configs across chains for the // same pool type+version+qualifier. @@ -445,7 +445,7 @@ func ConfigureAllTokenTransfers( } } - cfgs, err := impl.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, topology) + cfgs, err := impl.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, combos) if err != nil { return fmt.Errorf("get token transfer configs for selector %d: %w", selectors[i], err) } diff --git a/build/devenv/tests/e2e/tcapi/token_transfer/v3.go b/build/devenv/tests/e2e/tcapi/token_transfer/v3.go index 3cf032796..f1a0b27d0 100644 --- a/build/devenv/tests/e2e/tcapi/token_transfer/v3.go +++ b/build/devenv/tests/e2e/tcapi/token_transfer/v3.go @@ -11,7 +11,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/sequences" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/mock_receiver_v2" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/proxy" - "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" + bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" ccv "github.com/smartcontractkit/chainlink-ccv/build/devenv" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" @@ -159,8 +159,8 @@ func (tc *tokenTransferV3TestCase) HavePrerequisites(ctx context.Context, cfg *c func getTokenAddress(cfg *ccv.Cfg, chainSelector uint64, qualifier string) (protocol.UnknownAddress, error) { return tcapi.GetContractAddress(cfg, chainSelector, - datastore.ContractType(burn_mint_erc20_with_drip.ContractType), - burn_mint_erc20_with_drip.Deploy.Version(), + datastore.ContractType(bnm_drip_v1_0.ContractType), + bnm_drip_v1_0.Deploy.Version(), qualifier, "burn mint erc677") } From 01605e1a9a45473f811216356f64fd80287d22ba Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Fri, 3 Apr 2026 11:59:46 -0700 Subject: [PATCH 15/28] Revert "comments" This reverts commit eb6bad7cdc7e44345da9dc1dd7676ffe68e07c64. --- build/devenv/cciptestinterfaces/interface.go | 4 +-- build/devenv/common/common.go | 25 +++++++------------ build/devenv/environment.go | 2 +- build/devenv/evm/impl.go | 8 +++--- build/devenv/implcommon.go | 4 +-- .../tests/e2e/tcapi/token_transfer/v3.go | 6 ++--- 6 files changed, 20 insertions(+), 29 deletions(-) diff --git a/build/devenv/cciptestinterfaces/interface.go b/build/devenv/cciptestinterfaces/interface.go index 6ed7be892..c07061844 100644 --- a/build/devenv/cciptestinterfaces/interface.go +++ b/build/devenv/cciptestinterfaces/interface.go @@ -247,13 +247,11 @@ type TokenConfigProvider interface { // GetTokenTransferConfigs builds TokenTransferConfig entries for all pools // deployed on this chain, using chain-specific registry and CCV refs. - // combos should be the same set used during deployment so transfer - // configuration is derived from the same source of truth. GetTokenTransferConfigs( env *deployment.Environment, selector uint64, remoteSelectors []uint64, - combos []devenvcommon.TokenCombination, + topology *offchain.EnvironmentTopology, ) ([]tokensapi.TokenTransferConfig, error) } diff --git a/build/devenv/common/common.go b/build/devenv/common/common.go index 7b95f6ec0..d7d3caedc 100644 --- a/build/devenv/common/common.go +++ b/build/devenv/common/common.go @@ -285,10 +285,9 @@ func ComputeTokenCombinations( if !isCompatible(local.poolType, remote.poolType) { continue } - // At least two *distinct* chains must support the required types. - localSupported, remoteSupported := false, false - distinctChains := make(map[uint64]bool) - for sel, caps := range capabilities { + // At least two chains must support the required types. + localCount, remoteCount := 0, 0 + for _, caps := range capabilities { hasLocal, hasRemote := false, false for _, c := range caps { if c.PoolType == local.poolType && c.PoolVersion.String() == local.version { @@ -299,15 +298,13 @@ func ComputeTokenCombinations( } } if hasLocal { - localSupported = true - distinctChains[sel] = true + localCount++ } if hasRemote { - remoteSupported = true - distinctChains[sel] = true + remoteCount++ } } - if !localSupported || !remoteSupported || len(distinctChains) < 2 { + if localCount == 0 || remoteCount == 0 || (localCount+remoteCount) < 2 { continue } @@ -403,17 +400,13 @@ func qualifiersAvailable(qualifiers []string, topology *offchain.EnvironmentTopo // all exist as committees in the topology, and when ds is non-nil, whose local and // remote pool address refs exist in ds for every selector (each chain deploys both // pools across bidirectional transfer configs). -// Pass topology nil to skip the topology/qualifier check (e.g. when combos were -// already computed with topology taken into account). // Pass ds nil to skip the datastore check. func FilterTokenCombinations(combos []TokenCombination, topology *offchain.EnvironmentTopology, ds datastore.DataStore, selectors []uint64) []TokenCombination { filtered := make([]TokenCombination, 0, len(combos)) for _, combo := range combos { - if topology != nil { - if !qualifiersAvailable(combo.LocalPoolCCVQualifiers(), topology) || - !qualifiersAvailable(combo.RemotePoolCCVQualifiers(), topology) { - continue - } + if !qualifiersAvailable(combo.LocalPoolCCVQualifiers(), topology) || + !qualifiersAvailable(combo.RemotePoolCCVQualifiers(), topology) { + continue } if ds != nil && len(selectors) > 0 && !tokenCombinationPoolsExistInDataStore(ds, selectors, combo) { continue diff --git a/build/devenv/environment.go b/build/devenv/environment.go index 2194f205e..060d6d3c8 100644 --- a/build/devenv/environment.go +++ b/build/devenv/environment.go @@ -1095,7 +1095,7 @@ func NewEnvironment() (in *Cfg, err error) { // Configure cross-chain token transfers: each chain impl builds its own // TokenTransferConfigs using chain-specific registry and CCV refs. - if err = ConfigureAllTokenTransfers(impls, selectors, e, combos); err != nil { + if err = ConfigureAllTokenTransfers(impls, selectors, e, topology); err != nil { return nil, fmt.Errorf("configure all token transfers: %w", err) } diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index 1792589ab..d0a968ca4 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -1282,15 +1282,15 @@ func (m *CCIP17EVMConfig) PostTokenDeploy( // GetTokenTransferConfigs builds TokenTransferConfig entries for all generic // token pools deployed on this EVM chain, using EVM-specific registry and CCV refs. -// combos should be the same set used during deployment. func (m *CCIP17EVMConfig) GetTokenTransferConfigs( env *deployment.Environment, selector uint64, remoteSelectors []uint64, - combos []devenvcommon.TokenCombination, + topology *ccipOffchain.EnvironmentTopology, ) ([]tokenscore.TokenTransferConfig, error) { - allSelectors := append([]uint64{selector}, remoteSelectors...) - applicableCombos := devenvcommon.FilterTokenCombinations(combos, nil, env.DataStore, allSelectors) + applicableCombos := devenvcommon.FilterTokenCombinations( + devenvcommon.AllTokenCombinations(), topology, env.DataStore, append([]uint64{selector}, remoteSelectors...), + ) merged := make(map[string]tokenscore.TokenTransferConfig) for _, combo := range applicableCombos { diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index 2d819f784..f99e5308a 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -423,7 +423,7 @@ func ConfigureAllTokenTransfers( impls []cciptestinterfaces.CCIP17Configuration, selectors []uint64, env *deployment.Environment, - combos []devenvcommon.TokenCombination, + topology *ccipOffchain.EnvironmentTopology, ) error { // poolIdentityKey returns a key that groups configs across chains for the // same pool type+version+qualifier. @@ -445,7 +445,7 @@ func ConfigureAllTokenTransfers( } } - cfgs, err := impl.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, combos) + cfgs, err := impl.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, topology) if err != nil { return fmt.Errorf("get token transfer configs for selector %d: %w", selectors[i], err) } diff --git a/build/devenv/tests/e2e/tcapi/token_transfer/v3.go b/build/devenv/tests/e2e/tcapi/token_transfer/v3.go index f1a0b27d0..3cf032796 100644 --- a/build/devenv/tests/e2e/tcapi/token_transfer/v3.go +++ b/build/devenv/tests/e2e/tcapi/token_transfer/v3.go @@ -11,7 +11,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/sequences" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/mock_receiver_v2" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/proxy" - bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" + "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" ccv "github.com/smartcontractkit/chainlink-ccv/build/devenv" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" @@ -159,8 +159,8 @@ func (tc *tokenTransferV3TestCase) HavePrerequisites(ctx context.Context, cfg *c func getTokenAddress(cfg *ccv.Cfg, chainSelector uint64, qualifier string) (protocol.UnknownAddress, error) { return tcapi.GetContractAddress(cfg, chainSelector, - datastore.ContractType(bnm_drip_v1_0.ContractType), - bnm_drip_v1_0.Deploy.Version(), + datastore.ContractType(burn_mint_erc20_with_drip.ContractType), + burn_mint_erc20_with_drip.Deploy.Version(), qualifier, "burn mint erc677") } From 9b8d773e28fef51a0654dba56e0bff7b4563bdd1 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Fri, 3 Apr 2026 18:38:59 -0700 Subject: [PATCH 16/28] bump --- build/devenv/go.mod | 80 +++++++++++----------- build/devenv/go.sum | 160 ++++++++++++++++++++++---------------------- 2 files changed, 120 insertions(+), 120 deletions(-) diff --git a/build/devenv/go.mod b/build/devenv/go.mod index df273d42c..ec214f33f 100644 --- a/build/devenv/go.mod +++ b/build/devenv/go.mod @@ -9,22 +9,22 @@ require ( github.com/Masterminds/semver/v3 v3.4.0 github.com/c-bata/go-prompt v0.2.6 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc - github.com/docker/docker v28.5.2+incompatible + github.com/docker/docker v28.5.3-0.20260325154711-31a1689cb0a1+incompatible github.com/docker/go-connections v0.6.0 github.com/ethereum/go-ethereum v1.17.1 github.com/pelletier/go-toml/v2 v2.2.4 - github.com/prometheus/client_golang v1.23.0 + github.com/prometheus/client_golang v1.23.2 github.com/rs/zerolog v1.34.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402223727-b875aa99b74c - github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c - github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402223727-b875aa99b74c + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260404013452-4d6f1e0cc77b + github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b + github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260404013452-4d6f1e0cc77b github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 - github.com/smartcontractkit/chainlink-deployments-framework v0.85.0 - github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0 + github.com/smartcontractkit/chainlink-deployments-framework v0.93.0 + github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.3 github.com/stretchr/testify v1.11.1 - github.com/testcontainers/testcontainers-go v0.40.0 - github.com/testcontainers/testcontainers-go/modules/postgres v0.40.0 + github.com/testcontainers/testcontainers-go v0.41.0 + github.com/testcontainers/testcontainers-go/modules/postgres v0.41.0 go.uber.org/zap v1.27.1 ) @@ -36,8 +36,8 @@ require ( github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 github.com/sethvargo/go-retry v0.3.0 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260404013452-4d6f1e0cc77b + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b github.com/smartcontractkit/chainlink-ccv v0.0.0-20260218133052-8e7fe2f457f9 github.com/smartcontractkit/chainlink-common/keystore v1.0.0 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd @@ -48,11 +48,11 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/wasp v1.51.2 github.com/smartcontractkit/chainlink/deployment v0.0.0-20260126202327-6be9a05f0caf github.com/spf13/cobra v1.10.2 - google.golang.org/grpc v1.79.1 + google.golang.org/grpc v1.79.3 ) require ( - github.com/Khan/genqlient v0.7.0 // indirect + github.com/Khan/genqlient v0.8.1 // indirect github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect @@ -94,7 +94,7 @@ require ( github.com/stellar/go-stellar-sdk v0.1.0 // indirect github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 // indirect github.com/tjhop/slog-gokit v0.1.4 // indirect - github.com/vektah/gqlparser/v2 v2.5.14 // indirect + github.com/vektah/gqlparser/v2 v2.5.19 // indirect go.opentelemetry.io/collector/confmap v1.30.0 // indirect go.opentelemetry.io/collector/confmap/xconfmap v0.124.0 // indirect go.opentelemetry.io/collector/featuregate v1.30.0 // indirect @@ -128,28 +128,28 @@ require ( github.com/VictoriaMetrics/fastcache v1.13.0 // indirect github.com/XSAM/otelsql v0.37.0 // indirect github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect - github.com/aptos-labs/aptos-go-sdk v1.11.0 // indirect + github.com/aptos-labs/aptos-go-sdk v1.12.0 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/avast/retry-go v3.0.0+incompatible // indirect github.com/avast/retry-go/v4 v4.7.0 // indirect github.com/awalterschulze/gographviz v2.0.3+incompatible // indirect github.com/aws/aws-sdk-go v1.55.8 // indirect - github.com/aws/aws-sdk-go-v2 v1.41.2 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.10 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.10 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect - github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.58.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.18 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.11 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.15 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.7 // indirect - github.com/aws/smithy-go v1.24.1 // indirect + github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect + github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.59.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect + github.com/aws/smithy-go v1.24.2 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect github.com/benbjohnson/clock v1.3.5 // indirect @@ -239,7 +239,7 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.30.1 // indirect - github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/gofrs/flock v0.12.1 // indirect github.com/gogo/googleapis v1.4.1 // indirect @@ -267,7 +267,7 @@ require ( github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/consul/api v1.32.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect @@ -284,7 +284,7 @@ require ( github.com/hashicorp/memberlist v0.5.3 // indirect github.com/hashicorp/serf v0.10.2 // indirect github.com/hashicorp/yamux v0.1.2 // indirect - github.com/hasura/go-graphql-client v0.14.5 // indirect + github.com/hasura/go-graphql-client v0.15.1 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -389,11 +389,11 @@ require ( github.com/scylladb/go-reflectx v1.0.1 // indirect github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/shirou/gopsutil/v4 v4.26.1 // indirect + github.com/shirou/gopsutil/v4 v4.26.2 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3 // indirect github.com/sirupsen/logrus v1.9.4 // indirect - github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3 // indirect + github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 // indirect @@ -405,7 +405,7 @@ require ( github.com/smartcontractkit/freeport v0.1.3-0.20250828155247-add56fa28aad // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/libocr v0.0.0-20251212213002-0a5e2f907dda // indirect - github.com/smartcontractkit/mcms v0.36.3 // indirect + github.com/smartcontractkit/mcms v0.37.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/stephenlacy/go-ethereum-hdwallet v0.0.0-20230913225845-a4fa94429863 // indirect @@ -425,7 +425,7 @@ require ( github.com/ugorji/go/codec v1.3.0 // indirect github.com/ulule/limiter/v3 v3.11.2 // indirect github.com/urfave/cli/v2 v2.27.7 // indirect - github.com/valyala/fastjson v1.6.4 // indirect + github.com/valyala/fastjson v1.6.10 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect @@ -451,9 +451,9 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0 // indirect @@ -471,7 +471,7 @@ require ( go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect golang.org/x/arch v0.21.0 // indirect golang.org/x/crypto v0.48.0 // indirect - golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect + golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect golang.org/x/mod v0.33.0 // indirect golang.org/x/net v0.50.0 // indirect golang.org/x/oauth2 v0.35.0 // indirect diff --git a/build/devenv/go.sum b/build/devenv/go.sum index c18b287b7..fc79ae2b1 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -43,8 +43,8 @@ github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w= -github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM= +github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= +github.com/Khan/genqlient v0.8.1/go.mod h1:R2G6DzjBvCbhjsEajfRjbWdVglSH/73kSivC9TLWVjU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= @@ -82,8 +82,8 @@ github.com/apache/arrow-go/v18 v18.3.1 h1:oYZT8FqONiK74JhlH3WKVv+2NKYoyZ7C2ioD4D github.com/apache/arrow-go/v18 v18.3.1/go.mod h1:12QBya5JZT6PnBihi5NJTzbACrDGXYkrgjujz3MRQXU= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= -github.com/aptos-labs/aptos-go-sdk v1.11.0 h1:vIL1hpjECUiu7zMl9Wz6VV8ttXsrDqKUj0HxoeaIER4= -github.com/aptos-labs/aptos-go-sdk v1.11.0/go.mod h1:8YvYwRg93UcG6pTStCpZdYiscCtKh51sYfeLgIy/41c= +github.com/aptos-labs/aptos-go-sdk v1.12.0 h1:deHZ7NJlFhHm2i+eaPHt6EPa3BuXXnIYx2X5J3/U0Es= +github.com/aptos-labs/aptos-go-sdk v1.12.0/go.mod h1:FTgKp0RLfEefllCdkCj0jPU14xWk11yA7SFVfCDLUj8= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= @@ -99,38 +99,38 @@ github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2 github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= -github.com/aws/aws-sdk-go-v2 v1.41.2 h1:LuT2rzqNQsauaGkPK/7813XxcZ3o3yePY0Iy891T2ls= -github.com/aws/aws-sdk-go-v2 v1.41.2/go.mod h1:IvvlAZQXvTXznUPfRVfryiG1fbzE2NGK6m9u39YQ+S4= -github.com/aws/aws-sdk-go-v2/config v1.32.10 h1:9DMthfO6XWZYLfzZglAgW5Fyou2nRI5CuV44sTedKBI= -github.com/aws/aws-sdk-go-v2/config v1.32.10/go.mod h1:2rUIOnA2JaiqYmSKYmRJlcMWy6qTj1vuRFscppSBMcw= -github.com/aws/aws-sdk-go-v2/credentials v1.19.10 h1:EEhmEUFCE1Yhl7vDhNOI5OCL/iKMdkkYFTRpZXNw7m8= -github.com/aws/aws-sdk-go-v2/credentials v1.19.10/go.mod h1:RnnlFCAlxQCkN2Q379B67USkBMu1PipEEiibzYN5UTE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.18 h1:Ii4s+Sq3yDfaMLpjrJsqD6SmG/Wq/P5L/hw2qa78UAY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.18/go.mod h1:6x81qnY++ovptLE6nWQeWrpXxbnlIex+4H4eYYGcqfc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18 h1:F43zk1vemYIqPAwhjTjYIz0irU2EY7sOb/F5eJ3HuyM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18/go.mod h1:w1jdlZXrGKaJcNoL+Nnrj+k5wlpGXqnNrKoP22HvAug= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18 h1:xCeWVjj0ki0l3nruoyP2slHsGArMxeiiaoPN5QZH6YQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18/go.mod h1:r/eLGuGCBw6l36ZRWiw6PaZwPXb6YOj+i/7MizNl5/k= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= -github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.58.1 h1:MVbhtr5+/WM5u3Z4rdIk/xQmy7NFSyZxNXcy5hCCuRE= -github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.58.1/go.mod h1:mP260yaWr2aT73knlr44yaQEP52UPbVZppXzVO9k52g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.5 h1:CeY9LUdur+Dxoeldqoun6y4WtJ3RQtzk0JMP2gfUay0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.5/go.mod h1:AZLZf2fMaahW5s/wMRciu1sYbdsikT/UHwbUjOdEVTc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.18 h1:LTRCYFlnnKFlKsyIQxKhJuDuA3ZkrDQMRYm6rXiHlLY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.18/go.mod h1:XhwkgGG6bHSd00nO/mexWTcTjgd6PjuvWQMqSn2UaEk= +github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= +github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= +github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.59.2 h1:I1oExVl2b6nJGv//TcU78k9Covm/htQ5gwPIcDlM2PI= +github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.59.2/go.mod h1:sxvHFUS0fM9Y3BpmDvwrO9fnQC0CrFSG8KD9THjv6k4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= github.com/aws/aws-sdk-go-v2/service/kms v1.50.1 h1:wb/PYYm3wlcqGzw7Ls4GD3X5+seDDoNdVYIB6I/V87E= github.com/aws/aws-sdk-go-v2/service/kms v1.50.1/go.mod h1:xvHowJ6J9CuaFE04S8fitWQXytf4sHz3DTPGhw9FtmU= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.6 h1:MzORe+J94I+hYu2a6XmV5yC9huoTv8NRcCrUNedDypQ= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.6/go.mod h1:hXzcHLARD7GeWnifd8j9RWqtfIgxj4/cAtIVIK7hg8g= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.11 h1:7oGD8KPfBOJGXiCoRKrrrQkbvCp8N++u36hrLMPey6o= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.11/go.mod h1:0DO9B5EUJQlIDif+XJRWCljZRKsAFKh3gpFz7UnDtOo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.15 h1:edCcNp9eGIUDUCrzoCu1jWAXLGFIizeqkdkKgRlJwWc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.15/go.mod h1:lyRQKED9xWfgkYC/wmmYfv7iVIM68Z5OQ88ZdcV1QbU= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.7 h1:NITQpgo9A5NrDZ57uOWj+abvXSb83BbyggcUBVksN7c= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.7/go.mod h1:sks5UWBhEuWYDPdwlnRFn1w7xWdH29Jcpe+/PJQefEs= -github.com/aws/smithy-go v1.24.1 h1:VbyeNfmYkWoxMVpGUAbQumkODcYmfMRfZ8yQiH30SK0= -github.com/aws/smithy-go v1.24.1/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= +github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= +github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0= @@ -309,8 +309,8 @@ github.com/digitalocean/godo v1.144.0 h1:rDCsmpwcDe5egFQ3Ae45HTde685/GzX037mWRMP github.com/digitalocean/godo v1.144.0/go.mod h1:tYeiWY5ZXVpU48YaFv0M5irUFHXGorZpDNm7zzdWMzM= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= -github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v28.5.3-0.20260325154711-31a1689cb0a1+incompatible h1:f51eIlZsZqGKXyNeCHs5oVo/xQiR9zh+pDYMfnu3VPQ= +github.com/docker/docker v28.5.3-0.20260325154711-31a1689cb0a1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -458,8 +458,8 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8Wd github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= -github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= +github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I= github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= @@ -576,8 +576,8 @@ github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpS github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/consul/api v1.32.1 h1:0+osr/3t/aZNAdJX558crU3PEjVrG4x6715aZHRgceE= github.com/hashicorp/consul/api v1.32.1/go.mod h1:mXUWLnxftwTmDv4W3lzxYCPD199iNLLUyLfLGFJbtl4= github.com/hashicorp/consul/sdk v0.16.2 h1:cGX/djeEe9r087ARiKVWwVWCF64J+yW0G6ftZMZYbj0= @@ -632,8 +632,8 @@ github.com/hashicorp/serf v0.10.2 h1:m5IORhuNSjaxeljg5DeQVDlQyVkhRIjJDimbkCa8aAc github.com/hashicorp/serf v0.10.2/go.mod h1:T1CmSGfSeGfnfNy/w0odXQUR1rfECGd2Qdsp84DjOiY= github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= -github.com/hasura/go-graphql-client v0.14.5 h1:M9HxxGLCcDZnxJGYyWXAzDYEpommgjW+sUW3V8EaGms= -github.com/hasura/go-graphql-client v0.14.5/go.mod h1:jfSZtBER3or+88Q9vFhWHiFMPppfYILRyl+0zsgPIIw= +github.com/hasura/go-graphql-client v0.15.1 h1:mCb5I+8Bk3FU3GKWvf/zDXkTh7FbGlqJmP3oisBdnN8= +github.com/hasura/go-graphql-client v0.15.1/go.mod h1:jfSZtBER3or+88Q9vFhWHiFMPppfYILRyl+0zsgPIIw= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/hetznercloud/hcloud-go/v2 v2.21.0 h1:wUpQT+fgAxIcdMtFvuCJ78ziqc/VARubpOQPQyj4Q84= @@ -1015,8 +1015,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= -github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1096,8 +1096,8 @@ github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil/v4 v4.26.1 h1:TOkEyriIXk2HX9d4isZJtbjXbEjf5qyKPAzbzY0JWSo= -github.com/shirou/gopsutil/v4 v4.26.1/go.mod h1:medLI9/UNAb0dOI9Q3/7yWSqKkj00u+1tgY8nvv41pc= +github.com/shirou/gopsutil/v4 v4.26.2 h1:X8i6sicvUFih4BmYIGT1m2wwgw2VG9YgrDTi7cIRGUI= +github.com/shirou/gopsutil/v4 v4.26.2/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1115,30 +1115,30 @@ github.com/smartcontractkit/ccip-contract-examples/chains/evm v0.0.0-20250826190 github.com/smartcontractkit/ccip-contract-examples/chains/evm v0.0.0-20250826190403-aed7f5f33cde/go.mod h1:SYc+BvAALmwsx2zMJIAczIyVNwsiXRIBXmejcTORxGE= github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0kub04Epds5NPMHERfGjo= github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= -github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3 h1:bbVSKb++R+rpLkydNvyS4nZPNkcjtolUuFC8YVwtMVk= -github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3/go.mod h1:OywVThRaVXwknATT2B8QAwjOJ1LoYBB9bTsmRpf6RPw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402223727-b875aa99b74c h1:dsU/P4xXL/yM+anRSqJZtMWCsyKJ0ph6m4VaLiEwq9Y= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402223727-b875aa99b74c/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c h1:FovWq3VisffT6TysAUnOH6kQr2yK4AFWLrf2dqo6wpI= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c h1:ygjG4y9aI+UmTzzBs/CJNkT600gZAiN7zcj/tQUAJ2Y= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c h1:5nEdTdeZtqtA94OdjUGQ/SSm58hd0x/X7ZvXx1+3omg= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402223727-b875aa99b74c/go.mod h1:QZxcMdY1q34P+NjMhLTzPrXi8aaCCX7hDZ60dawpO+w= +github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265 h1:Q/sYLdOefZUKc/Bxssq1mg8ptQE/AOot2WI+QcLoiVA= +github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265/go.mod h1:CQGkKp3YDsUuxixxmmngmRKfh6yIcftGEZsQrsSIIM8= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260404013452-4d6f1e0cc77b h1:VZwrlKW1zT1aYmjPyA1lvYQa1eCFIy714hs280uy9+8= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260404013452-4d6f1e0cc77b/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260404013452-4d6f1e0cc77b h1:OZZEABOOm6Wvby0govc6SC8asQmONKSNN30EsqbGMcs= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260404013452-4d6f1e0cc77b/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b h1:oBSVUSB3l3dYXfOp7dnNuQD/gPmtlvIxTZqM/huQkKg= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b/go.mod h1:EzTojOm8F1YRlDO2OFpIBcBnsBWgQCnXrLAsdgFdmaI= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b h1:WbSvtjVXbKW7RcVqSM+f9W40eaDjP8xT1ccaIkoCX+E= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b/go.mod h1:X9Sccn1RXZkwjt+6rTmmX0Lwwgeh9oDw5jhIVbm+UjA= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 h1:jkChf04hhdiMBApbb+lLDxHMY62Md6UeM7v++GSw3K8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139/go.mod h1:1WcontO9PeuKdUf5HXfs3nuICtzUvFNnyCmrHkTCF9Y= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402223727-b875aa99b74c h1:zd4kTL/xt6b4XcPHkU7OmUsqzfYva0cQpyqtbDqch6c= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402223727-b875aa99b74c/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260404013452-4d6f1e0cc77b h1:KYiR02PnguKM6SvKJ/hknHPUJLIyKkXWllzuHHrDw/o= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260404013452-4d6f1e0cc77b/go.mod h1:ddbeNpxyDEs5N4tiGLLezAEWYGMdYCPH3/mLcr0Rr4U= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0/go.mod h1:0ghbAr7tRO0tT5ZqBXhOyzgUO37tNNe33Yn0hskauVM= github.com/smartcontractkit/chainlink-common/keystore v1.0.0 h1:sVa3j2FWK/5OxXpnlfDkF1deDAkuXEfaLKzYqBTA880= github.com/smartcontractkit/chainlink-common/keystore v1.0.0/go.mod h1:wGRJJlCFUOKIfBlBGEdBFiTf7R787B8HKyobjiymw3Q= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= -github.com/smartcontractkit/chainlink-deployments-framework v0.85.0 h1:L/iQt9pm324YBNlyJPe8oMw4l8LVEzbpL4HFFO4uaG4= -github.com/smartcontractkit/chainlink-deployments-framework v0.85.0/go.mod h1:L6cKbcw029ciNybdEU2ASdXiQUyqVnCIwlXyhs/DJl0= +github.com/smartcontractkit/chainlink-deployments-framework v0.93.0 h1:FzwtFJmasVhALpKvWZn+zOOlgty7cw2K70dzvjQIAKg= +github.com/smartcontractkit/chainlink-deployments-framework v0.93.0/go.mod h1:XTN/14+Ch8/+q+sdIastZWO/n9ID+ZnxKWD/aLqLDLw= github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260126170652-c5f27bb1804e h1:DmVqY4qcoDtUa4uqYJ444Izqj1zIu9AP2MCCUMBqwWk= github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260126170652-c5f27bb1804e/go.mod h1:5KhbnUmIYDjUd/bv0aTbiu/BNbVVixv7U/5Fk7lG12s= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd h1:sK+pK4epQp20yQ7XztwrVgkTkRAr4FY+TvEegW8RuQk= @@ -1171,8 +1171,8 @@ github.com/smartcontractkit/chainlink-protos/orchestrator v0.10.0 h1:0eroOyBwmdo github.com/smartcontractkit/chainlink-protos/orchestrator v0.10.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-sui v0.0.0-20260205175622-33e65031f9a9 h1:KyPROV+v7P8VdiU7JhVuGLcDlEBsURSpQmSCgNBTY+s= github.com/smartcontractkit/chainlink-sui v0.0.0-20260205175622-33e65031f9a9/go.mod h1:KpEWZJMLwbdMHeHQz9rbkES0vRrx4nk6OQXyhlHb9/8= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0 h1:7fQDETtHDe68c9Eusx4YpdPMsoBJX+hQMYjS0SlAIt4= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0/go.mod h1:43xdIQuqw/gzfazsqJkBrGdF25TIJDiY/Ak/YrWFTmU= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.3 h1:wMxGJzQrKF5J9Msmpeal1Iw3h4RqPwOZ2I1ZjlSqhZo= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.3/go.mod h1:BALK9cj8sk12e15UF6uDhifHgIApa+6N11TcQfInEro= github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 h1:VIxK8u0Jd0Q/VuhmsNm6Bls6Tb31H/sA3A/rbc5hnhg= github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0/go.mod h1:lyAu+oMXdNUzEDScj2DXB2IueY+SDXPPfyl/kb63tMM= github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.5 h1:RwZXxdIAOyjp6cwc9Quxgr38k8r7ACz+Lxh9o/A6oH0= @@ -1195,8 +1195,8 @@ github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12i github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20251212213002-0a5e2f907dda h1:OjM+79FRuVZlj0Qd4y+q8Xmz/tEn5y8npqmiQiMMj+w= github.com/smartcontractkit/libocr v0.0.0-20251212213002-0a5e2f907dda/go.mod h1:oJkBKVn8zoBQm7Feah9CiuEHyCqAhnp1LJBzrvloQtM= -github.com/smartcontractkit/mcms v0.36.3 h1:NxFNRZBTgcHbNoMsn4o9H6h+fXdd6EpWzIUiBWGf5Kk= -github.com/smartcontractkit/mcms v0.36.3/go.mod h1:IUBVZyIJ2pjcphR4NOusYWvo129wAepwblzYZWmvo0Q= +github.com/smartcontractkit/mcms v0.37.0 h1:h3tqQhVdLezyHOuPsGcknPFLlZlXpOHTchwlfO3D9s8= +github.com/smartcontractkit/mcms v0.37.0/go.mod h1:7YqJPR8w9GiO1L/JjjTrwlSwAZ7i3J7cgOcu88PqtvU= github.com/smartcontractkit/wsrpc v0.8.5-0.20250502134807-c57d3d995945 h1:zxcODLrFytOKmAd8ty8S/XK6WcIEJEgRBaL7sY/7l4Y= github.com/smartcontractkit/wsrpc v0.8.5-0.20250502134807-c57d3d995945/go.mod h1:m3pdp17i4bD50XgktkzWetcV5yaLsi7Gunbv4ZgN6qg= github.com/sony/gobreaker/v2 v2.1.0 h1:av2BnjtRmVPWBvy5gSFPytm1J8BmN5AGhq875FfGKDM= @@ -1250,10 +1250,10 @@ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDd github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= -github.com/testcontainers/testcontainers-go v0.40.0 h1:pSdJYLOVgLE8YdUY2FHQ1Fxu+aMnb6JfVz1mxk7OeMU= -github.com/testcontainers/testcontainers-go v0.40.0/go.mod h1:FSXV5KQtX2HAMlm7U3APNyLkkap35zNLxukw9oBi/MY= -github.com/testcontainers/testcontainers-go/modules/postgres v0.40.0 h1:s2bIayFXlbDFexo96y+htn7FzuhpXLYJNnIuglNKqOk= -github.com/testcontainers/testcontainers-go/modules/postgres v0.40.0/go.mod h1:h+u/2KoREGTnTl9UwrQ/g+XhasAT8E6dClclAADeXoQ= +github.com/testcontainers/testcontainers-go v0.41.0 h1:mfpsD0D36YgkxGj2LrIyxuwQ9i2wCKAD+ESsYM1wais= +github.com/testcontainers/testcontainers-go v0.41.0/go.mod h1:pdFrEIfaPl24zmBjerWTTYaY0M6UHsqA1YSvsoU40MI= +github.com/testcontainers/testcontainers-go/modules/postgres v0.41.0 h1:AOtFXssrDlLm84A2sTTR/AhvJiYbrIuCO59d+Ro9Tb0= +github.com/testcontainers/testcontainers-go/modules/postgres v0.41.0/go.mod h1:k2a09UKhgSp6vNpliIY0QSgm4Hi7GXVTzWvWgUemu/8= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= @@ -1287,10 +1287,10 @@ github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= -github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/vektah/gqlparser/v2 v2.5.14 h1:dzLq75BJe03jjQm6n56PdH1oweB8ana42wj7E4jRy70= -github.com/vektah/gqlparser/v2 v2.5.14/go.mod h1:WQQjFc+I1YIzoPvZBhUQX7waZgg3pMLi0r8KymvAE2w= +github.com/valyala/fastjson v1.6.10 h1:/yjJg8jaVQdYR3arGxPE2X5z89xrlhS0eGXdv+ADTh4= +github.com/valyala/fastjson v1.6.10/go.mod h1:e6FubmQouUNP73jtMLmcbxS6ydWIpOfhz34TSfO3JaE= +github.com/vektah/gqlparser/v2 v2.5.19 h1:bhCPCX1D4WWzCDvkPl4+TP1N8/kLrWnp43egplt7iSg= +github.com/vektah/gqlparser/v2 v2.5.19/go.mod h1:y7kvl5bBlDeuWIvLtA9849ncyvx6/lj06RsMrEjVy3U= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= @@ -1392,12 +1392,12 @@ go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 h1:vl9 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0/go.mod h1:GAXRxmLJcVM3u22IjTg74zWBrRCKq8BnOqUVLodpcpw= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0 h1:gAU726w9J8fwr4qRDqu1GYMNNs4gXrU+Pv20/N1UpB4= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0/go.mod h1:RboSDkp7N292rgu+T0MgVt2qgFGu6qa1RpZDOtpL76w= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 h1:inYW9ZhgqiDqh6BioM7DVHHzEGVq76Db5897WLGZ5Go= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0/go.mod h1:Izur+Wt8gClgMJqO/cZ8wdeeMryJ/xxiOVgFSSfpDTY= go.opentelemetry.io/otel/exporters/prometheus v0.58.0 h1:CJAxWKFIqdBennqxJyOgnt5LqkeFRT+Mz3Yjz3hL+h8= go.opentelemetry.io/otel/exporters/prometheus v0.58.0/go.mod h1:7qo/4CLI+zYSNbv0GMNquzuss2FVZo3OYrGh96n4HNc= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0 h1:yEX3aC9KDgvYPhuKECHbOlr5GLwH6KTjLJ1sBSkkxkc= @@ -1481,8 +1481,8 @@ golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU= -golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU= +golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= +golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1696,8 +1696,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= -google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 9c0efe9192ce68092df6e70a3fdf5bcc95952210 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Mon, 6 Apr 2026 10:11:12 -0700 Subject: [PATCH 17/28] split --- build/devenv/cciptestinterfaces/interface.go | 6 +++++- build/devenv/environment.go | 12 +++++++++--- build/devenv/implcommon.go | 6 +++++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/build/devenv/cciptestinterfaces/interface.go b/build/devenv/cciptestinterfaces/interface.go index c07061844..0d808c999 100644 --- a/build/devenv/cciptestinterfaces/interface.go +++ b/build/devenv/cciptestinterfaces/interface.go @@ -223,6 +223,11 @@ type ChainLaneProfile struct { // TokenConfigProvider abstracts the chain-specific decisions that feed into // TokenExpansion (token type, decimals, admin addresses, pre-mint amounts) // and any post-deployment work (e.g. funding lock-release pools on EVM). +// +// It is separate from OnChainConfigurable so chain families can deploy CCIP +// core contracts and lanes without implementing token pools (e.g. messaging-only +// or AltVM before token support exists). Devenv uses type assertions; when absent, +// token deployment and ConfigureTokensForTransfers are skipped. type TokenConfigProvider interface { // GetSupportedPools returns pool types and versions this chain can deploy. GetSupportedPools() []devenvcommon.PoolCapability @@ -258,7 +263,6 @@ type TokenConfigProvider interface { // OnChainConfigurable defines methods that allows devenv to // deploy, configure Chainlink product and connect on-chain part with other chains. type OnChainConfigurable interface { - TokenConfigProvider // ChainFamily returns the family of the chain. ChainFamily() string // DeployContractsForSelector deploys contracts for chain X using topology for CommitteeVerifier configuration. diff --git a/build/devenv/environment.go b/build/devenv/environment.go index eaf0c35c1..0da59accf 100644 --- a/build/devenv/environment.go +++ b/build/devenv/environment.go @@ -1029,7 +1029,11 @@ func NewEnvironment() (in *Cfg, err error) { if lookupErr != nil { return nil, lookupErr } - capsBySelector[networkInfo.ChainSelector] = impl.GetSupportedPools() + if tcp, ok := impl.(cciptestinterfaces.TokenConfigProvider); ok { + capsBySelector[networkInfo.ChainSelector] = tcp.GetSupportedPools() + } else { + capsBySelector[networkInfo.ChainSelector] = nil + } } combos := devenvcommon.ComputeTokenCombinations(capsBySelector, topology) @@ -1069,8 +1073,10 @@ func NewEnvironment() (in *Cfg, err error) { // Deploy generic tokens and pools via the chain-agnostic path. // USDC and Lombard stay inside DeployContractsForSelector. tokenDS := datastore.NewMemoryDataStore() - if err = DeployTokensAndPools(impl, e, networkInfo.ChainSelector, combos, tokenDS); err != nil { - return nil, fmt.Errorf("deploy tokens and pools for selector %d: %w", networkInfo.ChainSelector, err) + if tcp, ok := impl.(cciptestinterfaces.TokenConfigProvider); ok { + if err = DeployTokensAndPools(tcp, e, networkInfo.ChainSelector, combos, tokenDS); err != nil { + return nil, fmt.Errorf("deploy tokens and pools for selector %d: %w", networkInfo.ChainSelector, err) + } } if err = ds.Merge(tokenDS.Seal()); err != nil { return nil, err diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index 4b7aca574..6c9cc494a 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -438,6 +438,10 @@ func ConfigureAllTokenTransfers( byPoolIdentity := make(map[string][]tokenscore.TokenTransferConfig) for i, impl := range impls { + tcp, ok := impl.(cciptestinterfaces.TokenConfigProvider) + if !ok { + continue + } remoteSelectors := make([]uint64, 0, len(selectors)-1) for _, s := range selectors { if s != selectors[i] { @@ -445,7 +449,7 @@ func ConfigureAllTokenTransfers( } } - cfgs, err := impl.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, topology) + cfgs, err := tcp.GetTokenTransferConfigs(env, selectors[i], remoteSelectors, topology) if err != nil { return fmt.Errorf("get token transfer configs for selector %d: %w", selectors[i], err) } From 5ac8aef36e325649bc95b643c204cc5b0313252c Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Mon, 6 Apr 2026 13:29:53 -0400 Subject: [PATCH 18/28] Fix conflicts --- build/devenv/cciptestinterfaces/interface.go | 13 ++-- build/devenv/evm/impl.go | 79 ++++++++------------ build/devenv/go.sum | 70 ----------------- build/devenv/implcommon.go | 18 ++++- build/devenv/lane_topology.go | 19 +++-- build/devenv/reconcile_onchain.go | 9 ++- build/devenv/services/executor/base.go | 10 ++- build/devenv/tests/e2e/tcapi/contracts.go | 2 - build/devenv/tests/e2e/tcapi/types.go | 2 +- 9 files changed, 78 insertions(+), 144 deletions(-) diff --git a/build/devenv/cciptestinterfaces/interface.go b/build/devenv/cciptestinterfaces/interface.go index 426be985d..985570393 100644 --- a/build/devenv/cciptestinterfaces/interface.go +++ b/build/devenv/cciptestinterfaces/interface.go @@ -226,13 +226,16 @@ type OnChainConfigurable interface { // DeployContractsForSelector deploys contracts for chain X using topology for CommitteeVerifier configuration. // Returns all the contract addresses and metadata as datastore.DataStore. DeployContractsForSelector(ctx context.Context, env *deployment.Environment, selector uint64, topology *offchain.EnvironmentTopology) (datastore.DataStore, error) - // GetChainLaneProfile returns the canonical lane profile for this chain, - // used by ConfigureChainsForLanesFromTopology to assemble PartialChainConfig. - GetChainLaneProfile(env *deployment.Environment, selector uint64) (ChainLaneProfile, error) // GetConnectionProfile returns a ChainDefinition describing this chain as a - // lane destination, plus the default committee verifier remote chain input - // to apply for each remote chain. Used by the legacy ConnectChains path. + // lane destination, plus the default committee verifier config to apply for + // each remote chain. The environment uses profiles from all chains to + // assemble the full cross-chain connection config. GetConnectionProfile(env *deployment.Environment, selector uint64) (lanes.ChainDefinition, lanes.CommitteeVerifierRemoteChainInput, error) + // GetChainLaneProfile returns the lane profile for this chain, containing + // local contract refs, destination characteristics, and default per-remote + // settings. The environment uses profiles from all chains to assemble the + // full cross-chain connection config. + GetChainLaneProfile(env *deployment.Environment, selector uint64) (ChainLaneProfile, error) // PostConnect runs chain-specific setup after all chains have been connected // (e.g. USDC/Lombard token config, custom executor wiring). PostConnect(env *deployment.Environment, selector uint64, remoteSelectors []uint64) error diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index c161907ff..1bb55c117 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -2,6 +2,7 @@ package evm import ( "context" + "encoding/binary" "encoding/json" "errors" "fmt" @@ -1357,53 +1358,13 @@ func (m *CCIP17EVMConfig) GetChainLaneProfile(_ *deployment.Environment, selecto }, nil } -func evmFeeQuoterDestChainConfigOverride(selector uint64) *lanes.FeeQuoterDestChainConfigOverride { - override := lanes.FeeQuoterDestChainConfigOverride(func(cfg *lanes.FeeQuoterDestChainConfig) { - selectorBytes := changesetsutils.GetSelectorHex(selector) - cfg.IsEnabled = true - cfg.MaxDataBytes = 30_000 - cfg.MaxPerMsgGasLimit = 3_000_000 - cfg.DestGasOverhead = 300_000 - cfg.DefaultTokenFeeUSDCents = 25 - cfg.DestGasPerPayloadByteBase = 16 - cfg.DefaultTokenDestGasOverhead = 90_000 - cfg.DefaultTxGasLimit = 200_000 - cfg.NetworkFeeUSDCents = 10 - cfg.ChainFamilySelector = binary.BigEndian.Uint32(selectorBytes[:4]) - cfg.V2Params = &lanes.FeeQuoterV2Params{ - LinkFeeMultiplierPercent: 90, - USDPerUnitGas: big.NewInt(1e6), - } - }) - return &override -} - -func (m *CCIP17EVMConfig) GetChainLaneProfile(_ *deployment.Environment, selector uint64) (cciptestinterfaces.ChainLaneProfile, error) { - selectorBytes := changesetsutils.GetSelectorHex(selector) - var chainFamilySelector [4]byte - copy(chainFamilySelector[:], selectorBytes[:4]) - - return cciptestinterfaces.ChainLaneProfile{ - AddressBytesLength: 20, - BaseExecutionGasCost: 150_000, - FeeQuoterDestChainConfig: adapters.FeeQuoterDestChainConfig{ - IsEnabled: true, - MaxDataBytes: 30_000, - MaxPerMsgGasLimit: 3_000_000, - DestGasOverhead: 300_000, - DefaultTokenFeeUSDCents: 25, - DestGasPerPayloadByteBase: 16, - DefaultTokenDestGasOverhead: 90_000, - DefaultTxGasLimit: 200_000, - NetworkFeeUSDCents: 10, - ChainFamilySelector: chainFamilySelector, - LinkFeeMultiplierPercent: 90, - USDPerUnitGas: big.NewInt(1e6), - }, - ExecutorDestChainConfig: adapters.ExecutorDestChainConfig{ +func (m *CCIP17EVMConfig) GetConnectionProfile(_ *deployment.Environment, selector uint64) (lanes.ChainDefinition, lanes.CommitteeVerifierRemoteChainInput, error) { + override := evmFeeQuoterDestChainConfigOverride(selector) + chainDef := lanes.ChainDefinition{ + FeeQuoterDestChainConfigOverrides: override, + ExecutorDestChainConfig: lanes.ExecutorDestChainConfig{ Enabled: true, }, - DefaultExecutorQualifier: devenvcommon.DefaultExecutorQualifier, DefaultInboundCCVs: []datastore.AddressRef{ { Type: datastore.ContractType(versioned_verifier_resolver.CommitteeVerifierResolverType), @@ -1420,8 +1381,34 @@ func (m *CCIP17EVMConfig) GetChainLaneProfile(_ *deployment.Environment, selecto Qualifier: devenvcommon.DefaultCommitteeVerifierQualifier, }, }, + AddressBytesLength: 20, + BaseExecutionGasCost: 150_000, + } + cvConfig := lanes.CommitteeVerifierRemoteChainInput{ GasForVerification: CommitteeVerifierGasForVerification, - }, nil + } + return chainDef, cvConfig, nil +} + +func evmFeeQuoterDestChainConfigOverride(selector uint64) *lanes.FeeQuoterDestChainConfigOverride { + override := lanes.FeeQuoterDestChainConfigOverride(func(cfg *lanes.FeeQuoterDestChainConfig) { + selectorBytes := changesetsutils.GetSelectorHex(selector) + cfg.IsEnabled = true + cfg.MaxDataBytes = 30_000 + cfg.MaxPerMsgGasLimit = 3_000_000 + cfg.DestGasOverhead = 300_000 + cfg.DefaultTokenFeeUSDCents = 25 + cfg.DestGasPerPayloadByteBase = 16 + cfg.DefaultTokenDestGasOverhead = 90_000 + cfg.DefaultTxGasLimit = 200_000 + cfg.NetworkFeeUSDCents = 10 + cfg.ChainFamilySelector = binary.BigEndian.Uint32(selectorBytes[:4]) + cfg.V2Params = &lanes.FeeQuoterV2Params{ + LinkFeeMultiplierPercent: 90, + USDPerUnitGas: big.NewInt(1e6), + } + }) + return &override } func (m *CCIP17EVMConfig) PostConnect(e *deployment.Environment, selector uint64, remoteSelectors []uint64) error { diff --git a/build/devenv/go.sum b/build/devenv/go.sum index 0f23e0186..1bbdce1d0 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -1117,62 +1117,6 @@ github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0ku github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3 h1:bbVSKb++R+rpLkydNvyS4nZPNkcjtolUuFC8YVwtMVk= github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3/go.mod h1:OywVThRaVXwknATT2B8QAwjOJ1LoYBB9bTsmRpf6RPw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260326205122-a6b3f014b808 h1:L41P/gvHKlmYLv05HPW/RK+OycM0sFNIKsGyJPS9IjE= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260326205122-a6b3f014b808/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331171343-5fc2d717fb95 h1:0lC/s03tG7sQ7hQ0yD5m49KhZ9ostKv62is8LpQYzgY= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331171343-5fc2d717fb95/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331192634-7da5ecaa82f4 h1:QWX0dLXYnRFnXqUd22vJwVLNZDotCHkg5V6H0sdtTdo= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331192634-7da5ecaa82f4/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331194110-a896013896cc h1:DuXzHU5S9hHJDkhNZf4RjNnDNSfAgojRRvNoHzBshD0= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331194110-a896013896cc/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331202459-592a42284273 h1:Yq7pNEY3vudDhBwY9RwJE1rll8Cp9lDhqAzBckA+FyE= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260331202459-592a42284273/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260401132038-7de2f653c6c9 h1:A6k1Ey5MTq3f5gL0RnvUa0dXJ0xfHLNImEm48iSMiH4= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260401132038-7de2f653c6c9/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402164037-112403d53ee7 h1:Phcv77VXXm6WhvCXOMulrEZVzkyjM6iYdHramOQDtYk= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402164037-112403d53ee7/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808 h1:NfO2eAe1z3gDKgkYmpg/jjhNe0XVn7q6k0ySk+1F9co= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260326205122-a6b3f014b808/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331171343-5fc2d717fb95 h1:DuWQjn0NaneGEodlPOUYJD87jRnexldwxZm0bA7Qm40= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331171343-5fc2d717fb95/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331192634-7da5ecaa82f4 h1:OygMETKMtDFkrehhHMVIs+hxbc10qr109hyeLaxSIDk= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331192634-7da5ecaa82f4/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331194110-a896013896cc h1:pMCpq9Cl/hOW++3Zj+ekkyi77eaVYPKPMKsJI78EGyA= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331194110-a896013896cc/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273 h1:2XYL4paS2OR8dv/nEhRXzVNOSrhiwIV2qYL0lW29UG4= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260331202459-592a42284273/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9 h1:CWcRIZy9LxScxkp+KDxdTX+WuSBO7ZPcwpM1KJBROO0= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7 h1:Af0r0yNh0+Rijpc2oaswH33Y5X+w+gZkXqCxDXUvdCk= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402164037-112403d53ee7/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 h1:E196qCqW4eUiUd8y89qAvR3Kh4lvRqJbnkpOH36nYsE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95 h1:oTF+7+OAF+gwx+jyAr700jLKpapAc63YRDqXr04CbDk= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331192634-7da5ecaa82f4 h1:RFzPgFiMds2JnLZho0DqoECld+O+pncNxzD+E/TPvGs= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331192634-7da5ecaa82f4/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331194110-a896013896cc h1:+3bZQ3nH8SHiyAvyQniiw6NtK9OD66BG8yTGEWWfFPY= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331194110-a896013896cc/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331202459-592a42284273 h1:5fmTwgVqmoZrfXSX8x/atiXmpgF19eU4NyS8qPWRmP0= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9 h1:efR8enl63n8ANfF51MxNkI4+hUnPlyurKrWNOpRhJnE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402164037-112403d53ee7 h1:ZmyPsKQLk0+ZQB437qUWoiXfl+10HhxPEz+Y6UZ3AL4= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402164037-112403d53ee7/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808 h1:r3can+ynfVcXVEHN5+5Ai4Velu55TjSV7phdpCXVrjU= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95 h1:n/whT4MKiF6iHIvu2l71yaSRu6zQgBcu/htljKXEj20= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331171343-5fc2d717fb95/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331192634-7da5ecaa82f4 h1:fEShXypB3HIFGxCsPbuGTT9CDtj5KUUE0wvs1V+2XxI= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331192634-7da5ecaa82f4/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331194110-a896013896cc h1:dS7AjzSnpbJbf+3a89remW8cEEgLrOumY1aj02xuhLg= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331194110-a896013896cc/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331202459-592a42284273 h1:ArU2uhAMGWwNIeGXtlQ11wiicanQHfkmfRpC6dIr6gE= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9 h1:A58Lf4yZsdx5Mnvl5xh84q1mtySFZRSvJZTMlNNrkR0= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:N2K2pMRf1fZm5Vulski3Ua+ToVzPZAvYLftJNi4kBKY= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402164037-112403d53ee7 h1:IQocJ0d1Espgo8sDH33jEgVuLJ8qmRCNUILBye/olz4= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402164037-112403d53ee7/go.mod h1:QZxcMdY1q34P+NjMhLTzPrXi8aaCCX7hDZ60dawpO+w= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402191319-c1b65265360d h1:O8O8PXemoNJuCl1L+hWrmbrjWi8oPUwT8ziptBlnO14= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402191319-c1b65265360d/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402191319-c1b65265360d h1:GJIyLz8wb3u7Cqgwrph133E97k3uXTwVMnX/G3R9rWM= @@ -1185,20 +1129,6 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139/go.mod h1:1WcontO9PeuKdUf5HXfs3nuICtzUvFNnyCmrHkTCF9Y= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260326205122-a6b3f014b808 h1:wa86USykquE4t+ndaAdVXH2TKheOjDZYQXWDiWyoZ7s= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260326205122-a6b3f014b808/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331171343-5fc2d717fb95 h1:/NEGfzE1/lAyCiVP2cOCkODkBVVMwihPrZsgdQFxQEw= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331171343-5fc2d717fb95/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331192634-7da5ecaa82f4 h1:oG5mHqdPkQULah+XIAR7TzXWISh9+iwap+VY1zpUvYo= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331192634-7da5ecaa82f4/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331194110-a896013896cc h1:9jne5FH7wITWgB6mBK3X+QNouz2DjzA5qynYboOO1BI= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331194110-a896013896cc/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331202459-592a42284273 h1:to49m40lVlKAfv5NO5LmbNY76J3s+tITtrl9es2LbMo= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260331202459-592a42284273/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260401132038-7de2f653c6c9 h1:vOguLB7GsttJbYg+CjoFnk+K5QIb5a6xfv6vylWDnhE= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260401132038-7de2f653c6c9/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402164037-112403d53ee7 h1:n+ydYXOa5K88hqOxuSS/JT4emgMaRyX4C8x/GRHvAPM= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402164037-112403d53ee7/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402191319-c1b65265360d h1:RHFkdmUz90TIHJXsHcnxyPZUMO1eayEMX8nYfhi5c6g= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402191319-c1b65265360d/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index a1c43a95c..53864cf03 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -19,12 +19,20 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" ) +// --------------------------------------------------------------------------- +// Canonical path (new): ConfigureChainsForLanesFromTopology +// --------------------------------------------------------------------------- + type chainProfile struct { remotes []uint64 impl cciptestinterfaces.CCIP17Configuration profile cciptestinterfaces.ChainLaneProfile } +// connectAllChains configures lanes incrementally: each iteration adds one +// chain to the mesh, mirroring how production environments grow. The +// underlying ConfigureChainForLanes sequence is fully idempotent, so +// re-running for already-configured contracts is a no-op. func connectAllChainsCanonical( impls []cciptestinterfaces.CCIP17Configuration, blockchains []*blockchain.Input, @@ -44,7 +52,7 @@ func connectAllChainsCanonical( return fmt.Errorf("connectAllChainsCanonical: %w", err) } - partialChains, err := buildPartialChainConfigsFromProfiles(topology, orderedSelectors, profiles, ReconfigureLanesParams{}) + partialChains, useTestRouter, err := buildPartialChainConfigsFromProfiles(topology, orderedSelectors, profiles, ReconfigureLanesParams{}) if err != nil { return fmt.Errorf("connectAllChainsCanonical: %w", err) } @@ -62,8 +70,9 @@ func connectAllChainsCanonical( ) cfg := ccipChangesets.ConfigureChainsForLanesFromTopologyConfig{ - Topology: topology, - Chains: partialChains, + Topology: topology, + Chains: partialChains, + UseTestRouter: useTestRouter, } if err := cs.VerifyPreconditions(*e, cfg); err != nil { return fmt.Errorf("connectAllChainsCanonical: precondition check failed: %w", err) @@ -82,6 +91,9 @@ func connectAllChainsCanonical( return nil } +// --------------------------------------------------------------------------- +// Legacy path: lanes.ConnectChains +// --------------------------------------------------------------------------- type chainEntry struct { remoteSelectors []uint64 impl cciptestinterfaces.CCIP17Configuration diff --git a/build/devenv/lane_topology.go b/build/devenv/lane_topology.go index d91b7c05b..6b0ce92f8 100644 --- a/build/devenv/lane_topology.go +++ b/build/devenv/lane_topology.go @@ -131,7 +131,6 @@ func partialChainConfigFromProfile( return ccipChangesets.PartialChainConfig{ ChainSelector: localSelector, - UseTestRouter: o.UseTestRouter, CommitteeVerifiers: committeeVerifiers, RemoteChains: remoteChains, }, nil @@ -176,11 +175,7 @@ func buildConnectionProfilesFromImpls( return orderedSelectors, profiles, nil } -func assertConnectionProfilesCoverSelectors( - orderedSelectors []uint64, - profiles map[uint64]chainProfile, - selectors []uint64, -) error { +func assertConnectionProfilesCoverSelectors(orderedSelectors, selectors []uint64) error { want := make(map[uint64]struct{}, len(selectors)) for _, s := range selectors { want[s] = struct{}{} @@ -228,14 +223,18 @@ func buildPartialChainConfigsFromProfiles( orderedSelectors []uint64, profiles map[uint64]chainProfile, params ReconfigureLanesParams, -) ([]ccipChangesets.PartialChainConfig, error) { +) ([]ccipChangesets.PartialChainConfig, bool, error) { + useTestRouter := false chains := make([]ccipChangesets.PartialChainConfig, 0, len(orderedSelectors)) for _, localSel := range orderedSelectors { entry, ok := profiles[localSel] if !ok { - return nil, fmt.Errorf("no profile for local chain %d", localSel) + return nil, false, fmt.Errorf("no profile for local chain %d", localSel) } o := lanePartialOverridesFromReconfigureParams(params, localSel) + if o.UseTestRouter { + useTestRouter = true + } pc, err := partialChainConfigFromProfile( localSel, entry.remotes, @@ -245,9 +244,9 @@ func buildPartialChainConfigsFromProfiles( o, ) if err != nil { - return nil, fmt.Errorf("partial chain config for selector %d: %w", localSel, err) + return nil, false, fmt.Errorf("partial chain config for selector %d: %w", localSel, err) } chains = append(chains, pc) } - return chains, nil + return chains, useTestRouter, nil } diff --git a/build/devenv/reconcile_onchain.go b/build/devenv/reconcile_onchain.go index 3070ae8fd..4ef355a39 100644 --- a/build/devenv/reconcile_onchain.go +++ b/build/devenv/reconcile_onchain.go @@ -98,11 +98,11 @@ func reconfigureLanesFromTopology( if err != nil { return fmt.Errorf("reconfigure lanes: %w", err) } - if err := assertConnectionProfilesCoverSelectors(orderedSelectors, profiles, selectors); err != nil { + if err := assertConnectionProfilesCoverSelectors(orderedSelectors, selectors); err != nil { return err } - chains, err := buildPartialChainConfigsFromProfiles(topology, orderedSelectors, profiles, params) + chains, useTestRouter, err := buildPartialChainConfigsFromProfiles(topology, orderedSelectors, profiles, params) if err != nil { return fmt.Errorf("reconfigure lanes: %w", err) } @@ -119,8 +119,9 @@ func reconfigureLanesFromTopology( ccipAdapters.GetChainFamilyRegistry(), changesetscore.GetRegistry(), ).Apply(*e, ccipChangesets.ConfigureChainsForLanesFromTopologyConfig{ - Topology: topology, - Chains: chains, + Topology: topology, + Chains: chains, + UseTestRouter: useTestRouter, }) if err != nil { return err diff --git a/build/devenv/services/executor/base.go b/build/devenv/services/executor/base.go index d47131cbc..220955a1b 100644 --- a/build/devenv/services/executor/base.go +++ b/build/devenv/services/executor/base.go @@ -99,9 +99,13 @@ type Output struct { JDNodeID string `toml:"jd_node_id"` } -// RebuildExecutorJobSpecWithBlockchainInfos takes a job spec and rebuilds it with blockchain infos -// added to the inner config. This is needed for standalone executors which require blockchain -// connection information (CL nodes get this from their own chain config). +func (v *Input) Restart(ctx context.Context) error { + if v == nil || v.Mode != services.Standalone { + return nil + } + return services.RestartContainer(ctx, v.ContainerName) +} + func (v *Input) RebuildExecutorJobSpecWithBlockchainInfos(jobSpec string, blockchainInfos map[string]any) (string, error) { var spec executorpkg.JobSpec if _, err := toml.Decode(jobSpec, &spec); err != nil { diff --git a/build/devenv/tests/e2e/tcapi/contracts.go b/build/devenv/tests/e2e/tcapi/contracts.go index ed71b3f06..a08780d2b 100644 --- a/build/devenv/tests/e2e/tcapi/contracts.go +++ b/build/devenv/tests/e2e/tcapi/contracts.go @@ -14,8 +14,6 @@ import ( const ( DefaultExecTimeout = 40 * time.Second DefaultSentTimeout = 10 * time.Second - // DefaultAssertMessageTimeout bounds aggregator/indexer polling in AssertMessage (off-chain path) for smoke E2E. - DefaultAssertMessageTimeout = 180 * time.Second ) // GetContractAddress returns the contract address for the given chain and contract reference. diff --git a/build/devenv/tests/e2e/tcapi/types.go b/build/devenv/tests/e2e/tcapi/types.go index 8583ec55c..5654d729a 100644 --- a/build/devenv/tests/e2e/tcapi/types.go +++ b/build/devenv/tests/e2e/tcapi/types.go @@ -170,7 +170,7 @@ func NewTestingContext(ctx context.Context, impl map[uint64]cciptestinterfaces.C AggregatorClient: aggregatorClient, IndexerClient: indexerClient, LogAsserter: logAssert, - Timeout: DefaultAssertMessageTimeout, + Timeout: 180 * time.Second, logger: logger, } From 5cda91f5f19ed7b0dacb096e08c36ac45ad33e89 Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Mon, 6 Apr 2026 13:35:54 -0400 Subject: [PATCH 19/28] Linting --- build/devenv/implcommon.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index 53864cf03..2598597dc 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -93,7 +93,7 @@ func connectAllChainsCanonical( // --------------------------------------------------------------------------- // Legacy path: lanes.ConnectChains -// --------------------------------------------------------------------------- +// ---------------------------------------------------------------------------. type chainEntry struct { remoteSelectors []uint64 impl cciptestinterfaces.CCIP17Configuration From 18801f98ea4975bdaa10dc26f009e06e92a35b4a Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Mon, 6 Apr 2026 12:23:48 -0700 Subject: [PATCH 20/28] gomod --- build/devenv/go.mod | 10 +++++----- build/devenv/go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/build/devenv/go.mod b/build/devenv/go.mod index ec214f33f..0c23ef6dc 100644 --- a/build/devenv/go.mod +++ b/build/devenv/go.mod @@ -16,9 +16,9 @@ require ( github.com/prometheus/client_golang v1.23.2 github.com/rs/zerolog v1.34.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260404013452-4d6f1e0cc77b - github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b - github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260404013452-4d6f1e0cc77b + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406180811-0ec22f0243a4 + github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406180811-0ec22f0243a4 + github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406180811-0ec22f0243a4 github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 github.com/smartcontractkit/chainlink-deployments-framework v0.93.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.3 @@ -36,8 +36,8 @@ require ( github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 github.com/sethvargo/go-retry v0.3.0 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260404013452-4d6f1e0cc77b - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260406180811-0ec22f0243a4 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260406180811-0ec22f0243a4 github.com/smartcontractkit/chainlink-ccv v0.0.0-20260218133052-8e7fe2f457f9 github.com/smartcontractkit/chainlink-common/keystore v1.0.0 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd diff --git a/build/devenv/go.sum b/build/devenv/go.sum index fc79ae2b1..20c4a17ee 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -1117,20 +1117,20 @@ github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0ku github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265 h1:Q/sYLdOefZUKc/Bxssq1mg8ptQE/AOot2WI+QcLoiVA= github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265/go.mod h1:CQGkKp3YDsUuxixxmmngmRKfh6yIcftGEZsQrsSIIM8= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260404013452-4d6f1e0cc77b h1:VZwrlKW1zT1aYmjPyA1lvYQa1eCFIy714hs280uy9+8= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260404013452-4d6f1e0cc77b/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260404013452-4d6f1e0cc77b h1:OZZEABOOm6Wvby0govc6SC8asQmONKSNN30EsqbGMcs= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260404013452-4d6f1e0cc77b/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b h1:oBSVUSB3l3dYXfOp7dnNuQD/gPmtlvIxTZqM/huQkKg= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b/go.mod h1:EzTojOm8F1YRlDO2OFpIBcBnsBWgQCnXrLAsdgFdmaI= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b h1:WbSvtjVXbKW7RcVqSM+f9W40eaDjP8xT1ccaIkoCX+E= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260404013452-4d6f1e0cc77b/go.mod h1:X9Sccn1RXZkwjt+6rTmmX0Lwwgeh9oDw5jhIVbm+UjA= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406180811-0ec22f0243a4 h1:m1QSwnMxrvkpFek+Z+h9OZDNNgZn3ZqQrlI22Ujq2Xs= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406180811-0ec22f0243a4/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260406180811-0ec22f0243a4 h1:b6IxxglkWivZ5nfYdYkHF4w0l2BJyEmSdyMYRm47aB4= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260406180811-0ec22f0243a4/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260406180811-0ec22f0243a4 h1:TgfEUojeZZRElfYOwZHAE0+OsyDD+iN91lT7w4Uqcy8= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260406180811-0ec22f0243a4/go.mod h1:EzTojOm8F1YRlDO2OFpIBcBnsBWgQCnXrLAsdgFdmaI= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406180811-0ec22f0243a4 h1:bh1YAqwIHC1w1x3imtZk8X1wTuS986OXs7WUnAJ5K8E= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406180811-0ec22f0243a4/go.mod h1:X9Sccn1RXZkwjt+6rTmmX0Lwwgeh9oDw5jhIVbm+UjA= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 h1:jkChf04hhdiMBApbb+lLDxHMY62Md6UeM7v++GSw3K8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139/go.mod h1:1WcontO9PeuKdUf5HXfs3nuICtzUvFNnyCmrHkTCF9Y= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260404013452-4d6f1e0cc77b h1:KYiR02PnguKM6SvKJ/hknHPUJLIyKkXWllzuHHrDw/o= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260404013452-4d6f1e0cc77b/go.mod h1:ddbeNpxyDEs5N4tiGLLezAEWYGMdYCPH3/mLcr0Rr4U= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406180811-0ec22f0243a4 h1:6UI/ZLJHADfDfoUPpee2ES5HOFAARpkOIlL6fsfDqno= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406180811-0ec22f0243a4/go.mod h1:ddbeNpxyDEs5N4tiGLLezAEWYGMdYCPH3/mLcr0Rr4U= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0/go.mod h1:0ghbAr7tRO0tT5ZqBXhOyzgUO37tNNe33Yn0hskauVM= github.com/smartcontractkit/chainlink-common/keystore v1.0.0 h1:sVa3j2FWK/5OxXpnlfDkF1deDAkuXEfaLKzYqBTA880= From 46b5f413016601a89a9819d6ad6b7b74cd1b5244 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Mon, 6 Apr 2026 12:31:29 -0700 Subject: [PATCH 21/28] gomod --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5436c12bf..0db26a74c 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/pressly/goose/v3 v3.26.0 github.com/prometheus/client_golang v1.23.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260406180811-0ec22f0243a4 github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260115212037-5e3a1db0e079 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251222115927-36a18321243c // indirect diff --git a/go.sum b/go.sum index 6781810bd..2836761d0 100644 --- a/go.sum +++ b/go.sum @@ -714,8 +714,8 @@ github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0ku github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260107192940-0be702ef3ff5 h1:zn5uuemiuL/Rda48li8Gql929DeYPTRhR2ZGrO3Tgz4= github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260107192940-0be702ef3ff5/go.mod h1:k5Ln240ZCu7weL16IgR1EN5xUsgVMjU9qr84eYZfCto= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c h1:FovWq3VisffT6TysAUnOH6kQr2yK4AFWLrf2dqo6wpI= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402223727-b875aa99b74c/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260406180811-0ec22f0243a4 h1:b6IxxglkWivZ5nfYdYkHF4w0l2BJyEmSdyMYRm47aB4= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260406180811-0ec22f0243a4/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 h1:f8ak6g6P2KT4HjUbleU+Bh0gUJXMoGuoriMSyGxxD4M= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:Ve1xD71bl193YIZQEoJMmBqLGQJdNs29bwbuObwvbhQ= github.com/smartcontractkit/chainlink-common v0.9.6-0.20260114190811-74301cd99dc3 h1:VINIWIvYhgbGJpaI7O3aBuBOAZgMEN6BGA61zQIqvFw= From b812015f06e5035370429480a7642aad4adcc818 Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Mon, 6 Apr 2026 16:48:24 -0400 Subject: [PATCH 22/28] Fix tests --- build/devenv/go.mod | 76 +++++++-------- build/devenv/go.sum | 152 +++++++++++++++--------------- build/devenv/implcommon.go | 7 +- build/devenv/reconcile_onchain.go | 7 +- 4 files changed, 122 insertions(+), 120 deletions(-) diff --git a/build/devenv/go.mod b/build/devenv/go.mod index c99f457b2..75f2e6565 100644 --- a/build/devenv/go.mod +++ b/build/devenv/go.mod @@ -9,22 +9,22 @@ require ( github.com/Masterminds/semver/v3 v3.4.0 github.com/c-bata/go-prompt v0.2.6 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc - github.com/docker/docker v28.5.2+incompatible + github.com/docker/docker v28.5.3-0.20260325154711-31a1689cb0a1+incompatible github.com/docker/go-connections v0.6.0 github.com/ethereum/go-ethereum v1.17.1 github.com/pelletier/go-toml/v2 v2.2.4 - github.com/prometheus/client_golang v1.23.0 + github.com/prometheus/client_golang v1.23.2 github.com/rs/zerolog v1.34.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402191319-c1b65265360d - github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402191319-c1b65265360d - github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402191319-c1b65265360d + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406204149-529d481ce906 + github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406204149-529d481ce906 + github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406204149-529d481ce906 github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 - github.com/smartcontractkit/chainlink-deployments-framework v0.85.0 - github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0 + github.com/smartcontractkit/chainlink-deployments-framework v0.93.0 + github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.3 github.com/stretchr/testify v1.11.1 - github.com/testcontainers/testcontainers-go v0.40.0 - github.com/testcontainers/testcontainers-go/modules/postgres v0.40.0 + github.com/testcontainers/testcontainers-go v0.41.0 + github.com/testcontainers/testcontainers-go/modules/postgres v0.41.0 go.uber.org/zap v1.27.1 ) @@ -48,11 +48,11 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/wasp v1.51.2 github.com/smartcontractkit/chainlink/deployment v0.0.0-20260126202327-6be9a05f0caf github.com/spf13/cobra v1.10.2 - google.golang.org/grpc v1.79.1 + google.golang.org/grpc v1.79.3 ) require ( - github.com/Khan/genqlient v0.7.0 // indirect + github.com/Khan/genqlient v0.8.1 // indirect github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect @@ -94,7 +94,7 @@ require ( github.com/stellar/go-stellar-sdk v0.1.0 // indirect github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 // indirect github.com/tjhop/slog-gokit v0.1.4 // indirect - github.com/vektah/gqlparser/v2 v2.5.14 // indirect + github.com/vektah/gqlparser/v2 v2.5.19 // indirect go.opentelemetry.io/collector/confmap v1.30.0 // indirect go.opentelemetry.io/collector/confmap/xconfmap v0.124.0 // indirect go.opentelemetry.io/collector/featuregate v1.30.0 // indirect @@ -128,28 +128,28 @@ require ( github.com/VictoriaMetrics/fastcache v1.13.0 // indirect github.com/XSAM/otelsql v0.37.0 // indirect github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect - github.com/aptos-labs/aptos-go-sdk v1.11.0 // indirect + github.com/aptos-labs/aptos-go-sdk v1.12.0 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/avast/retry-go v3.0.0+incompatible // indirect github.com/avast/retry-go/v4 v4.7.0 // indirect github.com/awalterschulze/gographviz v2.0.3+incompatible // indirect github.com/aws/aws-sdk-go v1.55.8 // indirect - github.com/aws/aws-sdk-go-v2 v1.41.2 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.10 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.10 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect - github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.58.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.18 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.11 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.15 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.7 // indirect - github.com/aws/smithy-go v1.24.1 // indirect + github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect + github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.59.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect + github.com/aws/smithy-go v1.24.2 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect github.com/benbjohnson/clock v1.3.5 // indirect @@ -239,7 +239,7 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.30.1 // indirect - github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/gofrs/flock v0.12.1 // indirect github.com/gogo/googleapis v1.4.1 // indirect @@ -267,7 +267,7 @@ require ( github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/consul/api v1.32.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect @@ -284,7 +284,7 @@ require ( github.com/hashicorp/memberlist v0.5.3 // indirect github.com/hashicorp/serf v0.10.2 // indirect github.com/hashicorp/yamux v0.1.2 // indirect - github.com/hasura/go-graphql-client v0.14.5 // indirect + github.com/hasura/go-graphql-client v0.15.1 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -389,11 +389,11 @@ require ( github.com/scylladb/go-reflectx v1.0.1 // indirect github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/shirou/gopsutil/v4 v4.26.1 // indirect + github.com/shirou/gopsutil/v4 v4.26.2 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3 // indirect github.com/sirupsen/logrus v1.9.4 // indirect - github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3 // indirect + github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 // indirect @@ -405,7 +405,7 @@ require ( github.com/smartcontractkit/freeport v0.1.3-0.20250828155247-add56fa28aad // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/libocr v0.0.0-20251212213002-0a5e2f907dda // indirect - github.com/smartcontractkit/mcms v0.36.3 // indirect + github.com/smartcontractkit/mcms v0.37.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/stephenlacy/go-ethereum-hdwallet v0.0.0-20230913225845-a4fa94429863 // indirect @@ -425,7 +425,7 @@ require ( github.com/ugorji/go/codec v1.3.0 // indirect github.com/ulule/limiter/v3 v3.11.2 // indirect github.com/urfave/cli/v2 v2.27.7 // indirect - github.com/valyala/fastjson v1.6.4 // indirect + github.com/valyala/fastjson v1.6.10 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect @@ -451,9 +451,9 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0 // indirect @@ -471,7 +471,7 @@ require ( go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect golang.org/x/arch v0.21.0 // indirect golang.org/x/crypto v0.48.0 // indirect - golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect + golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect golang.org/x/mod v0.33.0 // indirect golang.org/x/net v0.50.0 // indirect golang.org/x/oauth2 v0.35.0 // indirect diff --git a/build/devenv/go.sum b/build/devenv/go.sum index 1bbdce1d0..450a765ee 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -43,8 +43,8 @@ github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w= -github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM= +github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= +github.com/Khan/genqlient v0.8.1/go.mod h1:R2G6DzjBvCbhjsEajfRjbWdVglSH/73kSivC9TLWVjU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= @@ -82,8 +82,8 @@ github.com/apache/arrow-go/v18 v18.3.1 h1:oYZT8FqONiK74JhlH3WKVv+2NKYoyZ7C2ioD4D github.com/apache/arrow-go/v18 v18.3.1/go.mod h1:12QBya5JZT6PnBihi5NJTzbACrDGXYkrgjujz3MRQXU= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= -github.com/aptos-labs/aptos-go-sdk v1.11.0 h1:vIL1hpjECUiu7zMl9Wz6VV8ttXsrDqKUj0HxoeaIER4= -github.com/aptos-labs/aptos-go-sdk v1.11.0/go.mod h1:8YvYwRg93UcG6pTStCpZdYiscCtKh51sYfeLgIy/41c= +github.com/aptos-labs/aptos-go-sdk v1.12.0 h1:deHZ7NJlFhHm2i+eaPHt6EPa3BuXXnIYx2X5J3/U0Es= +github.com/aptos-labs/aptos-go-sdk v1.12.0/go.mod h1:FTgKp0RLfEefllCdkCj0jPU14xWk11yA7SFVfCDLUj8= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= @@ -99,38 +99,38 @@ github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2 github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= -github.com/aws/aws-sdk-go-v2 v1.41.2 h1:LuT2rzqNQsauaGkPK/7813XxcZ3o3yePY0Iy891T2ls= -github.com/aws/aws-sdk-go-v2 v1.41.2/go.mod h1:IvvlAZQXvTXznUPfRVfryiG1fbzE2NGK6m9u39YQ+S4= -github.com/aws/aws-sdk-go-v2/config v1.32.10 h1:9DMthfO6XWZYLfzZglAgW5Fyou2nRI5CuV44sTedKBI= -github.com/aws/aws-sdk-go-v2/config v1.32.10/go.mod h1:2rUIOnA2JaiqYmSKYmRJlcMWy6qTj1vuRFscppSBMcw= -github.com/aws/aws-sdk-go-v2/credentials v1.19.10 h1:EEhmEUFCE1Yhl7vDhNOI5OCL/iKMdkkYFTRpZXNw7m8= -github.com/aws/aws-sdk-go-v2/credentials v1.19.10/go.mod h1:RnnlFCAlxQCkN2Q379B67USkBMu1PipEEiibzYN5UTE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.18 h1:Ii4s+Sq3yDfaMLpjrJsqD6SmG/Wq/P5L/hw2qa78UAY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.18/go.mod h1:6x81qnY++ovptLE6nWQeWrpXxbnlIex+4H4eYYGcqfc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18 h1:F43zk1vemYIqPAwhjTjYIz0irU2EY7sOb/F5eJ3HuyM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18/go.mod h1:w1jdlZXrGKaJcNoL+Nnrj+k5wlpGXqnNrKoP22HvAug= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18 h1:xCeWVjj0ki0l3nruoyP2slHsGArMxeiiaoPN5QZH6YQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18/go.mod h1:r/eLGuGCBw6l36ZRWiw6PaZwPXb6YOj+i/7MizNl5/k= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= -github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.58.1 h1:MVbhtr5+/WM5u3Z4rdIk/xQmy7NFSyZxNXcy5hCCuRE= -github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.58.1/go.mod h1:mP260yaWr2aT73knlr44yaQEP52UPbVZppXzVO9k52g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.5 h1:CeY9LUdur+Dxoeldqoun6y4WtJ3RQtzk0JMP2gfUay0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.5/go.mod h1:AZLZf2fMaahW5s/wMRciu1sYbdsikT/UHwbUjOdEVTc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.18 h1:LTRCYFlnnKFlKsyIQxKhJuDuA3ZkrDQMRYm6rXiHlLY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.18/go.mod h1:XhwkgGG6bHSd00nO/mexWTcTjgd6PjuvWQMqSn2UaEk= +github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= +github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= +github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.59.2 h1:I1oExVl2b6nJGv//TcU78k9Covm/htQ5gwPIcDlM2PI= +github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.59.2/go.mod h1:sxvHFUS0fM9Y3BpmDvwrO9fnQC0CrFSG8KD9THjv6k4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= github.com/aws/aws-sdk-go-v2/service/kms v1.50.1 h1:wb/PYYm3wlcqGzw7Ls4GD3X5+seDDoNdVYIB6I/V87E= github.com/aws/aws-sdk-go-v2/service/kms v1.50.1/go.mod h1:xvHowJ6J9CuaFE04S8fitWQXytf4sHz3DTPGhw9FtmU= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.6 h1:MzORe+J94I+hYu2a6XmV5yC9huoTv8NRcCrUNedDypQ= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.6/go.mod h1:hXzcHLARD7GeWnifd8j9RWqtfIgxj4/cAtIVIK7hg8g= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.11 h1:7oGD8KPfBOJGXiCoRKrrrQkbvCp8N++u36hrLMPey6o= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.11/go.mod h1:0DO9B5EUJQlIDif+XJRWCljZRKsAFKh3gpFz7UnDtOo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.15 h1:edCcNp9eGIUDUCrzoCu1jWAXLGFIizeqkdkKgRlJwWc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.15/go.mod h1:lyRQKED9xWfgkYC/wmmYfv7iVIM68Z5OQ88ZdcV1QbU= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.7 h1:NITQpgo9A5NrDZ57uOWj+abvXSb83BbyggcUBVksN7c= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.7/go.mod h1:sks5UWBhEuWYDPdwlnRFn1w7xWdH29Jcpe+/PJQefEs= -github.com/aws/smithy-go v1.24.1 h1:VbyeNfmYkWoxMVpGUAbQumkODcYmfMRfZ8yQiH30SK0= -github.com/aws/smithy-go v1.24.1/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= +github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= +github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0= @@ -309,8 +309,8 @@ github.com/digitalocean/godo v1.144.0 h1:rDCsmpwcDe5egFQ3Ae45HTde685/GzX037mWRMP github.com/digitalocean/godo v1.144.0/go.mod h1:tYeiWY5ZXVpU48YaFv0M5irUFHXGorZpDNm7zzdWMzM= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= -github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v28.5.3-0.20260325154711-31a1689cb0a1+incompatible h1:f51eIlZsZqGKXyNeCHs5oVo/xQiR9zh+pDYMfnu3VPQ= +github.com/docker/docker v28.5.3-0.20260325154711-31a1689cb0a1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -458,8 +458,8 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8Wd github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= -github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= +github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I= github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= @@ -576,8 +576,8 @@ github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpS github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/consul/api v1.32.1 h1:0+osr/3t/aZNAdJX558crU3PEjVrG4x6715aZHRgceE= github.com/hashicorp/consul/api v1.32.1/go.mod h1:mXUWLnxftwTmDv4W3lzxYCPD199iNLLUyLfLGFJbtl4= github.com/hashicorp/consul/sdk v0.16.2 h1:cGX/djeEe9r087ARiKVWwVWCF64J+yW0G6ftZMZYbj0= @@ -632,8 +632,8 @@ github.com/hashicorp/serf v0.10.2 h1:m5IORhuNSjaxeljg5DeQVDlQyVkhRIjJDimbkCa8aAc github.com/hashicorp/serf v0.10.2/go.mod h1:T1CmSGfSeGfnfNy/w0odXQUR1rfECGd2Qdsp84DjOiY= github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= -github.com/hasura/go-graphql-client v0.14.5 h1:M9HxxGLCcDZnxJGYyWXAzDYEpommgjW+sUW3V8EaGms= -github.com/hasura/go-graphql-client v0.14.5/go.mod h1:jfSZtBER3or+88Q9vFhWHiFMPppfYILRyl+0zsgPIIw= +github.com/hasura/go-graphql-client v0.15.1 h1:mCb5I+8Bk3FU3GKWvf/zDXkTh7FbGlqJmP3oisBdnN8= +github.com/hasura/go-graphql-client v0.15.1/go.mod h1:jfSZtBER3or+88Q9vFhWHiFMPppfYILRyl+0zsgPIIw= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/hetznercloud/hcloud-go/v2 v2.21.0 h1:wUpQT+fgAxIcdMtFvuCJ78ziqc/VARubpOQPQyj4Q84= @@ -1015,8 +1015,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= -github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1096,8 +1096,8 @@ github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil/v4 v4.26.1 h1:TOkEyriIXk2HX9d4isZJtbjXbEjf5qyKPAzbzY0JWSo= -github.com/shirou/gopsutil/v4 v4.26.1/go.mod h1:medLI9/UNAb0dOI9Q3/7yWSqKkj00u+1tgY8nvv41pc= +github.com/shirou/gopsutil/v4 v4.26.2 h1:X8i6sicvUFih4BmYIGT1m2wwgw2VG9YgrDTi7cIRGUI= +github.com/shirou/gopsutil/v4 v4.26.2/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1115,30 +1115,30 @@ github.com/smartcontractkit/ccip-contract-examples/chains/evm v0.0.0-20250826190 github.com/smartcontractkit/ccip-contract-examples/chains/evm v0.0.0-20250826190403-aed7f5f33cde/go.mod h1:SYc+BvAALmwsx2zMJIAczIyVNwsiXRIBXmejcTORxGE= github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0kub04Epds5NPMHERfGjo= github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= -github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3 h1:bbVSKb++R+rpLkydNvyS4nZPNkcjtolUuFC8YVwtMVk= -github.com/smartcontractkit/chainlink-aptos v0.0.0-20251212131933-e5e85d6fa4d3/go.mod h1:OywVThRaVXwknATT2B8QAwjOJ1LoYBB9bTsmRpf6RPw= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402191319-c1b65265360d h1:O8O8PXemoNJuCl1L+hWrmbrjWi8oPUwT8ziptBlnO14= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260402191319-c1b65265360d/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265 h1:Q/sYLdOefZUKc/Bxssq1mg8ptQE/AOot2WI+QcLoiVA= +github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265/go.mod h1:CQGkKp3YDsUuxixxmmngmRKfh6yIcftGEZsQrsSIIM8= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406204149-529d481ce906 h1:2KDLBGl086FjynCut+1vBCXz5aWD6bixjf+C2TIIrOA= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406204149-529d481ce906/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402191319-c1b65265360d h1:GJIyLz8wb3u7Cqgwrph133E97k3uXTwVMnX/G3R9rWM= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402191319-c1b65265360d/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402191319-c1b65265360d h1:bwPPR0uaku209EMZvq3+fzFG1pwxH12+1V6vbFkzVIU= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402191319-c1b65265360d/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402191319-c1b65265360d h1:R3VZW7dqiwaDS+pySlfsWliq1E3aZqlJaTSyy/PG+Bg= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260402191319-c1b65265360d/go.mod h1:QZxcMdY1q34P+NjMhLTzPrXi8aaCCX7hDZ60dawpO+w= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406204149-529d481ce906 h1:HDsNANWVH3vTg5dNqP6/rC2UThBwR2lw4Q3BRP41NIA= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406204149-529d481ce906/go.mod h1:X9Sccn1RXZkwjt+6rTmmX0Lwwgeh9oDw5jhIVbm+UjA= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 h1:jkChf04hhdiMBApbb+lLDxHMY62Md6UeM7v++GSw3K8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139/go.mod h1:1WcontO9PeuKdUf5HXfs3nuICtzUvFNnyCmrHkTCF9Y= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402191319-c1b65265360d h1:RHFkdmUz90TIHJXsHcnxyPZUMO1eayEMX8nYfhi5c6g= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260402191319-c1b65265360d/go.mod h1:P0/tjeeIIxfsBupk5MneRjq5uI9mj+ZQpMpYnFla6WM= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406204149-529d481ce906 h1:AW46S2F9Ug7EElUY7Y5q619wVwg+nS4eqsNhShELxis= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406204149-529d481ce906/go.mod h1:ddbeNpxyDEs5N4tiGLLezAEWYGMdYCPH3/mLcr0Rr4U= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0/go.mod h1:0ghbAr7tRO0tT5ZqBXhOyzgUO37tNNe33Yn0hskauVM= github.com/smartcontractkit/chainlink-common/keystore v1.0.0 h1:sVa3j2FWK/5OxXpnlfDkF1deDAkuXEfaLKzYqBTA880= github.com/smartcontractkit/chainlink-common/keystore v1.0.0/go.mod h1:wGRJJlCFUOKIfBlBGEdBFiTf7R787B8HKyobjiymw3Q= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= -github.com/smartcontractkit/chainlink-deployments-framework v0.85.0 h1:L/iQt9pm324YBNlyJPe8oMw4l8LVEzbpL4HFFO4uaG4= -github.com/smartcontractkit/chainlink-deployments-framework v0.85.0/go.mod h1:L6cKbcw029ciNybdEU2ASdXiQUyqVnCIwlXyhs/DJl0= +github.com/smartcontractkit/chainlink-deployments-framework v0.93.0 h1:FzwtFJmasVhALpKvWZn+zOOlgty7cw2K70dzvjQIAKg= +github.com/smartcontractkit/chainlink-deployments-framework v0.93.0/go.mod h1:XTN/14+Ch8/+q+sdIastZWO/n9ID+ZnxKWD/aLqLDLw= github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260126170652-c5f27bb1804e h1:DmVqY4qcoDtUa4uqYJ444Izqj1zIu9AP2MCCUMBqwWk= github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260126170652-c5f27bb1804e/go.mod h1:5KhbnUmIYDjUd/bv0aTbiu/BNbVVixv7U/5Fk7lG12s= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd h1:sK+pK4epQp20yQ7XztwrVgkTkRAr4FY+TvEegW8RuQk= @@ -1171,8 +1171,8 @@ github.com/smartcontractkit/chainlink-protos/orchestrator v0.10.0 h1:0eroOyBwmdo github.com/smartcontractkit/chainlink-protos/orchestrator v0.10.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-sui v0.0.0-20260205175622-33e65031f9a9 h1:KyPROV+v7P8VdiU7JhVuGLcDlEBsURSpQmSCgNBTY+s= github.com/smartcontractkit/chainlink-sui v0.0.0-20260205175622-33e65031f9a9/go.mod h1:KpEWZJMLwbdMHeHQz9rbkES0vRrx4nk6OQXyhlHb9/8= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0 h1:7fQDETtHDe68c9Eusx4YpdPMsoBJX+hQMYjS0SlAIt4= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.0/go.mod h1:43xdIQuqw/gzfazsqJkBrGdF25TIJDiY/Ak/YrWFTmU= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.3 h1:wMxGJzQrKF5J9Msmpeal1Iw3h4RqPwOZ2I1ZjlSqhZo= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.3/go.mod h1:BALK9cj8sk12e15UF6uDhifHgIApa+6N11TcQfInEro= github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 h1:VIxK8u0Jd0Q/VuhmsNm6Bls6Tb31H/sA3A/rbc5hnhg= github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0/go.mod h1:lyAu+oMXdNUzEDScj2DXB2IueY+SDXPPfyl/kb63tMM= github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.5 h1:RwZXxdIAOyjp6cwc9Quxgr38k8r7ACz+Lxh9o/A6oH0= @@ -1195,8 +1195,8 @@ github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12i github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20251212213002-0a5e2f907dda h1:OjM+79FRuVZlj0Qd4y+q8Xmz/tEn5y8npqmiQiMMj+w= github.com/smartcontractkit/libocr v0.0.0-20251212213002-0a5e2f907dda/go.mod h1:oJkBKVn8zoBQm7Feah9CiuEHyCqAhnp1LJBzrvloQtM= -github.com/smartcontractkit/mcms v0.36.3 h1:NxFNRZBTgcHbNoMsn4o9H6h+fXdd6EpWzIUiBWGf5Kk= -github.com/smartcontractkit/mcms v0.36.3/go.mod h1:IUBVZyIJ2pjcphR4NOusYWvo129wAepwblzYZWmvo0Q= +github.com/smartcontractkit/mcms v0.37.0 h1:h3tqQhVdLezyHOuPsGcknPFLlZlXpOHTchwlfO3D9s8= +github.com/smartcontractkit/mcms v0.37.0/go.mod h1:7YqJPR8w9GiO1L/JjjTrwlSwAZ7i3J7cgOcu88PqtvU= github.com/smartcontractkit/wsrpc v0.8.5-0.20250502134807-c57d3d995945 h1:zxcODLrFytOKmAd8ty8S/XK6WcIEJEgRBaL7sY/7l4Y= github.com/smartcontractkit/wsrpc v0.8.5-0.20250502134807-c57d3d995945/go.mod h1:m3pdp17i4bD50XgktkzWetcV5yaLsi7Gunbv4ZgN6qg= github.com/sony/gobreaker/v2 v2.1.0 h1:av2BnjtRmVPWBvy5gSFPytm1J8BmN5AGhq875FfGKDM= @@ -1250,10 +1250,10 @@ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDd github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= -github.com/testcontainers/testcontainers-go v0.40.0 h1:pSdJYLOVgLE8YdUY2FHQ1Fxu+aMnb6JfVz1mxk7OeMU= -github.com/testcontainers/testcontainers-go v0.40.0/go.mod h1:FSXV5KQtX2HAMlm7U3APNyLkkap35zNLxukw9oBi/MY= -github.com/testcontainers/testcontainers-go/modules/postgres v0.40.0 h1:s2bIayFXlbDFexo96y+htn7FzuhpXLYJNnIuglNKqOk= -github.com/testcontainers/testcontainers-go/modules/postgres v0.40.0/go.mod h1:h+u/2KoREGTnTl9UwrQ/g+XhasAT8E6dClclAADeXoQ= +github.com/testcontainers/testcontainers-go v0.41.0 h1:mfpsD0D36YgkxGj2LrIyxuwQ9i2wCKAD+ESsYM1wais= +github.com/testcontainers/testcontainers-go v0.41.0/go.mod h1:pdFrEIfaPl24zmBjerWTTYaY0M6UHsqA1YSvsoU40MI= +github.com/testcontainers/testcontainers-go/modules/postgres v0.41.0 h1:AOtFXssrDlLm84A2sTTR/AhvJiYbrIuCO59d+Ro9Tb0= +github.com/testcontainers/testcontainers-go/modules/postgres v0.41.0/go.mod h1:k2a09UKhgSp6vNpliIY0QSgm4Hi7GXVTzWvWgUemu/8= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= @@ -1287,10 +1287,10 @@ github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= -github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/vektah/gqlparser/v2 v2.5.14 h1:dzLq75BJe03jjQm6n56PdH1oweB8ana42wj7E4jRy70= -github.com/vektah/gqlparser/v2 v2.5.14/go.mod h1:WQQjFc+I1YIzoPvZBhUQX7waZgg3pMLi0r8KymvAE2w= +github.com/valyala/fastjson v1.6.10 h1:/yjJg8jaVQdYR3arGxPE2X5z89xrlhS0eGXdv+ADTh4= +github.com/valyala/fastjson v1.6.10/go.mod h1:e6FubmQouUNP73jtMLmcbxS6ydWIpOfhz34TSfO3JaE= +github.com/vektah/gqlparser/v2 v2.5.19 h1:bhCPCX1D4WWzCDvkPl4+TP1N8/kLrWnp43egplt7iSg= +github.com/vektah/gqlparser/v2 v2.5.19/go.mod h1:y7kvl5bBlDeuWIvLtA9849ncyvx6/lj06RsMrEjVy3U= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= @@ -1392,12 +1392,12 @@ go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 h1:vl9 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0/go.mod h1:GAXRxmLJcVM3u22IjTg74zWBrRCKq8BnOqUVLodpcpw= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0 h1:gAU726w9J8fwr4qRDqu1GYMNNs4gXrU+Pv20/N1UpB4= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0/go.mod h1:RboSDkp7N292rgu+T0MgVt2qgFGu6qa1RpZDOtpL76w= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 h1:inYW9ZhgqiDqh6BioM7DVHHzEGVq76Db5897WLGZ5Go= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0/go.mod h1:Izur+Wt8gClgMJqO/cZ8wdeeMryJ/xxiOVgFSSfpDTY= go.opentelemetry.io/otel/exporters/prometheus v0.58.0 h1:CJAxWKFIqdBennqxJyOgnt5LqkeFRT+Mz3Yjz3hL+h8= go.opentelemetry.io/otel/exporters/prometheus v0.58.0/go.mod h1:7qo/4CLI+zYSNbv0GMNquzuss2FVZo3OYrGh96n4HNc= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0 h1:yEX3aC9KDgvYPhuKECHbOlr5GLwH6KTjLJ1sBSkkxkc= @@ -1481,8 +1481,8 @@ golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU= -golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU= +golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= +golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1696,8 +1696,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= -google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index 2598597dc..d5deb8259 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -70,9 +70,10 @@ func connectAllChainsCanonical( ) cfg := ccipChangesets.ConfigureChainsForLanesFromTopologyConfig{ - Topology: topology, - Chains: partialChains, - UseTestRouter: useTestRouter, + Topology: topology, + Chains: partialChains, + UseTestRouter: useTestRouter, + AllowOnrampOverride: true, } if err := cs.VerifyPreconditions(*e, cfg); err != nil { return fmt.Errorf("connectAllChainsCanonical: precondition check failed: %w", err) diff --git a/build/devenv/reconcile_onchain.go b/build/devenv/reconcile_onchain.go index 4ef355a39..d08516679 100644 --- a/build/devenv/reconcile_onchain.go +++ b/build/devenv/reconcile_onchain.go @@ -119,9 +119,10 @@ func reconfigureLanesFromTopology( ccipAdapters.GetChainFamilyRegistry(), changesetscore.GetRegistry(), ).Apply(*e, ccipChangesets.ConfigureChainsForLanesFromTopologyConfig{ - Topology: topology, - Chains: chains, - UseTestRouter: useTestRouter, + Topology: topology, + Chains: chains, + UseTestRouter: useTestRouter, + AllowOnrampOverride: true, }) if err != nil { return err From fa65784bf2217743520fa22813b7b5ead76bcf0c Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Mon, 6 Apr 2026 17:16:02 -0400 Subject: [PATCH 23/28] Bump cl-ccip --- build/devenv/go.mod | 6 +++--- build/devenv/go.sum | 12 ++++++------ build/devenv/implcommon.go | 7 +++---- build/devenv/reconcile_onchain.go | 7 +++---- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/build/devenv/go.mod b/build/devenv/go.mod index 75f2e6565..5995a27c7 100644 --- a/build/devenv/go.mod +++ b/build/devenv/go.mod @@ -16,9 +16,9 @@ require ( github.com/prometheus/client_golang v1.23.2 github.com/rs/zerolog v1.34.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406204149-529d481ce906 - github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406204149-529d481ce906 - github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406204149-529d481ce906 + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406211403-2856e8088a47 + github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406211403-2856e8088a47 + github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406211403-2856e8088a47 github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 github.com/smartcontractkit/chainlink-deployments-framework v0.93.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.3 diff --git a/build/devenv/go.sum b/build/devenv/go.sum index 450a765ee..f9d81f4ff 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -1117,20 +1117,20 @@ github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0ku github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265 h1:Q/sYLdOefZUKc/Bxssq1mg8ptQE/AOot2WI+QcLoiVA= github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265/go.mod h1:CQGkKp3YDsUuxixxmmngmRKfh6yIcftGEZsQrsSIIM8= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406204149-529d481ce906 h1:2KDLBGl086FjynCut+1vBCXz5aWD6bixjf+C2TIIrOA= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406204149-529d481ce906/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406211403-2856e8088a47 h1:rfJcOgVzZVNT3o5JxYZUQoJFgkpTei+JtG2NUrR3W/Y= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260406211403-2856e8088a47/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402191319-c1b65265360d h1:GJIyLz8wb3u7Cqgwrph133E97k3uXTwVMnX/G3R9rWM= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260402191319-c1b65265360d/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402191319-c1b65265360d h1:bwPPR0uaku209EMZvq3+fzFG1pwxH12+1V6vbFkzVIU= github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260402191319-c1b65265360d/go.mod h1:QwX+HNkW/rFrwqHqCEIPr5VhEWi1PDklXMC3KJTmmf8= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406204149-529d481ce906 h1:HDsNANWVH3vTg5dNqP6/rC2UThBwR2lw4Q3BRP41NIA= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406204149-529d481ce906/go.mod h1:X9Sccn1RXZkwjt+6rTmmX0Lwwgeh9oDw5jhIVbm+UjA= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406211403-2856e8088a47 h1:D6JlONv+qfnaBEfcNjCI7o+BXv+Pt6UE3Afjx8hUBY8= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260406211403-2856e8088a47/go.mod h1:X9Sccn1RXZkwjt+6rTmmX0Lwwgeh9oDw5jhIVbm+UjA= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 h1:jkChf04hhdiMBApbb+lLDxHMY62Md6UeM7v++GSw3K8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139/go.mod h1:1WcontO9PeuKdUf5HXfs3nuICtzUvFNnyCmrHkTCF9Y= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406204149-529d481ce906 h1:AW46S2F9Ug7EElUY7Y5q619wVwg+nS4eqsNhShELxis= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406204149-529d481ce906/go.mod h1:ddbeNpxyDEs5N4tiGLLezAEWYGMdYCPH3/mLcr0Rr4U= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406211403-2856e8088a47 h1:RcHYMQdiVxz2qfwGSCpk7EPjXQstkZ1gC0c3JhfothI= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260406211403-2856e8088a47/go.mod h1:ddbeNpxyDEs5N4tiGLLezAEWYGMdYCPH3/mLcr0Rr4U= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0/go.mod h1:0ghbAr7tRO0tT5ZqBXhOyzgUO37tNNe33Yn0hskauVM= github.com/smartcontractkit/chainlink-common/keystore v1.0.0 h1:sVa3j2FWK/5OxXpnlfDkF1deDAkuXEfaLKzYqBTA880= diff --git a/build/devenv/implcommon.go b/build/devenv/implcommon.go index d5deb8259..2598597dc 100644 --- a/build/devenv/implcommon.go +++ b/build/devenv/implcommon.go @@ -70,10 +70,9 @@ func connectAllChainsCanonical( ) cfg := ccipChangesets.ConfigureChainsForLanesFromTopologyConfig{ - Topology: topology, - Chains: partialChains, - UseTestRouter: useTestRouter, - AllowOnrampOverride: true, + Topology: topology, + Chains: partialChains, + UseTestRouter: useTestRouter, } if err := cs.VerifyPreconditions(*e, cfg); err != nil { return fmt.Errorf("connectAllChainsCanonical: precondition check failed: %w", err) diff --git a/build/devenv/reconcile_onchain.go b/build/devenv/reconcile_onchain.go index d08516679..4ef355a39 100644 --- a/build/devenv/reconcile_onchain.go +++ b/build/devenv/reconcile_onchain.go @@ -119,10 +119,9 @@ func reconfigureLanesFromTopology( ccipAdapters.GetChainFamilyRegistry(), changesetscore.GetRegistry(), ).Apply(*e, ccipChangesets.ConfigureChainsForLanesFromTopologyConfig{ - Topology: topology, - Chains: chains, - UseTestRouter: useTestRouter, - AllowOnrampOverride: true, + Topology: topology, + Chains: chains, + UseTestRouter: useTestRouter, }) if err != nil { return err From e61a80605673c46260337fce863afab7d8670896 Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Tue, 7 Apr 2026 11:51:26 -0400 Subject: [PATCH 24/28] Linting --- build/devenv/evm/cctp.go | 4 ++-- build/devenv/evm/impl.go | 2 +- build/devenv/evm/lombard.go | 2 +- build/devenv/evm/operations.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/devenv/evm/cctp.go b/build/devenv/evm/cctp.go index 026bb8a27..0bd773960 100644 --- a/build/devenv/evm/cctp.go +++ b/build/devenv/evm/cctp.go @@ -15,7 +15,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/usdc_token_pool_proxy" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/mock_usdc_token_messenger" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/mock_usdc_token_transmitter" - "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/utils/operations/contract" + "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" burnminterc677ops "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" @@ -429,7 +429,7 @@ func filterOnlySupportedSelectors(remoteSelectors []uint64) []uint64 { } func usdcTokenPoolProxies(sourceSelector uint64, remoteSelectors []uint64) map[uint64]datastore.AddressRef { - selectors := make([]uint64, 0) + selectors := make([]uint64, 0, 1+len(remoteSelectors)) selectors = append(selectors, sourceSelector) selectors = append(selectors, remoteSelectors...) diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index 5018d59b0..bc64ce77d 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -45,7 +45,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/mock_lombard_bridge" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/offramp" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/onramp" - "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/utils/operations/contract" + "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/link" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/weth" diff --git a/build/devenv/evm/lombard.go b/build/devenv/evm/lombard.go index 318a6eedb..5be56efe9 100644 --- a/build/devenv/evm/lombard.go +++ b/build/devenv/evm/lombard.go @@ -14,7 +14,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/lombard_verifier" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/mock_receiver_v2" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/mock_lombard_bridge" - evm_contract "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/utils/operations/contract" + evm_contract "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" diff --git a/build/devenv/evm/operations.go b/build/devenv/evm/operations.go index 3d994dd2d..7d20891d5 100644 --- a/build/devenv/evm/operations.go +++ b/build/devenv/evm/operations.go @@ -11,7 +11,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/committee_verifier" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/mock_receiver_v2" - "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/utils/operations/contract" + "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_2_0/operations/router" "github.com/smartcontractkit/chainlink-ccv/protocol" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" From 26f97aef7417118ead9083407646cfe169d4a130 Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Tue, 7 Apr 2026 12:07:49 -0400 Subject: [PATCH 25/28] Linting --- build/devenv/evm/cctp.go | 2 +- build/devenv/evm/impl.go | 2 +- build/devenv/evm/lombard.go | 2 +- build/devenv/evm/operations.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/devenv/evm/cctp.go b/build/devenv/evm/cctp.go index 0bd773960..3e1f8fb0e 100644 --- a/build/devenv/evm/cctp.go +++ b/build/devenv/evm/cctp.go @@ -15,7 +15,6 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/usdc_token_pool_proxy" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/mock_usdc_token_messenger" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/mock_usdc_token_transmitter" - "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" burnminterc677ops "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" @@ -23,6 +22,7 @@ import ( "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" "github.com/smartcontractkit/chainlink-ccv/verifier/pkg/token/cctp" "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm" + "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-deployments-framework/operations" diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index bc64ce77d..32671814b 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -45,7 +45,6 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/mock_lombard_bridge" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/offramp" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/onramp" - "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" bnm_drip_v1_0 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/burn_mint_erc20_with_drip" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/link" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_0_0/operations/weth" @@ -60,6 +59,7 @@ import ( "github.com/smartcontractkit/chainlink-ccv/protocol" "github.com/smartcontractkit/chainlink-ccv/verifier/pkg/token/lombard" "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm" + "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-deployments-framework/operations" diff --git a/build/devenv/evm/lombard.go b/build/devenv/evm/lombard.go index 5be56efe9..76ad881b9 100644 --- a/build/devenv/evm/lombard.go +++ b/build/devenv/evm/lombard.go @@ -14,13 +14,13 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/lombard_verifier" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/mock_receiver_v2" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/gobindings/generated/latest/mock_lombard_bridge" - evm_contract "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/operations/burn_mint_erc20_with_drip" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" devenvcommon "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm" + evm_contract "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-deployments-framework/deployment" cldf_ops "github.com/smartcontractkit/chainlink-deployments-framework/operations" diff --git a/build/devenv/evm/operations.go b/build/devenv/evm/operations.go index 7d20891d5..88fb6cda5 100644 --- a/build/devenv/evm/operations.go +++ b/build/devenv/evm/operations.go @@ -11,9 +11,9 @@ import ( "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/committee_verifier" "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/mock_receiver_v2" - "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_2_0/operations/router" "github.com/smartcontractkit/chainlink-ccv/protocol" + "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm/operations/contract" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-deployments-framework/operations" From e76f465c9cc99924075e47f40536d5ea548f81de Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Thu, 9 Apr 2026 07:49:00 -0400 Subject: [PATCH 26/28] Bump cl-ccip --- build/devenv/go.mod | 12 ++++++------ build/devenv/go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/build/devenv/go.mod b/build/devenv/go.mod index 2e84ee6a4..5d4bc5312 100644 --- a/build/devenv/go.mod +++ b/build/devenv/go.mod @@ -16,9 +16,9 @@ require ( github.com/prometheus/client_golang v1.23.2 github.com/rs/zerolog v1.34.0 github.com/smartcontractkit/chain-selectors v1.0.97 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260408173936-5b7036b83fc5 - github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260408173936-5b7036b83fc5 - github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260408173936-5b7036b83fc5 + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260409110811-3490f129337a + github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260409110811-3490f129337a + github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260409110811-3490f129337a github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 github.com/smartcontractkit/chainlink-deployments-framework v0.93.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.3 @@ -36,8 +36,8 @@ require ( github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 github.com/sethvargo/go-retry v0.3.0 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260408173936-5b7036b83fc5 - github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260408173936-5b7036b83fc5 + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260409110811-3490f129337a + github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260409110811-3490f129337a github.com/smartcontractkit/chainlink-ccv v0.0.0-20260218133052-8e7fe2f457f9 github.com/smartcontractkit/chainlink-common/keystore v1.0.0 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd @@ -89,7 +89,7 @@ require ( github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b // indirect github.com/smartcontractkit/chainlink-protos/node-platform v0.0.0-20260205130626-db2a2aab956b // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.10.0 // indirect - github.com/smartcontractkit/chainlink-ton v0.0.0-20260219201907-054376f21418 // indirect + github.com/smartcontractkit/chainlink-ton v0.0.0-20260408074447-0acfdcb19338 // indirect github.com/smartcontractkit/chainlink/v2 v2.29.0 // indirect github.com/smartcontractkit/wsrpc v0.8.5-0.20250502134807-c57d3d995945 // indirect github.com/sony/gobreaker/v2 v2.1.0 // indirect diff --git a/build/devenv/go.sum b/build/devenv/go.sum index 3ed0e6ac3..3993ee80a 100644 --- a/build/devenv/go.sum +++ b/build/devenv/go.sum @@ -1121,20 +1121,20 @@ github.com/smartcontractkit/chain-selectors v1.0.97 h1:ECOin+SkJv2MUrfqTUu28J0ku github.com/smartcontractkit/chain-selectors v1.0.97/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265 h1:Q/sYLdOefZUKc/Bxssq1mg8ptQE/AOot2WI+QcLoiVA= github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265/go.mod h1:CQGkKp3YDsUuxixxmmngmRKfh6yIcftGEZsQrsSIIM8= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260408173936-5b7036b83fc5 h1:jTNSePW3S0CBBErI1pOR382VpQumuCxdf8XSntKeZTQ= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260408173936-5b7036b83fc5/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260408173936-5b7036b83fc5 h1:LbUM6/HKLdr6QTAD2uNNDugHES61dOkogjZ1n8rAmkY= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260408173936-5b7036b83fc5/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260408173936-5b7036b83fc5 h1:Rfq/Jr2M/YF4pH3n+J742eP9qcSZ2kn+nXhZvGl72m4= -github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260408173936-5b7036b83fc5/go.mod h1:BJeDtwLHUesySOOss1Az2CWO7hMAlOeg2/LiiW7BSlg= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260408173936-5b7036b83fc5 h1:G2HRBGR300tg2FSCC75w3OXSd5FHVeMgKtDK67pNpwA= -github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260408173936-5b7036b83fc5/go.mod h1:HzCawa0ZNY3yccY64rA6k6LWDai1+YsUQtEqJ30HYSk= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260409110811-3490f129337a h1:reeY+6xSaFUtS8HwYmAZsjkCOA3uf9F4slmAGDQ6n5U= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260409110811-3490f129337a/go.mod h1:iZTLsjnvzUR4QODACgkvJ2Xd1z1YYJJvEnLZ61K/sfw= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260409110811-3490f129337a h1:WmySB3m3ObwkeiFb9Ud7/2GP47JvDie/edy3tQvLkm0= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260409110811-3490f129337a/go.mod h1:zLqdD2kBX7NsntBneclb2yrHhjFaJdoyA8dK5eimlrE= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260409110811-3490f129337a h1:ly9qz9moZzkbuzTmcrXPXkW3zx5j2ZDxtIpb8KFPha0= +github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment v0.0.0-20260409110811-3490f129337a/go.mod h1:7DoO8FKZAI7d5zBmIlir9vetJcBv++Ejs4bIb57AE5s= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260409110811-3490f129337a h1:KwNRXQvRAIuKjgDZsVeFgszyhw4RHXQdwbTiqxWh9jk= +github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260409110811-3490f129337a/go.mod h1:ql2fox80uzSQuS1dKTs+P3rJYXZTtw15KhNMbizuzFw= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139 h1:jkChf04hhdiMBApbb+lLDxHMY62Md6UeM7v++GSw3K8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260129103204-4c8453dd8139/go.mod h1:wuhagkM/lU0GbV2YcrROOH0GlsfXJYwm6qmpa4CK70w= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139 h1:tw3K4UkH5XfW5SoyYkvAlbzrccoGSLdz/XkxD6nyGC8= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260129103204-4c8453dd8139/go.mod h1:1WcontO9PeuKdUf5HXfs3nuICtzUvFNnyCmrHkTCF9Y= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260408173936-5b7036b83fc5 h1:+npkvX++/TlR1U1EpDCswj+TxD+w4s68OZEWO5VyG6U= -github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260408173936-5b7036b83fc5/go.mod h1:ERS1toE+2mVHYVcWYWRjvk3Io+0y9wOcc/au6PrXJHo= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260409110811-3490f129337a h1:PypyyDJWre8H1JpS43+naffFELck+Ng/22XBmidmQ30= +github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260409110811-3490f129337a/go.mod h1:ZfTaZqrAySqpjghumOzdrVKn2F3XBahJny0UL8TQoIo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0 h1:eui+u6ge2RYW01F/DeXWrc5UOqc+8+lyPoi9TIAmMgo= github.com/smartcontractkit/chainlink-common v0.10.1-0.20260310151336-c98a9c147ac0/go.mod h1:0ghbAr7tRO0tT5ZqBXhOyzgUO37tNNe33Yn0hskauVM= github.com/smartcontractkit/chainlink-common/keystore v1.0.0 h1:sVa3j2FWK/5OxXpnlfDkF1deDAkuXEfaLKzYqBTA880= @@ -1183,8 +1183,8 @@ github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.5 h1:RwZXxdIA github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.5/go.mod h1:kHYJnZUqiPF7/xN5273prV+srrLJkS77GbBXHLKQpx0= github.com/smartcontractkit/chainlink-testing-framework/wasp v1.51.2 h1:QFO9Ar1zY9SHj//7LXWq5caVrfyTFrkRcfkMQeSOAaQ= github.com/smartcontractkit/chainlink-testing-framework/wasp v1.51.2/go.mod h1:OLczwaAvyObFG+eq4tQHkWqkbPBB0cHkZj0JzY3inik= -github.com/smartcontractkit/chainlink-ton v0.0.0-20260219201907-054376f21418 h1:7f92q/Tz/Ns+gjChmWg5mEonrYutZV33k/1x+Xxsb4I= -github.com/smartcontractkit/chainlink-ton v0.0.0-20260219201907-054376f21418/go.mod h1:FDDjLuc4vrfclu3JHkMaREg0XZz7Lw1MK47Z4jJ4U5Q= +github.com/smartcontractkit/chainlink-ton v0.0.0-20260408074447-0acfdcb19338 h1:iRIuD5dtz8UT9cTo3SvMnmYpUZNrA2sF2vvEnKlsq5w= +github.com/smartcontractkit/chainlink-ton v0.0.0-20260408074447-0acfdcb19338/go.mod h1:0Nqu8MByWraqq2L8snLo8omHVBxQnFFqgQdJHUvEJi8= github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20251014143056-a0c6328c91e9 h1:7Ut0g+Pdm+gcu2J/Xv8OpQOVf7uLGErMX8yhC4b4tIA= github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20251014143056-a0c6328c91e9/go.mod h1:h9hMs6K4hT1+mjYnJD3/SW1o7yC/sKjNi0Qh8hLfiCE= github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.5-0.20251014124537-af6b1684fe15 h1:idp/RjsFznR48JWGfZICsrpcl9JTrnMzoUNVz8MhQMI= From a19a8d9ba9b7bfe2b55c9ea0e225a75b89f4e1ed Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Thu, 16 Apr 2026 09:52:01 -0400 Subject: [PATCH 27/28] Merge conflicts --- build/devenv/environment_change_requirements.go | 2 +- build/devenv/lane_topology.go | 11 +++++------ build/devenv/reconcile_offchain.go | 11 ++++++----- build/devenv/reconcile_onchain.go | 11 ++++++----- .../tests/e2e/environment_change_reconcile_test.go | 12 ++++++------ 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/build/devenv/environment_change_requirements.go b/build/devenv/environment_change_requirements.go index 7ef6dacc3..544ca0177 100644 --- a/build/devenv/environment_change_requirements.go +++ b/build/devenv/environment_change_requirements.go @@ -3,7 +3,7 @@ package ccv import ( "fmt" - "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain/shared" + "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/offchain/shared" "github.com/smartcontractkit/chainlink-ccv/build/devenv/services" ) diff --git a/build/devenv/lane_topology.go b/build/devenv/lane_topology.go index 6b0ce92f8..025666d91 100644 --- a/build/devenv/lane_topology.go +++ b/build/devenv/lane_topology.go @@ -7,8 +7,8 @@ import ( chainsel "github.com/smartcontractkit/chain-selectors" - ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" - ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" + ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/changesets" + ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/offchain" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" @@ -37,13 +37,13 @@ func mergeCommitteeVerifierRemoteChainConfigForReconcile( if len(patch.RemovedAllowlistedSenders) > 0 { out.RemovedAllowlistedSenders = patch.RemovedAllowlistedSenders } - if patch.GasForVerification != 0 { + if patch.GasForVerification != nil { out.GasForVerification = patch.GasForVerification } - if patch.FeeUSDCents != 0 { + if patch.FeeUSDCents != nil { out.FeeUSDCents = patch.FeeUSDCents } - if patch.PayloadSizeBytes != 0 { + if patch.PayloadSizeBytes != nil { out.PayloadSizeBytes = patch.PayloadSizeBytes } return out @@ -124,7 +124,6 @@ func partialChainConfigFromProfile( DefaultExecutorQualifier: local.DefaultExecutorQualifier, FeeQuoterDestChainConfig: remote.FeeQuoterDestChainConfig, ExecutorDestChainConfig: local.ExecutorDestChainConfig, - AddressBytesLength: remote.AddressBytesLength, BaseExecutionGasCost: remote.BaseExecutionGasCost, } } diff --git a/build/devenv/reconcile_offchain.go b/build/devenv/reconcile_offchain.go index 1bb7e71b7..62e5a5927 100644 --- a/build/devenv/reconcile_offchain.go +++ b/build/devenv/reconcile_offchain.go @@ -6,10 +6,11 @@ import ( "google.golang.org/grpc/credentials/insecure" - ccipAdapters "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" - ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" - ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" - "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain/shared" + ccipAdapters "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/adapters" + ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/changesets" + ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/offchain" + "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/offchain/shared" + "github.com/smartcontractkit/chainlink-ccv/bootstrap" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" "github.com/smartcontractkit/chainlink-ccv/build/devenv/jobs" "github.com/smartcontractkit/chainlink-ccv/build/devenv/offchainloader" @@ -209,7 +210,7 @@ func configureOffchainFromTopology( topology *ccipOffchain.EnvironmentTopology, sharedTLSCerts *services.TLSCertPaths, ds datastore.MutableDataStore, -) (map[string][]string, error) { +) (map[string][]bootstrap.JobSpec, error) { if e == nil || in == nil || topology == nil { return nil, fmt.Errorf("environment, config, and topology are required") } diff --git a/build/devenv/reconcile_onchain.go b/build/devenv/reconcile_onchain.go index 4ef355a39..04555a618 100644 --- a/build/devenv/reconcile_onchain.go +++ b/build/devenv/reconcile_onchain.go @@ -4,11 +4,11 @@ import ( "context" "fmt" - "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/committee_verifier" + "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v2_0_0/operations/committee_verifier" changesetscore "github.com/smartcontractkit/chainlink-ccip/deployment/utils/changesets" - ccipAdapters "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters" - ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/changesets" - ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" + ccipAdapters "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/adapters" + ccipChangesets "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/changesets" + ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/offchain" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-deployments-framework/deployment" @@ -46,8 +46,9 @@ func CommitteeRemotePatchesFromAllowlistArgs( for i, addr := range a.RemovedAllowlistedSenders { removed[i] = addr.Hex() } + allow := a.AllowlistEnabled inner[a.DestChainSelector] = ccipChangesets.CommitteeVerifierRemoteChainConfig{ - AllowlistEnabled: a.AllowlistEnabled, + AllowlistEnabled: &allow, AddedAllowlistedSenders: added, RemovedAllowlistedSenders: removed, } diff --git a/build/devenv/tests/e2e/environment_change_reconcile_test.go b/build/devenv/tests/e2e/environment_change_reconcile_test.go index 043a2721e..f48d19f1c 100644 --- a/build/devenv/tests/e2e/environment_change_reconcile_test.go +++ b/build/devenv/tests/e2e/environment_change_reconcile_test.go @@ -16,13 +16,13 @@ import ( "github.com/stretchr/testify/require" chain_selectors "github.com/smartcontractkit/chain-selectors" - "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/sequences" - "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/versioned_verifier_resolver" - "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/committee_verifier" - "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v2_0_0/operations/proxy" routeroperations "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_2_0/operations/router" - ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain" - "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/offchain/operations/fetch_signing_keys" + "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v2_0_0/operations/committee_verifier" + "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v2_0_0/operations/proxy" + "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v2_0_0/sequences" + "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v2_0_0/versioned_verifier_resolver" + ccipOffchain "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/offchain" + "github.com/smartcontractkit/chainlink-ccip/deployment/v2_0_0/offchain/operations/fetch_signing_keys" ccv "github.com/smartcontractkit/chainlink-ccv/build/devenv" "github.com/smartcontractkit/chainlink-ccv/build/devenv/cciptestinterfaces" devenvcommon "github.com/smartcontractkit/chainlink-ccv/build/devenv/common" From 3f841f22be26b15bc963ffe2753c3db4044ac8e1 Mon Sep 17 00:00:00 2001 From: "Simon B.Robert" Date: Thu, 16 Apr 2026 10:29:53 -0400 Subject: [PATCH 28/28] Deploy test router --- build/devenv/evm/impl.go | 1 + 1 file changed, 1 insertion(+) diff --git a/build/devenv/evm/impl.go b/build/devenv/evm/impl.go index a76f18109..38c2926cb 100644 --- a/build/devenv/evm/impl.go +++ b/build/devenv/evm/impl.go @@ -1108,6 +1108,7 @@ func (m *CCIP17EVMConfig) GetDeployChainContractsCfg(env *deployment.Environment return ccipChangesets.DeployChainContractsPerChainCfg{ DeployerContract: create2Ref.Address, DeployerKeyOwned: true, + DeployTestRouter: true, RMNRemote: adapters.RMNRemoteDeployParams{ Version: semver.MustParse(rmn_remote.Deploy.Version()), },