diff --git a/.changeset/gentle-walls-rest.md b/.changeset/gentle-walls-rest.md new file mode 100644 index 00000000000..acdc4b484be --- /dev/null +++ b/.changeset/gentle-walls-rest.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +#internal Pre-process contract abis in the evm chainwriter. diff --git a/core/capabilities/targets/mocks/chain_writer.go b/core/capabilities/targets/mocks/chain_writer.go index 3d8efae8451..d8a5a677a11 100644 --- a/core/capabilities/targets/mocks/chain_writer.go +++ b/core/capabilities/targets/mocks/chain_writer.go @@ -77,7 +77,7 @@ func (_m *ChainWriter) GetTransactionStatus(ctx context.Context, transactionID u } // SubmitTransaction provides a mock function with given fields: ctx, contractName, method, args, transactionID, toAddress, meta, value -func (_m *ChainWriter) SubmitTransaction(ctx context.Context, contractName string, method string, args []interface{}, transactionID uuid.UUID, toAddress string, meta *types.TxMeta, value big.Int) error { +func (_m *ChainWriter) SubmitTransaction(ctx context.Context, contractName string, method string, args interface{}, transactionID uuid.UUID, toAddress string, meta *types.TxMeta, value big.Int) error { ret := _m.Called(ctx, contractName, method, args, transactionID, toAddress, meta, value) if len(ret) == 0 { @@ -85,7 +85,7 @@ func (_m *ChainWriter) SubmitTransaction(ctx context.Context, contractName strin } var r0 error - if rf, ok := ret.Get(0).(func(context.Context, string, string, []interface{}, uuid.UUID, string, *types.TxMeta, big.Int) error); ok { + if rf, ok := ret.Get(0).(func(context.Context, string, string, interface{}, uuid.UUID, string, *types.TxMeta, big.Int) error); ok { r0 = rf(ctx, contractName, method, args, transactionID, toAddress, meta, value) } else { r0 = ret.Error(0) diff --git a/core/capabilities/targets/write_target.go b/core/capabilities/targets/write_target.go index af7bca1eedd..be5c779bf05 100644 --- a/core/capabilities/targets/write_target.go +++ b/core/capabilities/targets/write_target.go @@ -127,10 +127,32 @@ func (cap *WriteTarget) Execute(ctx context.Context, request capabilities.Capabi if err != nil { return nil, err } - args := []any{common.HexToAddress(reqConfig.Address), inputs.Report, inputs.Context, inputs.Signatures} + + // Note: The codec that ChainWriter uses to encode the parameters for the contract ABI cannot handle + // `nil` values, including for slices. Until the bug is fixed we need to ensure that there are no + // `nil` values passed in the request. + req := struct { + ReceiverAddress string + RawReport []byte + ReportContext []byte + Signatures [][]byte + }{reqConfig.Address, inputs.Report, inputs.Context, inputs.Signatures} + + if req.RawReport == nil { + req.RawReport = make([]byte, 0) + } + + if req.ReportContext == nil { + req.ReportContext = make([]byte, 0) + } + + if req.Signatures == nil { + req.Signatures = make([][]byte, 0) + } + meta := commontypes.TxMeta{WorkflowExecutionID: &request.Metadata.WorkflowExecutionID} value := big.NewInt(0) - if err := cap.cw.SubmitTransaction(ctx, "forwarder", "report", args, txID, cap.forwarderAddress, &meta, *value); err != nil { + if err := cap.cw.SubmitTransaction(ctx, "forwarder", "report", req, txID, cap.forwarderAddress, &meta, *value); err != nil { return nil, err } cap.lggr.Debugw("Transaction submitted", "request", request, "transaction", txID) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 0b96e928d7b..0e9104a32bb 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -21,7 +21,7 @@ require ( github.com/prometheus/client_golang v1.17.0 github.com/shopspring/decimal v1.3.1 github.com/smartcontractkit/chainlink-automation v1.0.3 - github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93 + github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9 github.com/smartcontractkit/chainlink-vrf v0.0.0-20240222010609-cd67d123c772 github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000 github.com/smartcontractkit/libocr v0.0.0-20240419185742-fd3cab206b2c diff --git a/core/scripts/go.sum b/core/scripts/go.sum index a6e0e7e6f8e..6ee7132708d 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1185,8 +1185,8 @@ github.com/smartcontractkit/chain-selectors v1.0.10 h1:t9kJeE6B6G+hKD0GYR4kGJSCq github.com/smartcontractkit/chain-selectors v1.0.10/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE= github.com/smartcontractkit/chainlink-automation v1.0.3 h1:h/ijT0NiyV06VxYVgcNfsE3+8OEzT3Q0Z9au0z1BPWs= github.com/smartcontractkit/chainlink-automation v1.0.3/go.mod h1:RjboV0Qd7YP+To+OrzHGXaxUxoSONveCoAK2TQ1INLU= -github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93 h1:LEukS7+ZNK61mfmZiieD2csK52n/RGg+M60LCuc6zPQ= -github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93/go.mod h1:DUZccDEW98n+J1mhdWGO7wr/Njad9p9Fzks839JN7Rs= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9 h1:6KxgmkZdVE/nU5ym5j114MELSs13HgMy5FV0TpnocS8= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9/go.mod h1:DUZccDEW98n+J1mhdWGO7wr/Njad9p9Fzks839JN7Rs= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240524214833-c362c2ebbd2d h1:5tgMC5Gi2UAOKZ+m28W8ubjLeR0pQCAcrz6eQ0rW510= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240524214833-c362c2ebbd2d/go.mod h1:0UNuO3nDt9MFsZPaHJBEUolxVkN0iC69j1ccDp95e8k= github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240220203239-09be0ea34540 h1:xFSv8561jsLtF6gYZr/zW2z5qUUAkcFkApin2mnbYTo= diff --git a/core/services/relay/evm/chain_writer.go b/core/services/relay/evm/chain_writer.go index 3b73164c902..fa62297efce 100644 --- a/core/services/relay/evm/chain_writer.go +++ b/core/services/relay/evm/chain_writer.go @@ -4,8 +4,9 @@ import ( "context" "fmt" "math/big" - "time" + "strings" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/google/uuid" @@ -14,7 +15,6 @@ import ( txmgrtypes "github.com/smartcontractkit/chainlink/v2/common/txmgr/types" evmclient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" evmtxmgr "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" - evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" @@ -30,8 +30,31 @@ type ChainWriterService interface { // Compile-time assertion that chainWriter implements the ChainWriterService interface. var _ ChainWriterService = (*chainWriter)(nil) -func NewChainWriterService(logger logger.Logger, client evmclient.Client, txm evmtxmgr.TxManager, config types.ChainWriterConfig) ChainWriterService { - return &chainWriter{logger: logger, client: client, config: config, txm: txm} +func NewChainWriterService(logger logger.Logger, client evmclient.Client, txm evmtxmgr.TxManager, config types.ChainWriterConfig) (ChainWriterService, error) { + w := chainWriter{ + logger: logger, + client: client, + txm: txm, + + sendStrategy: txmgr.NewSendEveryStrategy(), + contracts: config.Contracts, + parsedContracts: &parsedTypes{encoderDefs: map[string]types.CodecEntry{}, decoderDefs: map[string]types.CodecEntry{}}, + } + + if config.SendStrategy != nil { + w.sendStrategy = config.SendStrategy + } + + if err := w.parseContracts(); err != nil { + return nil, fmt.Errorf("%w: failed to parse contracts", err) + } + + var err error + if w.encoder, err = w.parsedContracts.toCodec(); err != nil { + return nil, fmt.Errorf("%w: failed to create codec", err) + } + + return &w, nil } type chainWriter struct { @@ -39,17 +62,26 @@ type chainWriter struct { logger logger.Logger client evmclient.Client - config types.ChainWriterConfig txm evmtxmgr.TxManager + + sendStrategy txmgrtypes.TxStrategy + contracts map[string]*types.ContractConfig + parsedContracts *parsedTypes + + encoder commontypes.Encoder } -func (w *chainWriter) SubmitTransaction(ctx context.Context, contract, method string, args []any, transactionID uuid.UUID, toAddress string, meta *commontypes.TxMeta, value big.Int) error { +// SubmitTransaction ... +// +// Note: The codec that ChainWriter uses to encode the parameters for the contract ABI cannot handle +// `nil` values, including for slices. Until the bug is fixed we need to ensure that there are no +// `nil` values passed in the request. +func (w *chainWriter) SubmitTransaction(ctx context.Context, contract, method string, args any, transactionID uuid.UUID, toAddress string, meta *commontypes.TxMeta, value big.Int) error { if !common.IsHexAddress(toAddress) { return fmt.Errorf("toAddress is not a valid ethereum address: %v", toAddress) } - // TODO(nickcorin): Pre-process the contracts when initialising the chain writer. - contractConfig, ok := w.config.Contracts[contract] + contractConfig, ok := w.contracts[contract] if !ok { return fmt.Errorf("contract config not found: %v", contract) } @@ -59,11 +91,9 @@ func (w *chainWriter) SubmitTransaction(ctx context.Context, contract, method st return fmt.Errorf("method config not found: %v", method) } - forwarderABI := evmtypes.MustGetABI(contractConfig.ContractABI) - - calldata, err := forwarderABI.Pack(methodConfig.ChainSpecificName, args...) + calldata, err := w.encoder.Encode(ctx, args, wrapItemType(contract, method, true)) if err != nil { - return fmt.Errorf("pack forwarder abi: %w", err) + return fmt.Errorf("%w: failed to encode args", err) } var checker evmtxmgr.TransmitCheckerSpec @@ -71,24 +101,51 @@ func (w *chainWriter) SubmitTransaction(ctx context.Context, contract, method st checker.CheckerType = txmgrtypes.TransmitCheckerType(methodConfig.Checker) } - var sendStrategy txmgrtypes.TxStrategy = txmgr.SendEveryStrategy{} - if w.config.SendStrategy != nil { - sendStrategy = w.config.SendStrategy - } - req := evmtxmgr.TxRequest{ FromAddress: methodConfig.FromAddress, ToAddress: common.HexToAddress(toAddress), EncodedPayload: calldata, FeeLimit: methodConfig.GasLimit, Meta: &txmgrtypes.TxMeta[common.Address, common.Hash]{WorkflowExecutionID: meta.WorkflowExecutionID}, - Strategy: sendStrategy, + Strategy: w.sendStrategy, Checker: checker, } _, err = w.txm.CreateTransaction(ctx, req) if err != nil { - return fmt.Errorf("failed to create tx: %w", err) + return fmt.Errorf("%w; failed to create tx", err) + } + + return nil +} + +func (w *chainWriter) parseContracts() error { + for contract, contractConfig := range w.contracts { + abi, err := abi.JSON(strings.NewReader(contractConfig.ContractABI)) + if err != nil { + return fmt.Errorf("%w: failed to parse contract abi", err) + } + + for method, methodConfig := range contractConfig.Configs { + abiMethod, ok := abi.Methods[methodConfig.ChainSpecificName] + if !ok { + return fmt.Errorf("%w: method %s doesn't exist", commontypes.ErrInvalidConfig, methodConfig.ChainSpecificName) + } + + // ABI.Pack prepends the method.ID to the encodings, we'll need the encoder to do the same. + inputMod, err := methodConfig.InputModifications.ToModifier(evmDecoderHooks...) + if err != nil { + return fmt.Errorf("%w: failed to create input mods", err) + } + + input := types.NewCodecEntry(abiMethod.Inputs, abiMethod.ID, inputMod) + + if err = input.Init(); err != nil { + return fmt.Errorf("%w: failed to init codec entry for method %s", err, method) + } + + w.parsedContracts.encoderDefs[wrapItemType(contract, method, true)] = input + } } return nil @@ -104,10 +161,6 @@ func (w *chainWriter) GetFeeComponents(ctx context.Context) (*commontypes.ChainF func (w *chainWriter) Close() error { return w.StopOnce(w.Name(), func() error { - _, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - - // TODO(nickcorin): Add shutdown steps here. return nil }) } diff --git a/core/services/relay/evm/types/types.go b/core/services/relay/evm/types/types.go index 8f4a2db864c..a4c7e69a2fa 100644 --- a/core/services/relay/evm/types/types.go +++ b/core/services/relay/evm/types/types.go @@ -23,11 +23,11 @@ import ( ) type ChainWriterConfig struct { + Contracts map[string]*ContractConfig SendStrategy txmgrtypes.TxStrategy - Contracts map[string]ChainWriter } -type ChainWriter struct { +type ContractConfig struct { ContractABI string `json:"contractABI" toml:"contractABI"` // key is genericName from config Configs map[string]*ChainWriterDefinition `json:"configs" toml:"configs"` @@ -35,10 +35,11 @@ type ChainWriter struct { type ChainWriterDefinition struct { // chain specific contract method name or event type. - ChainSpecificName string `json:"chainSpecificName"` - Checker string `json:"checker"` - FromAddress common.Address `json:"fromAddress"` - GasLimit uint64 `json:"gasLimit"` // TODO(archseer): what if this has to be configured per call? + ChainSpecificName string `json:"chainSpecificName"` + Checker string `json:"checker"` + FromAddress common.Address `json:"fromAddress"` + GasLimit uint64 `json:"gasLimit"` // TODO(archseer): what if this has to be configured per call? + InputModifications codec.ModifiersConfig `json:"inputModifications,omitempty"` } type ChainReaderConfig struct { diff --git a/core/services/relay/evm/write_target.go b/core/services/relay/evm/write_target.go index 29447aacf32..e5fd1385609 100644 --- a/core/services/relay/evm/write_target.go +++ b/core/services/relay/evm/write_target.go @@ -55,7 +55,7 @@ func NewWriteTarget(ctx context.Context, relayer *Relayer, chain legacyevm.Chain } chainWriterConfig := relayevmtypes.ChainWriterConfig{ - Contracts: map[string]relayevmtypes.ChainWriter{ + Contracts: map[string]*relayevmtypes.ContractConfig{ "forwarder": { ContractABI: forwarder.KeystoneForwarderABI, Configs: map[string]*relayevmtypes.ChainWriterDefinition{ @@ -69,7 +69,10 @@ func NewWriteTarget(ctx context.Context, relayer *Relayer, chain legacyevm.Chain }, }, } - cw := NewChainWriterService(lggr.Named("ChainWriter"), chain.Client(), chain.TxManager(), chainWriterConfig) + cw, err := NewChainWriterService(lggr.Named("ChainWriter"), chain.Client(), chain.TxManager(), chainWriterConfig) + if err != nil { + return nil, err + } return targets.NewWriteTarget(lggr, name, cr, cw, config.ForwarderAddress().String()), nil } diff --git a/go.mod b/go.mod index 799cf55532e..e4378e52905 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( github.com/shopspring/decimal v1.3.1 github.com/smartcontractkit/chain-selectors v1.0.10 github.com/smartcontractkit/chainlink-automation v1.0.3 - github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93 + github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9 github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240524214833-c362c2ebbd2d github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240220203239-09be0ea34540 github.com/smartcontractkit/chainlink-feeds v0.0.0-20240522213638-159fb2d99917 diff --git a/go.sum b/go.sum index af3534fbc8b..619581b6941 100644 --- a/go.sum +++ b/go.sum @@ -1171,8 +1171,8 @@ github.com/smartcontractkit/chain-selectors v1.0.10 h1:t9kJeE6B6G+hKD0GYR4kGJSCq github.com/smartcontractkit/chain-selectors v1.0.10/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE= github.com/smartcontractkit/chainlink-automation v1.0.3 h1:h/ijT0NiyV06VxYVgcNfsE3+8OEzT3Q0Z9au0z1BPWs= github.com/smartcontractkit/chainlink-automation v1.0.3/go.mod h1:RjboV0Qd7YP+To+OrzHGXaxUxoSONveCoAK2TQ1INLU= -github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93 h1:LEukS7+ZNK61mfmZiieD2csK52n/RGg+M60LCuc6zPQ= -github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93/go.mod h1:DUZccDEW98n+J1mhdWGO7wr/Njad9p9Fzks839JN7Rs= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9 h1:6KxgmkZdVE/nU5ym5j114MELSs13HgMy5FV0TpnocS8= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9/go.mod h1:DUZccDEW98n+J1mhdWGO7wr/Njad9p9Fzks839JN7Rs= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240524214833-c362c2ebbd2d h1:5tgMC5Gi2UAOKZ+m28W8ubjLeR0pQCAcrz6eQ0rW510= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240524214833-c362c2ebbd2d/go.mod h1:0UNuO3nDt9MFsZPaHJBEUolxVkN0iC69j1ccDp95e8k= github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240220203239-09be0ea34540 h1:xFSv8561jsLtF6gYZr/zW2z5qUUAkcFkApin2mnbYTo= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 9cd8d31cc8b..10381e8bafb 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -27,7 +27,7 @@ require ( github.com/shopspring/decimal v1.3.1 github.com/slack-go/slack v0.12.2 github.com/smartcontractkit/chainlink-automation v1.0.3 - github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93 + github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9 github.com/smartcontractkit/chainlink-testing-framework v1.28.17 github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868 github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index ea1c5e043b3..ced20a370a6 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1512,8 +1512,8 @@ github.com/smartcontractkit/chain-selectors v1.0.10 h1:t9kJeE6B6G+hKD0GYR4kGJSCq github.com/smartcontractkit/chain-selectors v1.0.10/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE= github.com/smartcontractkit/chainlink-automation v1.0.3 h1:h/ijT0NiyV06VxYVgcNfsE3+8OEzT3Q0Z9au0z1BPWs= github.com/smartcontractkit/chainlink-automation v1.0.3/go.mod h1:RjboV0Qd7YP+To+OrzHGXaxUxoSONveCoAK2TQ1INLU= -github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93 h1:LEukS7+ZNK61mfmZiieD2csK52n/RGg+M60LCuc6zPQ= -github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93/go.mod h1:DUZccDEW98n+J1mhdWGO7wr/Njad9p9Fzks839JN7Rs= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9 h1:6KxgmkZdVE/nU5ym5j114MELSs13HgMy5FV0TpnocS8= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9/go.mod h1:DUZccDEW98n+J1mhdWGO7wr/Njad9p9Fzks839JN7Rs= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240524214833-c362c2ebbd2d h1:5tgMC5Gi2UAOKZ+m28W8ubjLeR0pQCAcrz6eQ0rW510= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240524214833-c362c2ebbd2d/go.mod h1:0UNuO3nDt9MFsZPaHJBEUolxVkN0iC69j1ccDp95e8k= github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240220203239-09be0ea34540 h1:xFSv8561jsLtF6gYZr/zW2z5qUUAkcFkApin2mnbYTo= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 218ef1bd6a8..8975752427e 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -16,7 +16,7 @@ require ( github.com/rs/zerolog v1.30.0 github.com/slack-go/slack v0.12.2 github.com/smartcontractkit/chainlink-automation v1.0.3 - github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93 + github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9 github.com/smartcontractkit/chainlink-testing-framework v1.28.17 github.com/smartcontractkit/chainlink/integration-tests v0.0.0-20240214231432-4ad5eb95178c github.com/smartcontractkit/chainlink/v2 v2.9.0-beta0.0.20240216210048-da02459ddad8 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 165377307b1..e70edaa726b 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1502,8 +1502,8 @@ github.com/smartcontractkit/chain-selectors v1.0.10 h1:t9kJeE6B6G+hKD0GYR4kGJSCq github.com/smartcontractkit/chain-selectors v1.0.10/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE= github.com/smartcontractkit/chainlink-automation v1.0.3 h1:h/ijT0NiyV06VxYVgcNfsE3+8OEzT3Q0Z9au0z1BPWs= github.com/smartcontractkit/chainlink-automation v1.0.3/go.mod h1:RjboV0Qd7YP+To+OrzHGXaxUxoSONveCoAK2TQ1INLU= -github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93 h1:LEukS7+ZNK61mfmZiieD2csK52n/RGg+M60LCuc6zPQ= -github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531161624-ddf27dafed93/go.mod h1:DUZccDEW98n+J1mhdWGO7wr/Njad9p9Fzks839JN7Rs= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9 h1:6KxgmkZdVE/nU5ym5j114MELSs13HgMy5FV0TpnocS8= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240531185627-1ff5b506c5f9/go.mod h1:DUZccDEW98n+J1mhdWGO7wr/Njad9p9Fzks839JN7Rs= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240524214833-c362c2ebbd2d h1:5tgMC5Gi2UAOKZ+m28W8ubjLeR0pQCAcrz6eQ0rW510= github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240524214833-c362c2ebbd2d/go.mod h1:0UNuO3nDt9MFsZPaHJBEUolxVkN0iC69j1ccDp95e8k= github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240220203239-09be0ea34540 h1:xFSv8561jsLtF6gYZr/zW2z5qUUAkcFkApin2mnbYTo=