From 097d8c85ad33029186ea6b9fee1699da3d8d6212 Mon Sep 17 00:00:00 2001 From: Andrew Gouin Date: Sat, 18 Nov 2023 00:09:33 -0700 Subject: [PATCH 1/9] scale max retries --- relayer/chains/cosmos/cosmos_chain_processor.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/relayer/chains/cosmos/cosmos_chain_processor.go b/relayer/chains/cosmos/cosmos_chain_processor.go index f59bd6492..14ab75a0b 100644 --- a/relayer/chains/cosmos/cosmos_chain_processor.go +++ b/relayer/chains/cosmos/cosmos_chain_processor.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "math" "math/big" "time" @@ -419,8 +420,10 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu zap.Error(err), ) + maxRetries := math.Round(blockMaxRetries * time.Second.Seconds() / persistence.minQueryLoopDuration.Seconds()) + persistence.retriesAtLatestQueriedBlock++ - if persistence.retriesAtLatestQueriedBlock >= blockMaxRetries { + if persistence.retriesAtLatestQueriedBlock >= int(maxRetries) { ccp.log.Warn("Reached max retries querying for block, skipping", zap.Int64("height", i)) // skip this block. now depends on flush to pickup anything missed in the block. persistence.latestQueriedBlock = i From 5145db34d6fd7c141389df95c77e3dc47dc592aa Mon Sep 17 00:00:00 2001 From: Andrew Gouin Date: Mon, 20 Nov 2023 15:58:14 -0700 Subject: [PATCH 2/9] tm websocket first pass --- .../chains/cosmos/cosmos_chain_processor.go | 163 ++++++++++++++++++ relayer/processor/path_end_runtime.go | 10 +- 2 files changed, 170 insertions(+), 3 deletions(-) diff --git a/relayer/chains/cosmos/cosmos_chain_processor.go b/relayer/chains/cosmos/cosmos_chain_processor.go index 14ab75a0b..83c3c1ac3 100644 --- a/relayer/chains/cosmos/cosmos_chain_processor.go +++ b/relayer/chains/cosmos/cosmos_chain_processor.go @@ -18,6 +18,7 @@ import ( "github.com/cosmos/relayer/v2/relayer/provider" ctypes "github.com/cometbft/cometbft/rpc/core/types" + comettypes "github.com/cometbft/cometbft/types" "github.com/cosmos/relayer/v2/relayer/chains" "go.uber.org/zap" "golang.org/x/sync/errgroup" @@ -272,6 +273,10 @@ func (ccp *CosmosChainProcessor) Run(ctx context.Context, initialBlockHistory ui ccp.log.Debug("Entering main query loop") + if err := ccp.subscribe(ctx); err != nil { + ccp.log.Warn("Error subscribing to websocket, falling back to rpc polling", zap.Error(err)) + } + ticker := time.NewTicker(persistence.minQueryLoopDuration) defer ticker.Stop() @@ -288,6 +293,164 @@ func (ccp *CosmosChainProcessor) Run(ctx context.Context, initialBlockHistory ui } } +func (ccp CosmosChainProcessor) periodicTMVersionCheck(ctx context.Context) { + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + status, err := ccp.nodeStatusWithRetry(ctx) + if err != nil { + ccp.log.Error( + "Failed to query node status after max attempts", + zap.Uint("attempts", latestHeightQueryRetries), + zap.Error(err), + ) + continue + } + + ccp.chainProvider.setCometVersion(ccp.log, status.NodeInfo.Version) + } + } + +} + +func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { + + // latestHeight, err := ccp.latestHeightWithRetry(ctx) + // if err != nil { + // return err + // } + // ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, latestHeight) + // if err != nil { + // return err + // } + + // valSet := ibcHeader.(provider.TendermintIBCHeader).ValidatorSet + + headerChan, err := ccp.chainProvider.RPCClient.Subscribe(ctx, "header", comettypes.QueryForEvent(comettypes.EventNewBlockHeader).String()) + if err != nil { + return fmt.Errorf("failed to subscribe to blocks over websocket: %w", err) + } + + txChan, err := ccp.chainProvider.RPCClient.Subscribe(ctx, "tx", comettypes.QueryForEvent(comettypes.EventTx).String()) + if err != nil { + return fmt.Errorf("failed to subscribe to blocks over websocket: %w", err) + } + + // periodically check the tendermint version of the node + go ccp.periodicTMVersionCheck(ctx) + + // valSetChan, err := ccp.chainProvider.RPCClient.Subscribe(ctx, "vals", comettypes.QueryForEvent(comettypes.EventValidatorSetUpdates).String()) + // if err != nil { + // return fmt.Errorf("failed to subscribe to blocks over websocket: %w", err) + // } + + chainID := ccp.chainProvider.ChainId() + + for { + ibcMessagesCache := processor.NewIBCMessagesCache() + ibcHeaderCache := make(processor.IBCHeaderCache) + + var latestHeader provider.TendermintIBCHeader + + select { + case <-ctx.Done(): + return nil + case event := <-headerChan: + headerEvent := event.Data.(comettypes.EventDataNewBlockHeader) + + ccp.log.Debug("Received new block header event", zap.Int64("height", headerEvent.Header.Height)) + + // TODO try to avoid this query by getting the SignedHeader via websocket. + // If we can't, add retry logic. + ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, int64(headerEvent.Header.Height)) + if err != nil { + ccp.log.Error("Error querying IBC header", + zap.Int64("height", headerEvent.Header.Height), + zap.Error(err), + ) + continue + } + + latestHeader = ibcHeader.(provider.TendermintIBCHeader) + + heightUint64 := uint64(headerEvent.Header.Height) + + blockMsgs := ccp.ibcMessagesFromBlockEvents( + headerEvent.ResultBeginBlock.Events, + headerEvent.ResultEndBlock.Events, + heightUint64, + ccp.chainProvider.cometLegacyEncoding, + ) + for _, m := range blockMsgs { + ccp.handleMessage(ctx, m, ibcMessagesCache) + } + + ccp.latestBlock = provider.LatestBlock{ + Height: heightUint64, + Time: headerEvent.Header.Time, + } + + // latestHeader = provider.TendermintIBCHeader{ + // ValidatorSet: valSet, + // SignedHeader: &comettypes.SignedHeader{ + // Header: &headerEvent.Header, + // // TODO: how do we get Commit without querying light block? + // // Commit: , + // }, + // } + + ibcHeaderCache[heightUint64] = latestHeader + case event := <-txChan: + ccp.log.Debug("Received new tx event") + + txEvent := event.Data.(comettypes.EventDataTx) + + tx := txEvent.Result + if tx.Code != 0 { + // tx was not successful + continue + } + messages := chains.IbcMessagesFromEvents(ccp.log, tx.Events, chainID, uint64(txEvent.Height), ccp.chainProvider.cometLegacyEncoding) + + for _, m := range messages { + ccp.handleMessage(ctx, m, ibcMessagesCache) + } + // case event := <-valSetChan: + // ccp.log.Debug("Received validator set change event") + // vsEvent := event.Data.(comettypes.EventDataValidatorSetUpdates) + // valSet.UpdateWithChangeSet(vsEvent.ValidatorUpdates) + // continue + } + + for _, pp := range ccp.pathProcessors { + clientID := pp.RelevantClientID(chainID) + clientState, err := ccp.clientState(ctx, clientID) + if err != nil { + ccp.log.Error("Error fetching client state", + zap.String("client_id", clientID), + zap.Error(err), + ) + continue + } + + pp.HandleNewData(chainID, processor.ChainProcessorCacheData{ + LatestBlock: ccp.latestBlock, + LatestHeader: latestHeader, + IBCMessagesCache: ibcMessagesCache.Clone(), + InSync: ccp.inSync, + ClientState: clientState, + ConnectionStateCache: ccp.connectionStateCache.FilterForClient(clientID), + ChannelStateCache: ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients), + IBCHeaderCache: ibcHeaderCache.Clone(), + }) + } + } +} + // initializeConnectionState will bootstrap the connectionStateCache with the open connection state. func (ccp *CosmosChainProcessor) initializeConnectionState(ctx context.Context) error { ctx, cancel := context.WithTimeout(ctx, queryStateTimeout) diff --git a/relayer/processor/path_end_runtime.go b/relayer/processor/path_end_runtime.go index d91307f12..6c6e5cff8 100644 --- a/relayer/processor/path_end_runtime.go +++ b/relayer/processor/path_end_runtime.go @@ -375,7 +375,9 @@ func (pathEnd *pathEndRuntime) mergeCacheData(ctx context.Context, cancel func() pathEnd.lastClientUpdateHeightMu.Unlock() pathEnd.inSync = d.InSync - pathEnd.latestHeader = d.LatestHeader + if d.LatestHeader != nil { + pathEnd.latestHeader = d.LatestHeader + } pathEnd.clientState = d.ClientState terminate, err := pathEnd.checkForMisbehaviour(ctx, pathEnd.clientState, counterParty) @@ -407,8 +409,10 @@ func (pathEnd *pathEndRuntime) mergeCacheData(ctx context.Context, cancel func() pathEnd.mergeMessageCache(d.IBCMessagesCache, counterpartyChainID, pathEnd.inSync && counterpartyInSync) // Merge incoming packet IBC messages into the backlog - pathEnd.ibcHeaderCache.Merge(d.IBCHeaderCache) // Update latest IBC header state - pathEnd.ibcHeaderCache.Prune(ibcHeadersToCache) // Only keep most recent IBC headers + if d.IBCHeaderCache != nil { + pathEnd.ibcHeaderCache.Merge(d.IBCHeaderCache) // Update latest IBC header state + pathEnd.ibcHeaderCache.Prune(ibcHeadersToCache) // Only keep most recent IBC headers + } } // shouldSendPacketMessage determines if the packet flow message should be sent now. From c6befda2eb0ccf9c280e5d4d8958df985f6539c8 Mon Sep 17 00:00:00 2001 From: Andrew Gouin Date: Mon, 20 Nov 2023 23:03:05 -0700 Subject: [PATCH 3/9] include legacy support --- interchaintest/go.mod | 5 +- interchaintest/go.sum | 209 +++------------- .../chains/cosmos/cosmos_chain_processor.go | 223 ++++++++++++------ relayer/processor/path_end_runtime.go | 33 +-- 4 files changed, 206 insertions(+), 264 deletions(-) diff --git a/interchaintest/go.mod b/interchaintest/go.mod index caf8de4aa..4f52f03c1 100644 --- a/interchaintest/go.mod +++ b/interchaintest/go.mod @@ -172,7 +172,6 @@ require ( github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect github.com/minio/highwayhash v1.0.2 // indirect @@ -213,13 +212,15 @@ require ( github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rs/cors v1.8.3 // indirect github.com/rs/zerolog v1.31.0 // indirect + github.com/sagikazarmark/locafero v0.3.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.10.0 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.17.0 // indirect github.com/strangelove-ventures/cometbft v0.37.3-0.20231004194858-c01e8d5bcac3 // indirect diff --git a/interchaintest/go.sum b/interchaintest/go.sum index f56927420..895959f2c 100644 --- a/interchaintest/go.sum +++ b/interchaintest/go.sum @@ -32,8 +32,6 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= @@ -72,8 +70,6 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute v1.23.1 h1:V97tBoDaZHb6leicZ1G6DLK2BAaZLJ/7+9BB/En3hR0= cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= @@ -115,8 +111,6 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/iam v1.1.3 h1:18tKG7DzydKWUnLjonWcJO6wjSCAtzh4GcRKlH/Hrzc= cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= @@ -193,12 +187,9 @@ cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xX cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cosmossdk.io/api v0.7.1 h1:PNQ1xN8+/0hj/sSD0ANqjkgfXFys+bZ5L8Hg7uzoUTU= -cosmossdk.io/api v0.7.1/go.mod h1:ure9edhcROIHsngavM6mBLilMGFnfjhV/AaYhEMUkdo= cosmossdk.io/api v0.7.2 h1:BO3i5fvKMKvfaUiMkCznxViuBEfyWA/k6w2eAF6q1C4= cosmossdk.io/api v0.7.2/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= -cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508 h1:tt5OMwdouv7dkwkWJYxb8I9h322bOxnC9RmK2qGvWMs= -cosmossdk.io/client/v2 v2.0.0-20230818115413-c402c51a1508/go.mod h1:iHeSk2AT6O8RNGlfcEQq6Yty6Z/6gydQsXXBh5I715Q= +cosmossdk.io/client/v2 v2.0.0-beta.1 h1:XkHh1lhrLYIT9zKl7cIOXUXg2hdhtjTPBUfqERNA1/Q= cosmossdk.io/client/v2 v2.0.0-beta.1/go.mod h1:JEUSu9moNZQ4kU3ir1DKD5eU4bllmAexrGWjmb9k8qU= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= @@ -210,31 +201,20 @@ cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= -cosmossdk.io/math v1.1.3-rc.1 h1:NebCNWDqb1MJRNfvxr4YY7d8FSYgkuB3L75K6xvM+Zo= -cosmossdk.io/math v1.1.3-rc.1/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/simapp v0.0.0-20230224204036-a6adb0821462 h1:g8muUHnXL8vhld2Sjilyhb1UQObc+x9GVuDK43TYZns= cosmossdk.io/simapp v0.0.0-20230224204036-a6adb0821462/go.mod h1:4Dd3NLoLYoN90kZ0uyHoTHzVVk9+J0v4HhZRBNTAq2c= -cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4= -cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk= cosmossdk.io/store v1.0.0 h1:6tnPgTpTSIskaTmw/4s5C9FARdgFflycIc9OX8i1tOI= cosmossdk.io/store v1.0.0/go.mod h1:ABMprwjvx6IpMp8l06TwuMrj6694/QP5NIW+X6jaTYc= -cosmossdk.io/x/circuit v0.0.0-20230818115413-c402c51a1508 h1:9HRBpMbGgk+W4BIp4ezYH2EjbpuVl2fBlwyJ2GZgrS0= -cosmossdk.io/x/circuit v0.0.0-20230818115413-c402c51a1508/go.mod h1:BhFX0kD6lkctNQO3ZGYY3p6h0/wPLVbFhrOt3uQxEIM= +cosmossdk.io/x/circuit v0.1.0 h1:IAej8aRYeuOMritczqTlljbUVHq1E85CpBqaCTwYgXs= cosmossdk.io/x/circuit v0.1.0/go.mod h1:YDzblVE8+E+urPYQq5kq5foRY/IzhXovSYXb4nwd39w= -cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508 h1:R9H1lDpcPSkrLOnt6IDE38o0Wp8xE/+BAxocb0oyX4I= -cosmossdk.io/x/evidence v0.0.0-20230818115413-c402c51a1508/go.mod h1:yjIo3J0QKDo9CJawK1QoTA1hBx0llafVJdPqI0+ry74= +cosmossdk.io/x/evidence v0.1.0 h1:J6OEyDl1rbykksdGynzPKG5R/zm6TacwW2fbLTW4nCk= cosmossdk.io/x/evidence v0.1.0/go.mod h1:hTaiiXsoiJ3InMz1uptgF0BnGqROllAN8mwisOMMsfw= -cosmossdk.io/x/feegrant v0.0.0-20230926065455-cd9f0a61b710 h1:IHjYY/3rNkNc1mSPVpqg7hMP898Y6fXOdGL1jtHcKI0= -cosmossdk.io/x/feegrant v0.0.0-20230926065455-cd9f0a61b710/go.mod h1:nnIKdJKz1Os+sOlJHrjgMOh1WAlle0aV7Y+0x434OyI= +cosmossdk.io/x/feegrant v0.1.0 h1:c7s3oAq/8/UO0EiN1H5BIjwVntujVTkYs35YPvvrdQk= cosmossdk.io/x/feegrant v0.1.0/go.mod h1:4r+FsViJRpcZif/yhTn+E0E6OFfg4n0Lx+6cCtnZElU= -cosmossdk.io/x/tx v0.10.0 h1:LxWF/hksVDbeQmFj4voLM5ZCHyVZ1cCNIqKenfH9plc= -cosmossdk.io/x/tx v0.10.0/go.mod h1:MKo9/b5wsoL8dd9y9pvD2yOP1CMvzHIWYxi1l2oLPFo= cosmossdk.io/x/tx v0.12.0 h1:Ry2btjQdrfrje9qZ3iZeZSmDArjgxUJMMcLMrX4wj5U= cosmossdk.io/x/tx v0.12.0/go.mod h1:qTth2coAGkwCwOCjqQ8EAQg+9udXNRzcnSbMgGKGEI0= -cosmossdk.io/x/upgrade v0.0.0-20230926065455-cd9f0a61b710 h1:gUTneiEiIQ5kMAkekPUaDxKxI8YYQSEkXftBY/obYMA= -cosmossdk.io/x/upgrade v0.0.0-20230926065455-cd9f0a61b710/go.mod h1:TiRRu0bfrDCN4suS/gYrM5yDitmuZyyjV92P6tA/IFs= cosmossdk.io/x/upgrade v0.1.0 h1:z1ZZG4UL9ICTNbJDYZ6jOnF9GdEK9wyoEFi4BUScHXE= cosmossdk.io/x/upgrade v0.1.0/go.mod h1:/6jjNGbiPCNtmA1N+rBtP601sr0g4ZXuj3yC6ClPCGY= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -277,12 +257,12 @@ github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8 github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/StirlingMarketingGroup/go-namecase v1.0.0 h1:2CzaNtCzc4iNHirR+5ru9OzGg8rQp860gqLBFqRI02Y= github.com/StirlingMarketingGroup/go-namecase v1.0.0/go.mod h1:ZsoSKcafcAzuBx+sndbxHu/RjDcDTrEdT4UvhniHfio= -github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= @@ -302,8 +282,6 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/avast/retry-go/v4 v4.5.0 h1:QoRAZZ90cj5oni2Lsgl2GW8mNTnUCnmpx/iKpwVisHg= -github.com/avast/retry-go/v4 v4.5.0/go.mod h1:7hLEXp0oku2Nir2xBAsg0PTphp9z71bN5Aq1fboC3+I= github.com/avast/retry-go/v4 v4.5.1 h1:AxIx0HGi4VZ3I02jr78j5lZ3M6x1E0Ivxa6b0pUUh7o= github.com/avast/retry-go/v4 v4.5.1/go.mod h1:/sipNsvNB3RRuT5iNcb6h73nw3IBmXJ/H3XrCQYSOpc= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= @@ -401,8 +379,6 @@ github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZ github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98 h1:Y7g+YeGJ+1Ni31uOplgf7mi+1X+Em5PzIx9WMPq/2zY= -github.com/cockroachdb/pebble v0.0.0-20230824192853-9bb0864bdb98/go.mod h1:EDjiaAXc0FXiRmxDzcu1wIEJ093ohHMUWxrI6iku0XA= github.com/cockroachdb/pebble v0.0.0-20231102162011-844f0582c2eb h1:6Po+YYKT5B5ZXN0wd2rwFBaebM0LufPf8p4zxOd48Kg= github.com/cockroachdb/pebble v0.0.0-20231102162011-844f0582c2eb/go.mod h1:acMRUGd/BK8AUmQNK3spUCCGzFLZU2bSST3NMXSq2Kc= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= @@ -416,8 +392,7 @@ github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AK github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.7.7 h1:QOC2K4A42RQpcrZyptP6z9EJZnlHfHJUfZrAAHe15q4= @@ -437,8 +412,6 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1 h1:1Z+SgLg8S2+DoiePz9aO5dSjJUgag8VFhFUSD/HGvOU= -github.com/cosmos/cosmos-sdk v0.50.0-rc.1/go.mod h1:JbgPLZrh+yX+4+n1CPJ/uL9HrhZw6QVg0q7cTq2Iwq0= github.com/cosmos/cosmos-sdk v0.50.1 h1:2SYwAYqd7ZwtrWxu/J8PwbQV/cDcu90bCr/a78g3lVw= github.com/cosmos/cosmos-sdk v0.50.1/go.mod h1:fsLSPGstCwn6MMsFDMAQWGJj8E4sYsN9Gnu1bGE5imA= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= @@ -449,30 +422,20 @@ github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= -github.com/cosmos/iavl v1.0.0-rc.1 h1:5+73BEWW1gZOIUJKlk/1fpD4lOqqeFBA8KuV+NpkCpU= -github.com/cosmos/iavl v1.0.0-rc.1/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= github.com/cosmos/iavl v1.0.0 h1:bw6t0Mv/mVCJvlMTOPHWLs5uUE3BRBfVWCRelOzl+so= github.com/cosmos/iavl v1.0.0/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= -github.com/cosmos/ibc-go/modules/capability v1.0.0-rc6 h1:K3lWRr/WJkPdSWErxhQL1x0CTnJyONHwJSyaTefGDf0= -github.com/cosmos/ibc-go/modules/capability v1.0.0-rc6/go.mod h1:DBP9jg+NoXU2buK5QDyf87lMjcQYN8qFlByNeNJmuhs= github.com/cosmos/ibc-go/modules/capability v1.0.0 h1:r/l++byFtn7jHYa09zlAdSeevo8ci1mVZNO9+V0xsLE= github.com/cosmos/ibc-go/modules/capability v1.0.0/go.mod h1:D81ZxzjZAe0ZO5ambnvn1qedsFQ8lOwtqicG6liLBco= -github.com/cosmos/ibc-go/v8 v8.0.0-beta.1 h1:vCateGEI1nl955HxLu/Nh+d8dYkribGjcrlQqWjjVnI= -github.com/cosmos/ibc-go/v8 v8.0.0-beta.1/go.mod h1:1bpsE9mtwEbSRmCCo0VsIGe64JY2sXSxeNv8Be1nPxQ= github.com/cosmos/ibc-go/v8 v8.0.0 h1:QKipnr/NGwc+9L7NZipURvmSIu+nw9jOIWTJuDBqOhg= github.com/cosmos/ibc-go/v8 v8.0.0/go.mod h1:C6IiJom0F3cIQCD5fKwVPDrDK9j/xTu563AWuOmXois= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= -github.com/cosmos/ledger-cosmos-go v0.13.0 h1:ex0CvCxToSR7j5WjrghPu2Bu9sSXKikjnVvUryNnx4s= -github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= @@ -483,8 +446,8 @@ github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuA github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= @@ -516,8 +479,6 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WA github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -548,20 +509,14 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/c-kzg-4844 v0.3.0 h1:3Y3hD6l5i0dEYsBL50C+Om644kve3pNqoAcvE26o9zI= -github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.12.1 h1:1kXDPxhLfyySuQYIfRxVBGYuaHdxNNxevA73vjIwsgk= -github.com/ethereum/go-ethereum v1.12.1/go.mod h1:zKetLweqBR8ZS+1O9iJWI8DvmmD2NzD19apjEWDCsnw= github.com/ethereum/go-ethereum v1.13.5 h1:U6TCRciCqZRe4FPXmy1sMGxTfuk8P7u2UoinF3VbaFk= github.com/ethereum/go-ethereum v1.13.5/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -576,8 +531,6 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= -github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/getsentry/sentry-go v0.25.0 h1:q6Eo+hS+yoJlTO3uu/azhQadsD8V+jQn2D8VvX1eOyI= github.com/getsentry/sentry-go v0.25.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -628,8 +581,8 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -641,8 +594,6 @@ github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2 github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -704,7 +655,6 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -744,23 +694,18 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo= github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/googleapis/enterprise-certificate-proxy v0.3.1 h1:SBWmZhjUDRorQxrN0nwzf+AHBxnbFjViHQS4P0yVpmQ= github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= @@ -777,14 +722,10 @@ github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+ github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -824,8 +765,6 @@ github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/H github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= -github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= @@ -882,8 +821,8 @@ github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jhump/protoreflect v1.15.2 h1:7YppbATX94jEt9KLAc5hICx4h6Yt3SaavhQRsIUEHP0= -github.com/jhump/protoreflect v1.15.2/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= +github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -917,8 +856,6 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= @@ -950,8 +887,6 @@ github.com/libp2p/go-libp2p v0.31.0 h1:LFShhP8F6xthWiBBq3euxbKjZsoRajVEyBS9snfHx github.com/libp2p/go-libp2p v0.31.0/go.mod h1:W/FEK1c/t04PbRH3fA9i5oucu5YcgrG0JVoBWT1B7Eg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= -github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= github.com/linxGnu/grocksdb v1.8.4 h1:ZMsBpPpJNtRLHiKKp0mI7gW+NT4s7UgfD5xHxx1jVRo= github.com/linxGnu/grocksdb v1.8.4/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= @@ -970,7 +905,6 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -981,8 +915,6 @@ github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -1011,8 +943,6 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/moby/moby v24.0.2+incompatible h1:yH+5dRHH1x3XRKzl1THA2aGTy6CHYnkt5N924ADMax8= -github.com/moby/moby v24.0.2+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/moby v24.0.7+incompatible h1:RrVT5IXBn85mRtFKP+gFwVLCcnNPZIgN3NVRJG9Le+4= github.com/moby/moby v24.0.7+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/patternmatcher v0.5.0 h1:YCZgJOeULcxLw1Q+sVR636pmS7sPEn1Qo2iAN6M7DBo= @@ -1065,8 +995,6 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce h1:/pEpMk55wH0X+E5zedGEMOdLuWmV8P4+4W3+LZaM6kg= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230110094441-db37f07504ce/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1090,8 +1018,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= -github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= +github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= +github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -1123,8 +1051,6 @@ github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6 github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b h1:vab8deKC4QoIfm9fJM59iuNz1ELGsuLoYYpiF+pHiG8= -github.com/petermattis/goid v0.0.0-20230808133559-b036b712a89b/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/petermattis/goid v0.0.0-20230904192822-1876fd5063bc h1:8bQZVK1X6BJR/6nYUPxQEP+ReTsceJTKizeuwjWOPUA= github.com/petermattis/goid v0.0.0-20230904192822-1876fd5063bc/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= @@ -1140,7 +1066,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1159,8 +1084,6 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1169,8 +1092,6 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1179,8 +1100,6 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1188,7 +1107,6 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= @@ -1209,6 +1127,10 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= +github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= @@ -1228,39 +1150,31 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= github.com/strangelove-ventures/cometbft v0.37.3-0.20231004194858-c01e8d5bcac3 h1:sOdCYxFMTVbEGvJ6LfjQsm+tQbB5YdUpvMcXJnHBFm4= github.com/strangelove-ventures/cometbft v0.37.3-0.20231004194858-c01e8d5bcac3/go.mod h1:Jgux5ULdCs9N7ARy9NHe+hPfJQhUFpYF6+/+gmcqsGw= -github.com/strangelove-ventures/interchaintest/v8 v8.0.0-20231017192510-34c63cfd0956 h1:KDCvw0Hb7x+uN5+8PjLF/HwVuoMAhC3kTk3nlDq9P3Q= -github.com/strangelove-ventures/interchaintest/v8 v8.0.0-20231017192510-34c63cfd0956/go.mod h1:PjgiNKXZN9sRig0ObiPjNeklNVF8YnXvLaOaDu9LX90= -github.com/strangelove-ventures/interchaintest/v8 v8.0.0-20231018160911-cbabe40c85b1 h1:IGDiiEWFR47BRZfo7yLyKvyr6tWL8/dNXmEJq7us49k= -github.com/strangelove-ventures/interchaintest/v8 v8.0.0-20231018160911-cbabe40c85b1/go.mod h1:PjgiNKXZN9sRig0ObiPjNeklNVF8YnXvLaOaDu9LX90= github.com/strangelove-ventures/interchaintest/v8 v8.0.1-0.20231114192524-e3719592933b h1:VDe2ofJ2xiiLwkJ6qhcF2gvg75gB4WVpXO8lFzhYQOU= github.com/strangelove-ventures/interchaintest/v8 v8.0.1-0.20231114192524-e3719592933b/go.mod h1:TbVaBTSa9Y7/Jj/JeqoH79fAcyQiHloz1zxXxKjtCFA= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1284,11 +1198,9 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/supranational/blst v0.3.11-0.20230406105308-e9dfc5ee724b h1:u49mjRnygnB34h8OKbnNJFVUtWSKIKb1KukdV8bILUM= -github.com/supranational/blst v0.3.11-0.20230406105308-e9dfc5ee724b/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= @@ -1298,10 +1210,10 @@ github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2l github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= @@ -1312,8 +1224,8 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1329,12 +1241,8 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -1386,10 +1294,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1403,8 +1308,6 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 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-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= @@ -1433,10 +1336,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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= @@ -1501,8 +1401,6 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1530,8 +1428,6 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1548,8 +1444,6 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1659,15 +1553,12 @@ golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1679,10 +1570,7 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1753,8 +1641,6 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1815,10 +1701,7 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= -google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= -google.golang.org/api v0.139.0 h1:A1TrCPgMmOiYu0AiNkvQIpIx+D8blHTDcJ5EogkP7LI= -google.golang.org/api v0.139.0/go.mod h1:CVagp6Eekz9CjGZ718Z+sloknzkDJE7Vc1Ckj9+viBk= +google.golang.org/api v0.143.0 h1:o8cekTkqhywkbZT6p1UHJPZ9+9uuCAJs/KYomxZB8fA= google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1938,16 +1821,10 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb h1:XFBgcDwm7irdHTbz4Zk2h7Mh+eis4nfJEFQFYzJzuIA= -google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 h1:nIgk/EEq3/YlnmVVXVnm14rC2oxgs1o0ong4sD/rd44= -google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a h1:myvhA4is3vrit1a6NZCWBIwN0kNEnX21DJOJX/NvIfI= google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1991,8 +1868,6 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= -google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -2071,22 +1946,14 @@ modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v1.24.1 h1:uvJSeCKL/AgzBo2yYIPPTy82v21KgGnizcGYfBHaNuM= -modernc.org/libc v1.24.1/go.mod h1:FmfO1RLrU3MHJfyi9eYYmZBfi/R+tqZ6+hQ3yQQUkak= modernc.org/libc v1.29.0 h1:tTFRFq69YKCF2QyGNuRUQxKBm1uZZLubf6Cjh/pVHXs= modernc.org/libc v1.29.0/go.mod h1:DaG/4Q3LRRdqpiLyP0C2m1B8ZMGkQ+cCgOIjEtQlYhQ= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.6.0 h1:i6mzavxrE9a30whzMfwf7XWVODx2r5OYXvU46cirX7o= -modernc.org/memory v1.6.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.26.0 h1:SocQdLRSYlA8W99V8YH0NES75thx19d9sB/aFc4R8Lw= -modernc.org/sqlite v1.26.0/go.mod h1:FL3pVXie73rg3Rii6V/u5BoHlSoyeZeIgKZEgHARyCU= modernc.org/sqlite v1.27.0 h1:MpKAHoyYB7xqcwnUwkuD+npwEa0fojF0B5QRbN+auJ8= modernc.org/sqlite v1.27.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= @@ -2108,8 +1975,6 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/relayer/chains/cosmos/cosmos_chain_processor.go b/relayer/chains/cosmos/cosmos_chain_processor.go index 83c3c1ac3..9ac8e934a 100644 --- a/relayer/chains/cosmos/cosmos_chain_processor.go +++ b/relayer/chains/cosmos/cosmos_chain_processor.go @@ -20,10 +20,14 @@ import ( ctypes "github.com/cometbft/cometbft/rpc/core/types" comettypes "github.com/cometbft/cometbft/types" "github.com/cosmos/relayer/v2/relayer/chains" + legacycomettypes "github.com/strangelove-ventures/cometbft/types" "go.uber.org/zap" "golang.org/x/sync/errgroup" ) +// Used by the query cycle to attempt to switch to websocket connection once chains are in sync +var switchToSubscribeErr = errors.New("switching to subscribe") + type CosmosChainProcessor struct { log *zap.Logger @@ -273,15 +277,23 @@ func (ccp *CosmosChainProcessor) Run(ctx context.Context, initialBlockHistory ui ccp.log.Debug("Entering main query loop") - if err := ccp.subscribe(ctx); err != nil { - ccp.log.Warn("Error subscribing to websocket, falling back to rpc polling", zap.Error(err)) - } - ticker := time.NewTicker(persistence.minQueryLoopDuration) defer ticker.Stop() for { if err := ccp.queryCycle(ctx, &persistence, stuckPacket); err != nil { + if errors.Is(err, switchToSubscribeErr) { + if ccp.chainProvider.cometLegacyBlockResults { + if err := ccp.subscribeLegacy(ctx); err != nil { + ccp.log.Error("Error subscribing to legacy websocket", zap.Error(err)) + } + } else { + if err := ccp.subscribe(ctx); err != nil { + ccp.log.Error("Error subscribing to websocket", zap.Error(err)) + } + } + continue + } return err } select { @@ -293,63 +305,136 @@ func (ccp *CosmosChainProcessor) Run(ctx context.Context, initialBlockHistory ui } } -func (ccp CosmosChainProcessor) periodicTMVersionCheck(ctx context.Context) { - ticker := time.NewTicker(5 * time.Second) - defer ticker.Stop() +func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { + if err := ccp.chainProvider.LegacyRPCClient.Start(); err != nil { + return fmt.Errorf("failed to start client service: %w", err) + } + blockChan, err := ccp.chainProvider.LegacyRPCClient.Subscribe(ctx, "block", legacycomettypes.QueryForEvent(legacycomettypes.EventNewBlock).String()) + if err != nil { + return fmt.Errorf("failed to subscribe to legacy blocks over websocket: %w", err) + } + + txChan, err := ccp.chainProvider.LegacyRPCClient.Subscribe(ctx, "tx", legacycomettypes.QueryForEvent(legacycomettypes.EventTx).String()) + if err != nil { + return fmt.Errorf("failed to subscribe to legacy tx over websocket: %w", err) + } + + chainID := ccp.chainProvider.ChainId() + + ccp.log.Info("Subscribed to legacy block events on websocket") + for { + ibcMessagesCache := processor.NewIBCMessagesCache() + ibcHeaderCache := make(processor.IBCHeaderCache) + + var latestHeader provider.IBCHeader + var isBlockEvent bool + select { case <-ctx.Done(): - return - case <-ticker.C: - status, err := ccp.nodeStatusWithRetry(ctx) + return nil + case event := <-blockChan: + isBlockEvent = true + blockEvent := event.Data.(legacycomettypes.EventDataNewBlock) + + ccp.log.Debug("Received new legacy block event", zap.Int64("height", blockEvent.Block.Height)) + + // TODO try to avoid this query by getting the SignedHeader via websocket. + // If we can't, add retry logic. + ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, blockEvent.Block.Height) if err != nil { - ccp.log.Error( - "Failed to query node status after max attempts", - zap.Uint("attempts", latestHeightQueryRetries), + ccp.log.Error("Error querying IBC header", + zap.Int64("height", blockEvent.Block.Height), zap.Error(err), ) continue } - ccp.chainProvider.setCometVersion(ccp.log, status.NodeInfo.Version) - } - } + latestHeader = ibcHeader.(provider.TendermintIBCHeader) -} + heightUint64 := uint64(blockEvent.Block.Height) -func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { + ibcHeaderCache[heightUint64] = latestHeader - // latestHeight, err := ccp.latestHeightWithRetry(ctx) - // if err != nil { - // return err - // } - // ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, latestHeight) - // if err != nil { - // return err - // } + beginBlockMsgs := ccp.ibcMessagesFromBlockEvents( + chains.ConvertEvents(blockEvent.ResultBeginBlock.Events), + heightUint64, + ccp.chainProvider.cometLegacyEncoding, + ) + for _, m := range beginBlockMsgs { + ccp.handleMessage(ctx, m, ibcMessagesCache) + } - // valSet := ibcHeader.(provider.TendermintIBCHeader).ValidatorSet + endBlockMsgs := ccp.ibcMessagesFromBlockEvents( + chains.ConvertEvents(blockEvent.ResultEndBlock.Events), + heightUint64, + ccp.chainProvider.cometLegacyEncoding, + ) + for _, m := range endBlockMsgs { + ccp.handleMessage(ctx, m, ibcMessagesCache) + } - headerChan, err := ccp.chainProvider.RPCClient.Subscribe(ctx, "header", comettypes.QueryForEvent(comettypes.EventNewBlockHeader).String()) - if err != nil { - return fmt.Errorf("failed to subscribe to blocks over websocket: %w", err) + ccp.latestBlock = provider.LatestBlock{ + Height: heightUint64, + Time: blockEvent.Block.Time, + } + + case event := <-txChan: + txEvent := event.Data.(legacycomettypes.EventDataTx) + + tx := txEvent.TxResult.Result + if tx.Code != 0 { + // tx was not successful + continue + } + messages := chains.IbcMessagesFromEvents(ccp.log, chains.ConvertEvents(tx.Events), chainID, uint64(txEvent.Height), ccp.chainProvider.cometLegacyEncoding) + + for _, m := range messages { + ccp.handleMessage(ctx, m, ibcMessagesCache) + } + } + + for _, pp := range ccp.pathProcessors { + clientID := pp.RelevantClientID(chainID) + var clientState provider.ClientState + if isBlockEvent { + clientState, err = ccp.clientState(ctx, clientID) + if err != nil { + ccp.log.Error("Error fetching client state", + zap.String("client_id", clientID), + zap.Error(err), + ) + continue + } + } + + pp.HandleNewData(chainID, processor.ChainProcessorCacheData{ + LatestBlock: ccp.latestBlock, + LatestHeader: latestHeader, + IBCMessagesCache: ibcMessagesCache.Clone(), + InSync: true, + ClientState: clientState, + ConnectionStateCache: ccp.connectionStateCache.FilterForClient(clientID), + ChannelStateCache: ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients), + IBCHeaderCache: ibcHeaderCache.Clone(), + }) + } } +} - txChan, err := ccp.chainProvider.RPCClient.Subscribe(ctx, "tx", comettypes.QueryForEvent(comettypes.EventTx).String()) +func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { + if err := ccp.chainProvider.RPCClient.Start(); err != nil { + return fmt.Errorf("failed to start client service: %w", err) + } + blockChan, err := ccp.chainProvider.RPCClient.Subscribe(ctx, "block", comettypes.QueryForEvent(comettypes.EventNewBlock).String()) if err != nil { return fmt.Errorf("failed to subscribe to blocks over websocket: %w", err) } - // periodically check the tendermint version of the node - go ccp.periodicTMVersionCheck(ctx) - - // valSetChan, err := ccp.chainProvider.RPCClient.Subscribe(ctx, "vals", comettypes.QueryForEvent(comettypes.EventValidatorSetUpdates).String()) - // if err != nil { - // return fmt.Errorf("failed to subscribe to blocks over websocket: %w", err) - // } - chainID := ccp.chainProvider.ChainId() + ccp.log.Info("Subscribed to new block events on websocket") + for { ibcMessagesCache := processor.NewIBCMessagesCache() ibcHeaderCache := make(processor.IBCHeaderCache) @@ -359,17 +444,17 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { select { case <-ctx.Done(): return nil - case event := <-headerChan: - headerEvent := event.Data.(comettypes.EventDataNewBlockHeader) + case event := <-blockChan: + blockEvent := event.Data.(comettypes.EventDataNewBlock) - ccp.log.Debug("Received new block header event", zap.Int64("height", headerEvent.Header.Height)) + ccp.log.Debug("Received new block event", zap.Int64("height", blockEvent.Block.Height)) // TODO try to avoid this query by getting the SignedHeader via websocket. // If we can't, add retry logic. - ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, int64(headerEvent.Header.Height)) + ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, blockEvent.Block.Height) if err != nil { ccp.log.Error("Error querying IBC header", - zap.Int64("height", headerEvent.Header.Height), + zap.Int64("height", blockEvent.Block.Height), zap.Error(err), ) continue @@ -377,11 +462,10 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { latestHeader = ibcHeader.(provider.TendermintIBCHeader) - heightUint64 := uint64(headerEvent.Header.Height) + heightUint64 := uint64(blockEvent.Block.Height) blockMsgs := ccp.ibcMessagesFromBlockEvents( - headerEvent.ResultBeginBlock.Events, - headerEvent.ResultEndBlock.Events, + blockEvent.ResultFinalizeBlock.Events, heightUint64, ccp.chainProvider.cometLegacyEncoding, ) @@ -391,39 +475,22 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { ccp.latestBlock = provider.LatestBlock{ Height: heightUint64, - Time: headerEvent.Header.Time, + Time: blockEvent.Block.Time, } - // latestHeader = provider.TendermintIBCHeader{ - // ValidatorSet: valSet, - // SignedHeader: &comettypes.SignedHeader{ - // Header: &headerEvent.Header, - // // TODO: how do we get Commit without querying light block? - // // Commit: , - // }, - // } + for _, tx := range blockEvent.ResultFinalizeBlock.TxResults { + if tx.Code != 0 { + // tx was not successful + continue + } + messages := chains.IbcMessagesFromEvents(ccp.log, tx.Events, chainID, heightUint64, ccp.chainProvider.cometLegacyEncoding) - ibcHeaderCache[heightUint64] = latestHeader - case event := <-txChan: - ccp.log.Debug("Received new tx event") - - txEvent := event.Data.(comettypes.EventDataTx) - - tx := txEvent.Result - if tx.Code != 0 { - // tx was not successful - continue + for _, m := range messages { + ccp.handleMessage(ctx, m, ibcMessagesCache) + } } - messages := chains.IbcMessagesFromEvents(ccp.log, tx.Events, chainID, uint64(txEvent.Height), ccp.chainProvider.cometLegacyEncoding) - for _, m := range messages { - ccp.handleMessage(ctx, m, ibcMessagesCache) - } - // case event := <-valSetChan: - // ccp.log.Debug("Received validator set change event") - // vsEvent := event.Data.(comettypes.EventDataValidatorSetUpdates) - // valSet.UpdateWithChangeSet(vsEvent.ValidatorUpdates) - // continue + ibcHeaderCache[heightUint64] = latestHeader } for _, pp := range ccp.pathProcessors { @@ -441,7 +508,7 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { LatestBlock: ccp.latestBlock, LatestHeader: latestHeader, IBCMessagesCache: ibcMessagesCache.Clone(), - InSync: ccp.inSync, + InSync: true, ClientState: clientState, ConnectionStateCache: ccp.connectionStateCache.FilterForClient(clientID), ChannelStateCache: ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients), @@ -532,6 +599,10 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu ccp.inSync = true firstTimeInSync = true ccp.log.Info("Chain is in sync") + // attempt to switchover to websocket + // TODO fixme: can be a few blocks in between when we switch over and when we start processing blocks + // mostly fine because we have the periodic flush, but could be improved. + return switchToSubscribeErr } else { ccp.log.Info("Chain is not yet in sync", zap.Int64("latest_queried_block", persistence.latestQueriedBlock), diff --git a/relayer/processor/path_end_runtime.go b/relayer/processor/path_end_runtime.go index 6c6e5cff8..0b3a7da65 100644 --- a/relayer/processor/path_end_runtime.go +++ b/relayer/processor/path_end_runtime.go @@ -378,22 +378,27 @@ func (pathEnd *pathEndRuntime) mergeCacheData(ctx context.Context, cancel func() if d.LatestHeader != nil { pathEnd.latestHeader = d.LatestHeader } - pathEnd.clientState = d.ClientState - terminate, err := pathEnd.checkForMisbehaviour(ctx, pathEnd.clientState, counterParty) - if err != nil { - pathEnd.log.Error( - "Failed to check for misbehaviour", - zap.String("client_id", pathEnd.info.ClientID), - zap.Error(err), - ) - } - - if d.ClientState.ConsensusHeight != pathEnd.clientState.ConsensusHeight { + var terminate bool + if d.ClientState.ClientID != "" { pathEnd.clientState = d.ClientState - ibcHeader, ok := counterParty.ibcHeaderCache[d.ClientState.ConsensusHeight.RevisionHeight] - if ok { - pathEnd.clientState.ConsensusTime = time.Unix(0, int64(ibcHeader.ConsensusState().GetTimestamp())) + + var err error + terminate, err = pathEnd.checkForMisbehaviour(ctx, pathEnd.clientState, counterParty) + if err != nil { + pathEnd.log.Error( + "Failed to check for misbehaviour", + zap.String("client_id", pathEnd.info.ClientID), + zap.Error(err), + ) + } + + if d.ClientState.ConsensusHeight != pathEnd.clientState.ConsensusHeight { + pathEnd.clientState = d.ClientState + ibcHeader, ok := counterParty.ibcHeaderCache[d.ClientState.ConsensusHeight.RevisionHeight] + if ok { + pathEnd.clientState.ConsensusTime = time.Unix(0, int64(ibcHeader.ConsensusState().GetTimestamp())) + } } } From de6e15966d053aec76c835b3b32d45e68cdbab28 Mon Sep 17 00:00:00 2001 From: Andrew Gouin Date: Mon, 20 Nov 2023 23:33:50 -0700 Subject: [PATCH 4/9] parallelize query --- .../chains/cosmos/cosmos_chain_processor.go | 138 +++++++++++------- relayer/processor/path_end_runtime.go | 16 +- 2 files changed, 96 insertions(+), 58 deletions(-) diff --git a/relayer/chains/cosmos/cosmos_chain_processor.go b/relayer/chains/cosmos/cosmos_chain_processor.go index 9ac8e934a..fe2a52a90 100644 --- a/relayer/chains/cosmos/cosmos_chain_processor.go +++ b/relayer/chains/cosmos/cosmos_chain_processor.go @@ -26,7 +26,7 @@ import ( ) // Used by the query cycle to attempt to switch to websocket connection once chains are in sync -var switchToSubscribeErr = errors.New("switching to subscribe") +var errSwitchToSubscribe = errors.New("switching to subscribe") type CosmosChainProcessor struct { log *zap.Logger @@ -282,7 +282,8 @@ func (ccp *CosmosChainProcessor) Run(ctx context.Context, initialBlockHistory ui for { if err := ccp.queryCycle(ctx, &persistence, stuckPacket); err != nil { - if errors.Is(err, switchToSubscribeErr) { + if errors.Is(err, errSwitchToSubscribe) { + ccp.log.Debug("Attempting to switch to websocket mode") if ccp.chainProvider.cometLegacyBlockResults { if err := ccp.subscribeLegacy(ctx); err != nil { ccp.log.Error("Error subscribing to legacy websocket", zap.Error(err)) @@ -330,6 +331,8 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { var latestHeader provider.IBCHeader var isBlockEvent bool + var eg errgroup.Group + select { case <-ctx.Done(): return nil @@ -339,22 +342,21 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { ccp.log.Debug("Received new legacy block event", zap.Int64("height", blockEvent.Block.Height)) - // TODO try to avoid this query by getting the SignedHeader via websocket. - // If we can't, add retry logic. - ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, blockEvent.Block.Height) - if err != nil { - ccp.log.Error("Error querying IBC header", - zap.Int64("height", blockEvent.Block.Height), - zap.Error(err), - ) - continue - } + heightUint64 := uint64(blockEvent.Block.Height) - latestHeader = ibcHeader.(provider.TendermintIBCHeader) + eg.Go(func() (err error) { + // TODO try to avoid this query by getting the SignedHeader via websocket. + // If we can't, add retry logic. + ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, blockEvent.Block.Height) + if err != nil { + return err + } - heightUint64 := uint64(blockEvent.Block.Height) + latestHeader = ibcHeader.(provider.TendermintIBCHeader) + ibcHeaderCache[heightUint64] = latestHeader - ibcHeaderCache[heightUint64] = latestHeader + return nil + }) beginBlockMsgs := ccp.ibcMessagesFromBlockEvents( chains.ConvertEvents(blockEvent.ResultBeginBlock.Events), @@ -378,10 +380,11 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { Height: heightUint64, Time: blockEvent.Block.Time, } - case event := <-txChan: txEvent := event.Data.(legacycomettypes.EventDataTx) + ccp.log.Debug("Received new legacy tx event", zap.Int64("height", txEvent.Height)) + tx := txEvent.TxResult.Result if tx.Code != 0 { // tx was not successful @@ -397,27 +400,40 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { for _, pp := range ccp.pathProcessors { clientID := pp.RelevantClientID(chainID) var clientState provider.ClientState + + newData := processor.ChainProcessorCacheData{ + IBCMessagesCache: ibcMessagesCache.Clone(), + InSync: true, + } + if isBlockEvent { + newData.LatestBlock = ccp.latestBlock + newData.ConnectionStateCache = ccp.connectionStateCache.FilterForClient(clientID) + newData.ChannelStateCache = ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients) + + if err := eg.Wait(); err != nil { + ccp.log.Warn( + "Error querying IBC header", + zap.Uint64("height", ccp.latestBlock.Height), + zap.Error(err), + ) + } else { + newData.LatestHeader = latestHeader + newData.IBCHeaderCache = ibcHeaderCache.Clone() + } + clientState, err = ccp.clientState(ctx, clientID) if err != nil { ccp.log.Error("Error fetching client state", zap.String("client_id", clientID), zap.Error(err), ) - continue + } else { + newData.ClientState = clientState } } - pp.HandleNewData(chainID, processor.ChainProcessorCacheData{ - LatestBlock: ccp.latestBlock, - LatestHeader: latestHeader, - IBCMessagesCache: ibcMessagesCache.Clone(), - InSync: true, - ClientState: clientState, - ConnectionStateCache: ccp.connectionStateCache.FilterForClient(clientID), - ChannelStateCache: ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients), - IBCHeaderCache: ibcHeaderCache.Clone(), - }) + pp.HandleNewData(chainID, newData) } } } @@ -439,7 +455,9 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { ibcMessagesCache := processor.NewIBCMessagesCache() ibcHeaderCache := make(processor.IBCHeaderCache) - var latestHeader provider.TendermintIBCHeader + var latestHeader provider.IBCHeader + + var eg errgroup.Group select { case <-ctx.Done(): @@ -449,20 +467,21 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { ccp.log.Debug("Received new block event", zap.Int64("height", blockEvent.Block.Height)) - // TODO try to avoid this query by getting the SignedHeader via websocket. - // If we can't, add retry logic. - ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, blockEvent.Block.Height) - if err != nil { - ccp.log.Error("Error querying IBC header", - zap.Int64("height", blockEvent.Block.Height), - zap.Error(err), - ) - continue - } + heightUint64 := uint64(blockEvent.Block.Height) - latestHeader = ibcHeader.(provider.TendermintIBCHeader) + eg.Go(func() (err error) { + // TODO try to avoid this query by getting the SignedHeader via websocket. + // If we can't, add retry logic. + ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, blockEvent.Block.Height) + if err != nil { + return err + } - heightUint64 := uint64(blockEvent.Block.Height) + latestHeader = ibcHeader.(provider.TendermintIBCHeader) + ibcHeaderCache[heightUint64] = latestHeader + + return nil + }) blockMsgs := ccp.ibcMessagesFromBlockEvents( blockEvent.ResultFinalizeBlock.Events, @@ -495,25 +514,38 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { for _, pp := range ccp.pathProcessors { clientID := pp.RelevantClientID(chainID) - clientState, err := ccp.clientState(ctx, clientID) + var clientState provider.ClientState + + newData := processor.ChainProcessorCacheData{ + LatestBlock: ccp.latestBlock, + IBCMessagesCache: ibcMessagesCache.Clone(), + InSync: true, + ConnectionStateCache: ccp.connectionStateCache.FilterForClient(clientID), + ChannelStateCache: ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients), + } + + if err := eg.Wait(); err != nil { + ccp.log.Warn( + "Error querying IBC header", + zap.Uint64("height", ccp.latestBlock.Height), + zap.Error(err), + ) + } else { + newData.LatestHeader = latestHeader + newData.IBCHeaderCache = ibcHeaderCache.Clone() + } + + clientState, err = ccp.clientState(ctx, clientID) if err != nil { ccp.log.Error("Error fetching client state", zap.String("client_id", clientID), zap.Error(err), ) - continue + } else { + newData.ClientState = clientState } - pp.HandleNewData(chainID, processor.ChainProcessorCacheData{ - LatestBlock: ccp.latestBlock, - LatestHeader: latestHeader, - IBCMessagesCache: ibcMessagesCache.Clone(), - InSync: true, - ClientState: clientState, - ConnectionStateCache: ccp.connectionStateCache.FilterForClient(clientID), - ChannelStateCache: ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients), - IBCHeaderCache: ibcHeaderCache.Clone(), - }) + pp.HandleNewData(chainID, newData) } } } @@ -602,7 +634,7 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu // attempt to switchover to websocket // TODO fixme: can be a few blocks in between when we switch over and when we start processing blocks // mostly fine because we have the periodic flush, but could be improved. - return switchToSubscribeErr + return errSwitchToSubscribe } else { ccp.log.Info("Chain is not yet in sync", zap.Int64("latest_queried_block", persistence.latestQueriedBlock), diff --git a/relayer/processor/path_end_runtime.go b/relayer/processor/path_end_runtime.go index 0b3a7da65..aa3853c17 100644 --- a/relayer/processor/path_end_runtime.go +++ b/relayer/processor/path_end_runtime.go @@ -370,9 +370,11 @@ func (pathEnd *pathEndRuntime) checkForMisbehaviour( } func (pathEnd *pathEndRuntime) mergeCacheData(ctx context.Context, cancel func(), d ChainProcessorCacheData, counterpartyChainID string, counterpartyInSync bool, messageLifecycle MessageLifecycle, counterParty *pathEndRuntime) { - pathEnd.lastClientUpdateHeightMu.Lock() - pathEnd.latestBlock = d.LatestBlock - pathEnd.lastClientUpdateHeightMu.Unlock() + if d.LatestBlock.Height != 0 { + pathEnd.lastClientUpdateHeightMu.Lock() + pathEnd.latestBlock = d.LatestBlock + pathEnd.lastClientUpdateHeightMu.Unlock() + } pathEnd.inSync = d.InSync if d.LatestHeader != nil { @@ -409,8 +411,12 @@ func (pathEnd *pathEndRuntime) mergeCacheData(ctx context.Context, cancel func() return } - pathEnd.connectionStateCache = d.ConnectionStateCache // Update latest connection open state for chain - pathEnd.channelStateCache = d.ChannelStateCache // Update latest channel open state for chain + if d.ConnectionStateCache != nil { + pathEnd.connectionStateCache = d.ConnectionStateCache // Update latest connection open state for chain + } + if d.ChannelStateCache != nil { + pathEnd.channelStateCache = d.ChannelStateCache // Update latest channel open state for chain + } pathEnd.mergeMessageCache(d.IBCMessagesCache, counterpartyChainID, pathEnd.inSync && counterpartyInSync) // Merge incoming packet IBC messages into the backlog From a898ddac989b70897389194ab7651aa1118f9159 Mon Sep 17 00:00:00 2001 From: Andrew Gouin Date: Tue, 21 Nov 2023 00:07:13 -0700 Subject: [PATCH 5/9] fix --- .../chains/cosmos/cosmos_chain_processor.go | 49 ++++++++++++------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/relayer/chains/cosmos/cosmos_chain_processor.go b/relayer/chains/cosmos/cosmos_chain_processor.go index fe2a52a90..dabdb6d8e 100644 --- a/relayer/chains/cosmos/cosmos_chain_processor.go +++ b/relayer/chains/cosmos/cosmos_chain_processor.go @@ -397,6 +397,15 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { } } + headerErr := eg.Wait() + if headerErr != nil { + ccp.log.Warn( + "Error querying IBC header", + zap.Uint64("height", ccp.latestBlock.Height), + zap.Error(err), + ) + } + for _, pp := range ccp.pathProcessors { clientID := pp.RelevantClientID(chainID) var clientState provider.ClientState @@ -411,13 +420,7 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { newData.ConnectionStateCache = ccp.connectionStateCache.FilterForClient(clientID) newData.ChannelStateCache = ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients) - if err := eg.Wait(); err != nil { - ccp.log.Warn( - "Error querying IBC header", - zap.Uint64("height", ccp.latestBlock.Height), - zap.Error(err), - ) - } else { + if headerErr == nil { newData.LatestHeader = latestHeader newData.IBCHeaderCache = ibcHeaderCache.Clone() } @@ -512,6 +515,15 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { ibcHeaderCache[heightUint64] = latestHeader } + headerErr := eg.Wait() + if headerErr != nil { + ccp.log.Warn( + "Error querying IBC header", + zap.Uint64("height", ccp.latestBlock.Height), + zap.Error(err), + ) + } + for _, pp := range ccp.pathProcessors { clientID := pp.RelevantClientID(chainID) var clientState provider.ClientState @@ -524,13 +536,7 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { ChannelStateCache: ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients), } - if err := eg.Wait(); err != nil { - ccp.log.Warn( - "Error querying IBC header", - zap.Uint64("height", ccp.latestBlock.Height), - zap.Error(err), - ) - } else { + if headerErr == nil { newData.LatestHeader = latestHeader newData.IBCHeaderCache = ibcHeaderCache.Clone() } @@ -631,10 +637,6 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu ccp.inSync = true firstTimeInSync = true ccp.log.Info("Chain is in sync") - // attempt to switchover to websocket - // TODO fixme: can be a few blocks in between when we switch over and when we start processing blocks - // mostly fine because we have the periodic flush, but could be improved. - return errSwitchToSubscribe } else { ccp.log.Info("Chain is not yet in sync", zap.Int64("latest_queried_block", persistence.latestQueriedBlock), @@ -762,6 +764,10 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu for _, pp := range ccp.pathProcessors { pp.ProcessBacklogIfReady() } + // attempt to switchover to websocket + // TODO fixme: can be a few blocks in between when we switch over and when we start processing blocks + // mostly fine because we have the periodic flush, but could be improved. + return errSwitchToSubscribe } return nil @@ -792,6 +798,13 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu persistence.latestQueriedBlock = newLatestQueriedBlock + if firstTimeInSync { + // attempt to switchover to websocket + // TODO fixme: can be a few blocks in between when we switch over and when we start processing blocks + // mostly fine because we have the periodic flush, but could be improved. + return errSwitchToSubscribe + } + return nil } From cc4d9ae281ba4d7b1f7c184449dc1bfd3d40ac41 Mon Sep 17 00:00:00 2001 From: Andrew Gouin Date: Tue, 21 Nov 2023 09:59:12 -0700 Subject: [PATCH 6/9] allow websocket and poller to run in parallel --- .../chains/cosmos/cosmos_chain_processor.go | 167 +++++++++++------- relayer/chains/cosmos/message_handlers.go | 2 + relayer/chains/cosmos/provider.go | 25 ++- 3 files changed, 130 insertions(+), 64 deletions(-) diff --git a/relayer/chains/cosmos/cosmos_chain_processor.go b/relayer/chains/cosmos/cosmos_chain_processor.go index dabdb6d8e..08d40614f 100644 --- a/relayer/chains/cosmos/cosmos_chain_processor.go +++ b/relayer/chains/cosmos/cosmos_chain_processor.go @@ -6,6 +6,8 @@ import ( "fmt" "math" "math/big" + "sync" + "sync/atomic" "time" "github.com/avast/retry-go/v4" @@ -36,13 +38,14 @@ type CosmosChainProcessor struct { pathProcessors processor.PathProcessors // indicates whether queries are in sync with latest height of the chain - inSync bool + inSync atomic.Bool // highest block - latestBlock provider.LatestBlock + latestBlock provider.LatestBlock + latestBlockMu sync.Mutex // holds highest consensus height and header for all clients - latestClientState + latestClientState *latestClientState // holds open state for known connections connectionStateCache processor.ConnectionStateCache @@ -61,22 +64,33 @@ type CosmosChainProcessor struct { // parsed gas prices accepted by the chain (only used for metrics) parsedGasPrices *sdk.DecCoins + + // used to signal that the subscriber should start + subscriberStart chan struct{} + subscriberStopped chan struct{} + + // Used to prevent concurrent processing of messages + messageMu sync.Mutex } func NewCosmosChainProcessor( log *zap.Logger, - provider *CosmosProvider, + prov *CosmosProvider, metrics *processor.PrometheusMetrics, ) *CosmosChainProcessor { return &CosmosChainProcessor{ - log: log.With(zap.String("chain_name", provider.ChainName()), zap.String("chain_id", provider.ChainId())), - chainProvider: provider, - latestClientState: make(latestClientState), + log: log.With(zap.String("chain_name", prov.ChainName()), zap.String("chain_id", prov.ChainId())), + chainProvider: prov, + latestClientState: &latestClientState{ + s: make(map[string]provider.ClientState), + }, connectionStateCache: make(processor.ConnectionStateCache), channelStateCache: make(processor.ChannelStateCache), connectionClients: make(map[string]string), channelConnections: make(map[string]string), metrics: metrics, + subscriberStart: make(chan struct{}, 1), + subscriberStopped: make(chan struct{}, 1), } } @@ -94,10 +108,15 @@ const ( ) // latestClientState is a map of clientID to the latest clientInfo for that client. -type latestClientState map[string]provider.ClientState +type latestClientState struct { + s map[string]provider.ClientState + mu sync.RWMutex +} -func (l latestClientState) update(ctx context.Context, clientInfo chains.ClientInfo, ccp *CosmosChainProcessor) { - existingClientInfo, ok := l[clientInfo.ClientID] +func (l *latestClientState) update(ctx context.Context, clientInfo chains.ClientInfo, ccp *CosmosChainProcessor) { + l.mu.RLock() + existingClientInfo, ok := l.s[clientInfo.ClientID] + l.mu.RUnlock() var trustingPeriod time.Duration if ok { if clientInfo.ConsensusHeight.LT(existingClientInfo.ConsensusHeight) { @@ -121,7 +140,9 @@ func (l latestClientState) update(ctx context.Context, clientInfo chains.ClientI clientState := clientInfo.ClientState(trustingPeriod) // update latest if no existing state or provided consensus height is newer - l[clientInfo.ClientID] = clientState + l.mu.Lock() + defer l.mu.Unlock() + l.s[clientInfo.ClientID] = clientState } // Provider returns the ChainProvider, which provides the methods for querying, assembling IBC messages, and sending transactions. @@ -135,25 +156,6 @@ func (ccp *CosmosChainProcessor) SetPathProcessors(pathProcessors processor.Path ccp.pathProcessors = pathProcessors } -// latestHeightWithRetry will query for the latest height, retrying in case of failure. -// It will delay by latestHeightQueryRetryDelay between attempts, up to latestHeightQueryRetries. -func (ccp *CosmosChainProcessor) latestHeightWithRetry(ctx context.Context) (latestHeight int64, err error) { - return latestHeight, retry.Do(func() error { - latestHeightQueryCtx, cancelLatestHeightQueryCtx := context.WithTimeout(ctx, queryTimeout) - defer cancelLatestHeightQueryCtx() - var err error - latestHeight, err = ccp.chainProvider.QueryLatestHeight(latestHeightQueryCtx) - return err - }, retry.Context(ctx), retry.Attempts(latestHeightQueryRetries), retry.Delay(latestHeightQueryRetryDelay), retry.LastErrorOnly(true), retry.OnRetry(func(n uint, err error) { - ccp.log.Error( - "Failed to query latest height", - zap.Uint("attempt", n+1), - zap.Uint("max_attempts", latestHeightQueryRetries), - zap.Error(err), - ) - })) -} - // nodeStatusWithRetry will query for the latest node status, retrying in case of failure. // It will delay by latestHeightQueryRetryDelay between attempts, up to latestHeightQueryRetries. func (ccp *CosmosChainProcessor) nodeStatusWithRetry(ctx context.Context) (status *ctypes.ResultStatus, err error) { @@ -176,13 +178,20 @@ func (ccp *CosmosChainProcessor) nodeStatusWithRetry(ctx context.Context) (statu // clientState will return the most recent client state if client messages // have already been observed for the clientID, otherwise it will query for it. func (ccp *CosmosChainProcessor) clientState(ctx context.Context, clientID string) (provider.ClientState, error) { - if state, ok := ccp.latestClientState[clientID]; ok && state.TrustingPeriod > 0 { + ccp.latestClientState.mu.RLock() + state, ok := ccp.latestClientState.s[clientID] + ccp.latestClientState.mu.RUnlock() + if ok && state.TrustingPeriod > 0 { return state, nil } + ccp.latestBlockMu.Lock() + latestBlock := ccp.latestBlock + ccp.latestBlockMu.Unlock() + var clientState provider.ClientState if clientID == ibcexported.LocalhostClientID { - cs, err := ccp.chainProvider.queryLocalhostClientState(ctx, int64(ccp.latestBlock.Height)) + cs, err := ccp.chainProvider.queryLocalhostClientState(ctx, int64(latestBlock.Height)) if err != nil { return provider.ClientState{}, err } @@ -191,7 +200,7 @@ func (ccp *CosmosChainProcessor) clientState(ctx context.Context, clientID strin ConsensusHeight: cs.GetLatestHeight().(clienttypes.Height), } } else { - cs, err := ccp.chainProvider.queryTMClientState(ctx, int64(ccp.latestBlock.Height), clientID) + cs, err := ccp.chainProvider.queryTMClientState(ctx, int64(latestBlock.Height), clientID) if err != nil { return provider.ClientState{}, err } @@ -202,7 +211,9 @@ func (ccp *CosmosChainProcessor) clientState(ctx context.Context, clientID strin } } - ccp.latestClientState[clientID] = clientState + ccp.latestClientState.mu.Lock() + defer ccp.latestClientState.mu.Unlock() + ccp.latestClientState.s[clientID] = clientState return clientState, nil } @@ -280,19 +291,12 @@ func (ccp *CosmosChainProcessor) Run(ctx context.Context, initialBlockHistory ui ticker := time.NewTicker(persistence.minQueryLoopDuration) defer ticker.Stop() + go ccp.waitForSubscribeStart(ctx) + for { if err := ccp.queryCycle(ctx, &persistence, stuckPacket); err != nil { if errors.Is(err, errSwitchToSubscribe) { - ccp.log.Debug("Attempting to switch to websocket mode") - if ccp.chainProvider.cometLegacyBlockResults { - if err := ccp.subscribeLegacy(ctx); err != nil { - ccp.log.Error("Error subscribing to legacy websocket", zap.Error(err)) - } - } else { - if err := ccp.subscribe(ctx); err != nil { - ccp.log.Error("Error subscribing to websocket", zap.Error(err)) - } - } + <-ccp.subscriberStopped continue } return err @@ -306,6 +310,26 @@ func (ccp *CosmosChainProcessor) Run(ctx context.Context, initialBlockHistory ui } } +func (ccp *CosmosChainProcessor) waitForSubscribeStart(ctx context.Context) { + select { + case <-ctx.Done(): + return + case <-ccp.subscriberStart: + ccp.log.Debug("Attempting to switch to websocket mode") + if ccp.chainProvider.legacyBlockResultsEnabled() { + if err := ccp.subscribeLegacy(ctx); err != nil { + ccp.subscriberStopped <- struct{}{} + ccp.log.Error("Error subscribing to legacy websocket", zap.Error(err)) + } + } else { + if err := ccp.subscribe(ctx); err != nil { + ccp.subscriberStopped <- struct{}{} + ccp.log.Error("Error subscribing to websocket", zap.Error(err)) + } + } + } +} + func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { if err := ccp.chainProvider.LegacyRPCClient.Start(); err != nil { return fmt.Errorf("failed to start client service: %w", err) @@ -329,6 +353,7 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { ibcHeaderCache := make(processor.IBCHeaderCache) var latestHeader provider.IBCHeader + var latestBlock provider.LatestBlock var isBlockEvent bool var eg errgroup.Group @@ -358,10 +383,12 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { return nil }) + legacyEncodedEvents := ccp.chainProvider.legacyEncodedEventsEnabled() + beginBlockMsgs := ccp.ibcMessagesFromBlockEvents( chains.ConvertEvents(blockEvent.ResultBeginBlock.Events), heightUint64, - ccp.chainProvider.cometLegacyEncoding, + legacyEncodedEvents, ) for _, m := range beginBlockMsgs { ccp.handleMessage(ctx, m, ibcMessagesCache) @@ -370,16 +397,20 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { endBlockMsgs := ccp.ibcMessagesFromBlockEvents( chains.ConvertEvents(blockEvent.ResultEndBlock.Events), heightUint64, - ccp.chainProvider.cometLegacyEncoding, + legacyEncodedEvents, ) for _, m := range endBlockMsgs { ccp.handleMessage(ctx, m, ibcMessagesCache) } - ccp.latestBlock = provider.LatestBlock{ + latestBlock = provider.LatestBlock{ Height: heightUint64, Time: blockEvent.Block.Time, } + + ccp.latestBlockMu.Lock() + ccp.latestBlock = latestBlock + ccp.latestBlockMu.Unlock() case event := <-txChan: txEvent := event.Data.(legacycomettypes.EventDataTx) @@ -390,7 +421,7 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { // tx was not successful continue } - messages := chains.IbcMessagesFromEvents(ccp.log, chains.ConvertEvents(tx.Events), chainID, uint64(txEvent.Height), ccp.chainProvider.cometLegacyEncoding) + messages := chains.IbcMessagesFromEvents(ccp.log, chains.ConvertEvents(tx.Events), chainID, uint64(txEvent.Height), ccp.chainProvider.legacyEncodedEventsEnabled()) for _, m := range messages { ccp.handleMessage(ctx, m, ibcMessagesCache) @@ -401,7 +432,7 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { if headerErr != nil { ccp.log.Warn( "Error querying IBC header", - zap.Uint64("height", ccp.latestBlock.Height), + zap.Uint64("height", latestBlock.Height), zap.Error(err), ) } @@ -416,7 +447,7 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { } if isBlockEvent { - newData.LatestBlock = ccp.latestBlock + newData.LatestBlock = latestBlock newData.ConnectionStateCache = ccp.connectionStateCache.FilterForClient(clientID) newData.ChannelStateCache = ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients) @@ -459,6 +490,7 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { ibcHeaderCache := make(processor.IBCHeaderCache) var latestHeader provider.IBCHeader + var latestBlock provider.LatestBlock var eg errgroup.Group @@ -486,26 +518,32 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { return nil }) + legacyEncodedEvents := ccp.chainProvider.legacyEncodedEventsEnabled() + blockMsgs := ccp.ibcMessagesFromBlockEvents( blockEvent.ResultFinalizeBlock.Events, heightUint64, - ccp.chainProvider.cometLegacyEncoding, + legacyEncodedEvents, ) for _, m := range blockMsgs { ccp.handleMessage(ctx, m, ibcMessagesCache) } - ccp.latestBlock = provider.LatestBlock{ + latestBlock = provider.LatestBlock{ Height: heightUint64, Time: blockEvent.Block.Time, } + ccp.latestBlockMu.Lock() + ccp.latestBlock = latestBlock + ccp.latestBlockMu.Unlock() + for _, tx := range blockEvent.ResultFinalizeBlock.TxResults { if tx.Code != 0 { // tx was not successful continue } - messages := chains.IbcMessagesFromEvents(ccp.log, tx.Events, chainID, heightUint64, ccp.chainProvider.cometLegacyEncoding) + messages := chains.IbcMessagesFromEvents(ccp.log, tx.Events, chainID, heightUint64, legacyEncodedEvents) for _, m := range messages { ccp.handleMessage(ctx, m, ibcMessagesCache) @@ -519,7 +557,7 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { if headerErr != nil { ccp.log.Warn( "Error querying IBC header", - zap.Uint64("height", ccp.latestBlock.Height), + zap.Uint64("height", latestBlock.Height), zap.Error(err), ) } @@ -529,7 +567,7 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { var clientState provider.ClientState newData := processor.ChainProcessorCacheData{ - LatestBlock: ccp.latestBlock, + LatestBlock: latestBlock, IBCMessagesCache: ibcMessagesCache.Clone(), InSync: true, ConnectionStateCache: ccp.connectionStateCache.FilterForClient(clientID), @@ -632,10 +670,11 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu // used at the end of the cycle to send signal to path processors to start processing if both chains are in sync and no new messages came in this cycle firstTimeInSync := false - if !ccp.inSync { + if !ccp.inSync.Load() { if (persistence.latestHeight - persistence.latestQueriedBlock) < inSyncNumBlocksThreshold { - ccp.inSync = true + ccp.inSync.Store(true) firstTimeInSync = true + ccp.subscriberStart <- struct{}{} ccp.log.Info("Chain is in sync") } else { ccp.log.Info("Chain is not yet in sync", @@ -655,6 +694,8 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu newLatestQueriedBlock := persistence.latestQueriedBlock + var latestBlock provider.LatestBlock + chainID := ccp.chainProvider.ChainId() for i := persistence.latestQueriedBlock + 1; i <= persistence.latestHeight; i++ { @@ -714,15 +755,19 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu heightUint64 := uint64(i) - ccp.latestBlock = provider.LatestBlock{ + latestBlock = provider.LatestBlock{ Height: heightUint64, Time: latestHeader.SignedHeader.Time, } + ccp.latestBlockMu.Lock() + ccp.latestBlock = latestBlock + ccp.latestBlockMu.Unlock() + ibcHeaderCache[heightUint64] = latestHeader ppChanged = true - base64Encoded := ccp.chainProvider.cometLegacyEncoding + base64Encoded := ccp.chainProvider.legacyEncodedEventsEnabled() blockMsgs := ccp.ibcMessagesFromBlockEvents( blockRes.Events, @@ -785,10 +830,10 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu } pp.HandleNewData(chainID, processor.ChainProcessorCacheData{ - LatestBlock: ccp.latestBlock, + LatestBlock: latestBlock, LatestHeader: latestHeader, IBCMessagesCache: ibcMessagesCache.Clone(), - InSync: ccp.inSync, + InSync: ccp.inSync.Load(), ClientState: clientState, ConnectionStateCache: ccp.connectionStateCache.FilterForClient(clientID), ChannelStateCache: ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients), diff --git a/relayer/chains/cosmos/message_handlers.go b/relayer/chains/cosmos/message_handlers.go index 6f7310c5c..69572b4a8 100644 --- a/relayer/chains/cosmos/message_handlers.go +++ b/relayer/chains/cosmos/message_handlers.go @@ -14,6 +14,8 @@ import ( ) func (ccp *CosmosChainProcessor) handleMessage(ctx context.Context, m chains.IbcMessage, c processor.IBCMessagesCache) { + ccp.messageMu.Lock() + defer ccp.messageMu.Unlock() switch t := m.Info.(type) { case *chains.PacketInfo: ccp.handlePacketMessage(m.EventType, provider.PacketInfo(*t), c) diff --git a/relayer/chains/cosmos/provider.go b/relayer/chains/cosmos/provider.go index f7c82b9dd..852613ed1 100644 --- a/relayer/chains/cosmos/provider.go +++ b/relayer/chains/cosmos/provider.go @@ -155,10 +155,12 @@ type CosmosProvider struct { metrics *processor.PrometheusMetrics // for comet < v0.37, decode tm events as base64 - cometLegacyEncoding bool + cometLegacyEncoding bool + cometLegacyEncodingMu sync.Mutex // for comet < v0.38, use legacy RPC client for ResultsBlockResults - cometLegacyBlockResults bool + cometLegacyBlockResults bool + cometLegacyBlockResultsMu sync.Mutex } type WalletState struct { @@ -374,8 +376,13 @@ func (cc *CosmosProvider) updateNextAccountSequence(sequenceGuard *WalletState, } func (cc *CosmosProvider) setCometVersion(log *zap.Logger, version string) { + cc.cometLegacyEncodingMu.Lock() cc.cometLegacyEncoding = cc.legacyEncodedEvents(log, version) + cc.cometLegacyEncodingMu.Unlock() + + cc.cometLegacyBlockResultsMu.Lock() cc.cometLegacyBlockResults = cc.legacyBlockResults(version) + cc.cometLegacyBlockResultsMu.Unlock() } func (cc *CosmosProvider) legacyEncodedEvents(log *zap.Logger, version string) bool { @@ -386,6 +393,18 @@ func (cc *CosmosProvider) legacyBlockResults(version string) bool { return semver.Compare("v"+version, cometBlockResultsThreshold) < 0 } +func (cc *CosmosProvider) legacyEncodedEventsEnabled() bool { + cc.cometLegacyEncodingMu.Lock() + defer cc.cometLegacyEncodingMu.Unlock() + return cc.cometLegacyEncoding +} + +func (cc *CosmosProvider) legacyBlockResultsEnabled() bool { + cc.cometLegacyBlockResultsMu.Lock() + defer cc.cometLegacyBlockResultsMu.Unlock() + return cc.cometLegacyBlockResults +} + // keysDir returns a string representing the path on the local filesystem where the keystore will be initialized. func keysDir(home, chainID string) string { return path.Join(home, "keys", chainID) @@ -425,7 +444,7 @@ func (cc *CosmosProvider) BlockResults(ctx context.Context, height *int64) (*cha var results *chains.Results switch { - case cc.cometLegacyBlockResults: + case cc.legacyBlockResultsEnabled(): legacyRes, err := cc.LegacyRPCClient.BlockResults(ctx, height) if err != nil { return nil, err From 93fc953b22bf61e613ef0a615575a759641e24a7 Mon Sep 17 00:00:00 2001 From: Andrew Gouin Date: Tue, 21 Nov 2023 11:16:53 -0700 Subject: [PATCH 7/9] retry for block headers --- .../chains/cosmos/cosmos_chain_processor.go | 94 +++++++++---------- 1 file changed, 44 insertions(+), 50 deletions(-) diff --git a/relayer/chains/cosmos/cosmos_chain_processor.go b/relayer/chains/cosmos/cosmos_chain_processor.go index 08d40614f..1d602ed61 100644 --- a/relayer/chains/cosmos/cosmos_chain_processor.go +++ b/relayer/chains/cosmos/cosmos_chain_processor.go @@ -42,7 +42,7 @@ type CosmosChainProcessor struct { // highest block latestBlock provider.LatestBlock - latestBlockMu sync.Mutex + latestBlockMu sync.RWMutex // holds highest consensus height and header for all clients latestClientState *latestClientState @@ -89,8 +89,8 @@ func NewCosmosChainProcessor( connectionClients: make(map[string]string), channelConnections: make(map[string]string), metrics: metrics, - subscriberStart: make(chan struct{}, 1), - subscriberStopped: make(chan struct{}, 1), + subscriberStart: make(chan struct{}), + subscriberStopped: make(chan struct{}), } } @@ -185,9 +185,9 @@ func (ccp *CosmosChainProcessor) clientState(ctx context.Context, clientID strin return state, nil } - ccp.latestBlockMu.Lock() + ccp.latestBlockMu.RLock() latestBlock := ccp.latestBlock - ccp.latestBlockMu.Unlock() + ccp.latestBlockMu.RUnlock() var clientState provider.ClientState if clientID == ibcexported.LocalhostClientID { @@ -296,8 +296,12 @@ func (ccp *CosmosChainProcessor) Run(ctx context.Context, initialBlockHistory ui for { if err := ccp.queryCycle(ctx, &persistence, stuckPacket); err != nil { if errors.Is(err, errSwitchToSubscribe) { - <-ccp.subscriberStopped - continue + select { + case <-ctx.Done(): + return nil + case <-ccp.subscriberStopped: + continue + } } return err } @@ -331,15 +335,16 @@ func (ccp *CosmosChainProcessor) waitForSubscribeStart(ctx context.Context) { } func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { + subscriber := "cosmos-chain-processor" if err := ccp.chainProvider.LegacyRPCClient.Start(); err != nil { return fmt.Errorf("failed to start client service: %w", err) } - blockChan, err := ccp.chainProvider.LegacyRPCClient.Subscribe(ctx, "block", legacycomettypes.QueryForEvent(legacycomettypes.EventNewBlock).String()) + blockChan, err := ccp.chainProvider.LegacyRPCClient.Subscribe(ctx, subscriber, legacycomettypes.QueryForEvent(legacycomettypes.EventNewBlock).String()) if err != nil { return fmt.Errorf("failed to subscribe to legacy blocks over websocket: %w", err) } - txChan, err := ccp.chainProvider.LegacyRPCClient.Subscribe(ctx, "tx", legacycomettypes.QueryForEvent(legacycomettypes.EventTx).String()) + txChan, err := ccp.chainProvider.LegacyRPCClient.Subscribe(ctx, subscriber, legacycomettypes.QueryForEvent(legacycomettypes.EventTx).String()) if err != nil { return fmt.Errorf("failed to subscribe to legacy tx over websocket: %w", err) } @@ -356,11 +361,12 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { var latestBlock provider.LatestBlock var isBlockEvent bool - var eg errgroup.Group - select { case <-ctx.Done(): - return nil + if err := ccp.chainProvider.LegacyRPCClient.UnsubscribeAll(context.TODO(), subscriber); err != nil { + ccp.log.Error("Error unsubscribing from legacy websocket", zap.Error(err)) + } + return ccp.chainProvider.LegacyRPCClient.Stop() case event := <-blockChan: isBlockEvent = true blockEvent := event.Data.(legacycomettypes.EventDataNewBlock) @@ -369,9 +375,8 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { heightUint64 := uint64(blockEvent.Block.Height) - eg.Go(func() (err error) { + if err := retry.Do(func() error { // TODO try to avoid this query by getting the SignedHeader via websocket. - // If we can't, add retry logic. ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, blockEvent.Block.Height) if err != nil { return err @@ -381,7 +386,13 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { ibcHeaderCache[heightUint64] = latestHeader return nil - }) + }, retry.Attempts(20), retry.DelayType(retry.FixedDelay), retry.Delay(10*time.Millisecond), retry.LastErrorOnly(true)); err != nil { + ccp.log.Warn("Error querying IBC header after max retries", + zap.Uint64("height", heightUint64), + zap.Error(err), + ) + continue + } legacyEncodedEvents := ccp.chainProvider.legacyEncodedEventsEnabled() @@ -428,15 +439,6 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { } } - headerErr := eg.Wait() - if headerErr != nil { - ccp.log.Warn( - "Error querying IBC header", - zap.Uint64("height", latestBlock.Height), - zap.Error(err), - ) - } - for _, pp := range ccp.pathProcessors { clientID := pp.RelevantClientID(chainID) var clientState provider.ClientState @@ -450,11 +452,8 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { newData.LatestBlock = latestBlock newData.ConnectionStateCache = ccp.connectionStateCache.FilterForClient(clientID) newData.ChannelStateCache = ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients) - - if headerErr == nil { - newData.LatestHeader = latestHeader - newData.IBCHeaderCache = ibcHeaderCache.Clone() - } + newData.LatestHeader = latestHeader + newData.IBCHeaderCache = ibcHeaderCache.Clone() clientState, err = ccp.clientState(ctx, clientID) if err != nil { @@ -473,10 +472,11 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { } func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { + subscriber := "cosmos-chain-processor" if err := ccp.chainProvider.RPCClient.Start(); err != nil { return fmt.Errorf("failed to start client service: %w", err) } - blockChan, err := ccp.chainProvider.RPCClient.Subscribe(ctx, "block", comettypes.QueryForEvent(comettypes.EventNewBlock).String()) + blockChan, err := ccp.chainProvider.RPCClient.Subscribe(ctx, subscriber, comettypes.QueryForEvent(comettypes.EventNewBlock).String()) if err != nil { return fmt.Errorf("failed to subscribe to blocks over websocket: %w", err) } @@ -492,11 +492,12 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { var latestHeader provider.IBCHeader var latestBlock provider.LatestBlock - var eg errgroup.Group - select { case <-ctx.Done(): - return nil + if err := ccp.chainProvider.RPCClient.UnsubscribeAll(context.TODO(), subscriber); err != nil { + ccp.log.Error("Error unsubscribing from websocket", zap.Error(err)) + } + return ccp.chainProvider.RPCClient.Stop() case event := <-blockChan: blockEvent := event.Data.(comettypes.EventDataNewBlock) @@ -504,9 +505,8 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { heightUint64 := uint64(blockEvent.Block.Height) - eg.Go(func() (err error) { + if err := retry.Do(func() error { // TODO try to avoid this query by getting the SignedHeader via websocket. - // If we can't, add retry logic. ibcHeader, err := ccp.chainProvider.QueryIBCHeader(ctx, blockEvent.Block.Height) if err != nil { return err @@ -516,7 +516,13 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { ibcHeaderCache[heightUint64] = latestHeader return nil - }) + }, retry.Attempts(20), retry.DelayType(retry.FixedDelay), retry.Delay(10*time.Millisecond), retry.LastErrorOnly(true)); err != nil { + ccp.log.Warn("Error querying IBC header after max retries", + zap.Uint64("height", heightUint64), + zap.Error(err), + ) + continue + } legacyEncodedEvents := ccp.chainProvider.legacyEncodedEventsEnabled() @@ -553,32 +559,20 @@ func (ccp *CosmosChainProcessor) subscribe(ctx context.Context) error { ibcHeaderCache[heightUint64] = latestHeader } - headerErr := eg.Wait() - if headerErr != nil { - ccp.log.Warn( - "Error querying IBC header", - zap.Uint64("height", latestBlock.Height), - zap.Error(err), - ) - } - for _, pp := range ccp.pathProcessors { clientID := pp.RelevantClientID(chainID) var clientState provider.ClientState newData := processor.ChainProcessorCacheData{ LatestBlock: latestBlock, + LatestHeader: latestHeader, + IBCHeaderCache: ibcHeaderCache.Clone(), IBCMessagesCache: ibcMessagesCache.Clone(), InSync: true, ConnectionStateCache: ccp.connectionStateCache.FilterForClient(clientID), ChannelStateCache: ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients), } - if headerErr == nil { - newData.LatestHeader = latestHeader - newData.IBCHeaderCache = ibcHeaderCache.Clone() - } - clientState, err = ccp.clientState(ctx, clientID) if err != nil { ccp.log.Error("Error fetching client state", From 3e5cebcdf9f75e53217b7a46964f1ae024e21237 Mon Sep 17 00:00:00 2001 From: Andrew Gouin Date: Tue, 21 Nov 2023 14:32:21 -0700 Subject: [PATCH 8/9] switch to websocket missed case --- relayer/chains/cosmos/cosmos_chain_processor.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/relayer/chains/cosmos/cosmos_chain_processor.go b/relayer/chains/cosmos/cosmos_chain_processor.go index 1d602ed61..0eee30dbd 100644 --- a/relayer/chains/cosmos/cosmos_chain_processor.go +++ b/relayer/chains/cosmos/cosmos_chain_processor.go @@ -795,6 +795,12 @@ func (ccp *CosmosChainProcessor) queryCycle(ctx context.Context, persistence *qu } if newLatestQueriedBlock == persistence.latestQueriedBlock { + if firstTimeInSync { + // attempt to switchover to websocket + // TODO fixme: can be a few blocks in between when we switch over and when we start processing blocks + // mostly fine because we have the periodic flush, but could be improved. + return errSwitchToSubscribe + } return nil } From 9766d0a8147775c1364382fa185ecffdf0925b30 Mon Sep 17 00:00:00 2001 From: Andrew Gouin Date: Tue, 21 Nov 2023 17:25:27 -0700 Subject: [PATCH 9/9] fixes --- relayer/chains/cosmos/cosmos_chain_processor.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/relayer/chains/cosmos/cosmos_chain_processor.go b/relayer/chains/cosmos/cosmos_chain_processor.go index 0eee30dbd..2793618c0 100644 --- a/relayer/chains/cosmos/cosmos_chain_processor.go +++ b/relayer/chains/cosmos/cosmos_chain_processor.go @@ -444,14 +444,15 @@ func (ccp *CosmosChainProcessor) subscribeLegacy(ctx context.Context) error { var clientState provider.ClientState newData := processor.ChainProcessorCacheData{ - IBCMessagesCache: ibcMessagesCache.Clone(), - InSync: true, + IBCMessagesCache: ibcMessagesCache.Clone(), + ConnectionStateCache: ccp.connectionStateCache.FilterForClient(clientID), + ChannelStateCache: ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients), + + InSync: true, } if isBlockEvent { newData.LatestBlock = latestBlock - newData.ConnectionStateCache = ccp.connectionStateCache.FilterForClient(clientID) - newData.ChannelStateCache = ccp.channelStateCache.FilterForClient(clientID, ccp.channelConnections, ccp.connectionClients) newData.LatestHeader = latestHeader newData.IBCHeaderCache = ibcHeaderCache.Clone()