diff --git a/.changeset/forty-taxis-bake.md b/.changeset/forty-taxis-bake.md new file mode 100644 index 00000000000..93de8eea83f --- /dev/null +++ b/.changeset/forty-taxis-bake.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +address codec implementation #added diff --git a/core/capabilities/ccip/ccipevm/addresscodec.go b/core/capabilities/ccip/ccipevm/addresscodec.go new file mode 100644 index 00000000000..faf2ceaf291 --- /dev/null +++ b/core/capabilities/ccip/ccipevm/addresscodec.go @@ -0,0 +1,24 @@ +package ccipevm + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" +) + +type AddressCodec struct{} + +func (a AddressCodec) AddressBytesToString(addr []byte) (string, error) { + if len(addr) != common.AddressLength { + return "", fmt.Errorf("invalid EVM address length, expected %v, got %d", common.AddressLength, len(addr)) + } + + return common.BytesToAddress(addr).Hex(), nil +} + +func (a AddressCodec) AddressStringToBytes(addr string) ([]byte, error) { + if !common.IsHexAddress(addr) { + return nil, fmt.Errorf("invalid EVM address %s", addr) + } + return common.HexToAddress(addr).Bytes(), nil +} diff --git a/core/capabilities/ccip/ccipevm/addresscodec_test.go b/core/capabilities/ccip/ccipevm/addresscodec_test.go new file mode 100644 index 00000000000..8b717458ff2 --- /dev/null +++ b/core/capabilities/ccip/ccipevm/addresscodec_test.go @@ -0,0 +1,55 @@ +package ccipevm + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAddressBytesToString(t *testing.T) { + addressCodec := AddressCodec{} + addr := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13} + want := "0x000102030405060708090a0b0c0d0e0f10111213" + got, err := addressCodec.AddressBytesToString(addr) + require.NoError(t, err) + require.Equal(t, want, got) +} + +func TestAddressStringToBytes(t *testing.T) { + addressCodec := AddressCodec{} + addr := "0x000102030405060708090a0b0c0d0e0f10111213" + want := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13} + got, err := addressCodec.AddressStringToBytes(addr) + require.NoError(t, err) + require.Equal(t, want, got) +} + +func TestInvalidAddressBytesToString(t *testing.T) { + addressCodec := AddressCodec{} + addr := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12} + _, err := addressCodec.AddressBytesToString(addr) + require.Error(t, err) +} + +func TestInvalidAddressStringToBytes(t *testing.T) { + addressCodec := AddressCodec{} + addr := "0x000102030405060708090a0b0c0d0e0f1011121" + _, err := addressCodec.AddressStringToBytes(addr) + require.Error(t, err) +} + +func TestValidEVMAddress(t *testing.T) { + addressCodec := AddressCodec{} + addr := []byte{0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef} + want := "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF" + got, err := addressCodec.AddressBytesToString(addr) + require.NoError(t, err) + require.Equal(t, want, got) +} + +func TestInvalidHexString(t *testing.T) { + addressCodec := AddressCodec{} + addr := "0xZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" + _, err := addressCodec.AddressStringToBytes(addr) + require.Error(t, err) +} diff --git a/core/capabilities/ccip/ccipsolana/addresscodec.go b/core/capabilities/ccip/ccipsolana/addresscodec.go new file mode 100644 index 00000000000..74ae2835214 --- /dev/null +++ b/core/capabilities/ccip/ccipsolana/addresscodec.go @@ -0,0 +1,24 @@ +package ccipsolana + +import ( + "fmt" + + "github.com/gagliardetto/solana-go" +) + +type AddressCodec struct{} + +func (a AddressCodec) AddressBytesToString(addr []byte) (string, error) { + if len(addr) != solana.PublicKeyLength { + return "", fmt.Errorf("invalid SVM address length, expected %v, got %d", solana.PublicKeyLength, len(addr)) + } + return solana.PublicKeyFromBytes(addr).String(), nil +} + +func (a AddressCodec) AddressStringToBytes(addr string) ([]byte, error) { + pk, err := solana.PublicKeyFromBase58(addr) + if err != nil { + return nil, fmt.Errorf("failed to decode SVM address '%s': %w", addr, err) + } + return pk.Bytes(), nil +} diff --git a/core/capabilities/ccip/ccipsolana/addresscodec_test.go b/core/capabilities/ccip/ccipsolana/addresscodec_test.go new file mode 100644 index 00000000000..6d19bf8ecf0 --- /dev/null +++ b/core/capabilities/ccip/ccipsolana/addresscodec_test.go @@ -0,0 +1,96 @@ +package ccipsolana + +import ( + "encoding/hex" + "errors" + "testing" + + "github.com/gagliardetto/solana-go" + "github.com/stretchr/testify/require" +) + +func TestPublicKeyFromBytes(t *testing.T) { + tests := []struct { + name string + inHex string + isErr bool + expected string + }{ + { + "empty", + "", + true, + solana.PublicKey{}.String(), + }, + { + "smaller than required", + "010203040506", + true, + solana.PublicKey{}.String(), + }, + { + "equal to 32 bytes", + "0102030405060102030405060102030405060102030405060102030405060101", + false, + solana.MustPublicKeyFromBase58("4wBqpZM9msxygzsdeLPq6Zw3LoiAxJk3GjtKPpqkcsi").String(), + }, + { + "longer than required", + "0102030405060102030405060102030405060102030405060102030405060101FFFFFFFFFF", + true, + solana.PublicKey{}.String(), + }, + } + + codec := AddressCodec{} + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + bytes, err := hex.DecodeString(test.inHex) + require.NoError(t, err) + + if test.isErr { + _, err := codec.AddressBytesToString(bytes) + require.Error(t, err) + } else { + actual, err := codec.AddressBytesToString(bytes) + require.NoError(t, err) + require.Equal(t, test.expected, actual) + } + }) + } +} + +func TestPublicKeyFromBase58(t *testing.T) { + tests := []struct { + name string + in string + expected []byte + expectedErr error + }{ + { + "hand crafted", + "SerumkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + solana.MustPublicKeyFromBase58("SerumkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA").Bytes(), + nil, + }, + { + "hand crafted error", + "SerkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + solana.PublicKey{}.Bytes(), + errors.New("invalid length, expected 32, got 30"), + }, + } + + codec := AddressCodec{} + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + actual, err := codec.AddressStringToBytes(test.in) + if test.expectedErr == nil { + require.NoError(t, err) + require.Equal(t, test.expected, actual) + } else { + require.Error(t, err) + } + }) + } +} diff --git a/core/capabilities/ccip/ccipsolana/executecodec_test.go b/core/capabilities/ccip/ccipsolana/executecodec_test.go index ba3b9ff49f6..e7b90396e02 100644 --- a/core/capabilities/ccip/ccipsolana/executecodec_test.go +++ b/core/capabilities/ccip/ccipsolana/executecodec_test.go @@ -13,8 +13,6 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common/mocks" - "github.com/smartcontractkit/chainlink-ccip/mocks/pkg/types/ccipocr3" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" @@ -142,7 +140,7 @@ func TestExecutePluginCodecV1(t *testing.T) { } ctx := testutils.Context(t) - mockExtraDataCodec := &mocks.ExtraDataCodec{} + mockExtraDataCodec := mocks.NewExtraDataCodec(t) mockExtraDataCodec.On("DecodeTokenAmountDestExecData", mock.Anything, mock.Anything).Return(map[string]any{ "destGasAmount": uint32(10), }, nil) @@ -181,7 +179,7 @@ func TestExecutePluginCodecV1(t *testing.T) { } func Test_DecodingExecuteReport(t *testing.T) { - mockExtraDataCodec := ccipocr3.NewMockExtraDataCodec(t) + mockExtraDataCodec := mocks.NewExtraDataCodec(t) mockExtraDataCodec.On("DecodeTokenAmountDestExecData", mock.Anything, mock.Anything).Return(map[string]any{ "destGasAmount": uint32(10), }, nil) diff --git a/core/capabilities/ccip/common/addresscodec.go b/core/capabilities/ccip/common/addresscodec.go new file mode 100644 index 00000000000..3440ec4c391 --- /dev/null +++ b/core/capabilities/ccip/common/addresscodec.go @@ -0,0 +1,81 @@ +package common + +import ( + "fmt" + + chainsel "github.com/smartcontractkit/chain-selectors" + + cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" +) + +// ChainSpecificAddressCodec is an interface that defines the methods for encoding and decoding addresses +type ChainSpecificAddressCodec interface { + AddressBytesToString([]byte) (string, error) + AddressStringToBytes(string) ([]byte, error) +} + +// AddressCodec is a struct that holds the chain specific address codecs +type AddressCodec struct { + EVMAddressCodec ChainSpecificAddressCodec + SolanaAddressCodec ChainSpecificAddressCodec +} + +// AddressCodecParams is a struct that holds the parameters for creating a AddressCodec +type AddressCodecParams struct { + evmAddressCodec ChainSpecificAddressCodec + solanaAddressCodec ChainSpecificAddressCodec +} + +// NewAddressCodecParams is a constructor for AddressCodecParams +func NewAddressCodecParams(evmAddressCodec ChainSpecificAddressCodec, solanaAddressCodec ChainSpecificAddressCodec) AddressCodecParams { + return AddressCodecParams{ + evmAddressCodec: evmAddressCodec, + solanaAddressCodec: solanaAddressCodec, + } +} + +// NewAddressCodec is a constructor for AddressCodec +func NewAddressCodec(params AddressCodecParams) AddressCodec { + return AddressCodec{ + EVMAddressCodec: params.evmAddressCodec, + SolanaAddressCodec: params.solanaAddressCodec, + } +} + +// AddressBytesToString converts an address from bytes to string +func (ac AddressCodec) AddressBytesToString(addr cciptypes.UnknownAddress, chainSelector cciptypes.ChainSelector) (string, error) { + family, err := chainsel.GetSelectorFamily(uint64(chainSelector)) + if err != nil { + return "", fmt.Errorf("failed to get chain family for selector %d: %w", chainSelector, err) + } + + switch family { + case chainsel.FamilyEVM: + return ac.EVMAddressCodec.AddressBytesToString(addr) + + case chainsel.FamilySolana: + return ac.SolanaAddressCodec.AddressBytesToString(addr) + + default: + return "", fmt.Errorf("unsupported family for address encode type %s", family) + } +} + +// AddressStringToBytes converts an address from string to bytes +func (ac AddressCodec) AddressStringToBytes(addr string, chainSelector cciptypes.ChainSelector) (cciptypes.UnknownAddress, error) { + family, err := chainsel.GetSelectorFamily(uint64(chainSelector)) + if err != nil { + return nil, fmt.Errorf("failed to get chain family for selector %d: %w", chainSelector, err) + } + + switch family { + case chainsel.FamilyEVM: + return ac.EVMAddressCodec.AddressStringToBytes(addr) + + case chainsel.FamilySolana: + return ac.SolanaAddressCodec.AddressStringToBytes(addr) + + default: + return nil, fmt.Errorf("unsupported family for address decode type %s", family) + } +} diff --git a/core/capabilities/ccip/delegate.go b/core/capabilities/ccip/delegate.go index 02d5688868c..1d2f09753bd 100644 --- a/core/capabilities/ccip/delegate.go +++ b/core/capabilities/ccip/delegate.go @@ -7,6 +7,8 @@ import ( "strconv" "time" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipsolana" "golang.org/x/exp/maps" "github.com/avast/retry-go/v4" @@ -224,6 +226,11 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, spec job.Job) (services bootstrapperLocators, hcr, cciptypes.ChainSelector(homeChainChainSelector), + common.NewAddressCodec( + common.NewAddressCodecParams( + ccipevm.AddressCodec{}, + ccipsolana.AddressCodec{}, + )), ) } else { oracleCreator = oraclecreator.NewBootstrapOracleCreator( diff --git a/core/capabilities/ccip/oraclecreator/plugin.go b/core/capabilities/ccip/oraclecreator/plugin.go index 581a3570026..baea4697039 100644 --- a/core/capabilities/ccip/oraclecreator/plugin.go +++ b/core/capabilities/ccip/oraclecreator/plugin.go @@ -8,7 +8,6 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/gagliardetto/solana-go" "github.com/google/uuid" "github.com/prometheus/client_golang/prometheus" @@ -64,7 +63,6 @@ var plugins = map[string]plugin{ chainsel.FamilyEVM: { CommitPluginCodec: ccipevm.NewCommitPluginCodecV1(), ExecutePluginCodec: ccipevm.NewExecutePluginCodecV1(extraDataCodec), - ExtraArgsCodec: extraDataCodec, MessageHasher: func(lggr logger.Logger) cciptypes.MessageHasher { return ccipevm.NewMessageHasherV1(lggr, extraDataCodec) }, @@ -75,7 +73,6 @@ var plugins = map[string]plugin{ chainsel.FamilySolana: { CommitPluginCodec: ccipsolana.NewCommitPluginCodecV1(), ExecutePluginCodec: ccipsolana.NewExecutePluginCodecV1(extraDataCodec), - ExtraArgsCodec: extraDataCodec, MessageHasher: func(lggr logger.Logger) cciptypes.MessageHasher { return ccipsolana.NewMessageHasherV1(lggr, extraDataCodec) }, @@ -93,7 +90,6 @@ const ( type plugin struct { CommitPluginCodec cciptypes.CommitPluginCodec ExecutePluginCodec cciptypes.ExecutePluginCodec - ExtraArgsCodec ccipcommon.ExtraDataCodec MessageHasher func(lggr logger.Logger) cciptypes.MessageHasher TokenDataEncoder cciptypes.TokenDataEncoder GasEstimateProvider cciptypes.EstimateProvider @@ -117,6 +113,7 @@ type pluginOracleCreator struct { homeChainReader ccipreaderpkg.HomeChain homeChainSelector cciptypes.ChainSelector relayers map[types.RelayID]loop.Relayer + addressCodec cciptypes.AddressCodec } func NewPluginOracleCreator( @@ -134,6 +131,7 @@ func NewPluginOracleCreator( bootstrapperLocators []commontypes.BootstrapperLocator, homeChainReader ccipreaderpkg.HomeChain, homeChainSelector cciptypes.ChainSelector, + addressCodec cciptypes.AddressCodec, ) cctypes.OracleCreator { return &pluginOracleCreator{ ocrKeyBundles: ocrKeyBundles, @@ -150,6 +148,7 @@ func NewPluginOracleCreator( bootstrapperLocators: bootstrapperLocators, homeChainReader: homeChainReader, homeChainSelector: homeChainSelector, + addressCodec: addressCodec, } } @@ -179,6 +178,11 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c return nil, fmt.Errorf("failed to get public config from OCR config: %w", err) } + offrampAddrStr, err := i.addressCodec.AddressBytesToString(config.Config.OfframpAddress, cciptypes.ChainSelector(chainSelector)) + if err != nil { + return nil, err + } + contractReaders, chainWriters, err := i.createReadersAndWriters( ctx, destChainID, @@ -186,6 +190,7 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c config, publicConfig, destChainFamily, + offrampAddrStr, ) if err != nil { return nil, fmt.Errorf("failed to create readers and writers: %w", err) @@ -214,7 +219,7 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c // TODO: Extract the correct transmitter address from the destsFromAccount factory, transmitter, err := i.createFactoryAndTransmitter( - donID, config, destRelayID, contractReaders, chainWriters, destChainWriter, destFromAccounts, publicConfig, destChainFamily) + donID, config, destRelayID, contractReaders, chainWriters, destChainWriter, destFromAccounts, publicConfig, offrampAddrStr) if err != nil { return nil, fmt.Errorf("failed to create factory and transmitter: %w", err) } @@ -232,7 +237,7 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c i.lggr. Named(fmt.Sprintf("CCIP%sOCR3", pluginType.String())). Named(destRelayID.String()). - Named(encodeOffRampAddr(config.Config.OfframpAddress, destChainFamily, false)), + Named(offrampAddrStr), false, func(ctx context.Context, msg string) {}), MetricsRegisterer: prometheus.WrapRegistererWith(map[string]string{"name": fmt.Sprintf("commit-%d", config.Config.ChainSelector)}, prometheus.DefaultRegisterer), @@ -262,23 +267,6 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c return newWrappedOracle(oracle, closers), nil } -func encodeOffRampAddr(addr []byte, chainFamily string, checkSum bool) string { - var offRampAddr string - switch chainFamily { - case relay.NetworkEVM: - offRampAddr = common.BytesToAddress(addr).Hex() - if !checkSum { - offRampAddr = hexutil.Encode(addr) - } - case relay.NetworkSolana: - offRampAddr = solana.PublicKeyFromBytes(addr).String() - default: - panic(fmt.Errorf("unsupported chain family: %s", chainFamily)) - } - - return offRampAddr -} - func (i *pluginOracleCreator) createFactoryAndTransmitter( donID uint32, config cctypes.OCR3ConfigWithMeta, @@ -288,7 +276,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( destChainWriter types.ContractWriter, destFromAccounts []string, publicConfig ocr3confighelper.PublicConfig, - destChainFamily string, + offrampAddrStr string, ) (ocr3types.ReportingPluginFactory[[]byte], ocr3types.ContractTransmitter[[]byte], error) { var factory ocr3types.ReportingPluginFactory[[]byte] var transmitter ocr3types.ContractTransmitter[[]byte] @@ -330,11 +318,12 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( Named("CCIPCommitPlugin"). Named(destRelayID.String()). Named(fmt.Sprintf("%d", config.Config.ChainSelector)). - Named(encodeOffRampAddr(config.Config.OfframpAddress, destChainFamily, false)), + Named(offrampAddrStr), DonID: donID, OcrConfig: ccipreaderpkg.OCR3ConfigWithMeta(config), CommitCodec: plugin.CommitPluginCodec, MsgHasher: messageHasher, + AddrCodec: i.addressCodec, HomeChainReader: i.homeChainReader, HomeChainSelector: i.homeChainSelector, ContractReaders: contractReaders, @@ -344,7 +333,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( factory = promwrapper.NewReportingPluginFactory[[]byte](factory, i.lggr, chainID, "CCIPCommit") transmitter = ocrimpls.NewCommitContractTransmitter(destChainWriter, ocrtypes.Account(destFromAccounts[0]), - encodeOffRampAddr(config.Config.OfframpAddress, destChainFamily, false), + offrampAddrStr, ) } else if config.Config.PluginType == uint8(cctypes.PluginTypeCCIPExec) { factory = execocr3.NewExecutePluginFactory( @@ -352,11 +341,12 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( Lggr: i.lggr. Named("CCIPExecPlugin"). Named(destRelayID.String()). - Named(encodeOffRampAddr(config.Config.OfframpAddress, destChainFamily, false)), + Named(offrampAddrStr), DonID: donID, OcrConfig: ccipreaderpkg.OCR3ConfigWithMeta(config), ExecCodec: plugin.ExecutePluginCodec, MsgHasher: messageHasher, + AddrCodec: i.addressCodec, HomeChainReader: i.homeChainReader, TokenDataEncoder: plugin.TokenDataEncoder, EstimateProvider: plugin.GasEstimateProvider, @@ -366,7 +356,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( factory = promwrapper.NewReportingPluginFactory[[]byte](factory, i.lggr, chainID, "CCIPExec") transmitter = ocrimpls.NewExecContractTransmitter(destChainWriter, ocrtypes.Account(destFromAccounts[0]), - encodeOffRampAddr(config.Config.OfframpAddress, destChainFamily, false), + offrampAddrStr, ) } else { return nil, nil, fmt.Errorf("unsupported plugin type %d", config.Config.PluginType) @@ -381,6 +371,7 @@ func (i *pluginOracleCreator) createReadersAndWriters( config cctypes.OCR3ConfigWithMeta, publicCfg ocr3confighelper.PublicConfig, destChainFamily string, + destAddrStr string, ) ( map[cciptypes.ChainSelector]types.ContractReader, map[cciptypes.ChainSelector]types.ContractWriter, @@ -427,7 +418,7 @@ func (i *pluginOracleCreator) createReadersAndWriters( } if chainID == destChainID && destChainFamily == relayChainFamily { - offrampAddress := encodeOffRampAddr(config.Config.OfframpAddress, relayChainFamily, true) + offrampAddress := destAddrStr err2 := cr.Bind(ctx, []types.BoundContract{ { Address: offrampAddress, diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 4abaebcec06..263ae377fef 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -340,7 +340,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 1f3dc61b15b..943e91f5129 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1086,8 +1086,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/deployment/go.mod b/deployment/go.mod index 5f2c01cd595..59580369687 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -30,7 +30,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.1.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index c899c4da9ba..1e7ac01199f 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1134,8 +1134,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/go.mod b/go.mod index 61064f2e11f..ed7af7154c2 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index 2a317acb602..adaa5834125 100644 --- a/go.sum +++ b/go.sum @@ -1018,8 +1018,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 55f992dda69..f1dd4b294ef 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -46,7 +46,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index d33f50ae8ec..a7583ce688b 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1384,8 +1384,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 8ca24e49805..5a7caa8af8c 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 1c6a4dee4a4..fa752605a9d 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1369,8 +1369,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index 816112294bc..7d07fa92ade 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -19,6 +19,10 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipsolana" + ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" + readermocks "github.com/smartcontractkit/chainlink-ccip/mocks/pkg/contractreader" "github.com/smartcontractkit/chainlink-ccip/pkg/consts" "github.com/smartcontractkit/chainlink-ccip/pkg/contractreader" @@ -283,6 +287,7 @@ func TestCCIPReader_GetRMNRemoteConfig(t *testing.T) { }) require.NoError(t, err) + addrCodec := ccipcommon.NewAddressCodec(ccipcommon.NewAddressCodecParams(ccipevm.AddressCodec{}, ccipsolana.AddressCodec{})) reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders( ctx, lggr, @@ -292,6 +297,7 @@ func TestCCIPReader_GetRMNRemoteConfig(t *testing.T) { nil, chainD, rmnRemoteAddr.Bytes(), + addrCodec, ) exp, err := rmnRemote.GetVersionedConfig(&bind.CallOpts{ @@ -405,7 +411,7 @@ func TestCCIPReader_GetOffRampConfigDigest(t *testing.T) { }, }) require.NoError(t, err) - + addrCodec := ccipcommon.NewAddressCodec(ccipcommon.NewAddressCodecParams(ccipevm.AddressCodec{}, ccipsolana.AddressCodec{})) reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders( ctx, lggr, @@ -415,6 +421,7 @@ func TestCCIPReader_GetOffRampConfigDigest(t *testing.T) { nil, chainD, addr.Bytes(), + addrCodec, ) ccipReaderCommitDigest, err := reader.GetOffRampConfigDigest(ctx, consts.PluginTypeCommit) @@ -1541,7 +1548,8 @@ func testSetupRealContracts( contractReaders[chain] = cr } contractWriters := make(map[cciptypes.ChainSelector]types.ContractWriter) - reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, cciptypes.ChainSelector(destChain), nil) + addrCodec := ccipcommon.NewAddressCodec(ccipcommon.NewAddressCodecParams(ccipevm.AddressCodec{}, ccipsolana.AddressCodec{})) + reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, cciptypes.ChainSelector(destChain), nil, addrCodec) return reader } @@ -1656,7 +1664,8 @@ func testSetup( contractReaders[chain] = cr } contractWriters := make(map[cciptypes.ChainSelector]types.ContractWriter) - reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, params.DestChain, nil) + addrCodec := ccipcommon.NewAddressCodec(ccipcommon.NewAddressCodecParams(ccipevm.AddressCodec{}, ccipsolana.AddressCodec{})) + reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, params.DestChain, nil, addrCodec) t.Cleanup(func() { require.NoError(t, cr.Close()) diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index 0ccfb4ac000..29803eedd11 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -338,7 +338,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index 40159d0f867..dc671fcc04f 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index 70e47ee9479..910275f27f4 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -341,7 +341,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index 6520f93d14b..8101914b812 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00=