From 320389a341ad01723a9b1f65099596099bab9ba3 Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Thu, 2 Apr 2026 14:54:37 -0700 Subject: [PATCH 01/15] 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 02/15] 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 03/15] 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 04/15] 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 05/15] 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 06/15] 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 07/15] 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 08/15] 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 09/15] 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 10/15] 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 11/15] 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 12/15] 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 13/15] 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 18801f98ea4975bdaa10dc26f009e06e92a35b4a Mon Sep 17 00:00:00 2001 From: Terry Tata Date: Mon, 6 Apr 2026 12:23:48 -0700 Subject: [PATCH 14/15] 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 15/15] 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=