diff --git a/core/services/relay/evm/chain_reader.go b/core/services/relay/evm/chain_reader.go index c9cc18e34a7..0f7f5f287ef 100644 --- a/core/services/relay/evm/chain_reader.go +++ b/core/services/relay/evm/chain_reader.go @@ -18,6 +18,7 @@ import ( commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" + "github.com/smartcontractkit/chainlink-common/pkg/values" evmclient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" @@ -168,7 +169,28 @@ func (cr *chainReader) GetLatestValue(ctx context.Context, readName string, conf return err } - return binding.GetLatestValue(ctx, common.HexToAddress(address), confidenceLevel, params, returnVal) + ptrToVal, isValue := returnVal.(*values.Value) + if !isValue { + return binding.GetLatestValue(ctx, common.HexToAddress(address), confidenceLevel, params, returnVal) + } + + contractType, err := cr.CreateContractType(readName, false) + if err != nil { + return err + } + + if err = cr.GetLatestValue(ctx, readName, confidenceLevel, params, contractType); err != nil { + return err + } + + wrapped, err := values.Wrap(contractType) + if err != nil { + return err + } + + *ptrToVal = wrapped + + return nil } func (cr *chainReader) BatchGetLatestValues(ctx context.Context, request commontypes.BatchGetLatestValuesRequest) (commontypes.BatchGetLatestValuesResult, error) { @@ -195,7 +217,35 @@ func (cr *chainReader) QueryKey( return nil, err } - return binding.QueryKey(ctx, common.HexToAddress(address), filter, limitAndSort, sequenceDataType) + _, isValue := sequenceDataType.(*values.Value) + if !isValue { + return binding.QueryKey(ctx, common.HexToAddress(address), filter, limitAndSort, sequenceDataType) + } else { + dataTypeFromReadIdentifier, err := cr.CreateContractType(contract.ReadIdentifier(filter.Key), false) + if err != nil { + return nil, err + } + + sequence, err := binding.QueryKey(ctx, common.HexToAddress(address), filter, limitAndSort, dataTypeFromReadIdentifier) + if err != nil { + return nil, err + } + + sequenceOfValues := make([]commontypes.Sequence, len(sequence)) + for idx, entry := range sequence { + value, err := values.Wrap(entry.Data) + if err != nil { + return nil, err + } + sequenceOfValues[idx] = commontypes.Sequence{ + Cursor: entry.Cursor, + Head: entry.Head, + Data: value, + } + } + + return sequenceOfValues, nil + } } func (cr *chainReader) CreateContractType(readIdentifier string, forEncoding bool) (any, error) { diff --git a/go.mod b/go.mod index 6f9b0e2bebc..322341eb4be 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module github.com/smartcontractkit/chainlink/v2 go 1.22.5 +replace github.com/smartcontractkit/chainlink-common => ../chainlink-common + require ( github.com/Depado/ginprom v1.8.0 github.com/Masterminds/semver/v3 v3.2.1