Skip to content

Commit

Permalink
[BCFR-203] Improve CR value comparator querying (topics and data word…
Browse files Browse the repository at this point in the history
…s) by doing encoding in the relayer (#14207)

* Add EVM CR topic and data words types to codec for QueryKey filtering

* temp

* Update Chain Reader Tester contract to match common testing structs

* Fix codecEntry ToNative() method bad error message

* Add support for filtering over indexed topics with query key

* Remove the need for Chain Reader Config InputFields

- Params are typed into all topics and checked for nil
- Allows for searching same read with diff params
- Allows to query filter and GetLatestValue same event

* Implement Chain Reader data words types init and packing

* cleanup changes

* Implement querying by data words with value comparators as any

* Fix CR topic querying and simplify value comparator encoding

* Simplify CR event topic and data words typing

* Refactor CR topic encoding a bit to be simpler

* Fix lint, changeset and correct a minor test failure

* [Bot] Update changeset file with jira issue

* Add changeset

* Update changesets

* lint

* Separate loop and non loop CR tests, bump go mod and minor fix

* Fix rebase issues

* Handle CR value comparator Querying codec type creation and lookup

* Update changeset associated ticket numbers

* lint

* Add todos

* Remove unused indexes from ChainReader DataWords config

* Update common

* Bump common

---------

Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com>
  • Loading branch information
1 parent d64834a commit 328b62a
Show file tree
Hide file tree
Showing 32 changed files with 701 additions and 539 deletions.
7 changes: 7 additions & 0 deletions .changeset/lucky-zebras-reflect.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"chainlink": minor
---

#internal Implement EVM ChainReader ValueComparator filtering by non-indexed event data. Right now only simple non indexed data where byte offsets don't exist is supported.

BCFR-203
8 changes: 8 additions & 0 deletions contracts/.changeset/fluffy-papayas-chew.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@chainlink/contracts': minor
---

#internal Change Chain Reader testing contract Triggered event for easier testing of filtering by non indexed evm data.


BCFR-203
6 changes: 3 additions & 3 deletions contracts/src/v0.8/shared/test/helpers/ChainReaderTester.sol
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ struct InnerTestStruct {
contract ChainReaderTester {
event Triggered(
int32 indexed field,
string differentField,
uint8 oracleId,
uint8[32] oracleIds,
address Account,
address[] Accounts,
string differentField,
int192 bigField,
MidLevelTestStruct nestedStruct
);
Expand Down Expand Up @@ -109,15 +109,15 @@ contract ChainReaderTester {

function triggerEvent(
int32 field,
string calldata differentField,
uint8 oracleId,
uint8[32] calldata oracleIds,
address account,
address[] calldata accounts,
string calldata differentField,
int192 bigField,
MidLevelTestStruct calldata nestedStruct
) public {
emit Triggered(field, differentField, oracleId, oracleIds, account, accounts, bigField, nestedStruct);
emit Triggered(field, oracleId, oracleIds, account, accounts, differentField, bigField, nestedStruct);
}

function triggerEventWithDynamicTopic(string calldata field) public {
Expand Down
5 changes: 0 additions & 5 deletions core/capabilities/ccip/configs/evm/contract_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,11 +194,6 @@ var SourceReaderConfig = evmrelaytypes.ChainReaderConfig{
consts.EventNameCCIPMessageSent: {
ChainSpecificName: mustGetEventName("CCIPMessageSent", onrampABI),
ReadType: evmrelaytypes.Event,
EventDefinitions: &evmrelaytypes.EventDefinitions{
GenericDataWordNames: map[string]uint8{
consts.EventAttributeSequenceNumber: 5,
},
},
},
},
},
Expand Down
40 changes: 20 additions & 20 deletions core/chains/evm/logpoller/orm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -606,8 +606,8 @@ func TestORM_IndexedLogs(t *testing.T) {
}

for idx, value := range topicValues {
topicFilters.Expressions[idx] = logpoller.NewEventByTopicFilter(topicIdx, []primitives.ValueComparator{
{Value: logpoller.EvmWord(value).Hex(), Operator: primitives.Eq},
topicFilters.Expressions[idx] = logpoller.NewEventByTopicFilter(topicIdx, []logpoller.HashedValueComparator{
{Value: logpoller.EvmWord(value), Operator: primitives.Eq},
})
}

Expand Down Expand Up @@ -702,8 +702,8 @@ func TestORM_IndexedLogs(t *testing.T) {
Expressions: []query.Expression{
logpoller.NewAddressFilter(addr),
logpoller.NewEventSigFilter(eventSig),
logpoller.NewEventByTopicFilter(1, []primitives.ValueComparator{
{Value: logpoller.EvmWord(2).Hex(), Operator: primitives.Gte},
logpoller.NewEventByTopicFilter(1, []logpoller.HashedValueComparator{
{Value: logpoller.EvmWord(2), Operator: primitives.Gte},
}),
query.Confidence(primitives.Unconfirmed),
},
Expand All @@ -717,11 +717,11 @@ func TestORM_IndexedLogs(t *testing.T) {
return []query.Expression{
logpoller.NewAddressFilter(addr),
logpoller.NewEventSigFilter(eventSig),
logpoller.NewEventByTopicFilter(topicIdx, []primitives.ValueComparator{
{Value: logpoller.EvmWord(min).Hex(), Operator: primitives.Gte},
logpoller.NewEventByTopicFilter(topicIdx, []logpoller.HashedValueComparator{
{Value: logpoller.EvmWord(min), Operator: primitives.Gte},
}),
logpoller.NewEventByTopicFilter(topicIdx, []primitives.ValueComparator{
{Value: logpoller.EvmWord(max).Hex(), Operator: primitives.Lte},
logpoller.NewEventByTopicFilter(topicIdx, []logpoller.HashedValueComparator{
{Value: logpoller.EvmWord(max), Operator: primitives.Lte},
}),
query.Confidence(primitives.Unconfirmed),
}
Expand Down Expand Up @@ -876,11 +876,11 @@ func TestORM_DataWords(t *testing.T) {
return []query.Expression{
logpoller.NewAddressFilter(addr),
logpoller.NewEventSigFilter(eventSig),
logpoller.NewEventByWordFilter(eventSig, wordIdx, []primitives.ValueComparator{
{Value: logpoller.EvmWord(word1).Hex(), Operator: primitives.Gte},
logpoller.NewEventByWordFilter(wordIdx, []logpoller.HashedValueComparator{
{Value: logpoller.EvmWord(word1), Operator: primitives.Gte},
}),
logpoller.NewEventByWordFilter(eventSig, wordIdx, []primitives.ValueComparator{
{Value: logpoller.EvmWord(word2).Hex(), Operator: primitives.Lte},
logpoller.NewEventByWordFilter(wordIdx, []logpoller.HashedValueComparator{
{Value: logpoller.EvmWord(word2), Operator: primitives.Lte},
}),
query.Confidence(primitives.Unconfirmed),
}
Expand Down Expand Up @@ -944,8 +944,8 @@ func TestORM_DataWords(t *testing.T) {
filter := []query.Expression{
logpoller.NewAddressFilter(addr),
logpoller.NewEventSigFilter(eventSig),
logpoller.NewEventByWordFilter(eventSig, 0, []primitives.ValueComparator{
{Value: logpoller.EvmWord(1).Hex(), Operator: primitives.Gte},
logpoller.NewEventByWordFilter(0, []logpoller.HashedValueComparator{
{Value: logpoller.EvmWord(1), Operator: primitives.Gte},
}),
query.Confidence(primitives.Unconfirmed),
}
Expand Down Expand Up @@ -1667,8 +1667,8 @@ func TestSelectLogsCreatedAfter(t *testing.T) {
if len(topicVals) > 0 {
exp := make([]query.Expression, len(topicVals))
for idx, val := range topicVals {
exp[idx] = logpoller.NewEventByTopicFilter(uint64(topicIdx), []primitives.ValueComparator{
{Value: val.String(), Operator: primitives.Eq},
exp[idx] = logpoller.NewEventByTopicFilter(uint64(topicIdx), []logpoller.HashedValueComparator{
{Value: val, Operator: primitives.Eq},
})
}

Expand Down Expand Up @@ -1955,11 +1955,11 @@ func TestSelectLogsDataWordBetween(t *testing.T) {
Expressions: []query.Expression{
logpoller.NewAddressFilter(address),
logpoller.NewEventSigFilter(eventSig),
logpoller.NewEventByWordFilter(eventSig, 0, []primitives.ValueComparator{
{Value: logpoller.EvmWord(word).Hex(), Operator: primitives.Lte},
logpoller.NewEventByWordFilter(0, []logpoller.HashedValueComparator{
{Value: logpoller.EvmWord(word), Operator: primitives.Lte},
}),
logpoller.NewEventByWordFilter(eventSig, 1, []primitives.ValueComparator{
{Value: logpoller.EvmWord(word).Hex(), Operator: primitives.Gte},
logpoller.NewEventByWordFilter(1, []logpoller.HashedValueComparator{
{Value: logpoller.EvmWord(word), Operator: primitives.Gte},
}),
query.Confidence(primitives.Unconfirmed),
},
Expand Down
31 changes: 17 additions & 14 deletions core/chains/evm/logpoller/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,11 @@ func (v *pgDSLParser) nestedConfQuery(finalized bool, confs uint64) string {
}

func (v *pgDSLParser) VisitEventByWordFilter(p *eventByWordFilter) {
if len(p.ValueComparers) > 0 {
if len(p.HashedValueComparers) > 0 {
wordIdx := v.args.withIndexedField("word_index", p.WordIndex)

comps := make([]string, len(p.ValueComparers))
for idx, comp := range p.ValueComparers {
comps := make([]string, len(p.HashedValueComparers))
for idx, comp := range p.HashedValueComparers {
comps[idx], v.err = makeComp(comp, v.args, "word_value", wordIdx, "substring(data from 32*:%s+1 for 32) %s :%s")
if v.err != nil {
return
Expand Down Expand Up @@ -199,7 +199,7 @@ func (v *pgDSLParser) VisitConfirmationsFilter(p *confirmationsFilter) {
}
}

func makeComp(comp primitives.ValueComparator, args *queryArgs, field, subfield, pattern string) (string, error) {
func makeComp(comp HashedValueComparator, args *queryArgs, field, subfield, pattern string) (string, error) {
cmp, err := cmpOpToString(comp.Operator)
if err != nil {
return "", err
Expand All @@ -209,7 +209,7 @@ func makeComp(comp primitives.ValueComparator, args *queryArgs, field, subfield,
pattern,
subfield,
cmp,
args.withIndexedField(field, common.HexToHash(comp.Value)),
args.withIndexedField(field, comp.Value),
), nil
}

Expand Down Expand Up @@ -492,17 +492,20 @@ func (f *eventSigFilter) Accept(visitor primitives.Visitor) {
}
}

type HashedValueComparator struct {
Value common.Hash
Operator primitives.ComparisonOperator
}

type eventByWordFilter struct {
EventSig common.Hash
WordIndex uint8
ValueComparers []primitives.ValueComparator
WordIndex uint8
HashedValueComparers []HashedValueComparator
}

func NewEventByWordFilter(eventSig common.Hash, wordIndex uint8, valueComparers []primitives.ValueComparator) query.Expression {
func NewEventByWordFilter(wordIndex uint8, valueComparers []HashedValueComparator) query.Expression {
return query.Expression{Primitive: &eventByWordFilter{
EventSig: eventSig,
WordIndex: wordIndex,
ValueComparers: valueComparers,
WordIndex: wordIndex,
HashedValueComparers: valueComparers,
}}
}

Expand All @@ -515,10 +518,10 @@ func (f *eventByWordFilter) Accept(visitor primitives.Visitor) {

type eventByTopicFilter struct {
Topic uint64
ValueComparers []primitives.ValueComparator
ValueComparers []HashedValueComparator
}

func NewEventByTopicFilter(topicIndex uint64, valueComparers []primitives.ValueComparator) query.Expression {
func NewEventByTopicFilter(topicIndex uint64, valueComparers []HashedValueComparator) query.Expression {
return query.Expression{Primitive: &eventByTopicFilter{
Topic: topicIndex,
ValueComparers: valueComparers,
Expand Down
16 changes: 8 additions & 8 deletions core/chains/evm/logpoller/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,8 @@ func TestDSLParser(t *testing.T) {
t.Run("query for event by word", func(t *testing.T) {
t.Parallel()

wordFilter := NewEventByWordFilter(common.HexToHash("0x42"), 8, []primitives.ValueComparator{
{Value: "", Operator: primitives.Gt},
wordFilter := NewEventByWordFilter(8, []HashedValueComparator{
{Value: common.HexToHash(""), Operator: primitives.Gt},
})

parser := &pgDSLParser{}
Expand All @@ -257,9 +257,9 @@ func TestDSLParser(t *testing.T) {
t.Run("query for event topic", func(t *testing.T) {
t.Parallel()

topicFilter := NewEventByTopicFilter(2, []primitives.ValueComparator{
{Value: "a", Operator: primitives.Gt},
{Value: "b", Operator: primitives.Lt},
topicFilter := NewEventByTopicFilter(2, []HashedValueComparator{
{Value: common.HexToHash("a"), Operator: primitives.Gt},
{Value: common.HexToHash("b"), Operator: primitives.Lt},
})

parser := &pgDSLParser{}
Expand Down Expand Up @@ -321,9 +321,9 @@ func TestDSLParser(t *testing.T) {
t.Run("nested query deep", func(t *testing.T) {
t.Parallel()

wordFilter := NewEventByWordFilter(common.HexToHash("0x42"), 8, []primitives.ValueComparator{
{Value: "a", Operator: primitives.Gt},
{Value: "b", Operator: primitives.Lte},
wordFilter := NewEventByWordFilter(8, []HashedValueComparator{
{Value: common.HexToHash("a"), Operator: primitives.Gt},
{Value: common.HexToHash("b"), Operator: primitives.Lte},
})

parser := &pgDSLParser{}
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ batch_vrf_coordinator_v2: ../../contracts/solc/v0.8.6/BatchVRFCoordinatorV2/Batc
batch_vrf_coordinator_v2plus: ../../contracts/solc/v0.8.19/BatchVRFCoordinatorV2Plus/BatchVRFCoordinatorV2Plus.abi ../../contracts/solc/v0.8.19/BatchVRFCoordinatorV2Plus/BatchVRFCoordinatorV2Plus.bin f13715b38b5b9084b08bffa571fb1c8ef686001535902e1255052f074b31ad4e
blockhash_store: ../../contracts/solc/v0.8.19/BlockhashStore/BlockhashStore.abi ../../contracts/solc/v0.8.19/BlockhashStore/BlockhashStore.bin 31b118f9577240c8834c35f8b5a1440e82a6ca8aea702970de2601824b6ab0e1
chain_module_base: ../../contracts/solc/v0.8.19/ChainModuleBase/ChainModuleBase.abi ../../contracts/solc/v0.8.19/ChainModuleBase/ChainModuleBase.bin 7a82cc28014761090185c2650239ad01a0901181f1b2b899b42ca293bcda3741
chain_reader_tester: ../../contracts/solc/v0.8.19/ChainReaderTester/ChainReaderTester.abi ../../contracts/solc/v0.8.19/ChainReaderTester/ChainReaderTester.bin b207f9e6bf71e445a2664a602677011b87b80bf95c6352fd7869f1a9ddb08a5b
chain_reader_tester: ../../contracts/solc/v0.8.19/ChainReaderTester/ChainReaderTester.abi ../../contracts/solc/v0.8.19/ChainReaderTester/ChainReaderTester.bin 84c4223c4dbd51aafd77a6787f4b84ce80f661ce86a907c1431c5b82d633f2ad
chain_specific_util_helper: ../../contracts/solc/v0.8.6/ChainSpecificUtilHelper/ChainSpecificUtilHelper.abi ../../contracts/solc/v0.8.6/ChainSpecificUtilHelper/ChainSpecificUtilHelper.bin 66eb30b0717fefe05672df5ec863c0b9a5a654623c4757307a2726d8f31e26b1
counter: ../../contracts/solc/v0.8.6/Counter/Counter.abi ../../contracts/solc/v0.8.6/Counter/Counter.bin 6ca06e000e8423573ffa0bdfda749d88236ab3da2a4cbb4a868c706da90488c9
cron_upkeep_factory_wrapper: ../../contracts/solc/v0.8.6/CronUpkeepFactory/CronUpkeepFactory.abi - dacb0f8cdf54ae9d2781c5e720fc314b32ed5e58eddccff512c75d6067292cd7
Expand Down
10 changes: 5 additions & 5 deletions core/scripts/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ require (
github.com/prometheus/client_golang v1.20.0
github.com/shopspring/decimal v1.4.0
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240916150342-36cb47701edf
github.com/smartcontractkit/chainlink-common v0.2.3-0.20240918210534-564164004d06
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7
github.com/spf13/cobra v1.8.1
Expand Down Expand Up @@ -116,7 +116,7 @@ require (
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/esote/minmaxheap v1.0.0 // indirect
github.com/ethereum/c-kzg-4844 v0.4.0 // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/fatih/color v1.17.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
Expand Down Expand Up @@ -341,16 +341,16 @@ require (
go.uber.org/zap v1.27.0 // indirect
golang.org/x/arch v0.8.0 // indirect
golang.org/x/crypto v0.27.0 // indirect
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect
golang.org/x/mod v0.20.0 // indirect
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
golang.org/x/mod v0.21.0 // indirect
golang.org/x/net v0.29.0 // indirect
golang.org/x/oauth2 v0.22.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.25.0 // indirect
golang.org/x/term v0.24.0 // indirect
golang.org/x/text v0.18.0 // indirect
golang.org/x/time v0.6.0 // indirect
golang.org/x/tools v0.24.0 // indirect
golang.org/x/tools v0.25.0 // indirect
gonum.org/v1/gonum v0.15.0 // indirect
google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect
Expand Down
20 changes: 10 additions & 10 deletions core/scripts/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -357,8 +357,8 @@ github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+ne
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
Expand Down Expand Up @@ -1083,8 +1083,8 @@ github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8um
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240917180332-5a68498d1612 h1:xPEM9XbfZmv8N3NjZ7AX5salonll/LdXrbb8JCbA4FE=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240917180332-5a68498d1612/go.mod h1:Lv77O13ZxOdmlvnu2vaUC0Lg+t3JAL+N+9K8dRsgmDI=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240916150342-36cb47701edf h1:1AlTUkT5D8HmvU9bwDoIN54/EFyOnRBl7gnXZVrYXEA=
github.com/smartcontractkit/chainlink-common v0.2.2-0.20240916150342-36cb47701edf/go.mod h1:l8NTByXUdGGJX+vyKYI6yX1/HIpM14F8Wm9BkU3Q4Qo=
github.com/smartcontractkit/chainlink-common v0.2.3-0.20240918210534-564164004d06 h1:wqLXuPdiUkn7es/epKmOpB0Q0tKdA9FkYPNQZrZ+VJU=
github.com/smartcontractkit/chainlink-common v0.2.3-0.20240918210534-564164004d06/go.mod h1:zm+l8gN4LQS1+YvwQDhRz/njirVeWGNiDJKIhCGwaoQ=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 h1:lTGIOQYLk1Ufn++X/AvZnt6VOcuhste5yp+C157No/Q=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7/go.mod h1:BMYE1vC/pGmdFSsOJdPrAA0/4gZ0Xo0SxTMdGspBtRo=
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240916152957-433914114bd2 h1:yRk4ektpx/UxwarqAfgxUXLrsYXlaNeP1NOwzHGrK2Q=
Expand Down Expand Up @@ -1376,8 +1376,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI=
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
Expand All @@ -1402,8 +1402,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
Expand Down Expand Up @@ -1614,8 +1614,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
Expand Down
Loading

0 comments on commit 328b62a

Please sign in to comment.