From d7396829f42d5bafbaf3e780e95faa55f36ff3db Mon Sep 17 00:00:00 2001 From: George Date: Tue, 13 Aug 2024 12:58:40 +0300 Subject: [PATCH 01/29] fix: small grammar fix --- wasmbinding/bindings/query.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wasmbinding/bindings/query.go b/wasmbinding/bindings/query.go index 88615da60..d4b970d54 100644 --- a/wasmbinding/bindings/query.go +++ b/wasmbinding/bindings/query.go @@ -107,7 +107,7 @@ type RegisteredQuery struct { ID uint64 `json:"id"` // The address that registered the query. Owner string `json:"owner"` - // The KV-storage keys for which we want to get values from remote chain + // The KV-storage keys for which we want to get values from the remote chain Keys []*types.KVKey `json:"keys"` // The filter for transaction search ICQ TransactionsFilter string `json:"transactions_filter"` @@ -115,15 +115,15 @@ type RegisteredQuery struct { QueryType string `json:"query_type"` // The IBC connection ID for getting ConsensusState to verify proofs. ConnectionID string `json:"connection_id"` - // Parameter that defines how often the query must be updated. + // A parameter that defines how often the query must be updated. UpdatePeriod uint64 `json:"update_period"` // The local chain last block height when the query result was updated. LastSubmittedResultLocalHeight uint64 `json:"last_submitted_result_local_height"` // The remote chain last block height when the query result was updated. LastSubmittedResultRemoteHeight *ibcclienttypes.Height `json:"last_submitted_result_remote_height,omitempty"` - // Amount of coins deposited for the query. + // The amount of coins deposited for the query. Deposit sdktypes.Coins `json:"deposit"` - // Timeout before query becomes available for everybody to remove. + // The timeout before the query becomes available for everybody to remove. SubmitTimeout uint64 `json:"submit_timeout"` // The local chain height when the query was registered. RegisteredAtHeight uint64 `json:"registered_at_height"` From 6aa40e8792b7e591678e444d25c9a1c450402ac9 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Sat, 26 Oct 2024 14:02:35 +0400 Subject: [PATCH 02/29] wip --- app/app.go | 13 +- proto/neutron/state-verifier/genesis.proto | 7 + proto/neutron/state-verifier/query.proto | 22 + x/state-verifier/genesis.go | 24 + x/state-verifier/keeper/keeper.go | 148 +++++ x/state-verifier/keeper/keeper_test.go | 90 +++ x/state-verifier/module.go | 154 +++++ x/state-verifier/types/codec.go | 17 + x/state-verifier/types/constants.go | 3 + x/state-verifier/types/genesis.go | 12 + x/state-verifier/types/genesis.pb.go | 265 +++++++++ x/state-verifier/types/keys.go | 23 + x/state-verifier/types/query.pb.go | 622 +++++++++++++++++++++ x/state-verifier/types/query.pb.gw.go | 171 ++++++ 14 files changed, 1570 insertions(+), 1 deletion(-) create mode 100644 proto/neutron/state-verifier/genesis.proto create mode 100644 proto/neutron/state-verifier/query.proto create mode 100644 x/state-verifier/genesis.go create mode 100644 x/state-verifier/keeper/keeper.go create mode 100644 x/state-verifier/keeper/keeper_test.go create mode 100644 x/state-verifier/module.go create mode 100644 x/state-verifier/types/codec.go create mode 100644 x/state-verifier/types/constants.go create mode 100644 x/state-verifier/types/genesis.go create mode 100644 x/state-verifier/types/genesis.pb.go create mode 100644 x/state-verifier/types/keys.go create mode 100644 x/state-verifier/types/query.pb.go create mode 100644 x/state-verifier/types/query.pb.gw.go diff --git a/app/app.go b/app/app.go index c9a4d859d..570e71999 100644 --- a/app/app.go +++ b/app/app.go @@ -11,6 +11,9 @@ import ( "time" dynamicfeestypes "github.com/neutron-org/neutron/v5/x/dynamicfees/types" + state_verifier "github.com/neutron-org/neutron/v5/x/state-verifier" + svkeeper "github.com/neutron-org/neutron/v5/x/state-verifier/keeper" + stateverifiertypes "github.com/neutron-org/neutron/v5/x/state-verifier/types" "github.com/skip-mev/feemarket/x/feemarket" feemarketkeeper "github.com/skip-mev/feemarket/x/feemarket/keeper" @@ -392,6 +395,8 @@ type App struct { InterchainTxsKeeper interchaintxskeeper.Keeper ContractManagerKeeper contractmanagermodulekeeper.Keeper + StateVerifierKeeper *svkeeper.Keeper + ConsensusParamsKeeper consensusparamkeeper.Keeper WasmKeeper wasmkeeper.Keeper @@ -487,7 +492,7 @@ func New( interchainqueriesmoduletypes.StoreKey, contractmanagermoduletypes.StoreKey, interchaintxstypes.StoreKey, wasmtypes.StoreKey, feetypes.StoreKey, feeburnertypes.StoreKey, adminmoduletypes.StoreKey, ccvconsumertypes.StoreKey, tokenfactorytypes.StoreKey, pfmtypes.StoreKey, crontypes.StoreKey, ibcratelimittypes.ModuleName, ibchookstypes.StoreKey, consensusparamtypes.StoreKey, crisistypes.StoreKey, dextypes.StoreKey, auctiontypes.StoreKey, - oracletypes.StoreKey, marketmaptypes.StoreKey, feemarkettypes.StoreKey, dynamicfeestypes.StoreKey, globalfeetypes.StoreKey, + oracletypes.StoreKey, marketmaptypes.StoreKey, feemarkettypes.StoreKey, dynamicfeestypes.StoreKey, globalfeetypes.StoreKey, stateverifiertypes.StoreKey, ) tkeys := storetypes.NewTransientStoreKeys(paramstypes.TStoreKey, dextypes.TStoreKey) memKeys := storetypes.NewMemoryStoreKeys(capabilitytypes.MemStoreKey, feetypes.MemStoreKey) @@ -651,6 +656,8 @@ func New( app.GlobalFeeKeeper = globalfeekeeper.NewKeeper(appCodec, keys[globalfeetypes.StoreKey], authtypes.NewModuleAddress(adminmoduletypes.ModuleName).String()) + app.StateVerifierKeeper = svkeeper.NewKeeper(appCodec, keys[stateverifiertypes.StoreKey], runtime.ProvideCometInfoService(), runtime.ProvideHeaderInfoService(nil), authtypes.NewModuleAddress(adminmoduletypes.ModuleName).String()) + // Create evidence Keeper for to register the IBC light client misbehaviour evidence route evidenceKeeper := evidencekeeper.NewKeeper( appCodec, runtime.NewKVStoreService(keys[evidencetypes.StoreKey]), &app.ConsumerKeeper, app.SlashingKeeper, @@ -927,6 +934,7 @@ func New( consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper), // always be last to make sure that it checks for all invariants and not only part of them crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), + state_verifier.NewAppModule(appCodec, app.StateVerifierKeeper), ) app.mm.SetOrderPreBlockers( @@ -972,6 +980,7 @@ func New( feemarkettypes.ModuleName, dextypes.ModuleName, consensusparamtypes.ModuleName, + stateverifiertypes.ModuleName, ) app.mm.SetOrderEndBlockers( @@ -1009,6 +1018,7 @@ func New( feemarkettypes.ModuleName, dextypes.ModuleName, consensusparamtypes.ModuleName, + stateverifiertypes.ModuleName, ) // NOTE: The genutils module must occur after staking so that pools are @@ -1052,6 +1062,7 @@ func New( dextypes.ModuleName, dynamicfeestypes.ModuleName, consensusparamtypes.ModuleName, + stateverifiertypes.ModuleName, ) app.mm.RegisterInvariants(&app.CrisisKeeper) diff --git a/proto/neutron/state-verifier/genesis.proto b/proto/neutron/state-verifier/genesis.proto new file mode 100644 index 000000000..bcfe5cead --- /dev/null +++ b/proto/neutron/state-verifier/genesis.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; +package neutron.state_verifier.v1; + +option go_package = "github.com/neutron-org/neutron/v5/x/state-verifier/types"; + +message GenesisState { +} diff --git a/proto/neutron/state-verifier/query.proto b/proto/neutron/state-verifier/query.proto new file mode 100644 index 000000000..36a9a0971 --- /dev/null +++ b/proto/neutron/state-verifier/query.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; +package neutron.state_verifier.v1; + +import "neutron/interchainqueries/tx.proto"; +import "google/api/annotations.proto"; + +option go_package = "github.com/neutron-org/neutron/v5/x/state-verifier/types"; + +service Query { + rpc VerifyStateValues(QueryVefiryStateValuesRequest) returns (QueryVerifyStateValuesResponse) { + option (google.api.http).get = "/neutron/state-verifier/verify_state_values"; + } +} + +message QueryVefiryStateValuesRequest { + uint64 height = 1; + repeated neutron.interchainqueries.StorageValue storage_values = 2; +} + +message QueryVerifyStateValuesResponse { + bool valid = 1; +} \ No newline at end of file diff --git a/x/state-verifier/genesis.go b/x/state-verifier/genesis.go new file mode 100644 index 000000000..3e494c696 --- /dev/null +++ b/x/state-verifier/genesis.go @@ -0,0 +1,24 @@ +package state_verifier + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/neutron-org/neutron/v5/x/state-verifier/keeper" + "github.com/neutron-org/neutron/v5/x/state-verifier/types" +) + +// InitGenesis initializes the module's state from a provided genesis state. +func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { + //// this line is used by starport scaffolding # genesis/module/init + //err := k.SetParams(ctx, genState.Params) + //if err != nil { + // panic(err) + //} +} + +// ExportGenesis returns the module's exported genesis +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + genesis := types.DefaultGenesis() + + return genesis +} diff --git a/x/state-verifier/keeper/keeper.go b/x/state-verifier/keeper/keeper.go new file mode 100644 index 000000000..80d232a1c --- /dev/null +++ b/x/state-verifier/keeper/keeper.go @@ -0,0 +1,148 @@ +package keeper + +import ( + "context" + "encoding/json" + "fmt" + + "cosmossdk.io/core/comet" + "cosmossdk.io/core/header" + "cosmossdk.io/errors" + "cosmossdk.io/log" + "cosmossdk.io/store/prefix" + storetypes "cosmossdk.io/store/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + ibccommitmenttypes "github.com/cosmos/ibc-go/v8/modules/core/23-commitment/types" + tendermint "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint" + ics23 "github.com/cosmos/ics23/go" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + + types2 "github.com/neutron-org/neutron/v5/x/interchainqueries/types" + "github.com/neutron-org/neutron/v5/x/state-verifier/types" +) + +type ( + Keeper struct { + cdc codec.BinaryCodec + storeKey storetypes.StoreKey + cometInfo comet.BlockInfoService + headerInfo header.Service + authority string + } +) + +func (k *Keeper) VerifyStateValues(ctx context.Context, request *types.QueryVefiryStateValuesRequest) (*types.QueryVerifyStateValuesResponse, error) { + if err := k.Verify(sdk.UnwrapSDKContext(ctx), int64(request.Height), request.StorageValues); err != nil { + return nil, err + } + + return &types.QueryVerifyStateValuesResponse{Valid: true}, nil +} + +func NewKeeper( + cdc codec.BinaryCodec, + storeKey storetypes.StoreKey, + cometInfo comet.BlockInfoService, + headerInfo header.Service, + authority string, +) *Keeper { + return &Keeper{ + cdc: cdc, + storeKey: storeKey, + authority: authority, + headerInfo: headerInfo, + cometInfo: cometInfo, + } +} + +func (k *Keeper) GetAuthority() string { + return k.authority +} + +func (k *Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) +} + +func (k *Keeper) SaveConsensusState(ctx sdk.Context) error { + headerInfo := k.headerInfo.GetHeaderInfo(ctx) + cometInfo := k.cometInfo.GetCometBlockInfo(ctx) + + cs := tendermint.ConsensusState{ + Timestamp: ctx.BlockTime(), + Root: ibccommitmenttypes.NewMerkleRoot(headerInfo.AppHash), + NextValidatorsHash: cometInfo.GetValidatorsHash(), + } + + store := ctx.KVStore(k.storeKey) + key := types.GetConsensusStateKey(ctx.BlockHeight()) + + csBz, err := json.Marshal(cs) + if err != nil { + return errors.Wrapf(sdkerrors.ErrJSONMarshal, err.Error()) + } + + store.Set(key, csBz) + + return nil +} + +func (k *Keeper) Verify(ctx sdk.Context, blockHeight int64, values []*types2.StorageValue) error { + store := ctx.KVStore(k.storeKey) + + csBz := store.Get(types.GetConsensusStateKey(blockHeight + 1)) + if csBz == nil { + return errors.Wrap(sdkerrors.ErrKeyNotFound, fmt.Sprintf("consensus state for block %d not found", blockHeight)) + } + + var cs tendermint.ConsensusState + if err := json.Unmarshal(csBz, &cs); err != nil { + return errors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) + } + + for _, result := range values { + proof, err := ibccommitmenttypes.ConvertProofs(result.Proof) + if err != nil { + return errors.Wrapf(sdkerrors.ErrInvalidType, "failed to convert crypto.ProofOps to MerkleProof: %v", err) + } + + path := ibccommitmenttypes.NewMerklePath(result.StoragePrefix, string(result.Key)) + // identify what kind proofs (non-existence proof always has *ics23.CommitmentProof_Nonexist as the first item) we got + // and call corresponding method to verify it + switch proof.GetProofs()[0].GetProof().(type) { + // we can get non-existence proof if someone queried some key which is not exists in the storage on remote chain + case *ics23.CommitmentProof_Nonexist: + if err := proof.VerifyNonMembership(ibccommitmenttypes.GetSDKSpecs(), cs.Root, path); err != nil { + return errors.Wrapf(types2.ErrInvalidProof, "failed to verify proof: %v", err) + } + result.Value = nil + case *ics23.CommitmentProof_Exist: + if err := proof.VerifyMembership(ibccommitmenttypes.GetSDKSpecs(), cs.Root, path, result.Value); err != nil { + return errors.Wrapf(types2.ErrInvalidProof, "failed to verify proof: %v", err) + } + default: + return errors.Wrapf(types2.ErrInvalidProof, "unknown proof type %T", proof.GetProofs()[0].GetProof()) + } + } + + return nil +} + +func (k Keeper) GetAllConsensusStates(ctx sdk.Context) []tendermint.ConsensusState { + var ( + store = prefix.NewStore(ctx.KVStore(k.storeKey), types.ConsensusStateKey) + states []tendermint.ConsensusState + ) + + iterator := storetypes.KVStorePrefixIterator(store, []byte{}) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + cs := tendermint.ConsensusState{} + k.cdc.MustUnmarshal(iterator.Value(), &cs) + states = append(states, cs) + } + + return states +} diff --git a/x/state-verifier/keeper/keeper_test.go b/x/state-verifier/keeper/keeper_test.go new file mode 100644 index 000000000..ae5b94bf9 --- /dev/null +++ b/x/state-verifier/keeper/keeper_test.go @@ -0,0 +1,90 @@ +package keeper_test + +import ( + "fmt" + "testing" + + "cosmossdk.io/math" + wasmKeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/cometbft/cometbft/abci/types" + sdk "github.com/cosmos/cosmos-sdk/types" + host "github.com/cosmos/ibc-go/v8/modules/core/24-host" + ibchost "github.com/cosmos/ibc-go/v8/modules/core/exported" + "github.com/stretchr/testify/suite" + + "github.com/neutron-org/neutron/v5/app/params" + "github.com/neutron-org/neutron/v5/testutil" + iqtypes "github.com/neutron-org/neutron/v5/x/interchainqueries/types" +) + +var reflectContractPath = "../../../wasmbinding/testdata/reflect.wasm" + +type KeeperTestSuite struct { + testutil.IBCConnectionTestSuite +} + +func (suite *KeeperTestSuite) TestVerifyValue() { + tests := []struct { + name string + malleate func(sender string, ctx sdk.Context) + }{ + { + name: "valid KV storage proof", + malleate: func(sender string, ctx sdk.Context) { + clientKey := host.FullClientStateKey(suite.Path.EndpointA.ClientID) + + resp, err := suite.ChainA.App.Query(ctx, &types.RequestQuery{ + Path: fmt.Sprintf("store/%s/key", ibchost.StoreKey), + Height: suite.ChainA.LastHeader.Header.Height - 1, + Data: clientKey, + Prove: true, + }) + suite.Require().NoError(err) + + suite.Require().NoError(suite.GetNeutronZoneApp(suite.ChainA).StateVerifierKeeper.Verify(ctx, resp.Height, []*iqtypes.StorageValue{{ + Key: resp.Key, + Proof: resp.ProofOps, + Value: resp.Value, + StoragePrefix: ibchost.StoreKey, + }})) + }, + }, + } + + for i, tc := range tests { + tt := tc + suite.Run(fmt.Sprintf("Case %s, %d/%d tests", tt.name, i+1, len(tests)), func() { + suite.SetupTest() + + var ( + ctx = suite.ChainA.GetContext() + contractOwner = wasmKeeper.RandomAccountAddress(suite.T()) + ) + + // Store code and instantiate reflect contract. + codeID := suite.StoreTestCode(ctx, contractOwner, reflectContractPath) + contractAddress := suite.InstantiateTestContract(ctx, contractOwner, codeID) + suite.Require().NotEmpty(contractAddress) + + err := testutil.SetupICAPath(suite.Path, contractAddress.String()) + suite.Require().NoError(err) + + // Top up contract address with native coins for deposit + senderAddress := suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress() + suite.TopUpWallet(ctx, senderAddress, contractAddress) + + tt.malleate(contractAddress.String(), ctx) + }) + } +} + +func (suite *KeeperTestSuite) TopUpWallet(ctx sdk.Context, sender, contractAddress sdk.AccAddress) { + coinsAmnt := sdk.NewCoins(sdk.NewCoin(params.DefaultDenom, math.NewInt(int64(1_000_000)))) + bankKeeper := suite.GetNeutronZoneApp(suite.ChainA).BankKeeper + err := bankKeeper.SendCoins(ctx, sender, contractAddress, coinsAmnt) + suite.Require().NoError(err) +} + +func TestKeeperTestSuite(t *testing.T) { + suite.Run(t, new(KeeperTestSuite)) +} diff --git a/x/state-verifier/module.go b/x/state-verifier/module.go new file mode 100644 index 000000000..a578dd568 --- /dev/null +++ b/x/state-verifier/module.go @@ -0,0 +1,154 @@ +package state_verifier + +import ( + "context" + "encoding/json" + "fmt" + + "cosmossdk.io/core/appmodule" + + "github.com/gorilla/mux" + + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/spf13/cobra" + + abci "github.com/cometbft/cometbft/abci/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + + "github.com/neutron-org/neutron/v5/x/state-verifier/keeper" + "github.com/neutron-org/neutron/v5/x/state-verifier/types" +) + +var ( + _ appmodule.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} +) + +// ---------------------------------------------------------------------------- +// AppModuleBasic +// ---------------------------------------------------------------------------- + +// AppModuleBasic implements the AppModuleBasic interface that defines the independent methods a Cosmos SDK module needs to implement. +type AppModuleBasic struct { + cdc codec.BinaryCodec +} + +func (a AppModuleBasic) RegisterRESTRoutes(_ client.Context, _ *mux.Router) { +} + +func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic { + return AppModuleBasic{cdc: cdc} +} + +// Name returns the name of the module as a string +func (AppModuleBasic) Name() string { + return types.ModuleName +} + +// RegisterLegacyAminoCodec registers the amino codec for the module, which is used to marshal and unmarshal structs to/from []byte in order to persist them in the module's KVStore +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) +} + +// RegisterInterfaces registers a module's interface types and their concrete implementations as proto.Message +func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { + types.RegisterInterfaces(reg) +} + +// DefaultGenesis returns a default GenesisState for the module, marshalled to json.RawMessage. The default GenesisState need to be defined by the module developer and is primarily used for testing +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(types.DefaultGenesis()) +} + +// ValidateGenesis used to validate the GenesisState, given in its json.RawMessage form +func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error { + var genState types.GenesisState + if err := cdc.UnmarshalJSON(bz, &genState); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) + } + return genState.Validate() +} + +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module +func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { + //types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) //nolint:errcheck +} + +// GetTxCmd returns the root Tx command for the module. The subcommands of this root command are used by end-users to generate new transactions containing messages defined in the module +func (a AppModuleBasic) GetTxCmd() *cobra.Command { + return nil +} + +// GetQueryCmd returns the root query command for the module. The subcommands of this root command are used by end-users to generate new queries to the subset of the state defined by the module +//func (AppModuleBasic) GetQueryCmd() *cobra.Command { +// return cli.GetQueryCmd(types.StoreKey) +//} + +// ---------------------------------------------------------------------------- +// AppModule +// ---------------------------------------------------------------------------- +var _ appmodule.AppModule = AppModule{} + +// AppModule implements the AppModule interface that defines the inter-dependent methods that modules need to implement +type AppModule struct { + AppModuleBasic + + keeper *keeper.Keeper +} + +func NewAppModule( + cdc codec.Codec, + keeper *keeper.Keeper, +) AppModule { + return AppModule{ + AppModuleBasic: NewAppModuleBasic(cdc), + keeper: keeper, + } +} + +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() { // marker +} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() { // marker +} + +// RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries +func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterQueryServer(cfg.QueryServer(), am.keeper) + //types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) +} + +// RegisterInvariants registers the invariants of the module. If an invariant deviates from its predicted value, the InvariantRegistry triggers appropriate logic (most often the chain will be halted) +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// InitGenesis performs the module's genesis initialization. It returns no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { + var genState types.GenesisState + // Initialize global index to index in genesis state + cdc.MustUnmarshalJSON(gs, &genState) + + InitGenesis(ctx, *am.keeper, genState) + + return []abci.ValidatorUpdate{} +} + +// ExportGenesis returns the module's exported genesis state as raw JSON bytes. +func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { + genState := ExportGenesis(ctx, *am.keeper) + return cdc.MustMarshalJSON(genState) +} + +// ConsensusVersion is a sequence number for state-breaking change of the module. It should be incremented on each consensus-breaking change introduced by the module. To avoid wrong/empty versions, the initial version should be set to 1 +func (AppModule) ConsensusVersion() uint64 { return types.ConsensusVersion } + +// BeginBlock contains the logic that is automatically triggered at the beginning of each block +func (am AppModule) BeginBlock(ctx context.Context) error { + return am.keeper.SaveConsensusState(sdk.UnwrapSDKContext(ctx)) +} diff --git a/x/state-verifier/types/codec.go b/x/state-verifier/types/codec.go new file mode 100644 index 000000000..b893e5e52 --- /dev/null +++ b/x/state-verifier/types/codec.go @@ -0,0 +1,17 @@ +package types + +import ( + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func RegisterCodec(cdc *codec.LegacyAmino) { +} + +func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + registry.RegisterImplementations( + (*sdk.Msg)(nil), + ) + //msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) +} diff --git a/x/state-verifier/types/constants.go b/x/state-verifier/types/constants.go new file mode 100644 index 000000000..6bad94d03 --- /dev/null +++ b/x/state-verifier/types/constants.go @@ -0,0 +1,3 @@ +package types + +const ConsensusVersion = 1 diff --git a/x/state-verifier/types/genesis.go b/x/state-verifier/types/genesis.go new file mode 100644 index 000000000..315d5df0a --- /dev/null +++ b/x/state-verifier/types/genesis.go @@ -0,0 +1,12 @@ +package types + +// DefaultGenesis returns the default genesis state +func DefaultGenesis() *GenesisState { + return &GenesisState{} +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + return nil +} diff --git a/x/state-verifier/types/genesis.pb.go b/x/state-verifier/types/genesis.pb.go new file mode 100644 index 000000000..a5b99cfdd --- /dev/null +++ b/x/state-verifier/types/genesis.pb.go @@ -0,0 +1,265 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: neutron/state-verifier/genesis.proto + +package types + +import ( + fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type GenesisState struct { +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_45b0385b8dfa6591, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func init() { + proto.RegisterType((*GenesisState)(nil), "neutron.state_verifier.v1.GenesisState") +} + +func init() { + proto.RegisterFile("neutron/state-verifier/genesis.proto", fileDescriptor_45b0385b8dfa6591) +} + +var fileDescriptor_45b0385b8dfa6591 = []byte{ + // 151 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xc9, 0x4b, 0x2d, 0x2d, + 0x29, 0xca, 0xcf, 0xd3, 0x2f, 0x2e, 0x49, 0x2c, 0x49, 0xd5, 0x2d, 0x4b, 0x2d, 0xca, 0x4c, 0xcb, + 0x4c, 0x2d, 0xd2, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, + 0x17, 0x92, 0x84, 0xaa, 0xd2, 0x03, 0xab, 0x8a, 0x87, 0xa9, 0xd2, 0x2b, 0x33, 0x54, 0xe2, 0xe3, + 0xe2, 0x71, 0x87, 0xa8, 0x0d, 0x06, 0xc9, 0x39, 0x05, 0x9d, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, + 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, + 0xb1, 0x1c, 0x43, 0x94, 0x45, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, + 0xd4, 0x3c, 0xdd, 0xfc, 0xa2, 0x74, 0x18, 0x5b, 0xbf, 0xcc, 0x54, 0xbf, 0x02, 0xdd, 0x19, 0x25, + 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0x60, 0x57, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf8, + 0xf8, 0x49, 0x78, 0xad, 0x00, 0x00, 0x00, +} + +func (m *GenesisState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/state-verifier/types/keys.go b/x/state-verifier/types/keys.go new file mode 100644 index 000000000..5850aaa22 --- /dev/null +++ b/x/state-verifier/types/keys.go @@ -0,0 +1,23 @@ +package types + +import "strconv" + +const ( + // ModuleName defines the module name + ModuleName = "state-verifier" + + // StoreKey defines the primary module store key + StoreKey = ModuleName +) + +const ( + prefixConsensusStateKey = iota + 1 +) + +var ( + ConsensusStateKey = []byte{prefixConsensusStateKey} +) + +func GetConsensusStateKey(height int64) []byte { + return append(ConsensusStateKey, []byte(strconv.FormatInt(height, 10))...) +} diff --git a/x/state-verifier/types/query.pb.go b/x/state-verifier/types/query.pb.go new file mode 100644 index 000000000..60278f615 --- /dev/null +++ b/x/state-verifier/types/query.pb.go @@ -0,0 +1,622 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: neutron/state-verifier/query.proto + +package types + +import ( + context "context" + fmt "fmt" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + types "github.com/neutron-org/neutron/v5/x/interchainqueries/types" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type QueryVefiryStateValuesRequest struct { + Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` + StorageValues []*types.StorageValue `protobuf:"bytes,2,rep,name=storage_values,json=storageValues,proto3" json:"storage_values,omitempty"` +} + +func (m *QueryVefiryStateValuesRequest) Reset() { *m = QueryVefiryStateValuesRequest{} } +func (m *QueryVefiryStateValuesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryVefiryStateValuesRequest) ProtoMessage() {} +func (*QueryVefiryStateValuesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_369825dbe2d186a4, []int{0} +} +func (m *QueryVefiryStateValuesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryVefiryStateValuesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryVefiryStateValuesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryVefiryStateValuesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVefiryStateValuesRequest.Merge(m, src) +} +func (m *QueryVefiryStateValuesRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryVefiryStateValuesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVefiryStateValuesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryVefiryStateValuesRequest proto.InternalMessageInfo + +func (m *QueryVefiryStateValuesRequest) GetHeight() uint64 { + if m != nil { + return m.Height + } + return 0 +} + +func (m *QueryVefiryStateValuesRequest) GetStorageValues() []*types.StorageValue { + if m != nil { + return m.StorageValues + } + return nil +} + +type QueryVerifyStateValuesResponse struct { + Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` +} + +func (m *QueryVerifyStateValuesResponse) Reset() { *m = QueryVerifyStateValuesResponse{} } +func (m *QueryVerifyStateValuesResponse) String() string { return proto.CompactTextString(m) } +func (*QueryVerifyStateValuesResponse) ProtoMessage() {} +func (*QueryVerifyStateValuesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_369825dbe2d186a4, []int{1} +} +func (m *QueryVerifyStateValuesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryVerifyStateValuesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryVerifyStateValuesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryVerifyStateValuesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVerifyStateValuesResponse.Merge(m, src) +} +func (m *QueryVerifyStateValuesResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryVerifyStateValuesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVerifyStateValuesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryVerifyStateValuesResponse proto.InternalMessageInfo + +func (m *QueryVerifyStateValuesResponse) GetValid() bool { + if m != nil { + return m.Valid + } + return false +} + +func init() { + proto.RegisterType((*QueryVefiryStateValuesRequest)(nil), "neutron.state_verifier.v1.QueryVefiryStateValuesRequest") + proto.RegisterType((*QueryVerifyStateValuesResponse)(nil), "neutron.state_verifier.v1.QueryVerifyStateValuesResponse") +} + +func init() { + proto.RegisterFile("neutron/state-verifier/query.proto", fileDescriptor_369825dbe2d186a4) +} + +var fileDescriptor_369825dbe2d186a4 = []byte{ + // 354 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0x41, 0x4b, 0x23, 0x31, + 0x14, 0xc7, 0x9b, 0xee, 0xb6, 0x2c, 0x59, 0x76, 0xc1, 0x41, 0xa4, 0x16, 0x1d, 0xca, 0x5c, 0x2c, + 0x48, 0x13, 0x6c, 0x51, 0xea, 0xd5, 0x0f, 0x20, 0x38, 0x85, 0x1e, 0xbc, 0x94, 0xb4, 0xbe, 0xce, + 0x04, 0x6a, 0x32, 0x4d, 0x32, 0x43, 0xe7, 0xea, 0xc5, 0xab, 0xe0, 0xe7, 0xf1, 0xac, 0xc7, 0x82, + 0x17, 0x8f, 0xd2, 0xfa, 0x41, 0xa4, 0x99, 0x69, 0x51, 0x4b, 0xf5, 0x96, 0x47, 0xde, 0xef, 0xfd, + 0x7f, 0xc9, 0xc3, 0x9e, 0x80, 0xd8, 0x28, 0x29, 0xa8, 0x36, 0xcc, 0x40, 0x23, 0x01, 0xc5, 0x87, + 0x1c, 0x14, 0x1d, 0xc7, 0xa0, 0x52, 0x12, 0x29, 0x69, 0xa4, 0xb3, 0x9b, 0xf7, 0x10, 0xdb, 0xd3, + 0x5b, 0xf6, 0x90, 0xe4, 0xa8, 0xba, 0xc2, 0xb9, 0x30, 0xa0, 0x06, 0x21, 0xe3, 0x62, 0x41, 0x72, + 0xd0, 0xd4, 0x4c, 0x32, 0xbc, 0xba, 0x17, 0x48, 0x19, 0x8c, 0x80, 0xb2, 0x88, 0x53, 0x26, 0x84, + 0x34, 0xcc, 0x70, 0x29, 0x74, 0x76, 0xeb, 0xdd, 0x22, 0xbc, 0x7f, 0xb1, 0x08, 0xeb, 0xc2, 0x90, + 0xab, 0xb4, 0xb3, 0x88, 0xe8, 0xb2, 0x51, 0x0c, 0xda, 0x87, 0x71, 0x0c, 0xda, 0x38, 0x3b, 0xb8, + 0x1c, 0x02, 0x0f, 0x42, 0x53, 0x41, 0x35, 0x54, 0xff, 0xed, 0xe7, 0x95, 0x73, 0x8e, 0xff, 0x6b, + 0x23, 0x15, 0x0b, 0xa0, 0x97, 0x58, 0xa0, 0x52, 0xac, 0xfd, 0xaa, 0xff, 0x6d, 0x1e, 0x90, 0xa5, + 0xef, 0x9a, 0x14, 0xe9, 0x64, 0x80, 0x0d, 0xf0, 0xff, 0xe9, 0x0f, 0x95, 0xf6, 0x4e, 0xb0, 0x9b, + 0x8b, 0x28, 0x3e, 0xfc, 0x2c, 0xa2, 0x23, 0x29, 0x34, 0x38, 0xdb, 0xb8, 0x94, 0xb0, 0x11, 0xbf, + 0xb2, 0x22, 0x7f, 0xfc, 0xac, 0x68, 0x3e, 0x22, 0x5c, 0xb2, 0xa0, 0xf3, 0x80, 0xf0, 0xd6, 0x1a, + 0xed, 0xb4, 0xc9, 0xc6, 0xff, 0x23, 0xdf, 0xbe, 0xbc, 0x7a, 0xfa, 0x33, 0xb9, 0x41, 0xd5, 0x6b, + 0xdd, 0x3c, 0xbf, 0xdd, 0x17, 0x1b, 0xce, 0x21, 0xdd, 0xb0, 0x60, 0x7b, 0x48, 0x7b, 0xf9, 0x60, + 0x0b, 0x9f, 0xf9, 0x4f, 0x33, 0x17, 0x4d, 0x67, 0x2e, 0x7a, 0x9d, 0xb9, 0xe8, 0x6e, 0xee, 0x16, + 0xa6, 0x73, 0xb7, 0xf0, 0x32, 0x77, 0x0b, 0x97, 0xed, 0x80, 0x9b, 0x30, 0xee, 0x93, 0x81, 0xbc, + 0x5e, 0x0e, 0x6c, 0x48, 0x15, 0xac, 0x86, 0x27, 0xc7, 0x74, 0xf2, 0x35, 0xc1, 0xa4, 0x11, 0xe8, + 0x7e, 0xd9, 0xae, 0xb9, 0xf5, 0x1e, 0x00, 0x00, 0xff, 0xff, 0x82, 0x4b, 0xbe, 0x07, 0x69, 0x02, + 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + VerifyStateValues(ctx context.Context, in *QueryVefiryStateValuesRequest, opts ...grpc.CallOption) (*QueryVerifyStateValuesResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) VerifyStateValues(ctx context.Context, in *QueryVefiryStateValuesRequest, opts ...grpc.CallOption) (*QueryVerifyStateValuesResponse, error) { + out := new(QueryVerifyStateValuesResponse) + err := c.cc.Invoke(ctx, "/neutron.state_verifier.v1.Query/VerifyStateValues", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + VerifyStateValues(context.Context, *QueryVefiryStateValuesRequest) (*QueryVerifyStateValuesResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) VerifyStateValues(ctx context.Context, req *QueryVefiryStateValuesRequest) (*QueryVerifyStateValuesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VerifyStateValues not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_VerifyStateValues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryVefiryStateValuesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).VerifyStateValues(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/neutron.state_verifier.v1.Query/VerifyStateValues", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).VerifyStateValues(ctx, req.(*QueryVefiryStateValuesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "neutron.state_verifier.v1.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "VerifyStateValues", + Handler: _Query_VerifyStateValues_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "neutron/state-verifier/query.proto", +} + +func (m *QueryVefiryStateValuesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryVefiryStateValuesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryVefiryStateValuesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.StorageValues) > 0 { + for iNdEx := len(m.StorageValues) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StorageValues[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.Height != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryVerifyStateValuesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryVerifyStateValuesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryVerifyStateValuesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Valid { + i-- + if m.Valid { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryVefiryStateValuesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Height != 0 { + n += 1 + sovQuery(uint64(m.Height)) + } + if len(m.StorageValues) > 0 { + for _, e := range m.StorageValues { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryVerifyStateValuesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Valid { + n += 2 + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryVefiryStateValuesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryVefiryStateValuesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryVefiryStateValuesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + } + m.Height = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Height |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StorageValues", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StorageValues = append(m.StorageValues, &types.StorageValue{}) + if err := m.StorageValues[len(m.StorageValues)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryVerifyStateValuesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryVerifyStateValuesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryVerifyStateValuesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Valid", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Valid = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/state-verifier/types/query.pb.gw.go b/x/state-verifier/types/query.pb.gw.go new file mode 100644 index 000000000..df696b44e --- /dev/null +++ b/x/state-verifier/types/query.pb.gw.go @@ -0,0 +1,171 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: neutron/state-verifier/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +var ( + filter_Query_VerifyStateValues_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_VerifyStateValues_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVefiryStateValuesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_VerifyStateValues_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.VerifyStateValues(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_VerifyStateValues_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVefiryStateValuesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_VerifyStateValues_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.VerifyStateValues(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_VerifyStateValues_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_VerifyStateValues_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_VerifyStateValues_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_VerifyStateValues_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_VerifyStateValues_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_VerifyStateValues_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_VerifyStateValues_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"neutron", "state-verifier", "verify_state_values"}, "", runtime.AssumeColonVerbOpt(false))) +) + +var ( + forward_Query_VerifyStateValues_0 = runtime.ForwardResponseMessage +) From 4e148ec0e57ed118824bc24bd22cbb09fd8ab582 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Tue, 29 Oct 2024 12:35:58 +0200 Subject: [PATCH 03/29] fix tests --- x/dex/keeper/msg_server_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/x/dex/keeper/msg_server_test.go b/x/dex/keeper/msg_server_test.go index 5fb64f8d6..adc1efedf 100644 --- a/x/dex/keeper/msg_server_test.go +++ b/x/dex/keeper/msg_server_test.go @@ -7,6 +7,7 @@ import ( "time" abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/cosmos-sdk/baseapp" "github.com/stretchr/testify/require" sdkmath "cosmossdk.io/math" @@ -1520,6 +1521,11 @@ func (s *DexTestSuite) nextBlockWithTime(blockTime time.Time) { func (s *DexTestSuite) beginBlockWithTime(blockTime time.Time) { s.Ctx = s.Ctx.WithBlockTime(blockTime) + // fill in empty CometBFT info just to avoid nil pointer panics (we don't care about validity of the info in these tests) + s.Ctx = s.Ctx.WithCometInfo(baseapp.NewBlockInfo(nil, nil, nil, abci.CommitInfo{ + Round: 0, + Votes: nil, + })) _, err := s.App.BeginBlocker(s.Ctx) s.NoError(err) } From 27825c9630afde43f622ca7ef682f98b1bd5188b Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Tue, 29 Oct 2024 13:49:28 +0200 Subject: [PATCH 04/29] genesis test --- proto/neutron/state-verifier/genesis.proto | 8 + .../tendermint/v1/tendermint.proto | 101 ++++++ x/state-verifier/genesis.go | 26 +- x/state-verifier/keeper/keeper.go | 25 +- x/state-verifier/module.go | 12 +- x/state-verifier/types/codec.go | 2 +- x/state-verifier/types/genesis.pb.go | 308 +++++++++++++++++- x/state-verifier/types/keys.go | 8 +- 8 files changed, 454 insertions(+), 36 deletions(-) create mode 100644 third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto diff --git a/proto/neutron/state-verifier/genesis.proto b/proto/neutron/state-verifier/genesis.proto index bcfe5cead..10ff413f8 100644 --- a/proto/neutron/state-verifier/genesis.proto +++ b/proto/neutron/state-verifier/genesis.proto @@ -3,5 +3,13 @@ package neutron.state_verifier.v1; option go_package = "github.com/neutron-org/neutron/v5/x/state-verifier/types"; +import "ibc/lightclients/tendermint/v1/tendermint.proto"; + +message ConsensusState { + int64 height = 1; + ibc.lightclients.tendermint.v1.ConsensusState cs = 2; +} + message GenesisState { + repeated ConsensusState states = 1; } diff --git a/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto b/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto new file mode 100644 index 000000000..7dec438f1 --- /dev/null +++ b/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto @@ -0,0 +1,101 @@ +syntax = "proto3"; + +package ibc.lightclients.tendermint.v1; + +option go_package = "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint;tendermint"; + +import "tendermint/types/validator.proto"; +import "tendermint/types/types.proto"; +import "cosmos/ics23/v1/proofs.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; +import "ibc/core/client/v1/client.proto"; +import "ibc/core/commitment/v1/commitment.proto"; +import "gogoproto/gogo.proto"; + +// ClientState from Tendermint tracks the current validator set, latest height, +// and a possible frozen height. +message ClientState { + option (gogoproto.goproto_getters) = false; + + string chain_id = 1; + Fraction trust_level = 2 [(gogoproto.nullable) = false]; + // duration of the period since the LastestTimestamp during which the + // submitted headers are valid for upgrade + google.protobuf.Duration trusting_period = 3 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; + // duration of the staking unbonding period + google.protobuf.Duration unbonding_period = 4 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; + // defines how much new (untrusted) header's Time can drift into the future. + google.protobuf.Duration max_clock_drift = 5 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; + // Block height when the client was frozen due to a misbehaviour + ibc.core.client.v1.Height frozen_height = 6 [(gogoproto.nullable) = false]; + // Latest height the client was updated to + ibc.core.client.v1.Height latest_height = 7 [(gogoproto.nullable) = false]; + + // Proof specifications used in verifying counterparty state + repeated cosmos.ics23.v1.ProofSpec proof_specs = 8; + + // Path at which next upgraded client will be committed. + // Each element corresponds to the key for a single CommitmentProof in the + // chained proof. NOTE: ClientState must stored under + // `{upgradePath}/{upgradeHeight}/clientState` ConsensusState must be stored + // under `{upgradepath}/{upgradeHeight}/consensusState` For SDK chains using + // the default upgrade module, upgrade_path should be []string{"upgrade", + // "upgradedIBCState"}` + repeated string upgrade_path = 9; + + // allow_update_after_expiry is deprecated + bool allow_update_after_expiry = 10 [deprecated = true]; + // allow_update_after_misbehaviour is deprecated + bool allow_update_after_misbehaviour = 11 [deprecated = true]; +} + +// ConsensusState defines the consensus state from Tendermint. +message ConsensusState { + option (gogoproto.goproto_getters) = false; + + // timestamp that corresponds to the block height in which the ConsensusState + // was stored. + google.protobuf.Timestamp timestamp = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + // commitment root (i.e app hash) + ibc.core.commitment.v1.MerkleRoot root = 2 [(gogoproto.nullable) = false]; + bytes next_validators_hash = 3 [(gogoproto.casttype) = "github.com/cometbft/cometbft/libs/bytes.HexBytes"]; +} + +// Misbehaviour is a wrapper over two conflicting Headers +// that implements Misbehaviour interface expected by ICS-02 +message Misbehaviour { + option (gogoproto.goproto_getters) = false; + + // ClientID is deprecated + string client_id = 1 [deprecated = true]; + Header header_1 = 2 [(gogoproto.customname) = "Header1"]; + Header header_2 = 3 [(gogoproto.customname) = "Header2"]; +} + +// Header defines the Tendermint client consensus Header. +// It encapsulates all the information necessary to update from a trusted +// Tendermint ConsensusState. The inclusion of TrustedHeight and +// TrustedValidators allows this update to process correctly, so long as the +// ConsensusState for the TrustedHeight exists, this removes race conditions +// among relayers The SignedHeader and ValidatorSet are the new untrusted update +// fields for the client. The TrustedHeight is the height of a stored +// ConsensusState on the client that will be used to verify the new untrusted +// header. The Trusted ConsensusState must be within the unbonding period of +// current time in order to correctly verify, and the TrustedValidators must +// hash to TrustedConsensusState.NextValidatorsHash since that is the last +// trusted validator set at the TrustedHeight. +message Header { + .tendermint.types.SignedHeader signed_header = 1 [(gogoproto.embed) = true]; + + .tendermint.types.ValidatorSet validator_set = 2; + ibc.core.client.v1.Height trusted_height = 3 [(gogoproto.nullable) = false]; + .tendermint.types.ValidatorSet trusted_validators = 4; +} + +// Fraction defines the protobuf message type for tmmath.Fraction that only +// supports positive values. +message Fraction { + uint64 numerator = 1; + uint64 denominator = 2; +} \ No newline at end of file diff --git a/x/state-verifier/genesis.go b/x/state-verifier/genesis.go index 3e494c696..2b9af0a9d 100644 --- a/x/state-verifier/genesis.go +++ b/x/state-verifier/genesis.go @@ -1,4 +1,4 @@ -package state_verifier +package stateverifier import ( sdk "github.com/cosmos/cosmos-sdk/types" @@ -8,17 +8,27 @@ import ( ) // InitGenesis initializes the module's state from a provided genesis state. -func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { - //// this line is used by starport scaffolding # genesis/module/init - //err := k.SetParams(ctx, genState.Params) - //if err != nil { - // panic(err) - //} +func InitGenesis(ctx sdk.Context, k *keeper.Keeper, genState types.GenesisState) { + // this line is used by starport scaffolding # genesis/module/init + for _, state := range genState.States { + if err := k.WriteConsensusState(ctx, state.Height, *state.Cs); err != nil { + panic(err) + } + } } // ExportGenesis returns the module's exported genesis -func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { +func ExportGenesis(ctx sdk.Context, k *keeper.Keeper) *types.GenesisState { genesis := types.DefaultGenesis() + allCs, err := k.GetAllConsensusStates(ctx) + if err != nil { + panic(err) + } + + for _, cs := range allCs { + genesis.States = append(genesis.States, cs) + } + return genesis } diff --git a/x/state-verifier/keeper/keeper.go b/x/state-verifier/keeper/keeper.go index 80d232a1c..6d1e3f583 100644 --- a/x/state-verifier/keeper/keeper.go +++ b/x/state-verifier/keeper/keeper.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "strconv" "cosmossdk.io/core/comet" "cosmossdk.io/core/header" @@ -75,10 +76,14 @@ func (k *Keeper) SaveConsensusState(ctx sdk.Context) error { NextValidatorsHash: cometInfo.GetValidatorsHash(), } + return k.WriteConsensusState(ctx, ctx.BlockHeight(), cs) +} + +func (k *Keeper) WriteConsensusState(ctx sdk.Context, height int64, cs tendermint.ConsensusState) error { store := ctx.KVStore(k.storeKey) - key := types.GetConsensusStateKey(ctx.BlockHeight()) + key := types.GetConsensusStateKey(height) - csBz, err := json.Marshal(cs) + csBz, err := k.cdc.Marshal(&cs) if err != nil { return errors.Wrapf(sdkerrors.ErrJSONMarshal, err.Error()) } @@ -129,10 +134,10 @@ func (k *Keeper) Verify(ctx sdk.Context, blockHeight int64, values []*types2.Sto return nil } -func (k Keeper) GetAllConsensusStates(ctx sdk.Context) []tendermint.ConsensusState { +func (k Keeper) GetAllConsensusStates(ctx sdk.Context) ([]*types.ConsensusState, error) { var ( store = prefix.NewStore(ctx.KVStore(k.storeKey), types.ConsensusStateKey) - states []tendermint.ConsensusState + states []*types.ConsensusState ) iterator := storetypes.KVStorePrefixIterator(store, []byte{}) @@ -141,8 +146,16 @@ func (k Keeper) GetAllConsensusStates(ctx sdk.Context) []tendermint.ConsensusSta for ; iterator.Valid(); iterator.Next() { cs := tendermint.ConsensusState{} k.cdc.MustUnmarshal(iterator.Value(), &cs) - states = append(states, cs) + height, err := strconv.ParseInt(string(iterator.Key()), 10, 64) + if err != nil { + return nil, errors.Wrapf(err, "failed to extract height from consensus state key") + } + + states = append(states, &types.ConsensusState{ + Height: height, + Cs: &cs, + }) } - return states + return states, nil } diff --git a/x/state-verifier/module.go b/x/state-verifier/module.go index a578dd568..0c2323bd4 100644 --- a/x/state-verifier/module.go +++ b/x/state-verifier/module.go @@ -1,4 +1,4 @@ -package state_verifier +package stateverifier import ( "context" @@ -76,7 +76,7 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingCo // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { - //types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) //nolint:errcheck + // types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) //nolint:errcheck } // GetTxCmd returns the root Tx command for the module. The subcommands of this root command are used by end-users to generate new transactions containing messages defined in the module @@ -85,7 +85,7 @@ func (a AppModuleBasic) GetTxCmd() *cobra.Command { } // GetQueryCmd returns the root query command for the module. The subcommands of this root command are used by end-users to generate new queries to the subset of the state defined by the module -//func (AppModuleBasic) GetQueryCmd() *cobra.Command { +// func (AppModuleBasic) GetQueryCmd() *cobra.Command { // return cli.GetQueryCmd(types.StoreKey) //} @@ -122,7 +122,7 @@ func (am AppModule) IsAppModule() { // marker // RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterQueryServer(cfg.QueryServer(), am.keeper) - //types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) + // types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) } // RegisterInvariants registers the invariants of the module. If an invariant deviates from its predicted value, the InvariantRegistry triggers appropriate logic (most often the chain will be halted) @@ -134,14 +134,14 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.Ra // Initialize global index to index in genesis state cdc.MustUnmarshalJSON(gs, &genState) - InitGenesis(ctx, *am.keeper, genState) + InitGenesis(ctx, am.keeper, genState) return []abci.ValidatorUpdate{} } // ExportGenesis returns the module's exported genesis state as raw JSON bytes. func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - genState := ExportGenesis(ctx, *am.keeper) + genState := ExportGenesis(ctx, am.keeper) return cdc.MustMarshalJSON(genState) } diff --git a/x/state-verifier/types/codec.go b/x/state-verifier/types/codec.go index b893e5e52..e16e3807f 100644 --- a/x/state-verifier/types/codec.go +++ b/x/state-verifier/types/codec.go @@ -13,5 +13,5 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { registry.RegisterImplementations( (*sdk.Msg)(nil), ) - //msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) + // msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } diff --git a/x/state-verifier/types/genesis.pb.go b/x/state-verifier/types/genesis.pb.go index a5b99cfdd..c0440e990 100644 --- a/x/state-verifier/types/genesis.pb.go +++ b/x/state-verifier/types/genesis.pb.go @@ -6,6 +6,7 @@ package types import ( fmt "fmt" proto "github.com/cosmos/gogoproto/proto" + _07_tendermint "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint" io "io" math "math" math_bits "math/bits" @@ -22,14 +23,67 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +type ConsensusState struct { + Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` + Cs *_07_tendermint.ConsensusState `protobuf:"bytes,2,opt,name=cs,proto3" json:"cs,omitempty"` +} + +func (m *ConsensusState) Reset() { *m = ConsensusState{} } +func (m *ConsensusState) String() string { return proto.CompactTextString(m) } +func (*ConsensusState) ProtoMessage() {} +func (*ConsensusState) Descriptor() ([]byte, []int) { + return fileDescriptor_45b0385b8dfa6591, []int{0} +} +func (m *ConsensusState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ConsensusState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ConsensusState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ConsensusState) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConsensusState.Merge(m, src) +} +func (m *ConsensusState) XXX_Size() int { + return m.Size() +} +func (m *ConsensusState) XXX_DiscardUnknown() { + xxx_messageInfo_ConsensusState.DiscardUnknown(m) +} + +var xxx_messageInfo_ConsensusState proto.InternalMessageInfo + +func (m *ConsensusState) GetHeight() int64 { + if m != nil { + return m.Height + } + return 0 +} + +func (m *ConsensusState) GetCs() *_07_tendermint.ConsensusState { + if m != nil { + return m.Cs + } + return nil +} + type GenesisState struct { + States []*ConsensusState `protobuf:"bytes,1,rep,name=states,proto3" json:"states,omitempty"` } func (m *GenesisState) Reset() { *m = GenesisState{} } func (m *GenesisState) String() string { return proto.CompactTextString(m) } func (*GenesisState) ProtoMessage() {} func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_45b0385b8dfa6591, []int{0} + return fileDescriptor_45b0385b8dfa6591, []int{1} } func (m *GenesisState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -58,7 +112,15 @@ func (m *GenesisState) XXX_DiscardUnknown() { var xxx_messageInfo_GenesisState proto.InternalMessageInfo +func (m *GenesisState) GetStates() []*ConsensusState { + if m != nil { + return m.States + } + return nil +} + func init() { + proto.RegisterType((*ConsensusState)(nil), "neutron.state_verifier.v1.ConsensusState") proto.RegisterType((*GenesisState)(nil), "neutron.state_verifier.v1.GenesisState") } @@ -67,17 +129,64 @@ func init() { } var fileDescriptor_45b0385b8dfa6591 = []byte{ - // 151 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xc9, 0x4b, 0x2d, 0x2d, - 0x29, 0xca, 0xcf, 0xd3, 0x2f, 0x2e, 0x49, 0x2c, 0x49, 0xd5, 0x2d, 0x4b, 0x2d, 0xca, 0x4c, 0xcb, - 0x4c, 0x2d, 0xd2, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, - 0x17, 0x92, 0x84, 0xaa, 0xd2, 0x03, 0xab, 0x8a, 0x87, 0xa9, 0xd2, 0x2b, 0x33, 0x54, 0xe2, 0xe3, - 0xe2, 0x71, 0x87, 0xa8, 0x0d, 0x06, 0xc9, 0x39, 0x05, 0x9d, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, - 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, - 0xb1, 0x1c, 0x43, 0x94, 0x45, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, - 0xd4, 0x3c, 0xdd, 0xfc, 0xa2, 0x74, 0x18, 0x5b, 0xbf, 0xcc, 0x54, 0xbf, 0x02, 0xdd, 0x19, 0x25, - 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0x60, 0x57, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf8, - 0xf8, 0x49, 0x78, 0xad, 0x00, 0x00, 0x00, + // 272 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x90, 0x31, 0x4b, 0xc3, 0x40, + 0x1c, 0xc5, 0x73, 0x29, 0x64, 0xb8, 0x8a, 0x43, 0x06, 0x89, 0x0e, 0x47, 0x28, 0x0e, 0x71, 0xe8, + 0x1d, 0xa9, 0x08, 0x4e, 0x82, 0x3a, 0x38, 0x1b, 0x37, 0x17, 0x31, 0xe7, 0xdf, 0xe4, 0xa0, 0xbd, + 0x2b, 0xf7, 0xbf, 0x04, 0xfd, 0x16, 0x7e, 0x2c, 0xc7, 0x8e, 0x8e, 0x92, 0x7c, 0x11, 0x69, 0x92, + 0x42, 0x2c, 0x74, 0xbb, 0x07, 0xef, 0x7e, 0xef, 0xff, 0x1e, 0x3d, 0xd7, 0x50, 0x39, 0x6b, 0xb4, + 0x40, 0xf7, 0xea, 0x60, 0x5e, 0x83, 0x55, 0xef, 0x0a, 0xac, 0x28, 0x40, 0x03, 0x2a, 0xe4, 0x6b, + 0x6b, 0x9c, 0x09, 0x4f, 0x07, 0x17, 0xef, 0x5c, 0x2f, 0x3b, 0x17, 0xaf, 0xd3, 0x33, 0xa1, 0x72, + 0x29, 0x96, 0xaa, 0x28, 0x9d, 0x5c, 0x2a, 0xd0, 0x0e, 0x85, 0x03, 0xfd, 0x06, 0x76, 0xa5, 0xb4, + 0x13, 0x75, 0x3a, 0x52, 0x3d, 0x6b, 0x56, 0xd2, 0xe3, 0x7b, 0xa3, 0x11, 0x34, 0x56, 0xf8, 0xb4, + 0xc5, 0x85, 0x27, 0x34, 0x28, 0x61, 0x4b, 0x88, 0x48, 0x4c, 0x92, 0x49, 0x36, 0xa8, 0xf0, 0x86, + 0xfa, 0x12, 0x23, 0x3f, 0x26, 0xc9, 0x74, 0xc1, 0xb9, 0xca, 0x25, 0x1f, 0xe7, 0xf0, 0x11, 0xb9, + 0x4e, 0xf9, 0x7f, 0x66, 0xe6, 0x4b, 0x9c, 0x3d, 0xd2, 0xa3, 0x87, 0xbe, 0x46, 0x9f, 0x73, 0x4b, + 0x83, 0xee, 0x7e, 0x8c, 0x48, 0x3c, 0x49, 0xa6, 0x8b, 0x0b, 0x7e, 0xb0, 0xd6, 0x3e, 0x6e, 0xf8, + 0x78, 0x97, 0x7d, 0x37, 0x8c, 0x6c, 0x1a, 0x46, 0x7e, 0x1b, 0x46, 0xbe, 0x5a, 0xe6, 0x6d, 0x5a, + 0xe6, 0xfd, 0xb4, 0xcc, 0x7b, 0xbe, 0x2e, 0x94, 0x2b, 0xab, 0x9c, 0x4b, 0xb3, 0x12, 0x03, 0x76, + 0x6e, 0x6c, 0xb1, 0x7b, 0x8b, 0xfa, 0x4a, 0x7c, 0xec, 0x8f, 0xec, 0x3e, 0xd7, 0x80, 0x79, 0xd0, + 0xed, 0x72, 0xf9, 0x17, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xda, 0xf5, 0x75, 0x8b, 0x01, 0x00, 0x00, +} + +func (m *ConsensusState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConsensusState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConsensusState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Cs != nil { + { + size, err := m.Cs.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Height != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -100,6 +209,20 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.States) > 0 { + for iNdEx := len(m.States) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.States[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } return len(dAtA) - i, nil } @@ -114,12 +237,34 @@ func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *ConsensusState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Height != 0 { + n += 1 + sovGenesis(uint64(m.Height)) + } + if m.Cs != nil { + l = m.Cs.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + return n +} + func (m *GenesisState) Size() (n int) { if m == nil { return 0 } var l int _ = l + if len(m.States) > 0 { + for _, e := range m.States { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } return n } @@ -129,6 +274,111 @@ func sovGenesis(x uint64) (n int) { func sozGenesis(x uint64) (n int) { return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (m *ConsensusState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConsensusState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConsensusState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + } + m.Height = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Height |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Cs == nil { + m.Cs = &_07_tendermint.ConsensusState{} + } + if err := m.Cs.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *GenesisState) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -158,6 +408,40 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field States", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.States = append(m.States, &ConsensusState{}) + if err := m.States[len(m.States)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) diff --git a/x/state-verifier/types/keys.go b/x/state-verifier/types/keys.go index 5850aaa22..36ea25bae 100644 --- a/x/state-verifier/types/keys.go +++ b/x/state-verifier/types/keys.go @@ -14,10 +14,12 @@ const ( prefixConsensusStateKey = iota + 1 ) -var ( - ConsensusStateKey = []byte{prefixConsensusStateKey} -) +var ConsensusStateKey = []byte{prefixConsensusStateKey} func GetConsensusStateKey(height int64) []byte { return append(ConsensusStateKey, []byte(strconv.FormatInt(height, 10))...) } + +func ExtractHeightFromConsensusStateKey(key []byte) (int64, error) { + return strconv.ParseInt(string(key[len(ConsensusStateKey):]), 10, 64) +} From be657684b4c95cab6ce60c1db2870e233ad08f45 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Tue, 29 Oct 2024 13:51:39 +0200 Subject: [PATCH 05/29] fmt --- x/state-verifier/genesis.go | 4 +--- x/state-verifier/module.go | 5 ++++- x/state-verifier/types/codec.go | 3 +-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/x/state-verifier/genesis.go b/x/state-verifier/genesis.go index 2b9af0a9d..0a73afffb 100644 --- a/x/state-verifier/genesis.go +++ b/x/state-verifier/genesis.go @@ -26,9 +26,7 @@ func ExportGenesis(ctx sdk.Context, k *keeper.Keeper) *types.GenesisState { panic(err) } - for _, cs := range allCs { - genesis.States = append(genesis.States, cs) - } + genesis.States = append(genesis.States, allCs...) return genesis } diff --git a/x/state-verifier/module.go b/x/state-verifier/module.go index 0c2323bd4..dde2a0221 100644 --- a/x/state-verifier/module.go +++ b/x/state-verifier/module.go @@ -76,7 +76,10 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingCo // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { - // types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) //nolint:errcheck + err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) + if err != nil { + panic(err) + } } // GetTxCmd returns the root Tx command for the module. The subcommands of this root command are used by end-users to generate new transactions containing messages defined in the module diff --git a/x/state-verifier/types/codec.go b/x/state-verifier/types/codec.go index e16e3807f..847679bb4 100644 --- a/x/state-verifier/types/codec.go +++ b/x/state-verifier/types/codec.go @@ -6,12 +6,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -func RegisterCodec(cdc *codec.LegacyAmino) { +func RegisterCodec(_ *codec.LegacyAmino) { } func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { registry.RegisterImplementations( (*sdk.Msg)(nil), ) - // msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } From 75d6eee259b3c18ea6c655701198e4c0781694b3 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Tue, 29 Oct 2024 14:04:10 +0200 Subject: [PATCH 06/29] fmt --- docs/static/swagger.yaml | 46 ++++++++++++++++++++++ proto/neutron/state-verifier/genesis.proto | 4 +- proto/neutron/state-verifier/query.proto | 4 +- x/state-verifier/keeper/keeper.go | 3 +- x/state-verifier/module.go | 5 --- 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/docs/static/swagger.yaml b/docs/static/swagger.yaml index bad25f7fc..cc7f58c4d 100644 --- a/docs/static/swagger.yaml +++ b/docs/static/swagger.yaml @@ -19635,6 +19635,11 @@ definitions: type: array type: object type: object + neutron.state_verifier.v1.QueryVerifyStateValuesResponse: + properties: + valid: + type: boolean + type: object osmosis.tokenfactory.Params: description: Params defines the parameters for the tokenfactory module. properties: @@ -45295,6 +45300,47 @@ paths: type: object tags: - Query + /neutron/state-verifier/verify_state_values: + get: + operationId: VerifyStateValues + parameters: + - format: uint64 + in: query + name: height + required: false + type: string + responses: + '200': + description: A successful response. + schema: + properties: + valid: + type: boolean + type: object + default: + description: An unexpected error response. + schema: + properties: + code: + format: int32 + type: integer + details: + items: + properties: + type_url: + type: string + value: + format: byte + type: string + type: object + type: array + error: + type: string + message: + type: string + type: object + tags: + - Query /osmosis/tokenfactory/v1beta1/denoms/factory/{creator}/{subdenom}/authority_metadata: get: operationId: DenomAuthorityMetadata diff --git a/proto/neutron/state-verifier/genesis.proto b/proto/neutron/state-verifier/genesis.proto index 10ff413f8..44c2c4cc1 100644 --- a/proto/neutron/state-verifier/genesis.proto +++ b/proto/neutron/state-verifier/genesis.proto @@ -1,10 +1,10 @@ syntax = "proto3"; package neutron.state_verifier.v1; -option go_package = "github.com/neutron-org/neutron/v5/x/state-verifier/types"; - import "ibc/lightclients/tendermint/v1/tendermint.proto"; +option go_package = "github.com/neutron-org/neutron/v5/x/state-verifier/types"; + message ConsensusState { int64 height = 1; ibc.lightclients.tendermint.v1.ConsensusState cs = 2; diff --git a/proto/neutron/state-verifier/query.proto b/proto/neutron/state-verifier/query.proto index 36a9a0971..d6994f496 100644 --- a/proto/neutron/state-verifier/query.proto +++ b/proto/neutron/state-verifier/query.proto @@ -1,8 +1,8 @@ syntax = "proto3"; package neutron.state_verifier.v1; -import "neutron/interchainqueries/tx.proto"; import "google/api/annotations.proto"; +import "neutron/interchainqueries/tx.proto"; option go_package = "github.com/neutron-org/neutron/v5/x/state-verifier/types"; @@ -19,4 +19,4 @@ message QueryVefiryStateValuesRequest { message QueryVerifyStateValuesResponse { bool valid = 1; -} \ No newline at end of file +} diff --git a/x/state-verifier/keeper/keeper.go b/x/state-verifier/keeper/keeper.go index 6d1e3f583..06b156479 100644 --- a/x/state-verifier/keeper/keeper.go +++ b/x/state-verifier/keeper/keeper.go @@ -2,7 +2,6 @@ package keeper import ( "context" - "encoding/json" "fmt" "strconv" @@ -102,7 +101,7 @@ func (k *Keeper) Verify(ctx sdk.Context, blockHeight int64, values []*types2.Sto } var cs tendermint.ConsensusState - if err := json.Unmarshal(csBz, &cs); err != nil { + if err := k.cdc.Unmarshal(csBz, &cs); err != nil { return errors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) } diff --git a/x/state-verifier/module.go b/x/state-verifier/module.go index dde2a0221..ed32a56c0 100644 --- a/x/state-verifier/module.go +++ b/x/state-verifier/module.go @@ -87,11 +87,6 @@ func (a AppModuleBasic) GetTxCmd() *cobra.Command { return nil } -// GetQueryCmd returns the root query command for the module. The subcommands of this root command are used by end-users to generate new queries to the subset of the state defined by the module -// func (AppModuleBasic) GetQueryCmd() *cobra.Command { -// return cli.GetQueryCmd(types.StoreKey) -//} - // ---------------------------------------------------------------------------- // AppModule // ---------------------------------------------------------------------------- From c8895e997c827d3ad8ca7d89af8e39c13330550d Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Tue, 29 Oct 2024 14:04:35 +0200 Subject: [PATCH 07/29] genesis test --- x/state-verifier/genesis_test.go | 67 ++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 x/state-verifier/genesis_test.go diff --git a/x/state-verifier/genesis_test.go b/x/state-verifier/genesis_test.go new file mode 100644 index 000000000..1fc461e69 --- /dev/null +++ b/x/state-verifier/genesis_test.go @@ -0,0 +1,67 @@ +package stateverifier_test + +import ( + "testing" + "time" + + ibccommitmenttypes "github.com/cosmos/ibc-go/v8/modules/core/23-commitment/types" + tendermint "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint" + "github.com/stretchr/testify/suite" + + "github.com/neutron-org/neutron/v5/testutil/apptesting" + stateverifier "github.com/neutron-org/neutron/v5/x/state-verifier" + "github.com/neutron-org/neutron/v5/x/state-verifier/types" +) + +type GenesisTestSuite struct { + apptesting.KeeperTestHelper +} + +func TestGenesisTestSuite(t *testing.T) { + suite.Run(t, new(GenesisTestSuite)) +} + +func (suite *GenesisTestSuite) SetupTest() { + suite.Setup() +} + +func (suite *GenesisTestSuite) TestInitExportGenesis() { + states := []*types.ConsensusState{ + { + Height: 1, + Cs: &tendermint.ConsensusState{ + Timestamp: time.Now().UTC(), + Root: ibccommitmenttypes.MerkleRoot{Hash: []byte("MerkleRoot")}, + NextValidatorsHash: []byte("qqqqqqqqq"), + }, + }, + { + Height: 2, + Cs: &tendermint.ConsensusState{ + Timestamp: time.Now().UTC(), + Root: ibccommitmenttypes.MerkleRoot{Hash: []byte("oafpaosfsdf")}, + NextValidatorsHash: []byte("sdfsdfsdf"), + }, + }, + { + Height: 3, + Cs: &tendermint.ConsensusState{ + Timestamp: time.Now().UTC(), + Root: ibccommitmenttypes.MerkleRoot{Hash: []byte("okjdfhjsdfsdf")}, + NextValidatorsHash: []byte("irhweiriweyrwe"), + }, + }, + } + suite.SetupTest() + k := suite.App.StateVerifierKeeper + + initialGenesis := types.GenesisState{ + States: states, + } + + stateverifier.InitGenesis(suite.Ctx, k, initialGenesis) + + exportedGenesis := stateverifier.ExportGenesis(suite.Ctx, k) + + suite.Require().EqualValues(initialGenesis, *exportedGenesis) +} From b301c9812078c688eda2f70dcbb60e56c7a68148 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 1 Nov 2024 15:45:06 +0200 Subject: [PATCH 08/29] whitelist query --- wasmbinding/stargate_allowlist.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/wasmbinding/stargate_allowlist.go b/wasmbinding/stargate_allowlist.go index 1364c94a4..00702a2b1 100644 --- a/wasmbinding/stargate_allowlist.go +++ b/wasmbinding/stargate_allowlist.go @@ -13,13 +13,13 @@ import ( marketmaptypes "github.com/skip-mev/slinky/x/marketmap/types" oracletypes "github.com/skip-mev/slinky/x/oracle/types" - dynamicfeestypes "github.com/neutron-org/neutron/v5/x/dynamicfees/types" - crontypes "github.com/neutron-org/neutron/v5/x/cron/types" dextypes "github.com/neutron-org/neutron/v5/x/dex/types" + dynamicfeestypes "github.com/neutron-org/neutron/v5/x/dynamicfees/types" feeburnertypes "github.com/neutron-org/neutron/v5/x/feeburner/types" interchainqueriestypes "github.com/neutron-org/neutron/v5/x/interchainqueries/types" interchaintxstypes "github.com/neutron-org/neutron/v5/x/interchaintxs/types" + stateverifiertypes "github.com/neutron-org/neutron/v5/x/state-verifier/types" tokenfactorytypes "github.com/neutron-org/neutron/v5/x/tokenfactory/types" ) @@ -118,5 +118,8 @@ func AcceptedStargateQueries() wasmkeeper.AcceptedQueries { // dynamicfees "neutron.dynamicfees.v1.Query/Params": &dynamicfeestypes.QueryParamsResponse{}, + + // state verifier + "/neutron.state_verifier.v1.Query/VerifyStateValues": &stateverifiertypes.QueryVerifyStateValuesResponse{}, } } From e67616544bd3cd42e1a3860283ddd299bdc83856 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 1 Nov 2024 16:53:27 +0200 Subject: [PATCH 09/29] README.md --- go.sum | 452 +++++++++++++++++++++ proto/neutron/state-verifier/genesis.proto | 2 + proto/neutron/state-verifier/query.proto | 5 +- x/state-verifier/README.md | 31 ++ x/state-verifier/keeper/keeper.go | 28 +- x/state-verifier/keeper/query.go | 18 + x/state-verifier/types/genesis.pb.go | 1 + x/state-verifier/types/query.pb.go | 108 ++--- x/state-verifier/types/query.pb.gw.go | 4 +- 9 files changed, 576 insertions(+), 73 deletions(-) create mode 100644 x/state-verifier/README.md create mode 100644 x/state-verifier/keeper/query.go diff --git a/go.sum b/go.sum index fd664db6f..c9ba23cee 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,6 @@ +4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= +4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= +cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -32,26 +35,42 @@ cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34h cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= +cloud.google.com/go/accessapproval v1.7.8/go.mod h1:7xkMRHJmgTAb08b6mKdyYTfPBTwiw4XvnI1l+jTvrdk= +cloud.google.com/go/accesscontextmanager v1.8.8/go.mod h1:XmIMhWxcTG9GTEAOBm3geKRKdVxM35FY10FSBS8zaDs= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.68.0/go.mod h1:105MFA3svHjC3Oazl7yjXAmIR89LKhRAeNdnDKJczME= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.23.3/go.mod h1:oZsWmFn+JlADKC2gc6/LYXYPh6gx+K14tymvQuT3sS4= +cloud.google.com/go/apigateway v1.6.8/go.mod h1:j383LuqwSSi7WFJwQj8zRTsU9vCiR+GkWUHlJ6GerR0= +cloud.google.com/go/apigeeconnect v1.6.8/go.mod h1:+XjRq6uKsjrswBCZf+BCWY7u0gJ9mRP9c34qqGVQBAw= +cloud.google.com/go/apigeeregistry v0.8.6/go.mod h1:Pvk3LJqhxKgkTyynwYK7MuJCbkTG0/JbisSazyu77FM= +cloud.google.com/go/appengine v1.8.8/go.mod h1:l9QQeNodTtyhYz8Sd3cTZrocgj4y7yap5t6b9XD74HQ= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.8.8/go.mod h1:L/VYdKO0xpgWvRgVwH4fiGIN2wBuBGHu15bSs1FnSRw= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.14.10/go.mod h1:i1jzotcdypXuEx6oG7+y0moY7TWR+wBaOu6VA3fGefU= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.19.2/go.mod h1:JJbMl9L3cWvgiBC0vRUl/uUJ1KLJD1zw4pKRsV/wQSI= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.11.8/go.mod h1:VDrDAh06vxYbpTJQEcZf9ueXb2S++Bm3F2Tw+liBJBk= cloud.google.com/go/auth v0.6.0 h1:5x+d6b5zdezZ7gmLWD1m/xNjnaQ2YDhmIz/HH3doy1g= cloud.google.com/go/auth v0.6.0/go.mod h1:b4acV+jLQDyjwm4OXHYjNvRi4jvGBzHWJRtJcy+2P4g= cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.13.8/go.mod h1:8O5i0OHiqRSnucux40rSMOfnBIarGxLMTQMOjpGxbB8= +cloud.google.com/go/baremetalsolution v1.2.7/go.mod h1:KvhbjdZzE1SR/GpgsE90pNWiglDY1vjzClYHB3NZseE= +cloud.google.com/go/batch v1.8.8/go.mod h1:PvTk3Rq5mf6RFcQtF9MZEsv9LG9aUjlUuqlq6IJ866o= +cloud.google.com/go/beyondcorp v1.0.7/go.mod h1:qiWZ0SIhhAB7wn5Vun0bNKdexl596QclVwWEUL+keK8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -59,12 +78,20 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.61.0/go.mod h1:PjZUje0IocbuTOdq4DBOJLNYB0WF3pAKBHzAYyxCwFo= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.18.6/go.mod h1:3aQtpAKmI0wPI4Dcele7cp87jg59EjOA37y7iGrRLIc= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.8.4/go.mod h1:q0t7+U6A4mv7UAtps89kiJ8TlSAIACUJABZH7jE+7uk= +cloud.google.com/go/certificatemanager v1.8.2/go.mod h1:x/OhbhxXrbAzPfLLN/tECrkgfnfg6qr6decH1V21/kQ= +cloud.google.com/go/channel v1.17.8/go.mod h1:xWbsExBg6rzMyUtQa2oaX8n3sdROQuWXLNoZp8X7ssI= +cloud.google.com/go/cloudbuild v1.16.2/go.mod h1:CJuhrizzeQ79ryNUO0d227lHf5lqigvDngl4hvYwXiw= +cloud.google.com/go/clouddms v1.7.7/go.mod h1:ikAo+Ekli1/xPaZvuP/9rmsgd34oEk6OndgNEdC2KRA= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.12.9/go.mod h1:ep1IV7Vud6LNy9JjJiYCcb/or8SO2h/He1gPQgF5Uqw= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -72,99 +99,174 @@ 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.27.1/go.mod h1:UVWm+bWKEKoM+PW2sZycP1Jgk3NhKwR2Iy2Cnp/G40I= cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +cloud.google.com/go/contactcenterinsights v1.13.3/go.mod h1:W7J0KTaHlvbL4l0ZkoTmgkKRPN3LxkdGSVQnv2CQ9js= +cloud.google.com/go/container v1.37.1/go.mod h1:8zwisvfdwqsXB/0TSxoUhTrfTrlfDV0pK9hcDtyFQ1c= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.11.7/go.mod h1:1xt9ZDhrB9py0gThDIg0Lq6AXVsFHKbXKYlqNAVhjcc= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.20.2/go.mod h1:OfoVR0QchMp2iwull28uaCkXsULClrVCe/Y5aBhwJpg= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.9.8/go.mod h1:0doO1EqzYcU/EAt/BsCZl+iOd9i/FwNGon6IgDBxAJU= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.9.5/go.mod h1:5FCHfsQNNmVvQJeI5XP7ftiOPlgHmYz4NUUhmCPrHag= +cloud.google.com/go/datafusion v1.7.8/go.mod h1:VVkTWac1XVCVdf2nzlU68OvoDO7uc0E58pR1Q5zq8JQ= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.8.8/go.mod h1:68L3luQpu2/KIQxK+B8ChR7c8id8wT7/txJNddsHpq0= +cloud.google.com/go/dataplex v1.17.0/go.mod h1:pSJPr0n+iu2/YKre2cRDwvdLrVg8EwGg483LB0AxA/g= +cloud.google.com/go/dataproc/v2 v2.5.0/go.mod h1:VV8BisKb9NpQsd/8XOriS5K0wpIlecTBrBm0ntvQ/g0= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.8.8/go.mod h1:DXb55JvGZN6EH3gvwu0JEbJvadxXOGL6grkhqP9y3QA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.17.1/go.mod h1:mtzZ2HcVtz90OVrEXXGDc2pO4NM1kiBQy8YV4qGe0ZM= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.10.7/go.mod h1:wNlOxMpOCP/uaV+0O0PC5wlCmpHGDUhyRGQ5RBZAvSw= +cloud.google.com/go/deploy v1.19.1/go.mod h1:y2DyvlK02aUlUFjDwTbEfOMTH29IGAjSniSGw+MceVM= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.54.1/go.mod h1:SDAvjPxEwb+DTRlxkCu0B5qilt0HtaV2GeoUBysvgCQ= +cloud.google.com/go/dlp v1.14.1/go.mod h1:nY5sIxqHm2APxYUpAoq8xOMtHLjFyBYUNbYjjnBptqY= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.30.2/go.mod h1:nMh79XZZ6dkXWZlh60vmyFPf9AySGM0QCYFJA39I2IU= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.9.8/go.mod h1:CJzupa3+HxdkCSn6hXu0tcdcsbZS2ZNK1zfSA+FqfPM= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v1.2.2/go.mod h1:PwFM/JBBTJ1pXSNNHD+NCMEhZylPOy1FCXuYCbl7ACk= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.6.9/go.mod h1:wS/7YcnVzn82DqBv9lOQoHZpWOdgwGbWk02QH1460dU= +cloud.google.com/go/eventarc v1.13.7/go.mod h1:yslFvubtw7PovgFr/Gg8GrqcOfJBAU4D5Qveds4vOzA= +cloud.google.com/go/filestore v1.8.4/go.mod h1:GnZEiebr0Eru+BALoYDsuOyqSzM4EV7n5HpCaXT0RT8= +cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.16.3/go.mod h1:Uk3Bu1mv6+f27PHh+yOjMAMB0u4LRkn7dxsdHBZmPKM= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gkebackup v1.5.1/go.mod h1:FCz8M70up0yEwLXBmVJRckYoOh9x/eTo8aymJcdrMu4= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.8.8/go.mod h1:S3UvXOu5vxZmeBU8YkpHMbcjsi9d0HDuJ+fB6ofHwKs= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.14.8/go.mod h1:Tdd33Wg3Jeehu4mIt9Fkm/ryy5wtJ8a3bjnzEnuY8UU= +cloud.google.com/go/gkemulticloud v1.2.1/go.mod h1:9VT+++rL2+x7o9+hc0R4CO4ywFzqlvISPZxPM93p+pw= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.6.8/go.mod h1:hxW23+rb48hDo82PVJJzWCHyOy7AyqgnZ8SnEUovIAE= 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.9 h1:oSkYLVtVme29uGYrOcKcvJRht7cHJpYD09GM9JaR0TE= cloud.google.com/go/iam v1.1.9/go.mod h1:Nt1eDWNYH9nGQg3d/mY7U1hvfGmsaG9o/kLGoLoLXjQ= +cloud.google.com/go/iap v1.9.7/go.mod h1:H/hF8BM9BMHRoHek60UMnJcNZpnMLdQYwc1L4OvFomk= +cloud.google.com/go/ids v1.4.8/go.mod h1:uW399c5bbwB5/YykcO2uQNwl3l+r6oMPEN2p9BmxCTY= +cloud.google.com/go/iot v1.7.8/go.mod h1:WKcw6vyfKlHKWdT3Sht8IhcK2iMydEK0Qv4Mwy3p1ms= +cloud.google.com/go/kms v1.18.1/go.mod h1:fOsmW0fzDVYXM0AOJWmpB0gFVOVgC33giwYi0kcTdBA= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.12.6/go.mod h1:zbac+SstgMxDAOY5iCMeq5mKNkEYjposny9ZpdVUhMU= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.9.8/go.mod h1:3wKB6HF0My17uQ+bnReWumKiDksYnV3ItF4+bAA6IbQ= +cloud.google.com/go/logging v1.10.0/go.mod h1:EHOwcxlltJrYGqMGfghSet736KR3hX1MAj614mrMk9I= +cloud.google.com/go/longrunning v0.5.8/go.mod h1:oJDErR/mm5h44gzsfjQlxd6jyjFvuBPOxR1TLy2+cQk= +cloud.google.com/go/managedidentities v1.6.8/go.mod h1:Gl4bBPT4LV1vwWMHp+RNBWJA7P8e5bArg0YDbdERB3o= +cloud.google.com/go/maps v1.11.2/go.mod h1:YzCIVDLDAAZQt+sTl+hZxanOmKc4v8aFSWZfxMdKAqw= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.8.8/go.mod h1:/2BevZygMTb57aSW5xxDnFkl/ohrs8T8O2+f5qGhMsE= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.10.8/go.mod h1:ryDp9chCUWXkTYYNiTEE0o/RBjGrcThZ/EOb+iW/TMo= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.13.7/go.mod h1:eQA2VqSDe1ooVQs8hteKUCBYf3wRlMAJiXZ+ru3QpnU= +cloud.google.com/go/monitoring v1.20.0/go.mod h1:5oUy5KllE4yxpztDJuzq/VVck0Q0cn/ykC98C9MXux0= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.14.7/go.mod h1:hdX86Gs4t3ZDv91Q7XFOxtWd9hcpkmZgVFoRoLDNsrU= +cloud.google.com/go/networkmanagement v1.13.3/go.mod h1:UVyvulpb1cOu2DfAHkxOGJTBVOC7nxjhaCKi3HMm70I= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.9.8/go.mod h1:8wCm5we0Aqf9ORfCUunupx5ipdfGFTL+PTTkYoBIFjE= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.11.6/go.mod h1:JoKKqNBlcs2f2K4L/Ao6FAUZI0Yw0j2cZOSRQFcHk8Q= +cloud.google.com/go/optimization v1.6.6/go.mod h1:qFLRJ5h7HD9YydjM8F+uKkU++MHCvrGyakgiHSkL1KE= +cloud.google.com/go/orchestration v1.9.3/go.mod h1:6cOnot26ereouYWqhm5k8fX1dysq+e71bEjYro+8RYA= +cloud.google.com/go/orgpolicy v1.12.4/go.mod h1:lHr1a8OmY3aA+WMvNyX+ckZ47r5vp+NI1eeC0zKTQCs= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.12.8/go.mod h1:GF1mHXXkpBlMhuHkZo58PPtbMEVapeNvT/wLYwjR+5g= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.13.4/go.mod h1:ae2K89lAr0zkWP7CCqdGiCBZTis1ymCM0xhmpUfaQYY= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.8.8/go.mod h1:TjMWRJeTs/3TAVCuzhp6oQ+ng8FWz7PKmgJ8b2+eXkM= +cloud.google.com/go/policytroubleshooter v1.10.6/go.mod h1:mEYX75+EvMAoJVNqpJ88hcZjPiUTmOsjlaGpDu/ZrD0= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.9.8/go.mod h1:ki1VWJTD/fSDJibXDmrm9Mn+Tzrl3sQZq4pZh3VBU+c= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.40.0/go.mod h1:BVJI4sI2FyXp36KFKvFwcfDRDfR8MiLT8mMhmIhdAeA= +cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.13.1/go.mod h1:z7FFKUnrk8oKc5WwLnuj6ae3uOjZGYY7tf4FIRjQD3Y= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.8.8/go.mod h1:XHm+7adVfxfllhSTUbKyhdqzFyk15lbeCqaULzpT5LM= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.12.4/go.mod h1:ZA02CeWOdH3Pw377pofqtdrIkN+Wh4vnZdDHl08KR/c= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.16.1/go.mod h1:KI+VIUVSXZUmbCkhCbbGitRqZGLmlz9BAhAyHgBTRE4= +cloud.google.com/go/resourcemanager v1.9.8/go.mod h1:L3cVnfsZ1Wsw4f9hBNmZ7O1/ahJRPn8Ltg03ifaqsIw= +cloud.google.com/go/resourcesettings v1.7.1/go.mod h1:f2WI2DpFghwCHYfyht0vMX2UKqJ9FRbXixXHBT3BmFQ= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.17.1/go.mod h1:UXtxpeokEUhbMRgq2dJH08Z5QTZgRzYR6sGES87xDkA= +cloud.google.com/go/run v1.3.8/go.mod h1:dFsJfGTEVGW37sCqzJ/kLMmRS2/wfwGsUMOEuv0ryL0= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.10.9/go.mod h1:nhiBshhr2jJggklptGgj33DF+aQ3/4CWaTeazS/8Qm0= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.13.2/go.mod h1:rB3lORY7QZrjACov35PX0KXMM0bKlbkL0/eFlS312wk= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.17.1/go.mod h1:i/v+U4Jxs8mTFXmB/eYIYBdRl7mFmeo3VrcFw+r6e9o= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.31.0/go.mod h1:6nVpMYo9Q02wR7ql1L17R1vE2KNvcooSkyKoJWB4Ox4= cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.11.8/go.mod h1:BCapDXmWzKx42Ffd/j8q7m5GNIH0JkolKhwK2quAm94= +cloud.google.com/go/shell v1.7.8/go.mod h1:07qTjW9lCuFbkb2G0hzqvNELK5nwT5aSsn6Own/a5bE= +cloud.google.com/go/spanner v1.64.0/go.mod h1:TOFx3pb2UwPsDGlE1gTehW+y6YlU4IFk+VdDHSGQS/M= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.23.2/go.mod h1:U3p1TXiaFNMw/bs593/9cx6zehLkhcxx1aTMMnMgefM= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -175,17 +277,32 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.41.0 h1:RusiwatSu6lHeEXe3kglxakAmAbfV+rhtPqA6i8RBx0= cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80= +cloud.google.com/go/storagetransfer v1.10.7/go.mod h1:vc58NUgvigCZtNvmnMPir9QSsOri8yfOIpL4KvNsnnw= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.6.9/go.mod h1:wvqO09RhWW8EfZBPcG/2FRT9SDbi2vsVXfV+jMzJD/w= +cloud.google.com/go/texttospeech v1.7.8/go.mod h1:ynSE4aBS/J/hwi8U8Aa+gwtOlwwCeymOniUSrx4eYyg= +cloud.google.com/go/tpu v1.6.8/go.mod h1:+u/GrLBfe2MAf33D9cyU36dOy7XKtfar4IRrO2k5rCI= +cloud.google.com/go/trace v1.10.8/go.mod h1:zu8PHOoxf4f4qUl81OFdVn02fmje7v79wo57Fz7oIPo= +cloud.google.com/go/translate v1.10.4/go.mod h1:8zF+IIQKPtqi2ebyISjgZDwj095cceaj0dDX2mI9WiU= +cloud.google.com/go/video v1.21.1/go.mod h1:m5bJKcdJ9sKTMJO6EWmtLXhmvEWbrDSSmzpo2sxTP9c= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.11.8/go.mod h1:pwQD5fVcMPPAcovgt+ywF1OaLD+V1EDxG7RX4Q+1r4k= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.8.3/go.mod h1:MeN2uM4T5MSOULtIIJEW/Ymr6It6eSP0ZdqCGuGKFXw= +cloud.google.com/go/vmmigration v1.7.8/go.mod h1:ARowCnYGN1+cFTdMR6FMsUSHuC2v1PmLRM35JfanA8c= +cloud.google.com/go/vmwareengine v1.1.4/go.mod h1:v+UndgfEEMePkZ8eXqzzFODipi/ls657S3MoSLI9JZ4= +cloud.google.com/go/vpcaccess v1.7.8/go.mod h1:fOd55qBAQiAFPA/hYwnOWgYNjcbvRMxd0rLvvojH/nU= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.9.8/go.mod h1:ywUL9x0E81fft6TYggLWc+HUaCkuhMBl/RHnG8q5d5M= +cloud.google.com/go/websecurityscanner v1.6.8/go.mod h1:VyEfLCEjX9PN6mhOzuuuIVKHQ9FLHPKsbSg+KxzTW8k= 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= +cloud.google.com/go/workflows v1.12.7/go.mod h1:W33pjrwjgNIDBYY5xdQfHeUxE3icFjO5x7Fh9kA4P2M= cosmossdk.io/api v0.7.5 h1:eMPTReoNmGUm8DeiQL9DyM8sYDjEhWzL1+nLbI9DqtQ= cosmossdk.io/api v0.7.5/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= cosmossdk.io/client/v2 v2.0.0-beta.4 h1:LGIzWbVTOof/IHQZeoWwxPX0fq607ONXhsfA7eUrQIg= @@ -204,6 +321,7 @@ cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= cosmossdk.io/store v1.1.0 h1:LnKwgYMc9BInn9PhpTFEQVbL9UK475G2H911CGGnWHk= cosmossdk.io/store v1.1.0/go.mod h1:oZfW/4Fc/zYqu3JmQcQdUJ3fqu5vnYTn3LZFFy8P8ng= +cosmossdk.io/tools/confix v0.1.2/go.mod h1:7XfcbK9sC/KNgVGxgLM0BrFbVcR/+6Dg7MFfpx7duYo= cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= cosmossdk.io/x/circuit v0.1.1/go.mod h1:B6f/urRuQH8gjt4eLIXfZJucrbreuYrKh5CSjaOxr+Q= cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= @@ -216,53 +334,93 @@ cosmossdk.io/x/tx v0.13.5 h1:FdnU+MdmFWn1pTsbfU0OCf2u6mJ8cqc1H4OMG418MLw= cosmossdk.io/x/tx v0.13.5/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= cosmossdk.io/x/upgrade v0.1.4 h1:/BWJim24QHoXde8Bc64/2BSEB6W4eTydq0X/2f8+g38= cosmossdk.io/x/upgrade v0.1.4/go.mod h1:9v0Aj+fs97O+Ztw+tG3/tp5JSlrmT7IcFhAebQHmOPo= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/4meepo/tagalign v1.3.4/go.mod h1:M+pnkHH2vG8+qhE5bVc/zeP7HS/j910Fwa9TUSyZVI0= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/Abirdcfly/dupword v0.0.14/go.mod h1:VKDAbxdY8YbKUByLGg8EETzYSuC4crm9WwI6Y3S0cLI= +github.com/Antonboom/errname v0.1.13/go.mod h1:uWyefRYRN54lBg6HseYCFhs6Qjcy41Y3Jl/dVhA87Ns= +github.com/Antonboom/nilnil v0.1.9/go.mod h1:iGe2rYwCq5/Me1khrysB4nwI7swQvjclR8/YRPl5ihQ= +github.com/Antonboom/testifylint v1.3.1/go.mod h1:NV0hTlteCkViPW9mSR4wEMfwp+Hs1T3dY60bkvSfhpM= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/CosmWasm/wasmvm/v2 v2.1.3 h1:CSJTauZqkHyb9yic6JVYCjiGUgxI2MJV2QzfSu8m49c= github.com/CosmWasm/wasmvm/v2 v2.1.3/go.mod h1:bMhLQL4Yp9CzJi9A83aR7VO9wockOsSlZbT4ztOl6bg= +github.com/Crocmagnon/fatcontext v0.2.2/go.mod h1:WSn/c/+MMNiD8Pri0ahRj0o9jVpeowzavOQplBJw6u0= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0/go.mod h1:ONJg5sxcbsdQQ4pOW8TGdTidT2TMAUy/2Xhr8mrYaao= +github.com/GeertJohan/go.rice v1.0.3/go.mod h1:XVdrU4pW00M4ikZed5q56tPf1v2KwnIKeIdc9CBYNt4= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= +github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= 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 v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= 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/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/assert/v2 v2.6.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/go-check-sumtype v0.1.4/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alexkohler/nakedret/v2 v2.0.4/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= +github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= 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/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= +github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.224 h1:09CiaaF35nRmxrzWZ2uRq5v6Ghg/d2RiPjZnSgtt+RQ= github.com/aws/aws-sdk-go v1.44.224/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -275,6 +433,13 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2 github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= +github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= +github.com/bombsimon/wsl/v4 v4.2.1/go.mod h1:Xu/kDxGZTofQcDGCtQe9KCzhHphIe0fDuyWTxER9Feo= +github.com/breml/bidichk v0.2.7/go.mod h1:YodjipAGI9fGcYM7II6wFvGhdMYsC5pHDlGzqvEW3tQ= +github.com/breml/errchkjson v0.3.6/go.mod h1:jhSDoFheAF2RSDOlCfhHO9KqhZgAYLyvHe7bRCX8f/U= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= @@ -282,6 +447,7 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= @@ -292,20 +458,32 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/bufbuild/buf v1.15.1/go.mod h1:TQeGKam1QMfHy/xsSnnMpxN3JK5HBb6aNvZj4m52gkE= +github.com/bufbuild/connect-go v1.5.2/go.mod h1:GmMJYR6orFqD0Y6ZgX8pwQ8j9baizDrIQMm1/a6LnHk= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA= +github.com/butuzov/mirror v1.2.0/go.mod h1:DqZZDtzm42wIAIyHXeN8W/qb1EPlb9Qn/if9icBOpdQ= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/catenacyber/perfsprint v0.7.1/go.mod h1:/wclWYompEyjUD2FuIIDVKNkqz7IgBIWXIH3V0Zol50= +github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= +github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= +github.com/chigopher/pathlib v0.19.1/go.mod h1:tzC1dZLW8o33UQpWkNkhvPwL5n4yyFRFm/jL1YGWFvY= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= @@ -317,8 +495,11 @@ github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/ckaznocha/intrange v0.1.2/go.mod h1:RWffCw/vKBwHeOEwWdCikAtY0q4gGt8VhJZEEA5n+RE= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -328,6 +509,7 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -343,16 +525,21 @@ github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcR github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/cometbft/cometbft v0.38.11 h1:6bNDUB8/xq4uYonYwIfGc9OqK1ZH4NkdaMmR1LZIJqk= github.com/cometbft/cometbft v0.38.11/go.mod h1:jHPx9vQpWzPHEAiYI/7EDKaB1NXhK6o3SArrrY8ExKc= github.com/cometbft/cometbft-db v0.12.0 h1:v77/z0VyfSU7k682IzZeZPFZrQAKiQwkqGN0QzAjMi0= github.com/cometbft/cometbft-db v0.12.0/go.mod h1:aX2NbCrjNVd2ZajYxt1BsiFf/Z+TQ2MN0VxdicheYuw= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -389,8 +576,15 @@ github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5n github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= 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.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creachadair/atomicfile v0.3.3/go.mod h1:X1r9P4wigJlGkYJO1HXZREdkVn+b1yHrsBBMLSj7tak= +github.com/creachadair/tomledit v0.0.26/go.mod h1:SJi1OxKpMyR141tq1lzsbPtIg3j8TeVPM/ZftfieD7o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/daaku/go.zipexe v1.0.2/go.mod h1:5xWogtqlYnfBXkSB1o9xysukNP9GTvaNkqzUZbt3Bw8= +github.com/daixiang0/gci v0.13.4/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -398,13 +592,16 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs 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/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8BzuWsEs= github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= @@ -415,6 +612,10 @@ 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/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v23.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -429,8 +630,10 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -441,13 +644,27 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= 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/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.7/go.mod h1:Mq0biU2jbdmKSZoqOj29017ygFrMnB5/Rifwp980W4o= +github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= 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.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/firefart/nonamedreturns v1.0.5/go.mod h1:gHJjDqhGM4WyPt639SOZs+G89Ko7QKH5R5BhnO6xJhw= +github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -458,17 +675,28 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/gagliardetto/binary v0.8.0/go.mod h1:2tfj51g5o9dnvsc+fL3Jxr22MuWzYXwx9wEoN0XQ7/c= +github.com/gagliardetto/solana-go v1.11.0/go.mod h1:afBEcIRrDLJst3lvAahTr63m6W2Ns6dajZxe2irF7Jg= +github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghostiam/protogetter v0.3.6/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-critic/go-critic v0.11.4/go.mod h1:2QAdo4iuLik5S9YG0rT4wcZ8QxwHYkrr6/2MWAiv/vc= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -490,6 +718,8 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= @@ -502,6 +732,17 @@ github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJ github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= +github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= +github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= +github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= +github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= +github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= +github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= +github.com/go-viper/mapstructure/v2 v2.0.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= @@ -515,10 +756,15 @@ github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG 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= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= 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/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= @@ -563,6 +809,18 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= +github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e/go.mod h1:Pm5KhLPA8gSnQwrQ6ukebRcapGb/BG9iUkdaiCcGHJM= +github.com/golangci/golangci-lint v1.59.1/go.mod h1:jX5Oif4C7P0j9++YB2MMJmoNrb01NJ8ITqKWNLewThg= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= +github.com/golangci/modinfo v0.3.4/go.mod h1:wytF1M5xl9u0ij8YSvhkEVPP3M5Mc7XLl1pxH3B2aUM= +github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= +github.com/golangci/revgrep v0.5.3/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= @@ -586,6 +844,8 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN 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= +github.com/google/go-containerregistry v0.13.0/go.mod h1:J9FQ+eSS4a1aC2GNZxvNpbWhgp0487v+cgiilB4FqDo= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -613,6 +873,7 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -638,18 +899,27 @@ github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMd github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= 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.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/rpc v1.2.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -662,9 +932,12 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjw github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -680,10 +953,12 @@ github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYS github.com/hashicorp/go-metrics v0.5.3/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-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= 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= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -709,16 +984,22 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/holiman/uint256 v1.3.0/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= @@ -731,10 +1012,21 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/informalsystems/itf-go v0.0.1/go.mod h1:wgqaQ/yl2kbNlgw6GaleuHEefpZvkZo6Hc0jc8cGG9M= +github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= +github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= 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/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jjti/go-spancheck v0.6.1/go.mod h1:vF1QkOO159prdo6mHRxak2CpzDpHAfKiPUDP/NeRnX8= 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= @@ -743,6 +1035,7 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -757,16 +1050,30 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= +github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= +github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= +github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= +github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= +github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -775,22 +1082,40 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= +github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= +github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/lasiar/canonicalheader v1.1.1/go.mod h1:cXkb3Dlk6XXy+8MVQnF23CYKWlyA7kfQhSw2CcZtZb0= +github.com/ldez/gomoddirectives v0.2.4/go.mod h1:oWu9i62VcQDYp9EQ0ONTfqLNh+mDLWWDO+SO0qSQw5g= +github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= 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.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= +github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= +github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= @@ -806,8 +1131,15 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +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/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= +github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mgechev/revive v1.3.7/go.mod h1:RJ16jUbF0OWC3co/+XTxmFNgEpUPwnnA0BRllX2aDNA= +github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -823,6 +1155,8 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -830,6 +1164,10 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1/go.mod h1:ye2e/VUEtE2BHE+G/QcKkcLQVAEJoYRFj5VUOQatCRE= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -838,13 +1176,19 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt/v2 v2.2.1-0.20220330180145-442af02fd36a/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats-server/v2 v2.8.4/go.mod h1:8zZa+Al3WsESfmgSs98Fi06dRWLH5Bnq90m5bKD/eT4= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nats.go v1.34.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/neutron-org/admin-module/v2 v2.0.2 h1:XDDFWjvkVBKRf3lBFCazT1zAXZ3dHX8GaZ4ol8Hdk8I= github.com/neutron-org/admin-module/v2 v2.0.2/go.mod h1:RfOyabXsdJ5btcOKyKPZDYiZhtuKFubbJMOb8EJZtvA= github.com/neutron-org/cosmos-sdk v0.50.9-neutron.0.20240924163649-207f347e9c53 h1:7FJOHOt9F0oea0b5jrn090u/zn7+LdBmT6ZDmrJtTqs= @@ -852,6 +1196,9 @@ github.com/neutron-org/cosmos-sdk v0.50.9-neutron.0.20240924163649-207f347e9c53/ github.com/neutron-org/wasmd v0.53.0-neutron h1:Dv1VP1+QjYeb6RMo03sxw0Pe42JU0MPxefwNaG22KVs= github.com/neutron-org/wasmd v0.53.0-neutron/go.mod h1:FJl/aWjdpGof3usAMFQpDe07Rkx77PUzp0cygFMOvtw= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nunnatsa/ginkgolinter v0.16.2/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ= 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= @@ -862,6 +1209,7 @@ github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQ github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= @@ -885,10 +1233,12 @@ github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/oxyno-zeta/gomock-extra-matcher v1.2.0 h1:WPEclU0y0PMwUzdDcaKZvld4aXpa3fkzjiUMQdcBEHg= @@ -901,6 +1251,7 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCRJjJzl4udgEf7hawInF9texMeO2jrU= github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= @@ -908,15 +1259,21 @@ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= +github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= 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= +github.com/polyfloyd/go-errorlint v1.5.2/go.mod h1:sH1QC1pxxi0fFecsVIzBmxtrgd9IF/SkJpA6wqyKAJs= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -944,11 +1301,19 @@ github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/quasilyte/go-ruleguard v0.4.2/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI= +github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/rabbitmq/amqp091-go v1.2.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= 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/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -963,17 +1328,30 @@ github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= 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/ryancurrah/gomodguard v1.3.2/go.mod h1:LqdemiFomEjcxOqirbQCb3JFvSxH2JUYMerTFd3sF2o= +github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.19.0/go.mod h1:c6vimRziqqERhtSe0MhIvzE1w54FrCHtrXb5NH/ja78= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= 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/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= 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= +github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= +github.com/sashamelentyev/usestdlibvars v1.26.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/securego/gosec/v2 v2.20.1-0.20240525090044-5f0084eb01a9/go.mod h1:dg7lPlu/xK/Ut9SedURCoZbVCR4yC7fM65DtH9/CDHs= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shamaton/msgpack/v2 v2.2.0 h1:IP1m01pHwCrMa6ZccP9B3bqxEMKMSmMVAVKk54g3L/Y= github.com/shamaton/msgpack/v2 v2.2.0/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -981,6 +1359,10 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= +github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= +github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= +github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/skip-mev/block-sdk/v2 v2.1.5 h1:3uoYG2ayP253wiohBPKdD3LrkJGd1Kgw914mmI1ZyOI= github.com/skip-mev/block-sdk/v2 v2.1.5/go.mod h1:E8SvITZUdxkes3gI3+kgESZL+NLffkcLKnowUgYTOf4= github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= @@ -991,10 +1373,13 @@ github.com/skip-mev/slinky v1.0.12 h1:qmZHB6c5fgDhO/pv67YcZc2M25t3gZcceVmJtA9zjO github.com/skip-mev/slinky v1.0.12/go.mod h1:8mxMdQ8MY8QAxgxLvUKTfDwX6XCAUeqZwkU/r+ZsELU= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= 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/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= @@ -1003,14 +1388,19 @@ github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cA github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +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.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -1032,13 +1422,29 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= +github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= +github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= +github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tetafro/godot v1.4.16/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= 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/tidwall/gjson v1.17.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= +github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +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/tomarrell/wrapcheck/v2 v2.8.3/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= +github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= @@ -1048,9 +1454,26 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ 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= +github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= +github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/uudashr/gocognit v1.1.2/go.mod h1:aAVdLURqcanke8h3vg35BC++eseDm66Z7KmchI5et4k= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vektra/mockery/v2 v2.44.1/go.mod h1:XNTE9RIu3deGAGQRVjP1VZxGpQNm0YedZx4oDs3prr8= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= +github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+YcPQN+mW4= +github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= +github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1062,10 +1485,19 @@ 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.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= +go-simpler.org/musttag v0.12.2/go.mod h1:uN1DVIasMTQKk6XSik7yrJoEysGtR2GRqvWnI9S7TYM= +go-simpler.org/sloglint v0.7.1/go.mod h1:OlaVDRh/FKKd4X4sIMbsz8st97vomydceL146Fthh/c= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= +go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4= +go.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E= +go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1094,6 +1526,8 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= @@ -1105,6 +1539,7 @@ go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= @@ -1139,6 +1574,7 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1166,6 +1602,7 @@ 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.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.20.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= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1256,6 +1693,7 @@ golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1369,6 +1807,7 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= 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= @@ -1453,6 +1892,8 @@ 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.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/vuln v1.1.3/go.mod h1:7Le6Fadm5FOqE9C926BCD0g12NWyhg7cxV4BwcPFuNY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1463,6 +1904,7 @@ golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNq golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1522,6 +1964,7 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1633,6 +2076,7 @@ google.golang.org/genproto v0.0.0-20240701130421-f6361c86f094 h1:6whtk83KtD3FkGr google.golang.org/genproto v0.0.0-20240701130421-f6361c86f094/go.mod h1:Zs4wYw8z1zr6RNF4cwYb31mvN/EGaKAdQjNCF3DW6K4= google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240617180043-68d350f18fd4/go.mod h1:/oe3+SiHAwz6s+M25PyTygWm3lnrhmGqIuIfkoUocqk= google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1710,6 +2154,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -1728,6 +2173,7 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1738,6 +2184,11 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.4.7/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= +mvdan.cc/gofumpt v0.6.0/go.mod h1:4L0wf+kgIPZtcCWXynNS2e6bhmj73umwnuXSZarixzA= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f/go.mod h1:RSLa7mKKCNeTTMHBw5Hsy2rfJmd6O2ivt9Dw9ZqCQpQ= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= @@ -1745,6 +2196,7 @@ pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +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.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/proto/neutron/state-verifier/genesis.proto b/proto/neutron/state-verifier/genesis.proto index 44c2c4cc1..8fc4b3cb6 100644 --- a/proto/neutron/state-verifier/genesis.proto +++ b/proto/neutron/state-verifier/genesis.proto @@ -5,6 +5,8 @@ import "ibc/lightclients/tendermint/v1/tendermint.proto"; option go_package = "github.com/neutron-org/neutron/v5/x/state-verifier/types"; + +// ConsensusState describes a "light" consensus state of Neutron at a particular height message ConsensusState { int64 height = 1; ibc.lightclients.tendermint.v1.ConsensusState cs = 2; diff --git a/proto/neutron/state-verifier/query.proto b/proto/neutron/state-verifier/query.proto index d6994f496..8f86bf5e6 100644 --- a/proto/neutron/state-verifier/query.proto +++ b/proto/neutron/state-verifier/query.proto @@ -7,12 +7,13 @@ import "neutron/interchainqueries/tx.proto"; option go_package = "github.com/neutron-org/neutron/v5/x/state-verifier/types"; service Query { - rpc VerifyStateValues(QueryVefiryStateValuesRequest) returns (QueryVerifyStateValuesResponse) { + rpc VerifyStateValues(QueryVerifyStateValuesRequest) returns (QueryVerifyStateValuesResponse) { option (google.api.http).get = "/neutron/state-verifier/verify_state_values"; } } -message QueryVefiryStateValuesRequest { +// QueryVerifyStateValuesRequest describes a structure to verify storage values from Neutron state from a particular height in the past +message QueryVerifyStateValuesRequest { uint64 height = 1; repeated neutron.interchainqueries.StorageValue storage_values = 2; } diff --git a/x/state-verifier/README.md b/x/state-verifier/README.md new file mode 100644 index 000000000..6a806a712 --- /dev/null +++ b/x/state-verifier/README.md @@ -0,0 +1,31 @@ +# Overview + +The State Verifier module allows to verify that some `storage values` were indeed present on a particular `block height` in the chain. + +The idea is the similar how Neutron's KV ICQ works: each `StorageValue` in Cosmos SDK is stored in [KV-IAVL storage](https://github.com/cosmos/iavl). +And to be more precise it's stored in a structure called [`MerkleTree`](https://github.com/cosmos/cosmos-sdk/blob/ae77f0080a724b159233bd9b289b2e91c0de21b5/docs/interfaces/lite/specification.md). +The tree allows to compose `Proof` for `key` and `value` pairs that can prove two things using `RootHash` of the tree: +* `key` and `value` are present in the tree; +* `key` is not present in the tree. + +Cosmos blockchain's storage is stored as a different tree for each block. +That means we can prove that a particular `KV` pair is really present (or not present) in the storage at a particular block height. + +# Implementation + +### BeginBlocker +In each block the module's `BeginBlocker` is being called and it saves `ConsensusState` of the current block height in the storage to use it for verification of storage values later: + +```go +consensusState := tendermint.ConsensusState{ + Timestamp: ctx.BlockTime(), // current block time + Root: ibccommitmenttypes.NewMerkleRoot(headerInfo.AppHash), // .AppHash for the previous block + NextValidatorsHash: cometInfo.GetValidatorsHash(), // hash of the validator set for the next block +} +``` + +For verification only `.Root` (`header.AppHash`) is used, but it's good to save all the values just in case and do not leave them empty. + +### VerifyStateValues query +The main query of the module that accepts slice of `[]StorageValue` structures and `blockHeight` on which those `StorageValues` are present. +The module verifies the values and returns an error if values cannot be verified `{valid: true}` structure if values are valid. \ No newline at end of file diff --git a/x/state-verifier/keeper/keeper.go b/x/state-verifier/keeper/keeper.go index 06b156479..1e558d8ec 100644 --- a/x/state-verifier/keeper/keeper.go +++ b/x/state-verifier/keeper/keeper.go @@ -1,7 +1,6 @@ package keeper import ( - "context" "fmt" "strconv" @@ -19,7 +18,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - types2 "github.com/neutron-org/neutron/v5/x/interchainqueries/types" + icqtypes "github.com/neutron-org/neutron/v5/x/interchainqueries/types" "github.com/neutron-org/neutron/v5/x/state-verifier/types" ) @@ -33,14 +32,6 @@ type ( } ) -func (k *Keeper) VerifyStateValues(ctx context.Context, request *types.QueryVefiryStateValuesRequest) (*types.QueryVerifyStateValuesResponse, error) { - if err := k.Verify(sdk.UnwrapSDKContext(ctx), int64(request.Height), request.StorageValues); err != nil { - return nil, err - } - - return &types.QueryVerifyStateValuesResponse{Valid: true}, nil -} - func NewKeeper( cdc codec.BinaryCodec, storeKey storetypes.StoreKey, @@ -65,6 +56,8 @@ func (k *Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } +// SaveConsensusState extracts info about the current header from the context, composes ConsensusState structure with that info +// and saves the structure to the state func (k *Keeper) SaveConsensusState(ctx sdk.Context) error { headerInfo := k.headerInfo.GetHeaderInfo(ctx) cometInfo := k.cometInfo.GetCometBlockInfo(ctx) @@ -78,6 +71,7 @@ func (k *Keeper) SaveConsensusState(ctx sdk.Context) error { return k.WriteConsensusState(ctx, ctx.BlockHeight(), cs) } +// WriteConsensusState writes ConsensusState structure and corresponding height into the storage func (k *Keeper) WriteConsensusState(ctx sdk.Context, height int64, cs tendermint.ConsensusState) error { store := ctx.KVStore(k.storeKey) key := types.GetConsensusStateKey(height) @@ -92,9 +86,11 @@ func (k *Keeper) WriteConsensusState(ctx sdk.Context, height int64, cs tendermin return nil } -func (k *Keeper) Verify(ctx sdk.Context, blockHeight int64, values []*types2.StorageValue) error { +// Verify verifies that provided `values` are actually present on Neutron blockchain at `blockHeight` +func (k *Keeper) Verify(ctx sdk.Context, blockHeight int64, values []*icqtypes.StorageValue) error { store := ctx.KVStore(k.storeKey) + // we need to use consensus state from the next height (N + 1), cause that consensus state contains .AppHash (Merkle Root) of the state for `blockHeight` (N) csBz := store.Get(types.GetConsensusStateKey(blockHeight + 1)) if csBz == nil { return errors.Wrap(sdkerrors.ErrKeyNotFound, fmt.Sprintf("consensus state for block %d not found", blockHeight)) @@ -118,22 +114,24 @@ func (k *Keeper) Verify(ctx sdk.Context, blockHeight int64, values []*types2.Sto // we can get non-existence proof if someone queried some key which is not exists in the storage on remote chain case *ics23.CommitmentProof_Nonexist: if err := proof.VerifyNonMembership(ibccommitmenttypes.GetSDKSpecs(), cs.Root, path); err != nil { - return errors.Wrapf(types2.ErrInvalidProof, "failed to verify proof: %v", err) + return errors.Wrapf(icqtypes.ErrInvalidProof, "failed to verify proof: %v", err) } result.Value = nil case *ics23.CommitmentProof_Exist: if err := proof.VerifyMembership(ibccommitmenttypes.GetSDKSpecs(), cs.Root, path, result.Value); err != nil { - return errors.Wrapf(types2.ErrInvalidProof, "failed to verify proof: %v", err) + return errors.Wrapf(icqtypes.ErrInvalidProof, "failed to verify proof: %v", err) } default: - return errors.Wrapf(types2.ErrInvalidProof, "unknown proof type %T", proof.GetProofs()[0].GetProof()) + return errors.Wrapf(icqtypes.ErrInvalidProof, "unknown proof type %T", proof.GetProofs()[0].GetProof()) } } return nil } -func (k Keeper) GetAllConsensusStates(ctx sdk.Context) ([]*types.ConsensusState, error) { +// GetAllConsensusStates returns ALL consensus states that are present in the storage +// Pagination is not needed here because the method is used to export state to genesis +func (k *Keeper) GetAllConsensusStates(ctx sdk.Context) ([]*types.ConsensusState, error) { var ( store = prefix.NewStore(ctx.KVStore(k.storeKey), types.ConsensusStateKey) states []*types.ConsensusState diff --git a/x/state-verifier/keeper/query.go b/x/state-verifier/keeper/query.go new file mode 100644 index 000000000..a21e8f804 --- /dev/null +++ b/x/state-verifier/keeper/query.go @@ -0,0 +1,18 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/neutron-org/neutron/v5/x/state-verifier/types" +) + +// VerifyStateValues implements `VerifyStateValues` gRPC query to verify storage values +func (k *Keeper) VerifyStateValues(ctx context.Context, request *types.QueryVerifyStateValuesRequest) (*types.QueryVerifyStateValuesResponse, error) { + if err := k.Verify(sdk.UnwrapSDKContext(ctx), int64(request.Height), request.StorageValues); err != nil { + return nil, err + } + + return &types.QueryVerifyStateValuesResponse{Valid: true}, nil +} diff --git a/x/state-verifier/types/genesis.pb.go b/x/state-verifier/types/genesis.pb.go index c0440e990..32234aa73 100644 --- a/x/state-verifier/types/genesis.pb.go +++ b/x/state-verifier/types/genesis.pb.go @@ -23,6 +23,7 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// ConsensusState describes a "light" consensus state of Neutron at a particular height type ConsensusState struct { Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` Cs *_07_tendermint.ConsensusState `protobuf:"bytes,2,opt,name=cs,proto3" json:"cs,omitempty"` diff --git a/x/state-verifier/types/query.pb.go b/x/state-verifier/types/query.pb.go index 60278f615..f7c8e64b3 100644 --- a/x/state-verifier/types/query.pb.go +++ b/x/state-verifier/types/query.pb.go @@ -29,23 +29,24 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -type QueryVefiryStateValuesRequest struct { +// QueryVerifyStateValuesRequest describes a structure to verify storage values from Neutron state from a particular height in the past +type QueryVerifyStateValuesRequest struct { Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` StorageValues []*types.StorageValue `protobuf:"bytes,2,rep,name=storage_values,json=storageValues,proto3" json:"storage_values,omitempty"` } -func (m *QueryVefiryStateValuesRequest) Reset() { *m = QueryVefiryStateValuesRequest{} } -func (m *QueryVefiryStateValuesRequest) String() string { return proto.CompactTextString(m) } -func (*QueryVefiryStateValuesRequest) ProtoMessage() {} -func (*QueryVefiryStateValuesRequest) Descriptor() ([]byte, []int) { +func (m *QueryVerifyStateValuesRequest) Reset() { *m = QueryVerifyStateValuesRequest{} } +func (m *QueryVerifyStateValuesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryVerifyStateValuesRequest) ProtoMessage() {} +func (*QueryVerifyStateValuesRequest) Descriptor() ([]byte, []int) { return fileDescriptor_369825dbe2d186a4, []int{0} } -func (m *QueryVefiryStateValuesRequest) XXX_Unmarshal(b []byte) error { +func (m *QueryVerifyStateValuesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryVefiryStateValuesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryVerifyStateValuesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryVefiryStateValuesRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryVerifyStateValuesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -55,26 +56,26 @@ func (m *QueryVefiryStateValuesRequest) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *QueryVefiryStateValuesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryVefiryStateValuesRequest.Merge(m, src) +func (m *QueryVerifyStateValuesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVerifyStateValuesRequest.Merge(m, src) } -func (m *QueryVefiryStateValuesRequest) XXX_Size() int { +func (m *QueryVerifyStateValuesRequest) XXX_Size() int { return m.Size() } -func (m *QueryVefiryStateValuesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryVefiryStateValuesRequest.DiscardUnknown(m) +func (m *QueryVerifyStateValuesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVerifyStateValuesRequest.DiscardUnknown(m) } -var xxx_messageInfo_QueryVefiryStateValuesRequest proto.InternalMessageInfo +var xxx_messageInfo_QueryVerifyStateValuesRequest proto.InternalMessageInfo -func (m *QueryVefiryStateValuesRequest) GetHeight() uint64 { +func (m *QueryVerifyStateValuesRequest) GetHeight() uint64 { if m != nil { return m.Height } return 0 } -func (m *QueryVefiryStateValuesRequest) GetStorageValues() []*types.StorageValue { +func (m *QueryVerifyStateValuesRequest) GetStorageValues() []*types.StorageValue { if m != nil { return m.StorageValues } @@ -126,7 +127,7 @@ func (m *QueryVerifyStateValuesResponse) GetValid() bool { } func init() { - proto.RegisterType((*QueryVefiryStateValuesRequest)(nil), "neutron.state_verifier.v1.QueryVefiryStateValuesRequest") + proto.RegisterType((*QueryVerifyStateValuesRequest)(nil), "neutron.state_verifier.v1.QueryVerifyStateValuesRequest") proto.RegisterType((*QueryVerifyStateValuesResponse)(nil), "neutron.state_verifier.v1.QueryVerifyStateValuesResponse") } @@ -135,30 +136,29 @@ func init() { } var fileDescriptor_369825dbe2d186a4 = []byte{ - // 354 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0x41, 0x4b, 0x23, 0x31, - 0x14, 0xc7, 0x9b, 0xee, 0xb6, 0x2c, 0x59, 0x76, 0xc1, 0x41, 0xa4, 0x16, 0x1d, 0xca, 0x5c, 0x2c, - 0x48, 0x13, 0x6c, 0x51, 0xea, 0xd5, 0x0f, 0x20, 0x38, 0x85, 0x1e, 0xbc, 0x94, 0xb4, 0xbe, 0xce, - 0x04, 0x6a, 0x32, 0x4d, 0x32, 0x43, 0xe7, 0xea, 0xc5, 0xab, 0xe0, 0xe7, 0xf1, 0xac, 0xc7, 0x82, - 0x17, 0x8f, 0xd2, 0xfa, 0x41, 0xa4, 0x99, 0x69, 0x51, 0x4b, 0xf5, 0x96, 0x47, 0xde, 0xef, 0xfd, - 0x7f, 0xc9, 0xc3, 0x9e, 0x80, 0xd8, 0x28, 0x29, 0xa8, 0x36, 0xcc, 0x40, 0x23, 0x01, 0xc5, 0x87, - 0x1c, 0x14, 0x1d, 0xc7, 0xa0, 0x52, 0x12, 0x29, 0x69, 0xa4, 0xb3, 0x9b, 0xf7, 0x10, 0xdb, 0xd3, - 0x5b, 0xf6, 0x90, 0xe4, 0xa8, 0xba, 0xc2, 0xb9, 0x30, 0xa0, 0x06, 0x21, 0xe3, 0x62, 0x41, 0x72, - 0xd0, 0xd4, 0x4c, 0x32, 0xbc, 0xba, 0x17, 0x48, 0x19, 0x8c, 0x80, 0xb2, 0x88, 0x53, 0x26, 0x84, - 0x34, 0xcc, 0x70, 0x29, 0x74, 0x76, 0xeb, 0xdd, 0x22, 0xbc, 0x7f, 0xb1, 0x08, 0xeb, 0xc2, 0x90, - 0xab, 0xb4, 0xb3, 0x88, 0xe8, 0xb2, 0x51, 0x0c, 0xda, 0x87, 0x71, 0x0c, 0xda, 0x38, 0x3b, 0xb8, - 0x1c, 0x02, 0x0f, 0x42, 0x53, 0x41, 0x35, 0x54, 0xff, 0xed, 0xe7, 0x95, 0x73, 0x8e, 0xff, 0x6b, - 0x23, 0x15, 0x0b, 0xa0, 0x97, 0x58, 0xa0, 0x52, 0xac, 0xfd, 0xaa, 0xff, 0x6d, 0x1e, 0x90, 0xa5, - 0xef, 0x9a, 0x14, 0xe9, 0x64, 0x80, 0x0d, 0xf0, 0xff, 0xe9, 0x0f, 0x95, 0xf6, 0x4e, 0xb0, 0x9b, - 0x8b, 0x28, 0x3e, 0xfc, 0x2c, 0xa2, 0x23, 0x29, 0x34, 0x38, 0xdb, 0xb8, 0x94, 0xb0, 0x11, 0xbf, - 0xb2, 0x22, 0x7f, 0xfc, 0xac, 0x68, 0x3e, 0x22, 0x5c, 0xb2, 0xa0, 0xf3, 0x80, 0xf0, 0xd6, 0x1a, - 0xed, 0xb4, 0xc9, 0xc6, 0xff, 0x23, 0xdf, 0xbe, 0xbc, 0x7a, 0xfa, 0x33, 0xb9, 0x41, 0xd5, 0x6b, - 0xdd, 0x3c, 0xbf, 0xdd, 0x17, 0x1b, 0xce, 0x21, 0xdd, 0xb0, 0x60, 0x7b, 0x48, 0x7b, 0xf9, 0x60, - 0x0b, 0x9f, 0xf9, 0x4f, 0x33, 0x17, 0x4d, 0x67, 0x2e, 0x7a, 0x9d, 0xb9, 0xe8, 0x6e, 0xee, 0x16, - 0xa6, 0x73, 0xb7, 0xf0, 0x32, 0x77, 0x0b, 0x97, 0xed, 0x80, 0x9b, 0x30, 0xee, 0x93, 0x81, 0xbc, - 0x5e, 0x0e, 0x6c, 0x48, 0x15, 0xac, 0x86, 0x27, 0xc7, 0x74, 0xf2, 0x35, 0xc1, 0xa4, 0x11, 0xe8, - 0x7e, 0xd9, 0xae, 0xb9, 0xf5, 0x1e, 0x00, 0x00, 0xff, 0xff, 0x82, 0x4b, 0xbe, 0x07, 0x69, 0x02, - 0x00, 0x00, + // 348 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x91, 0xc1, 0x4b, 0x3a, 0x41, + 0x1c, 0xc5, 0x1d, 0x7f, 0x3f, 0x25, 0x26, 0x0a, 0x5a, 0x22, 0x4c, 0x6a, 0x91, 0xbd, 0x24, 0x84, + 0x33, 0xa4, 0x14, 0x76, 0xed, 0x0f, 0x08, 0x5a, 0xc1, 0x43, 0x17, 0x19, 0xed, 0xdb, 0xee, 0x80, + 0xcd, 0xac, 0x33, 0xb3, 0x8b, 0x7b, 0xed, 0xd2, 0x35, 0xe8, 0xef, 0xe9, 0x5c, 0x47, 0xa1, 0x4b, + 0xc7, 0xd0, 0xfe, 0x90, 0xd8, 0x59, 0x95, 0x48, 0xec, 0xd0, 0x6d, 0x1f, 0xbc, 0xcf, 0x7b, 0x6f, + 0xe7, 0x8b, 0x3d, 0x01, 0xb1, 0x51, 0x52, 0x50, 0x6d, 0x98, 0x81, 0x46, 0x02, 0x8a, 0xdf, 0x72, + 0x50, 0x74, 0x14, 0x83, 0x4a, 0x49, 0xa4, 0xa4, 0x91, 0xce, 0xfe, 0xdc, 0x43, 0xac, 0xa7, 0xb7, + 0xf0, 0x90, 0xe4, 0xa4, 0x7a, 0x10, 0x48, 0x19, 0x0c, 0x81, 0xb2, 0x88, 0x53, 0x26, 0x84, 0x34, + 0xcc, 0x70, 0x29, 0x74, 0x0e, 0x56, 0x97, 0xe1, 0x5c, 0x18, 0x50, 0x83, 0x90, 0x71, 0x91, 0xe5, + 0x72, 0xd0, 0xd4, 0x8c, 0x73, 0x8f, 0xf7, 0x80, 0xf0, 0xe1, 0x55, 0x56, 0xd6, 0xcd, 0x62, 0xd3, + 0x4e, 0x56, 0xd1, 0x65, 0xc3, 0x18, 0xb4, 0x0f, 0xa3, 0x18, 0xb4, 0x71, 0xf6, 0x70, 0x39, 0x04, + 0x1e, 0x84, 0xa6, 0x82, 0x6a, 0xa8, 0xfe, 0xdf, 0x9f, 0x2b, 0xe7, 0x12, 0x6f, 0x6b, 0x23, 0x15, + 0x0b, 0xa0, 0x97, 0x58, 0xa0, 0x52, 0xac, 0xfd, 0xab, 0x6f, 0x36, 0x8f, 0xc8, 0x62, 0xef, 0x4a, + 0x2d, 0xe9, 0xe4, 0x80, 0x2d, 0xf0, 0xb7, 0xf4, 0x37, 0xa5, 0xbd, 0x33, 0xec, 0xae, 0x1b, 0xa2, + 0x23, 0x29, 0x34, 0x38, 0xbb, 0xb8, 0x94, 0xb0, 0x21, 0xbf, 0xb1, 0x43, 0x36, 0xfc, 0x5c, 0x34, + 0x5f, 0x10, 0x2e, 0x59, 0xd0, 0x79, 0x46, 0x78, 0x67, 0x85, 0x76, 0xda, 0x64, 0xed, 0xfb, 0x91, + 0x5f, 0xff, 0xbc, 0x7a, 0xfe, 0x07, 0x32, 0x9f, 0xea, 0xb5, 0xee, 0xdf, 0x3e, 0x9f, 0x8a, 0x0d, + 0xe7, 0x98, 0xae, 0x39, 0xb0, 0xfd, 0x48, 0x7b, 0xf3, 0x60, 0x0b, 0x5f, 0xf8, 0xaf, 0x53, 0x17, + 0x4d, 0xa6, 0x2e, 0xfa, 0x98, 0xba, 0xe8, 0x71, 0xe6, 0x16, 0x26, 0x33, 0xb7, 0xf0, 0x3e, 0x73, + 0x0b, 0xd7, 0xed, 0x80, 0x9b, 0x30, 0xee, 0x93, 0x81, 0xbc, 0x5b, 0x04, 0x36, 0xa4, 0x0a, 0x96, + 0xe1, 0xc9, 0x29, 0x1d, 0xff, 0x6c, 0x30, 0x69, 0x04, 0xba, 0x5f, 0xb6, 0x67, 0x6e, 0x7d, 0x05, + 0x00, 0x00, 0xff, 0xff, 0xaf, 0xee, 0x37, 0xf8, 0x69, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -173,7 +173,7 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type QueryClient interface { - VerifyStateValues(ctx context.Context, in *QueryVefiryStateValuesRequest, opts ...grpc.CallOption) (*QueryVerifyStateValuesResponse, error) + VerifyStateValues(ctx context.Context, in *QueryVerifyStateValuesRequest, opts ...grpc.CallOption) (*QueryVerifyStateValuesResponse, error) } type queryClient struct { @@ -184,7 +184,7 @@ func NewQueryClient(cc grpc1.ClientConn) QueryClient { return &queryClient{cc} } -func (c *queryClient) VerifyStateValues(ctx context.Context, in *QueryVefiryStateValuesRequest, opts ...grpc.CallOption) (*QueryVerifyStateValuesResponse, error) { +func (c *queryClient) VerifyStateValues(ctx context.Context, in *QueryVerifyStateValuesRequest, opts ...grpc.CallOption) (*QueryVerifyStateValuesResponse, error) { out := new(QueryVerifyStateValuesResponse) err := c.cc.Invoke(ctx, "/neutron.state_verifier.v1.Query/VerifyStateValues", in, out, opts...) if err != nil { @@ -195,14 +195,14 @@ func (c *queryClient) VerifyStateValues(ctx context.Context, in *QueryVefiryStat // QueryServer is the server API for Query service. type QueryServer interface { - VerifyStateValues(context.Context, *QueryVefiryStateValuesRequest) (*QueryVerifyStateValuesResponse, error) + VerifyStateValues(context.Context, *QueryVerifyStateValuesRequest) (*QueryVerifyStateValuesResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. type UnimplementedQueryServer struct { } -func (*UnimplementedQueryServer) VerifyStateValues(ctx context.Context, req *QueryVefiryStateValuesRequest) (*QueryVerifyStateValuesResponse, error) { +func (*UnimplementedQueryServer) VerifyStateValues(ctx context.Context, req *QueryVerifyStateValuesRequest) (*QueryVerifyStateValuesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VerifyStateValues not implemented") } @@ -211,7 +211,7 @@ func RegisterQueryServer(s grpc1.Server, srv QueryServer) { } func _Query_VerifyStateValues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryVefiryStateValuesRequest) + in := new(QueryVerifyStateValuesRequest) if err := dec(in); err != nil { return nil, err } @@ -223,7 +223,7 @@ func _Query_VerifyStateValues_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/neutron.state_verifier.v1.Query/VerifyStateValues", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).VerifyStateValues(ctx, req.(*QueryVefiryStateValuesRequest)) + return srv.(QueryServer).VerifyStateValues(ctx, req.(*QueryVerifyStateValuesRequest)) } return interceptor(ctx, in, info, handler) } @@ -241,7 +241,7 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Metadata: "neutron/state-verifier/query.proto", } -func (m *QueryVefiryStateValuesRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryVerifyStateValuesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -251,12 +251,12 @@ func (m *QueryVefiryStateValuesRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryVefiryStateValuesRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryVerifyStateValuesRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryVefiryStateValuesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryVerifyStateValuesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -327,7 +327,7 @@ func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *QueryVefiryStateValuesRequest) Size() (n int) { +func (m *QueryVerifyStateValuesRequest) Size() (n int) { if m == nil { return 0 } @@ -363,7 +363,7 @@ func sovQuery(x uint64) (n int) { func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *QueryVefiryStateValuesRequest) Unmarshal(dAtA []byte) error { +func (m *QueryVerifyStateValuesRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -386,10 +386,10 @@ func (m *QueryVefiryStateValuesRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryVefiryStateValuesRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryVerifyStateValuesRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryVefiryStateValuesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryVerifyStateValuesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: diff --git a/x/state-verifier/types/query.pb.gw.go b/x/state-verifier/types/query.pb.gw.go index df696b44e..f7df3c692 100644 --- a/x/state-verifier/types/query.pb.gw.go +++ b/x/state-verifier/types/query.pb.gw.go @@ -38,7 +38,7 @@ var ( ) func request_Query_VerifyStateValues_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryVefiryStateValuesRequest + var protoReq QueryVerifyStateValuesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -54,7 +54,7 @@ func request_Query_VerifyStateValues_0(ctx context.Context, marshaler runtime.Ma } func local_request_Query_VerifyStateValues_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryVefiryStateValuesRequest + var protoReq QueryVerifyStateValuesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { From b6a959bc3500074e0c140feefac95bffc59ab53a Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 1 Nov 2024 17:01:01 +0200 Subject: [PATCH 10/29] README.md --- proto/neutron/state-verifier/genesis.proto | 1 - x/state-verifier/README.md | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/proto/neutron/state-verifier/genesis.proto b/proto/neutron/state-verifier/genesis.proto index 8fc4b3cb6..d6ef33a7b 100644 --- a/proto/neutron/state-verifier/genesis.proto +++ b/proto/neutron/state-verifier/genesis.proto @@ -5,7 +5,6 @@ import "ibc/lightclients/tendermint/v1/tendermint.proto"; option go_package = "github.com/neutron-org/neutron/v5/x/state-verifier/types"; - // ConsensusState describes a "light" consensus state of Neutron at a particular height message ConsensusState { int64 height = 1; diff --git a/x/state-verifier/README.md b/x/state-verifier/README.md index 6a806a712..88214dcc4 100644 --- a/x/state-verifier/README.md +++ b/x/state-verifier/README.md @@ -11,10 +11,12 @@ The tree allows to compose `Proof` for `key` and `value` pairs that can prove tw Cosmos blockchain's storage is stored as a different tree for each block. That means we can prove that a particular `KV` pair is really present (or not present) in the storage at a particular block height. +See [Neutron's ICQ relayer implementation](https://github.com/neutron-org/neutron-query-relayer/blob/4542045ab24d2735890e70d4dc525677d5f30c8a/internal/proof/proof_impl/get_storage_values.go#L11) if you want to know how to query KV-proofs + # Implementation ### BeginBlocker -In each block the module's `BeginBlocker` is being called and it saves `ConsensusState` of the current block height in the storage to use it for verification of storage values later: +In each block the module's `BeginBlocker` is being called, and it saves `ConsensusState` of the current block height in the storage to use it for verification of storage values later: ```go consensusState := tendermint.ConsensusState{ From cfb54bab33bf57167047fb94bb620cd6dd151792 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 08:28:28 +0000 Subject: [PATCH 11/29] Bump github.com/grpc-ecosystem/grpc-gateway/v2 from 2.22.0 to 2.23.0 Bumps [github.com/grpc-ecosystem/grpc-gateway/v2](https://github.com/grpc-ecosystem/grpc-gateway) from 2.22.0 to 2.23.0. - [Release notes](https://github.com/grpc-ecosystem/grpc-gateway/releases) - [Changelog](https://github.com/grpc-ecosystem/grpc-gateway/blob/main/.goreleaser.yml) - [Commits](https://github.com/grpc-ecosystem/grpc-gateway/compare/v2.22.0...v2.23.0) --- updated-dependencies: - dependency-name: github.com/grpc-ecosystem/grpc-gateway/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index bca0493ce..952b4396f 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.1 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 github.com/hashicorp/go-metrics v0.5.3 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.20.5 @@ -45,7 +45,7 @@ require ( github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.9.0 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 - google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 + google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 google.golang.org/grpc v1.67.1 google.golang.org/protobuf v1.35.1 gopkg.in/yaml.v2 v2.4.0 @@ -200,15 +200,15 @@ require ( go.uber.org/zap v1.27.0 // indirect golang.org/x/crypto v0.26.0 // indirect golang.org/x/net v0.28.0 // indirect - golang.org/x/oauth2 v0.22.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.24.0 // indirect golang.org/x/term v0.23.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/text v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.186.0 // indirect google.golang.org/genproto v0.0.0-20240701130421-f6361c86f094 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.1 // indirect diff --git a/go.sum b/go.sum index fd664db6f..c44f1ab06 100644 --- a/go.sum +++ b/go.sum @@ -658,8 +658,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -1254,8 +1254,8 @@ 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.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1384,8 +1384,8 @@ 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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1631,10 +1631,10 @@ google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20240701130421-f6361c86f094 h1:6whtk83KtD3FkGrVb2hFXuQ+ZMbCNdakARIn/aHMmG8= google.golang.org/genproto v0.0.0-20240701130421-f6361c86f094/go.mod h1:Zs4wYw8z1zr6RNF4cwYb31mvN/EGaKAdQjNCF3DW6K4= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw= +google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= From 52bf354a64ea91917a292b548764e38eb7a865fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Nov 2024 09:01:53 +0000 Subject: [PATCH 12/29] Bump github.com/cosmos/ibc-go/v8 from 8.5.1 to 8.5.2 Bumps [github.com/cosmos/ibc-go/v8](https://github.com/cosmos/ibc-go) from 8.5.1 to 8.5.2. - [Release notes](https://github.com/cosmos/ibc-go/releases) - [Changelog](https://github.com/cosmos/ibc-go/blob/v8.5.2/CHANGELOG.md) - [Commits](https://github.com/cosmos/ibc-go/compare/v8.5.1...v8.5.2) --- updated-dependencies: - dependency-name: github.com/cosmos/ibc-go/v8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bca0493ce..678f56270 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/cosmos/gogoproto v1.7.0 github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.0.2 github.com/cosmos/ibc-go/modules/capability v1.0.1 - github.com/cosmos/ibc-go/v8 v8.5.1 + github.com/cosmos/ibc-go/v8 v8.5.2 github.com/cosmos/ics23/go v0.11.0 github.com/cosmos/interchain-security/v5 v5.1.1 github.com/gogo/protobuf v1.3.3 diff --git a/go.sum b/go.sum index fd664db6f..bc283cfe7 100644 --- a/go.sum +++ b/go.sum @@ -377,8 +377,8 @@ github.com/cosmos/ibc-go/modules/apps/callbacks v0.2.1-0.20231113120333-342c00b0 github.com/cosmos/ibc-go/modules/apps/callbacks v0.2.1-0.20231113120333-342c00b0f8bd/go.mod h1:JWfpWVKJKiKtd53/KbRoKfxWl8FsT2GPcNezTOk0o5Q= github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= -github.com/cosmos/ibc-go/v8 v8.5.1 h1:3JleEMKBjRKa3FeTKt4fjg22za/qygLBo7mDkoYTNBs= -github.com/cosmos/ibc-go/v8 v8.5.1/go.mod h1:P5hkAvq0Qbg0h18uLxDVA9q1kOJ0l36htMsskiNwXbo= +github.com/cosmos/ibc-go/v8 v8.5.2 h1:27s9oeD2AxLQF3e9BQsYt9doONyZ7FwZi/qkBv6Sdks= +github.com/cosmos/ibc-go/v8 v8.5.2/go.mod h1:P5hkAvq0Qbg0h18uLxDVA9q1kOJ0l36htMsskiNwXbo= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/interchain-security/v5 v5.0.0-20240802125602-fa1e09444aae h1:/EWV9qryltapge0v4ctvl2jV3Nne5nsbd+GYblj/jWA= From 91db8dbb154fe4cb5365883d553b5b3a5a595eea Mon Sep 17 00:00:00 2001 From: Murad Karammaev Date: Mon, 11 Nov 2024 10:24:47 +0200 Subject: [PATCH 13/29] fix: state-verifier: CLI panic: do not expose any commands --- x/state-verifier/module.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/x/state-verifier/module.go b/x/state-verifier/module.go index ed32a56c0..8769e8025 100644 --- a/x/state-verifier/module.go +++ b/x/state-verifier/module.go @@ -82,9 +82,13 @@ func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *r } } -// GetTxCmd returns the root Tx command for the module. The subcommands of this root command are used by end-users to generate new transactions containing messages defined in the module +// Do not expose any CLI commands for this module + func (a AppModuleBasic) GetTxCmd() *cobra.Command { - return nil + return &cobra.Command{} +} +func (a AppModuleBasic) GetQueryCmd() *cobra.Command { + return &cobra.Command{} } // ---------------------------------------------------------------------------- From 0b61afe3059039891662c09068b66bbe1e85f4cc Mon Sep 17 00:00:00 2001 From: Murad Karammaev Date: Mon, 11 Nov 2024 10:27:56 +0200 Subject: [PATCH 14/29] fix: state-verifier: warning: rename proto paths --- .../v1}/genesis.proto | 0 .../v1}/query.proto | 0 x/state-verifier/types/genesis.pb.go | 47 +++++++------- x/state-verifier/types/query.pb.go | 63 ++++++++++--------- x/state-verifier/types/query.pb.gw.go | 2 +- 5 files changed, 57 insertions(+), 55 deletions(-) rename proto/neutron/{state-verifier => state_verifier/v1}/genesis.proto (100%) rename proto/neutron/{state-verifier => state_verifier/v1}/query.proto (100%) diff --git a/proto/neutron/state-verifier/genesis.proto b/proto/neutron/state_verifier/v1/genesis.proto similarity index 100% rename from proto/neutron/state-verifier/genesis.proto rename to proto/neutron/state_verifier/v1/genesis.proto diff --git a/proto/neutron/state-verifier/query.proto b/proto/neutron/state_verifier/v1/query.proto similarity index 100% rename from proto/neutron/state-verifier/query.proto rename to proto/neutron/state_verifier/v1/query.proto diff --git a/x/state-verifier/types/genesis.pb.go b/x/state-verifier/types/genesis.pb.go index 32234aa73..75bb7cf35 100644 --- a/x/state-verifier/types/genesis.pb.go +++ b/x/state-verifier/types/genesis.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: neutron/state-verifier/genesis.proto +// source: neutron/state_verifier/v1/genesis.proto package types @@ -33,7 +33,7 @@ func (m *ConsensusState) Reset() { *m = ConsensusState{} } func (m *ConsensusState) String() string { return proto.CompactTextString(m) } func (*ConsensusState) ProtoMessage() {} func (*ConsensusState) Descriptor() ([]byte, []int) { - return fileDescriptor_45b0385b8dfa6591, []int{0} + return fileDescriptor_12c2ac447c18f7c3, []int{0} } func (m *ConsensusState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -84,7 +84,7 @@ func (m *GenesisState) Reset() { *m = GenesisState{} } func (m *GenesisState) String() string { return proto.CompactTextString(m) } func (*GenesisState) ProtoMessage() {} func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_45b0385b8dfa6591, []int{1} + return fileDescriptor_12c2ac447c18f7c3, []int{1} } func (m *GenesisState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -126,28 +126,29 @@ func init() { } func init() { - proto.RegisterFile("neutron/state-verifier/genesis.proto", fileDescriptor_45b0385b8dfa6591) + proto.RegisterFile("neutron/state_verifier/v1/genesis.proto", fileDescriptor_12c2ac447c18f7c3) } -var fileDescriptor_45b0385b8dfa6591 = []byte{ - // 272 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x90, 0x31, 0x4b, 0xc3, 0x40, - 0x1c, 0xc5, 0x73, 0x29, 0x64, 0xb8, 0x8a, 0x43, 0x06, 0x89, 0x0e, 0x47, 0x28, 0x0e, 0x71, 0xe8, - 0x1d, 0xa9, 0x08, 0x4e, 0x82, 0x3a, 0x38, 0x1b, 0x37, 0x17, 0x31, 0xe7, 0xdf, 0xe4, 0xa0, 0xbd, - 0x2b, 0xf7, 0xbf, 0x04, 0xfd, 0x16, 0x7e, 0x2c, 0xc7, 0x8e, 0x8e, 0x92, 0x7c, 0x11, 0x69, 0x92, - 0x42, 0x2c, 0x74, 0xbb, 0x07, 0xef, 0x7e, 0xef, 0xff, 0x1e, 0x3d, 0xd7, 0x50, 0x39, 0x6b, 0xb4, - 0x40, 0xf7, 0xea, 0x60, 0x5e, 0x83, 0x55, 0xef, 0x0a, 0xac, 0x28, 0x40, 0x03, 0x2a, 0xe4, 0x6b, - 0x6b, 0x9c, 0x09, 0x4f, 0x07, 0x17, 0xef, 0x5c, 0x2f, 0x3b, 0x17, 0xaf, 0xd3, 0x33, 0xa1, 0x72, - 0x29, 0x96, 0xaa, 0x28, 0x9d, 0x5c, 0x2a, 0xd0, 0x0e, 0x85, 0x03, 0xfd, 0x06, 0x76, 0xa5, 0xb4, - 0x13, 0x75, 0x3a, 0x52, 0x3d, 0x6b, 0x56, 0xd2, 0xe3, 0x7b, 0xa3, 0x11, 0x34, 0x56, 0xf8, 0xb4, - 0xc5, 0x85, 0x27, 0x34, 0x28, 0x61, 0x4b, 0x88, 0x48, 0x4c, 0x92, 0x49, 0x36, 0xa8, 0xf0, 0x86, - 0xfa, 0x12, 0x23, 0x3f, 0x26, 0xc9, 0x74, 0xc1, 0xb9, 0xca, 0x25, 0x1f, 0xe7, 0xf0, 0x11, 0xb9, - 0x4e, 0xf9, 0x7f, 0x66, 0xe6, 0x4b, 0x9c, 0x3d, 0xd2, 0xa3, 0x87, 0xbe, 0x46, 0x9f, 0x73, 0x4b, - 0x83, 0xee, 0x7e, 0x8c, 0x48, 0x3c, 0x49, 0xa6, 0x8b, 0x0b, 0x7e, 0xb0, 0xd6, 0x3e, 0x6e, 0xf8, - 0x78, 0x97, 0x7d, 0x37, 0x8c, 0x6c, 0x1a, 0x46, 0x7e, 0x1b, 0x46, 0xbe, 0x5a, 0xe6, 0x6d, 0x5a, - 0xe6, 0xfd, 0xb4, 0xcc, 0x7b, 0xbe, 0x2e, 0x94, 0x2b, 0xab, 0x9c, 0x4b, 0xb3, 0x12, 0x03, 0x76, - 0x6e, 0x6c, 0xb1, 0x7b, 0x8b, 0xfa, 0x4a, 0x7c, 0xec, 0x8f, 0xec, 0x3e, 0xd7, 0x80, 0x79, 0xd0, - 0xed, 0x72, 0xf9, 0x17, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xda, 0xf5, 0x75, 0x8b, 0x01, 0x00, 0x00, +var fileDescriptor_12c2ac447c18f7c3 = []byte{ + // 274 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0xd0, 0xb1, 0x4e, 0xc3, 0x30, + 0x10, 0x06, 0xe0, 0x3a, 0x95, 0x32, 0xb8, 0x88, 0x21, 0x03, 0x0a, 0x0c, 0x56, 0xd4, 0x85, 0x30, + 0xd4, 0x56, 0x8a, 0x90, 0x98, 0x90, 0x80, 0x81, 0x99, 0xb0, 0xb1, 0x20, 0x62, 0x8e, 0xc4, 0x52, + 0x6b, 0x57, 0x3e, 0xc7, 0x82, 0xb7, 0xe0, 0xb1, 0x18, 0x3b, 0x32, 0xa2, 0xe4, 0x45, 0x50, 0x9a, + 0x00, 0x2d, 0x12, 0x9b, 0x4f, 0x3a, 0x7f, 0x77, 0xf7, 0xd3, 0x63, 0x0d, 0xb5, 0xb3, 0x46, 0x0b, + 0x74, 0x8f, 0x0e, 0x1e, 0x3c, 0x58, 0xf5, 0xac, 0xc0, 0x0a, 0x9f, 0x89, 0x12, 0x34, 0xa0, 0x42, + 0xbe, 0xb2, 0xc6, 0x99, 0xe8, 0x70, 0x68, 0xe4, 0xbb, 0x8d, 0xdc, 0x67, 0x47, 0x42, 0x15, 0x52, + 0x2c, 0x54, 0x59, 0x39, 0xb9, 0x50, 0xa0, 0x1d, 0x0a, 0x07, 0xfa, 0x09, 0xec, 0x52, 0x69, 0xd7, + 0x41, 0xbf, 0x55, 0x6f, 0x4d, 0x2b, 0xba, 0x7f, 0x6d, 0x34, 0x82, 0xc6, 0x1a, 0xef, 0x3a, 0x2e, + 0x3a, 0xa0, 0x61, 0x05, 0x9d, 0x10, 0x93, 0x84, 0xa4, 0xe3, 0x7c, 0xa8, 0xa2, 0x0b, 0x1a, 0x48, + 0x8c, 0x83, 0x84, 0xa4, 0x93, 0x39, 0xe7, 0xaa, 0x90, 0x7c, 0x7b, 0x0e, 0xdf, 0x92, 0x7d, 0xc6, + 0x77, 0xcd, 0x3c, 0x90, 0x38, 0xbd, 0xa5, 0x7b, 0x37, 0xfd, 0x19, 0xfd, 0x9c, 0x4b, 0x1a, 0x6e, + 0xf6, 0xc7, 0x98, 0x24, 0xe3, 0x74, 0x32, 0x3f, 0xe1, 0xff, 0x9e, 0xf5, 0x97, 0x1b, 0x3e, 0x5e, + 0xe5, 0xef, 0x0d, 0x23, 0xeb, 0x86, 0x91, 0xcf, 0x86, 0x91, 0xb7, 0x96, 0x8d, 0xd6, 0x2d, 0x1b, + 0x7d, 0xb4, 0x6c, 0x74, 0x7f, 0x5e, 0x2a, 0x57, 0xd5, 0x05, 0x97, 0x66, 0x29, 0x06, 0x76, 0x66, + 0x6c, 0xf9, 0xfd, 0x16, 0xfe, 0x4c, 0xbc, 0xf4, 0x39, 0xcf, 0x7e, 0x72, 0x76, 0xaf, 0x2b, 0xc0, + 0x22, 0xdc, 0xe4, 0x72, 0xfa, 0x15, 0x00, 0x00, 0xff, 0xff, 0x2c, 0xbb, 0x34, 0x4c, 0x8e, 0x01, + 0x00, 0x00, } func (m *ConsensusState) Marshal() (dAtA []byte, err error) { diff --git a/x/state-verifier/types/query.pb.go b/x/state-verifier/types/query.pb.go index f7c8e64b3..a4c48ea58 100644 --- a/x/state-verifier/types/query.pb.go +++ b/x/state-verifier/types/query.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: neutron/state-verifier/query.proto +// source: neutron/state_verifier/v1/query.proto package types @@ -39,7 +39,7 @@ func (m *QueryVerifyStateValuesRequest) Reset() { *m = QueryVerifyStateV func (m *QueryVerifyStateValuesRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyStateValuesRequest) ProtoMessage() {} func (*QueryVerifyStateValuesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_369825dbe2d186a4, []int{0} + return fileDescriptor_57fce5d311842a25, []int{0} } func (m *QueryVerifyStateValuesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -90,7 +90,7 @@ func (m *QueryVerifyStateValuesResponse) Reset() { *m = QueryVerifyState func (m *QueryVerifyStateValuesResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyStateValuesResponse) ProtoMessage() {} func (*QueryVerifyStateValuesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_369825dbe2d186a4, []int{1} + return fileDescriptor_57fce5d311842a25, []int{1} } func (m *QueryVerifyStateValuesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -132,33 +132,34 @@ func init() { } func init() { - proto.RegisterFile("neutron/state-verifier/query.proto", fileDescriptor_369825dbe2d186a4) -} - -var fileDescriptor_369825dbe2d186a4 = []byte{ - // 348 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x91, 0xc1, 0x4b, 0x3a, 0x41, - 0x1c, 0xc5, 0x1d, 0x7f, 0x3f, 0x25, 0x26, 0x0a, 0x5a, 0x22, 0x4c, 0x6a, 0x91, 0xbd, 0x24, 0x84, - 0x33, 0xa4, 0x14, 0x76, 0xed, 0x0f, 0x08, 0x5a, 0xc1, 0x43, 0x17, 0x19, 0xed, 0xdb, 0xee, 0x80, - 0xcd, 0xac, 0x33, 0xb3, 0x8b, 0x7b, 0xed, 0xd2, 0x35, 0xe8, 0xef, 0xe9, 0x5c, 0x47, 0xa1, 0x4b, - 0xc7, 0xd0, 0xfe, 0x90, 0xd8, 0x59, 0x95, 0x48, 0xec, 0xd0, 0x6d, 0x1f, 0xbc, 0xcf, 0x7b, 0x6f, - 0xe7, 0x8b, 0x3d, 0x01, 0xb1, 0x51, 0x52, 0x50, 0x6d, 0x98, 0x81, 0x46, 0x02, 0x8a, 0xdf, 0x72, - 0x50, 0x74, 0x14, 0x83, 0x4a, 0x49, 0xa4, 0xa4, 0x91, 0xce, 0xfe, 0xdc, 0x43, 0xac, 0xa7, 0xb7, - 0xf0, 0x90, 0xe4, 0xa4, 0x7a, 0x10, 0x48, 0x19, 0x0c, 0x81, 0xb2, 0x88, 0x53, 0x26, 0x84, 0x34, - 0xcc, 0x70, 0x29, 0x74, 0x0e, 0x56, 0x97, 0xe1, 0x5c, 0x18, 0x50, 0x83, 0x90, 0x71, 0x91, 0xe5, - 0x72, 0xd0, 0xd4, 0x8c, 0x73, 0x8f, 0xf7, 0x80, 0xf0, 0xe1, 0x55, 0x56, 0xd6, 0xcd, 0x62, 0xd3, - 0x4e, 0x56, 0xd1, 0x65, 0xc3, 0x18, 0xb4, 0x0f, 0xa3, 0x18, 0xb4, 0x71, 0xf6, 0x70, 0x39, 0x04, - 0x1e, 0x84, 0xa6, 0x82, 0x6a, 0xa8, 0xfe, 0xdf, 0x9f, 0x2b, 0xe7, 0x12, 0x6f, 0x6b, 0x23, 0x15, - 0x0b, 0xa0, 0x97, 0x58, 0xa0, 0x52, 0xac, 0xfd, 0xab, 0x6f, 0x36, 0x8f, 0xc8, 0x62, 0xef, 0x4a, - 0x2d, 0xe9, 0xe4, 0x80, 0x2d, 0xf0, 0xb7, 0xf4, 0x37, 0xa5, 0xbd, 0x33, 0xec, 0xae, 0x1b, 0xa2, - 0x23, 0x29, 0x34, 0x38, 0xbb, 0xb8, 0x94, 0xb0, 0x21, 0xbf, 0xb1, 0x43, 0x36, 0xfc, 0x5c, 0x34, - 0x5f, 0x10, 0x2e, 0x59, 0xd0, 0x79, 0x46, 0x78, 0x67, 0x85, 0x76, 0xda, 0x64, 0xed, 0xfb, 0x91, - 0x5f, 0xff, 0xbc, 0x7a, 0xfe, 0x07, 0x32, 0x9f, 0xea, 0xb5, 0xee, 0xdf, 0x3e, 0x9f, 0x8a, 0x0d, - 0xe7, 0x98, 0xae, 0x39, 0xb0, 0xfd, 0x48, 0x7b, 0xf3, 0x60, 0x0b, 0x5f, 0xf8, 0xaf, 0x53, 0x17, - 0x4d, 0xa6, 0x2e, 0xfa, 0x98, 0xba, 0xe8, 0x71, 0xe6, 0x16, 0x26, 0x33, 0xb7, 0xf0, 0x3e, 0x73, - 0x0b, 0xd7, 0xed, 0x80, 0x9b, 0x30, 0xee, 0x93, 0x81, 0xbc, 0x5b, 0x04, 0x36, 0xa4, 0x0a, 0x96, - 0xe1, 0xc9, 0x29, 0x1d, 0xff, 0x6c, 0x30, 0x69, 0x04, 0xba, 0x5f, 0xb6, 0x67, 0x6e, 0x7d, 0x05, - 0x00, 0x00, 0xff, 0xff, 0xaf, 0xee, 0x37, 0xf8, 0x69, 0x02, 0x00, 0x00, + proto.RegisterFile("neutron/state_verifier/v1/query.proto", fileDescriptor_57fce5d311842a25) +} + +var fileDescriptor_57fce5d311842a25 = []byte{ + // 353 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x91, 0xc1, 0x4a, 0x2b, 0x31, + 0x14, 0x86, 0x9b, 0xde, 0xdb, 0x72, 0xc9, 0xe5, 0x5e, 0x70, 0x10, 0xa9, 0x45, 0x87, 0x32, 0x20, + 0x16, 0xa4, 0x09, 0x6d, 0x51, 0xea, 0xd6, 0x07, 0x10, 0x9c, 0x42, 0x17, 0x6e, 0x4a, 0x5a, 0x8f, + 0x33, 0x81, 0x9a, 0x4c, 0x93, 0xcc, 0xd0, 0x6e, 0xdd, 0xb8, 0x15, 0x7c, 0x1e, 0xd7, 0xba, 0x2c, + 0xb8, 0x71, 0x29, 0xad, 0x0f, 0x22, 0x93, 0x69, 0xd5, 0x5a, 0xea, 0xc2, 0xe5, 0x81, 0xf3, 0x7d, + 0xff, 0x9f, 0x1c, 0xbc, 0x27, 0x20, 0x36, 0x4a, 0x0a, 0xaa, 0x0d, 0x33, 0xd0, 0x4d, 0x40, 0xf1, + 0x4b, 0x0e, 0x8a, 0x26, 0x75, 0x3a, 0x8c, 0x41, 0x8d, 0x49, 0xa4, 0xa4, 0x91, 0xce, 0xf6, 0x7c, + 0x8d, 0x2c, 0xaf, 0x91, 0xa4, 0x5e, 0xde, 0x09, 0xa4, 0x0c, 0x06, 0x40, 0x59, 0xc4, 0x29, 0x13, + 0x42, 0x1a, 0x66, 0xb8, 0x14, 0x3a, 0x03, 0xcb, 0xde, 0xc2, 0xcf, 0x85, 0x01, 0xd5, 0x0f, 0x19, + 0x17, 0xa9, 0x97, 0x83, 0xa6, 0x66, 0x94, 0xed, 0x78, 0x37, 0x08, 0xef, 0x9e, 0xa5, 0x61, 0x9d, + 0x54, 0x3b, 0x6e, 0xa7, 0x11, 0x1d, 0x36, 0x88, 0x41, 0xfb, 0x30, 0x8c, 0x41, 0x1b, 0x67, 0x0b, + 0x17, 0x43, 0xe0, 0x41, 0x68, 0x4a, 0xa8, 0x82, 0xaa, 0xbf, 0xfd, 0xf9, 0xe4, 0x9c, 0xe2, 0xff, + 0xda, 0x48, 0xc5, 0x02, 0xe8, 0x26, 0x16, 0x28, 0xe5, 0x2b, 0xbf, 0xaa, 0x7f, 0x1b, 0xfb, 0x64, + 0xd1, 0x77, 0x25, 0x96, 0xb4, 0x33, 0xc0, 0x06, 0xf8, 0xff, 0xf4, 0xa7, 0x49, 0x7b, 0x47, 0xd8, + 0x5d, 0x57, 0x44, 0x47, 0x52, 0x68, 0x70, 0x36, 0x71, 0x21, 0x61, 0x03, 0x7e, 0x61, 0x8b, 0xfc, + 0xf1, 0xb3, 0xa1, 0xf1, 0x80, 0x70, 0xc1, 0x82, 0xce, 0x3d, 0xc2, 0x1b, 0x2b, 0xb4, 0xd3, 0x22, + 0x6b, 0xff, 0x8f, 0x7c, 0xfb, 0xf2, 0xf2, 0xf1, 0x0f, 0xc8, 0xac, 0xaa, 0xd7, 0xbc, 0x7e, 0x7a, + 0xbd, 0xcb, 0xd7, 0x9c, 0x03, 0xba, 0x74, 0xe3, 0xda, 0xc7, 0x8d, 0x2d, 0xda, 0x9d, 0x8b, 0x2d, + 0x7c, 0xe2, 0x3f, 0x4e, 0x5d, 0x34, 0x99, 0xba, 0xe8, 0x65, 0xea, 0xa2, 0xdb, 0x99, 0x9b, 0x9b, + 0xcc, 0xdc, 0xdc, 0xf3, 0xcc, 0xcd, 0x9d, 0xb7, 0x02, 0x6e, 0xc2, 0xb8, 0x47, 0xfa, 0xf2, 0x6a, + 0x21, 0xac, 0x49, 0x15, 0xbc, 0xcb, 0x93, 0x43, 0x3a, 0xfa, 0x9a, 0x60, 0xc6, 0x11, 0xe8, 0x5e, + 0xd1, 0x9e, 0xb9, 0xf9, 0x16, 0x00, 0x00, 0xff, 0xff, 0x90, 0xd2, 0x13, 0x46, 0x6c, 0x02, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -238,7 +239,7 @@ var _Query_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "neutron/state-verifier/query.proto", + Metadata: "neutron/state_verifier/v1/query.proto", } func (m *QueryVerifyStateValuesRequest) Marshal() (dAtA []byte, err error) { diff --git a/x/state-verifier/types/query.pb.gw.go b/x/state-verifier/types/query.pb.gw.go index f7df3c692..51ec48b3b 100644 --- a/x/state-verifier/types/query.pb.gw.go +++ b/x/state-verifier/types/query.pb.gw.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: neutron/state-verifier/query.proto +// source: neutron/state_verifier/v1/query.proto /* Package types is a reverse proxy. From 8fe02d9f41b87c34f2c98c95237c777ea5801520 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Thu, 14 Nov 2024 12:29:27 +0200 Subject: [PATCH 15/29] more tests --- x/state-verifier/keeper/keeper_test.go | 81 ++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 5 deletions(-) diff --git a/x/state-verifier/keeper/keeper_test.go b/x/state-verifier/keeper/keeper_test.go index ae5b94bf9..9b1f6fcdc 100644 --- a/x/state-verifier/keeper/keeper_test.go +++ b/x/state-verifier/keeper/keeper_test.go @@ -7,7 +7,9 @@ import ( "cosmossdk.io/math" wasmKeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/proto/tendermint/crypto" sdk "github.com/cosmos/cosmos-sdk/types" + ibctypes "github.com/cosmos/ibc-go/v8/modules/core/23-commitment/types" host "github.com/cosmos/ibc-go/v8/modules/core/24-host" ibchost "github.com/cosmos/ibc-go/v8/modules/core/exported" "github.com/stretchr/testify/suite" @@ -26,11 +28,11 @@ type KeeperTestSuite struct { func (suite *KeeperTestSuite) TestVerifyValue() { tests := []struct { name string - malleate func(sender string, ctx sdk.Context) + malleate func(sender string, ctx sdk.Context) ([]*iqtypes.StorageValue, int64, error) }{ { name: "valid KV storage proof", - malleate: func(sender string, ctx sdk.Context) { + malleate: func(sender string, ctx sdk.Context) ([]*iqtypes.StorageValue, int64, error) { clientKey := host.FullClientStateKey(suite.Path.EndpointA.ClientID) resp, err := suite.ChainA.App.Query(ctx, &types.RequestQuery{ @@ -41,12 +43,75 @@ func (suite *KeeperTestSuite) TestVerifyValue() { }) suite.Require().NoError(err) - suite.Require().NoError(suite.GetNeutronZoneApp(suite.ChainA).StateVerifierKeeper.Verify(ctx, resp.Height, []*iqtypes.StorageValue{{ + return []*iqtypes.StorageValue{{ Key: resp.Key, Proof: resp.ProofOps, Value: resp.Value, StoragePrefix: ibchost.StoreKey, - }})) + }}, resp.Height, nil + }, + }, + { + name: "empty KV storage proof", + malleate: func(sender string, ctx sdk.Context) ([]*iqtypes.StorageValue, int64, error) { + clientKey := host.FullClientStateKey(suite.Path.EndpointA.ClientID) + + resp, err := suite.ChainA.App.Query(ctx, &types.RequestQuery{ + Path: fmt.Sprintf("store/%s/key", ibchost.StoreKey), + Height: suite.ChainA.LastHeader.Header.Height - 1, + Data: clientKey, + Prove: true, + }) + suite.Require().NoError(err) + + return []*iqtypes.StorageValue{{ + Key: resp.Key, + Proof: nil, + Value: resp.Value, + StoragePrefix: ibchost.StoreKey, + }}, resp.Height, ibctypes.ErrInvalidMerkleProof + }, + }, + { + name: "invalid KV storage proof", + malleate: func(sender string, ctx sdk.Context) ([]*iqtypes.StorageValue, int64, error) { + clientKey := host.FullClientStateKey(suite.Path.EndpointA.ClientID) + + resp, err := suite.ChainA.App.Query(ctx, &types.RequestQuery{ + Path: fmt.Sprintf("store/%s/key", ibchost.StoreKey), + Height: suite.ChainA.LastHeader.Header.Height - 1, + Data: clientKey, + Prove: true, + }) + suite.Require().NoError(err) + + return []*iqtypes.StorageValue{{ + Key: resp.Key, + Proof: &crypto.ProofOps{Ops: []crypto.ProofOp{{Type: "dasfsdf", Key: []byte("sffgsdf"), Data: []byte("sfdsdfs")}}}, + Value: resp.Value, + StoragePrefix: ibchost.StoreKey, + }}, resp.Height, ibctypes.ErrInvalidMerkleProof + }, + }, + { + name: "invalid height for proof", + malleate: func(sender string, ctx sdk.Context) ([]*iqtypes.StorageValue, int64, error) { + clientKey := host.FullClientStateKey(suite.Path.EndpointA.ClientID) + + resp, err := suite.ChainA.App.Query(ctx, &types.RequestQuery{ + Path: fmt.Sprintf("store/%s/key", ibchost.StoreKey), + Height: suite.ChainA.LastHeader.Header.Height - 1, + Data: clientKey, + Prove: true, + }) + suite.Require().NoError(err) + + return []*iqtypes.StorageValue{{ + Key: resp.Key, + Proof: resp.ProofOps, + Value: resp.Value, + StoragePrefix: ibchost.StoreKey, + }}, resp.Height - 2, fmt.Errorf("Please ensure proof was submitted with correct proofHeight and to the correct chain.") }, }, } @@ -73,7 +138,13 @@ func (suite *KeeperTestSuite) TestVerifyValue() { senderAddress := suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress() suite.TopUpWallet(ctx, senderAddress, contractAddress) - tt.malleate(contractAddress.String(), ctx) + stValues, height, expectedError := tt.malleate(contractAddress.String(), ctx) + + if expectedError != nil { + suite.Require().ErrorContains(suite.GetNeutronZoneApp(suite.ChainA).StateVerifierKeeper.Verify(ctx, height, stValues), expectedError.Error()) + } else { + suite.Require().NoError(suite.GetNeutronZoneApp(suite.ChainA).StateVerifierKeeper.Verify(ctx, height, stValues)) + } }) } } From 3ecc8ee45ce361a6cf72b549b123eae1cc60d1e2 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Thu, 14 Nov 2024 12:31:50 +0200 Subject: [PATCH 16/29] more tests --- x/state-verifier/keeper/keeper_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/x/state-verifier/keeper/keeper_test.go b/x/state-verifier/keeper/keeper_test.go index 9b1f6fcdc..c7f1cb6c9 100644 --- a/x/state-verifier/keeper/keeper_test.go +++ b/x/state-verifier/keeper/keeper_test.go @@ -114,6 +114,27 @@ func (suite *KeeperTestSuite) TestVerifyValue() { }}, resp.Height - 2, fmt.Errorf("Please ensure proof was submitted with correct proofHeight and to the correct chain.") }, }, + { + name: "invalid storage prefix", + malleate: func(sender string, ctx sdk.Context) ([]*iqtypes.StorageValue, int64, error) { + clientKey := host.FullClientStateKey(suite.Path.EndpointA.ClientID) + + resp, err := suite.ChainA.App.Query(ctx, &types.RequestQuery{ + Path: fmt.Sprintf("store/%s/key", ibchost.StoreKey), + Height: suite.ChainA.LastHeader.Header.Height - 1, + Data: clientKey, + Prove: true, + }) + suite.Require().NoError(err) + + return []*iqtypes.StorageValue{{ + Key: resp.Key, + Proof: resp.ProofOps, + Value: resp.Value, + StoragePrefix: "kekekek", + }}, resp.Height, fmt.Errorf("Please ensure the path and value are both correct.") + }, + }, } for i, tc := range tests { From 81db51ff70222caacb583f1a7170b940a079d587 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 08:13:31 +0000 Subject: [PATCH 17/29] Bump google.golang.org/protobuf from 1.35.1 to 1.35.2 Bumps google.golang.org/protobuf from 1.35.1 to 1.35.2. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bfe8ffb1c..6383fe76c 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.35.1 + google.golang.org/protobuf v1.35.2 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index 4f75b8005..1ff5289c9 100644 --- a/go.sum +++ b/go.sum @@ -1694,8 +1694,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From f44ad7b5dbdbc2a7f53814a007448c2ffde5f1b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 08:53:11 +0000 Subject: [PATCH 18/29] Bump cosmossdk.io/math from 1.3.0 to 1.4.0 Bumps [cosmossdk.io/math](https://github.com/cosmos/cosmos-sdk) from 1.3.0 to 1.4.0. - [Release notes](https://github.com/cosmos/cosmos-sdk/releases) - [Changelog](https://github.com/cosmos/cosmos-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/cosmos/cosmos-sdk/compare/log/v1.3.0...log/v1.4.0) --- updated-dependencies: - dependency-name: cosmossdk.io/math dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bfe8ffb1c..e64c74dee 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( cosmossdk.io/core v0.11.1 cosmossdk.io/errors v1.0.1 cosmossdk.io/log v1.4.1 - cosmossdk.io/math v1.3.0 + cosmossdk.io/math v1.4.0 cosmossdk.io/store v1.1.0 cosmossdk.io/x/evidence v0.1.1 cosmossdk.io/x/feegrant v0.1.1 diff --git a/go.sum b/go.sum index 4f75b8005..206c16b78 100644 --- a/go.sum +++ b/go.sum @@ -200,8 +200,8 @@ cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= cosmossdk.io/log v1.4.1/go.mod h1:k08v0Pyq+gCP6phvdI6RCGhLf/r425UT6Rk/m+o74rU= -cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= -cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= cosmossdk.io/store v1.1.0 h1:LnKwgYMc9BInn9PhpTFEQVbL9UK475G2H911CGGnWHk= cosmossdk.io/store v1.1.0/go.mod h1:oZfW/4Fc/zYqu3JmQcQdUJ3fqu5vnYTn3LZFFy8P8ng= cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= From 7753d040b8dfabf84feb43d764ee960086056c05 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 22 Nov 2024 14:39:56 +0200 Subject: [PATCH 19/29] v5.0.2 upgrade handler + tokenfactory tests + increasage of tf gas limit call --- app/app.go | 2 + app/upgrades/v5.0.2/constants.go | 18 ++ app/upgrades/v5.0.2/upgrades.go | 30 +++ app/upgrades/v5.0.2/upgrades_test.go | 37 +++ go.mod | 1 + testutil/test_helpers.go | 10 + x/tokenfactory/keeper/before_send_test.go | 222 ++++++++++++++++++ x/tokenfactory/keeper/keeper_test.go | 10 + .../testdata/infinite_track_beforesend.wasm | Bin 0 -> 143412 bytes x/tokenfactory/keeper/testdata/no100.wasm | Bin 0 -> 195044 bytes x/tokenfactory/types/constants.go | 2 +- 11 files changed, 331 insertions(+), 1 deletion(-) create mode 100644 app/upgrades/v5.0.2/constants.go create mode 100644 app/upgrades/v5.0.2/upgrades.go create mode 100644 app/upgrades/v5.0.2/upgrades_test.go create mode 100644 x/tokenfactory/keeper/testdata/infinite_track_beforesend.wasm create mode 100644 x/tokenfactory/keeper/testdata/no100.wasm diff --git a/app/app.go b/app/app.go index 8d5fab53e..e07388ec8 100644 --- a/app/app.go +++ b/app/app.go @@ -10,6 +10,7 @@ import ( "path/filepath" "time" + v502 "github.com/neutron-org/neutron/v5/app/upgrades/v5.0.2" dynamicfeestypes "github.com/neutron-org/neutron/v5/x/dynamicfees/types" "github.com/skip-mev/feemarket/x/feemarket" @@ -228,6 +229,7 @@ const ( var ( Upgrades = []upgrades.Upgrade{ v500.Upgrade, + v502.Upgrade, } // DefaultNodeHome default home directories for the application daemon diff --git a/app/upgrades/v5.0.2/constants.go b/app/upgrades/v5.0.2/constants.go new file mode 100644 index 000000000..fca497bfd --- /dev/null +++ b/app/upgrades/v5.0.2/constants.go @@ -0,0 +1,18 @@ +package v502 + +import ( + storetypes "cosmossdk.io/store/types" + + "github.com/neutron-org/neutron/v5/app/upgrades" +) + +const ( + // UpgradeName defines the on-chain upgrade name. + UpgradeName = "v5.0.2" +) + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: CreateUpgradeHandler, + StoreUpgrades: storetypes.StoreUpgrades{}, +} diff --git a/app/upgrades/v5.0.2/upgrades.go b/app/upgrades/v5.0.2/upgrades.go new file mode 100644 index 000000000..c0e20d180 --- /dev/null +++ b/app/upgrades/v5.0.2/upgrades.go @@ -0,0 +1,30 @@ +package v502 + +import ( + "context" + "fmt" + + upgradetypes "cosmossdk.io/x/upgrade/types" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + + "github.com/neutron-org/neutron/v5/app/upgrades" +) + +func CreateUpgradeHandler( + _ *module.Manager, + _ module.Configurator, + _ *upgrades.UpgradeKeepers, + _ upgrades.StoreKeys, + _ codec.Codec, +) upgradetypes.UpgradeHandler { + return func(c context.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + ctx := sdk.UnwrapSDKContext(c) + + ctx.Logger().Info("Starting module migrations...") + + ctx.Logger().Info(fmt.Sprintf("Migration {%s} applied", UpgradeName)) + return vm, nil + } +} diff --git a/app/upgrades/v5.0.2/upgrades_test.go b/app/upgrades/v5.0.2/upgrades_test.go new file mode 100644 index 000000000..a9062c5ea --- /dev/null +++ b/app/upgrades/v5.0.2/upgrades_test.go @@ -0,0 +1,37 @@ +package v502_test + +import ( + "testing" + + upgradetypes "cosmossdk.io/x/upgrade/types" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + + v502 "github.com/neutron-org/neutron/v5/app/upgrades/v5.0.2" + "github.com/neutron-org/neutron/v5/testutil" +) + +type UpgradeTestSuite struct { + testutil.IBCConnectionTestSuite +} + +func TestKeeperTestSuite(t *testing.T) { + suite.Run(t, new(UpgradeTestSuite)) +} + +func (suite *UpgradeTestSuite) SetupTest() { + suite.IBCConnectionTestSuite.SetupTest() +} + +func (suite *UpgradeTestSuite) TestOracleUpgrade() { + app := suite.GetNeutronZoneApp(suite.ChainA) + ctx := suite.ChainA.GetContext().WithChainID("neutron-1") + t := suite.T() + + upgrade := upgradetypes.Plan{ + Name: v502.UpgradeName, + Info: "some text here", + Height: 100, + } + require.NoError(t, app.UpgradeKeeper.ApplyUpgrade(ctx, upgrade)) +} diff --git a/go.mod b/go.mod index e64c74dee..2816f7fc5 100644 --- a/go.mod +++ b/go.mod @@ -218,6 +218,7 @@ require ( ) replace ( + cosmossdk.io/math => cosmossdk.io/math v1.4.0 github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 github.com/CosmWasm/wasmd => github.com/neutron-org/wasmd v0.53.0-neutron github.com/cometbft/cometbft => github.com/neutron-org/cometbft v0.0.0-20241111105801-a7fe160b0b62 diff --git a/testutil/test_helpers.go b/testutil/test_helpers.go index de7cb00ba..12b6ede56 100644 --- a/testutil/test_helpers.go +++ b/testutil/test_helpers.go @@ -288,6 +288,16 @@ func (suite *IBCConnectionTestSuite) FundAcc(acc sdk.AccAddress, amounts sdk.Coi suite.Require().NoError(err) } +// FundModuleAcc funds target modules with specified amount. +func (suite *IBCConnectionTestSuite) FundModuleAcc(moduleName string, amounts sdk.Coins) { + bankKeeper := suite.GetNeutronZoneApp(suite.ChainA).BankKeeper + err := bankKeeper.MintCoins(suite.ChainA.GetContext(), tokenfactorytypes.ModuleName, amounts) + suite.Require().NoError(err) + + err = bankKeeper.SendCoinsFromModuleToModule(suite.ChainA.GetContext(), tokenfactorytypes.ModuleName, moduleName, amounts) + suite.Require().NoError(err) +} + // update CCV path with correct info func SetupCCVPath(path *ibctesting.Path, suite *IBCConnectionTestSuite) { // - set provider endpoint's clientID diff --git a/x/tokenfactory/keeper/before_send_test.go b/x/tokenfactory/keeper/before_send_test.go index 3ffd7a0f4..c47560596 100644 --- a/x/tokenfactory/keeper/before_send_test.go +++ b/x/tokenfactory/keeper/before_send_test.go @@ -2,12 +2,17 @@ package keeper_test import ( "encoding/json" + "fmt" "os" "cosmossdk.io/math" + storetypes "cosmossdk.io/store/types" wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + dextypes "github.com/neutron-org/neutron/v5/x/dex/types" + icqtypes "github.com/neutron-org/neutron/v5/x/interchainqueries/types" "github.com/neutron-org/neutron/v5/x/tokenfactory/types" ) @@ -46,6 +51,127 @@ func (suite *KeeperTestSuite) initBalanceTrackContract(denom string) (sdk.AccAdd return cosmwasmAddress, codeID, factoryDenom } +type SendMsgTestCase struct { + desc string + msg func(denom string) *banktypes.MsgSend + expectPass bool +} + +func (suite *KeeperTestSuite) TestBeforeSendHook() { + for _, tc := range []struct { + desc string + wasmFile string + sendMsgs []SendMsgTestCase + }{ + { + desc: "should not allow sending 100 amount of *any* denom", + wasmFile: "./testdata/no100.wasm", + sendMsgs: []SendMsgTestCase{ + { + desc: "sending 1 of factorydenom should not error", + msg: func(factorydenom string) *banktypes.MsgSend { + return banktypes.NewMsgSend( + suite.TestAccs[0], + suite.TestAccs[1], + sdk.NewCoins(sdk.NewInt64Coin(factorydenom, 1)), + ) + }, + expectPass: true, + }, + { + desc: "sending 1 of non-factorydenom should not error", + msg: func(factorydenom string) *banktypes.MsgSend { + return banktypes.NewMsgSend( + suite.TestAccs[0], + suite.TestAccs[1], + sdk.NewCoins(sdk.NewInt64Coin("foo", 1)), + ) + }, + expectPass: true, + }, + { + desc: "sending 100 of factorydenom should error", + msg: func(factorydenom string) *banktypes.MsgSend { + return banktypes.NewMsgSend( + suite.TestAccs[0], + suite.TestAccs[1], + sdk.NewCoins(sdk.NewInt64Coin(factorydenom, 100)), + ) + }, + expectPass: false, + }, + { + desc: "sending 100 of non-factorydenom should work", + msg: func(factorydenom string) *banktypes.MsgSend { + return banktypes.NewMsgSend( + suite.TestAccs[0], + suite.TestAccs[1], + sdk.NewCoins(sdk.NewInt64Coin("foo", 100)), + ) + }, + expectPass: true, + }, + { + desc: "having 100 coin within coins should not work", + msg: func(factorydenom string) *banktypes.MsgSend { + return banktypes.NewMsgSend( + suite.TestAccs[0], + suite.TestAccs[1], + sdk.NewCoins(sdk.NewInt64Coin(factorydenom, 100), sdk.NewInt64Coin("foo", 1)), + ) + }, + expectPass: false, + }, + }, + }, + } { + suite.Run(fmt.Sprintf("Case %suite", tc.desc), func() { + // setup test + suite.Setup() + + senderAddress := suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress() + suite.TopUpWallet(suite.ChainA.GetContext(), senderAddress, suite.TestAccs[0]) + + // upload and instantiate wasm code + wasmCode, err := os.ReadFile(tc.wasmFile) + suite.Require().NoError(err, "test: %v", tc.desc) + codeID, _, err := suite.contractKeeper.Create(suite.ChainA.GetContext(), suite.TestAccs[0], wasmCode, nil) + suite.Require().NoError(err, "test: %v", tc.desc) + cosmwasmAddress, _, err := suite.contractKeeper.Instantiate(suite.ChainA.GetContext(), codeID, suite.TestAccs[0], suite.TestAccs[0], []byte("{}"), "", sdk.NewCoins()) + suite.Require().NoError(err, "test: %v", tc.desc) + + // create new denom + res, err := suite.msgServer.CreateDenom(suite.ChainA.GetContext(), types.NewMsgCreateDenom(suite.TestAccs[0].String(), "bitcoin")) + suite.Require().NoError(err, "test: %v", tc.desc) + denom := res.GetNewTokenDenom() + + // mint enough coins to the creator + _, err = suite.msgServer.Mint(suite.ChainA.GetContext(), types.NewMsgMint(suite.TestAccs[0].String(), sdk.NewInt64Coin(denom, 1000000000))) + suite.Require().NoError(err) + // mint some non token factory denom coins for testing + suite.FundAcc(sdk.MustAccAddressFromBech32(suite.TestAccs[0].String()), sdk.Coins{sdk.NewInt64Coin("foo", 100000000000)}) + + params := types.DefaultParams() + params.WhitelistedHooks = []*types.WhitelistedHook{{DenomCreator: suite.TestAccs[0].String(), CodeID: 1}} + err = suite.GetNeutronZoneApp(suite.ChainA).TokenFactoryKeeper.SetParams(suite.ChainA.GetContext(), params) + suite.Require().NoError(err) + + // set beforesend hook to the new denom + _, err = suite.msgServer.SetBeforeSendHook(suite.ChainA.GetContext(), types.NewMsgSetBeforeSendHook(suite.TestAccs[0].String(), denom, cosmwasmAddress.String())) + suite.Require().NoError(err, "test: %v", tc.desc) + + for _, sendTc := range tc.sendMsgs { + _, err := suite.bankMsgServer.Send(suite.ChainA.GetContext(), sendTc.msg(denom)) + if sendTc.expectPass { + suite.Require().NoError(err, "test: %v", sendTc.desc) + } else { + suite.Require().Error(err, "test: %v", sendTc.desc) + } + } + }) + } +} + func (suite *KeeperTestSuite) TestTrackBeforeSendWasm() { suite.Setup() @@ -115,3 +241,99 @@ func (suite *KeeperTestSuite) TestNonWhitelistedHooksNotCalled() { // Whitelisted contract is not called suite.Require().Equal("\"0\"", string(queryResp)) } + +// TestInfiniteTrackBeforeSend tests gas metering with infinite loop contract +// to properly test if we are gas metering trackBeforeSend properly. +func (suite *KeeperTestSuite) TestInfiniteTrackBeforeSend() { + for _, tc := range []struct { + name string + wasmFile string + tokenToSend sdk.Coins + useFactoryDenom bool + blockBeforeSend bool + expectedError bool + }{ + { + name: "sending tokenfactory denom from module to module with infinite contract should panic", + wasmFile: "./testdata/infinite_track_beforesend.wasm", + useFactoryDenom: true, + }, + { + name: "sending tokenfactory denom from account to account with infinite contract should panic", + wasmFile: "./testdata/infinite_track_beforesend.wasm", + useFactoryDenom: true, + blockBeforeSend: true, + }, + { + name: "sending non-tokenfactory denom from module to module with infinite contract should not panic", + wasmFile: "./testdata/infinite_track_beforesend.wasm", + tokenToSend: sdk.NewCoins(sdk.NewInt64Coin("foo", 1000000)), + useFactoryDenom: false, + }, + { + name: "Try using no 100", + wasmFile: "./testdata/no100.wasm", + useFactoryDenom: true, + }, + } { + suite.Run(fmt.Sprintf("Case %suite", tc.name), func() { + // setup test + suite.Setup() + + // load wasm file + wasmCode, err := os.ReadFile(tc.wasmFile) + suite.Require().NoError(err) + + // instantiate wasm code + codeID, _, err := suite.contractKeeper.Create(suite.ChainA.GetContext(), suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress(), wasmCode, nil) + suite.Require().NoError(err, "test: %v", tc.name) + cosmwasmAddress, _, err := suite.contractKeeper.Instantiate(suite.ChainA.GetContext(), codeID, suite.TestAccs[0], suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress(), []byte("{}"), "", sdk.NewCoins()) + suite.Require().NoError(err, "test: %v", tc.name) + + params := types.DefaultParams() + params.WhitelistedHooks = []*types.WhitelistedHook{{DenomCreator: suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress().String(), CodeID: 1}} + err = suite.GetNeutronZoneApp(suite.ChainA).TokenFactoryKeeper.SetParams(suite.ChainA.GetContext(), params) + suite.Require().NoError(err) + + // create new denom + res, err := suite.msgServer.CreateDenom(suite.ChainA.GetContext(), types.NewMsgCreateDenom(suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress().String(), "bitcoin")) + suite.Require().NoError(err, "test: %v", tc.name) + factoryDenom := res.GetNewTokenDenom() + + var tokenToSend sdk.Coins + if tc.useFactoryDenom { + tokenToSend = sdk.NewCoins(sdk.NewInt64Coin(factoryDenom, 100)) + } else { + tokenToSend = tc.tokenToSend + } + + // send the mint module tokenToSend + if tc.blockBeforeSend { + suite.FundAcc(suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress(), tokenToSend) + } else { + suite.FundModuleAcc(icqtypes.ModuleName, tokenToSend) + } + + // set beforesend hook to the new denom + // we register infinite loop contract here to test if we are gas metering properly + _, err = suite.msgServer.SetBeforeSendHook(suite.ChainA.GetContext(), types.NewMsgSetBeforeSendHook(suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress().String(), factoryDenom, cosmwasmAddress.String())) + suite.Require().NoError(err, "test: %v", tc.name) + + ctx := suite.ChainA.GetContext().WithGasMeter(storetypes.NewGasMeter(30_000_000)) + + if tc.blockBeforeSend { + err = suite.GetNeutronZoneApp(suite.ChainA).BankKeeper.SendCoins(ctx, suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress(), suite.ChainA.SenderAccounts[1].SenderAccount.GetAddress(), tokenToSend) + suite.Require().Error(err) + } else { + // track before send suppresses in any case, thus we expect no error + err = suite.GetNeutronZoneApp(suite.ChainA).BankKeeper.SendCoinsFromModuleToModule(ctx, icqtypes.ModuleName, dextypes.ModuleName, tokenToSend) + suite.Require().NoError(err) + + // send should happen regardless of trackBeforeSend results + distributionModuleAddress := suite.GetNeutronZoneApp(suite.ChainA).AccountKeeper.GetModuleAddress("dex") + distributionModuleBalances := suite.GetNeutronZoneApp(suite.ChainA).BankKeeper.GetAllBalances(suite.ChainA.GetContext(), distributionModuleAddress) + suite.Require().True(distributionModuleBalances.Equal(tokenToSend)) + } + }) + } +} diff --git a/x/tokenfactory/keeper/keeper_test.go b/x/tokenfactory/keeper/keeper_test.go index bbf4b0488..31e5beaad 100644 --- a/x/tokenfactory/keeper/keeper_test.go +++ b/x/tokenfactory/keeper/keeper_test.go @@ -4,9 +4,12 @@ import ( "testing" "cosmossdk.io/math" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "github.com/cometbft/cometbft/crypto/ed25519" "github.com/cosmos/cosmos-sdk/baseapp" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/stretchr/testify/suite" @@ -29,6 +32,10 @@ type KeeperTestSuite struct { TestAccs []sdktypes.AccAddress QueryHelper *baseapp.QueryServiceTestHelper + contractKeeper wasmtypes.ContractOpsKeeper + + bankMsgServer banktypes.MsgServer + queryClient types.QueryClient msgServer types.MsgServer // defaultDenom is on the suite, as it depends on the creator test address. @@ -61,7 +68,10 @@ func (suite *KeeperTestSuite) Setup() { )) suite.Require().NoError(err) + suite.bankMsgServer = bankkeeper.NewMsgServerImpl(suite.GetNeutronZoneApp(suite.ChainA).BankKeeper) suite.msgServer = keeper.NewMsgServerImpl(*tokenFactoryKeeper) + + suite.contractKeeper = wasmkeeper.NewDefaultPermissionKeeper(suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper) } func (suite *KeeperTestSuite) SetupTokenFactory() { diff --git a/x/tokenfactory/keeper/testdata/infinite_track_beforesend.wasm b/x/tokenfactory/keeper/testdata/infinite_track_beforesend.wasm new file mode 100644 index 0000000000000000000000000000000000000000..44bf738f1cde3ee2f4558ad039995a97e9d306b5 GIT binary patch literal 143412 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 PBLD(>iF|-j#c}@u>>hmv literal 0 HcmV?d00001 diff --git a/x/tokenfactory/keeper/testdata/no100.wasm b/x/tokenfactory/keeper/testdata/no100.wasm new file mode 100644 index 0000000000000000000000000000000000000000..57de535ebb5c5d1bc2e34b14c0383bdf5b958cfc GIT binary patch literal 195044 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 z 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 Cpo3^QTUVfxx4+ z+(U+hXA_UsA{mge4KO{qu@1S-r8md{C_M`BY2&0EFV4|mkeHNX#o^SS9Od*e?#bWx zu=JJ}RG;D^f3#KfT<;)k7Aep~|6qR?NOZ@j5oSntbq87I&7Ds}E2goWx=z zWDTNP57AI`hCqc+PFQLL5}mx!sanbvDhWpc|6cww)i&uZb({iQRFNiH1OiuXu_+n) zl_o#xSb6}ELgoZc9jskDASt}mG~Ean;g z@n_~y4=jZ`anBQoq4A;LB&47_LJATG<_=H>z>G`|fJf%>tO3431WE+BcF;&&HHImm z)bPapFgJ;x#WL#<1M>9q<~(Y`idb|xu{r}R@l8-Wy9}<`|d7wk8%JmjgXs5hldJ=F2u%$Dn*i?y%F;A zAM<;LXZw71%$aPl3gON_r_1Q&*5z>o3qv~J+JBGUQ@_3Uo<`sOdG@~P;XGeqkm~*t z-Pw~}s+Gusyl3PhS(*+Q!2P_@NMKFVgBji@+YLk6&QP>zbHRth>SXP~QbAyk;GAE( zWpF`*y^IH92CZTRme=jFY6kH!#ZKLH&)pPQtIIqjUV zKJ%_W`A)~*I%H6p{sUYyMg2%Pd8E$-ZOx3|M@(&!lOl#Z22nmugsMfXdHqHqGdkZg zO~elr1Hw7-gw{0Joeaq^e<_ctb7_LcwO^hYl1hxY+^~eH3o0Rb3xT>EH9v{n@g_Y~ z9uO6A2$+E84#W_T;-6%EjKXLUM}jg|^nb9aOqCleQ{9ACR$FV-b0x_<3%0m6rCI`z z?f8hlVktLu*UI6yZYo_E*Ik*4&&}w78$wdvl&P`d!3?OKNoA@dWy-cD+5Siw3^Q~D zme;szpaQht8gJzl;+!(xF}P!C}qm? zzGQN6S z)ZBayQ>p9TI1k7Z^M#|nuMRU&y~PfoQWde;03#~4a_R8hnH4W>30R$9EZT$Cpqmt} zJkPSCWOIo1)x|+RA=^CISIov``WPhJ&>7rr@;D2;Z4Cg)3d5|t6K#p?G_ViTBf2Q< z?Iii5fXgRjbqb?oeTqTwIzB|)V}u50J|;WhPtWbmdVZt_5ER({Aqswik zTtHUEVvc8qmq5YIJDbf6yJzYqKda`L0s%-}A<4`g^nWY5Q*8ToZnqEv>9_X2Au|`k z@2dva%}_>>nen@KBOjBfgPnjJThx2puo8P3YLr#h_JSxP>U()pl_H!mR`@PHR0Lz} zJb;*BE^}rkao&|0GiwSPJk&*wiPIqMY*)w|j_CFJ+I=8dI0nmf_w>$1sn(|=bvgr_ z8ATMxs$7dL7N=av0--i>8LG{(d^Cw?tgj*Q5RUfARBaYhVq#T7(>`+ROtH)qO9Rd7 zuFyHU5;ah3)5K^b3=^XK-b9FMvu&0C{}ze=Pg*2SN!dERMdGh>w|yZ?mE3n3{FAyZ z}=$H0s3ox4+53>FpEYa1Bz9{)mpOsip}HP$j*tL{Q1_T>q&E&{uz6)eG`l>3H}j5rl?v`zbf8^ zRcYH&UTWQ>x*>KdW!=YsHPjm0!k=hL@eT`TO1@!3#$&@W;+inMDrDs@iG}#45m37y@`hq%n%Mt6Jz~5Vuq^k z@A&;Lhh;@H3FUTLREmC8c!~62M5qK^CdN-LE1vLcRow3sJ&(!P>^nNb+smxK%#D`^ zFH-aZ?O-YLky2q!02DoBc^FOgxoyQl;MDh5>V2IAIJX@t==$lsWmda_4PQ1co#eo- z1~E5US63}(tKd*W;f+8+FyQ=5UIT;I`?q9<(pT5}0KX~X91kQJ6kUSLPqV8?BH~3f zx|YSi>7@XtXWy;_GhDybODX=LuQ&-*XmC;vbp%tiY@5hHOuN=)`5~Ft$9YxD8veDLrE)Vwqj;n(r#R4O43?Jw1%Yhy{fWZ#jUH@4onWS z6_4e7Eom(i+R~JyB{NKtwC&nh#jlKADKDd>RbB^)fUii>Iz~kj$;U`(=rbXI5>l3q zlps}({>aoxc6v3&s2j^?MSIjH7t3561B-dhsz=uV$_~ zG9$wG`>)#joYS2SDC*qrYuGuv_O4yEYSpUss#R4JrM==5DEh^vJ*FsCPps^4X%Cz? zMh1`uwH8HyieSy}gu55RoXJyA#+W-CSK=Ukb^Y1Qs*a)4Bg|~QB~#sh6wj~PMDxAk zJA&9B8(=3-WKFII^R3n=*6j>^(_at8ya;}6`X2p&E0prgwJU}$wqacsFC~nbqZpDA zgnF}%Tfxayw~csF4wP1OE9l({ZJ9h;%o>Xs<`?X)=sqzogEfgvc-aE2qc`_Y{N}DY z4vgkX<&+OwQ&1XUr#D9PH zCd4ymhOqi35Dbts0c6=0Na_LXa#XweeG|+JUG1C{`;F8oRrEl;T4g~C)xN3M$Ib0N z*&WS*b)8++ov7W7(s(Vcc5aY3WFW};h`lGb_$>UaDY)VjQw%|bwt3)41+g|C?7nJ`jGZNjn&e_90t?Lb4;>~w>K2YIJw#jLJg{vsd` zlfQfr(^(xw8!{NtfCAyfprrT~A?&J*K@n(jvx&rri|`6Jf*?ng5ZUj58*R!Rtg+$s zg2;jN?>2(PfVbHENw~Q;RVR`aSYbOH3rq4ls%QnG@Je}CTfyLuY zlFC!qzo-^dNM$)l7~EARV1}$L+(d~or+Z@Kn1C{KWRi_zLn%mPw8sLQJ6&*?(D#oq zR~7n@;gGNg-N4w5StaIT;q4PiH+HW~MY>Y-Rj?aGlStPFk&&*slVj2q#LAI~JAT14bjJzxpp)F_$nV%>J~D34jJjdIaW?LRHZJ;Ioe zd9S)Bu1gqmgE*m5DvEKTEgS@RRbzB@gh!&jgi6ugv^s05e9~Q#IO2p#O?Rw|Vtpaq z5fesKYEi6CcQi-1km0;XM5-maqjs5gam1R}W1@44C{{Jjv_NT9HIlVG91?Ps{EB(J z_@?dKR8On1D3kY&`E4Ir5z7@LZQC8f+=nKnS-DV@%$Ip9?_?~c%`sW5?Q>&U2%@lU zZi49D63Wn&s+Zl+Lbn*F)Qp&uq>A6ceK}K5_|hpS#O{zZ28-ZjSev(|zDc42n-4J z37N%P3IA5}>FnTJB{MglK8ehx2v^5JIt7_Yt(ZtzE>yiXV;&nJ%$Ucqhx9E(;>55` zm#3JWWmQ24w~-f?iEVsXn%KsfO;kH5mQZZM(zA(en2gi-;Dzr9L>8QUHYqp|qLH#; zHA$nZ246VK8?K_-CTKk*3lYVcp&a6TpdKR@D@mkcg6#`aaApEoDNEl%yn%Fon<3-q z3um;by)IU=ZZ{3FR(;|)6#9tle-WkWNr<@`mqdS@ic2cDaN}eI5C#mqDsMDaP6df> zYNJ(L0Ff_b%fzY^_es@!A@LHcXur((4e@@mF&9tB*NuQ`WF;MEK(=E2YN^F8!j`kn z-NOPulu-ah>S(E{5W5R8p;LudYOa$McYwNmkaG5YO6D;k<=Q!z)x6 zO~}w_`5UQKvCyoa(<&6ga=2q>YMxhvzHL#2J%-vX2AjQWb}N2-tqvLpyNt#J69p%s zox~3)tXaiq{fr0S4~jqc73as)jDf@wD%$|cx~Ue?AUC)=-X?w~#gJ;)xbBNIv2z#< z!VzTc>Q=Q$rB;*E1=SNY!)A?WxgX8L6G*?>CUQ18WIT9ovX_GK;F<7XBP@7n7*!{S zPFG<4Lhp=tZk*of_D-i~w3tahwW%E{fNz`r=7<-Le==RE$CDeG*M z)bsZqjd!_q(_A*}e2Ri^$B1>Fg7PXM6Np_q+VVh)1EjlZv{E^`rD}5Pu5=!==HRukrdeAKR7t%- zY{ecUJ>9gJ2$;}L!g0mO^AAo8z;P=ks^mIpPDcUJpf!lz;{>(YbGGasc4DqhdDqoL zEodAnA6ZXiOybfsVy9jiz8>>)=oqkPxKF&P9mClc&|1(pYW?hsU93v5b66rm0cY7}wX%%I7IM`>aP z?K?X#@M#K2k^|97Q^8C_P7&s0W8O9vo%W;l$ z9h>R9<3E*ykF;wV|D30PF4R9uS@Ti+4GIK;LDG!q(@MzS&_okHOMSZsDCaa$3%8N>2tPTfSY$nv9uvc-wz0Dod8{i_s zDvO>KeLRItQ|(;ySyWSNbVpvTg^Uh;|4|QGO|e-5oGSFS|Lr&5spayK$O*JJFy}s> zr{DR^zy2SlEmG1{m>1zC$8a!t5r4s~adZP~hyq)S5v5vE(e>a_MNkd=MNRP+fEjIJ zE|0dW;d4KTq18*b%dH<5q{c?qQKmLt2qMiwbL(u*1)erz)L!T+NcB8WD~J@bBl=j~ z6U=PDy=hwWd@2bNK5r}b%d(_Jbt z!m>SaMp%W6bu8?PP=Fzo5Skt^ay8qoWpt25OFB-o@ZUrv8VFCa+Rrvi)3Rz>!8NTQ zBP>OQ@|GM5h}~VzUj8GkK$=gIGwe9VWZZhr5IVM{|`0J z5a1f+n#l}x!B+pXplDZ1v*O;MTsllYnEDJfEt^K@S|}Lvy*2ib*Ctj03%T70{LTXw zo2W4aiE6KCi705Vfx(osvFD1hZ9fZ$GP3%XRXcW=dTXkHWu<-%tH)W{W}JjU21Dd} zGI^pAT?Y)WU=>01I^M_ZL~@_ODl>#pUsn@!-T-efmx0Pfzl%PRl&f#*TS@mPGgZf5 zfI!eDKuj4=)+T`(Sc?#x0L!$R z3Cp>R7ppgUxf?4(#fC2^w5NZsIHNhF^6f|`E)X=bO5?%#jBt6mV zUaoGCNHmpGPzpiG(GZ$b=Y$NNvVDn)XSi!ECtpNAs&+}UG)iY zCOD4xM=WfWQ`$zM#uyWc8y~>nBrXGJw!jue*DC;S^8@(v&ggi_;O{*DytmsrZnjQk z0D0+X{myCgeD~)a@h^U_(r>}!!zCcl!bSzh0TE0WY)K8BCai(Hc)*}|hRq@cP$yD= zsznM699w8A@@ygndFJ_X`)GyJWK(6_%(J4`7zq-JKS_jrvJBPKHMb7+@&Co})jHH& zZp%1~17^?ojE{@=nsScQ5ny>H2L%;)Zl=e%!7Po=sClXCdqSg=$t<@@(z7km)F(2* z3u|n9bg9<1*TZ4^NCp%3kxa7}8wLjsPXmhW?Fz3=F^9lL-BMd+!Y3YlBSLaXU)Ddi z=||w=X@Fa2M>V0TDB=X%fJ&V|BQtsY@h5T|L&LDpP9AB_Dgi9`J3&S_zrKs^xZoEa;445hXzU@p%E-%}ReVEYb^vs58EO3z7hBGAui zi|y%YZ*M2*b|pNsN@5-)<_Uk$aP%k{jEu#4A@N9G7?tBLi=HN7M1#S(Gs4rBK@IXaQ_7V7zGsH13QSQ*`55zm-Pc% zb~pHNC2H!u@Wr6IB;L8xG#YW?*dDilX=BdzPxSSetrOK&Zj+s6t6R@LrHyZ!?A?@G z-B!PNX}j0TE)p9-OpAnUod&V7?>FM+#BK516zZc9Bb|W3D3_^i9b6Bu+ZnfRb6pEd z5RtgjcZIg~5rr`fK2TSBT&5TXZ*ESp4HqNJwxiaNGHjmBATjW&g$2Tw3JazxO#S3a zg0cj%uqOFQ&RHyb; zd&p{s1VB;oCq8rk))dYj++QKbhS1FFTa|x(U_MQ@^k{qtWq!xOzq0C-f=-EI* z_eoB=!*Et}*bY&8BqtDMu#@05S>rXRZumaTibXtdwqDB4*3%|>Zr2cVOIOXwbZmO@ zn^ei|VO3ff6M?9xABiV|m64`T;?6OBk_}1_BpLBC&H%Dek&YR0QN9Zi^4D=1nD~<* zM}K#s5Qd!vwN-{K9_XSuq9(_!?TI)xrDQPcoc?;g5Si>9Vu|W5(t49PiOxTqf7@iN zigGrwVGHfgayrw$4yAyGHmnWf_+i&K0UoT;e{uzek^EntFSgtwI4v-lLiQj7RF>}0 zK2zNC1o|l=rTCdezwtA(#Z$x7fnx5VRB0I>Gd#tkz^A7x6gxsP@CqF2Wz!5)Hfc=; z%8h)lVWPcfMQpB~iN#n2K)9iR-l$rwC_&*$oBC;CU3GNZfRse1CdqLPKR1}Qj+N(g z`C%|}wg+!!G1xrr+((^pG!ouKEHWv+)sE^KkIVSVFa9zp{3u|zwq$b* zHY}w(*blZTbgH0jsO-rnD!-xYi~4_^xqKNb$30}1STEQ`Nx)Mj?1056FE2C_A&?tW zL0u8s@Y&XRGPM~w1Zh;yhfQf)GAsibdh&6!^#om3LffHBH#`yv=XvTZ3tliqP5<6v62kvvpHG61@JJ%yHR zSEsB^B@{j#I8}R`^TMTE!37~~>Cml6EZaUfh(c*9)!vCGHoO+PAf7W|_UU;%#9lO= ztrVm75oq8Wq*Hh{=V%M57;IL`Z6H&6Pm2+^hCej;A_aB5XgL%=&SZrb9Wb55BNaXH zYXsH@VeMe7(X(lHrZMu@4H0aF1++V~5h3MB z;)n5ZGC!n3-tog0%ceLvbc1ly;u|GbxNA}*98`)Ff>>F%SrM;*sO+S5;&&lpJeh{M z)EXgF3^S~Atag~g0stskLQd$w@-uvbspD@gM2ufAok6p3`$SD&y~ik~^`)l+nW zXA|4ec(B_vxx?~&$?}-k#NHzs0rtW<2aJ4LAsvBY&9XAZ=l?hT%Rv02_peYzXu=ba zOCp}?Q-}A*=Y(sGcyq1&L*QqyAEQErc!8Fd6jwS}gAfqx{vOPfR?Lk`^b5*2j#Q|? zZp4xi2*d)iJv2-O4lYd+J9bVhy9VkVQw~xRR1xewK&yhTL%EJ2Z|z-CE%6%}^ZoKx zh6elesw#^VG8q#cBYju@`fRw$k-P%uPy!B{PI0N&ZjY0|qY&vBh9@a8eS_D?CQ~XUmacyTP!oOrt}&e#oB*a>x(?l3amsx3rQ66oKf3n~{JblO zKK(|1KNQ3t7v34vdvCx8#=LRcK-^aTGI3kyaGAg>o!4eEw{^ae$=nu$9)ved;-Fxk zr<1vDqdlF>ZP_Js61Ro&CJq$#L^j@wnNJVKyjQk$J@56RI%X=OI?c~^dBUN%ZZu6i z+3{@i#+;-#6S*z5<|`ZlGooR4H1B2ZxB{fId4;cJ*mNei0n(A*k^Tvy{fbh7G_^j9 z?^8Q*Glo8gc0|~UsWncHh7hobwl(u8@!#G>G!TKJ-Nzwd+y`zWQ)R-|F#SXuj(D7J zf8eHr`xNpe?}Z!<5Q2agLGLT>F5s4^$RI*P>@39h7g%|bxjnebR?4c zh)j(A+S?18GpXssAL&_$VB)+K;dV?R@$0!LZ?AS0Mg^P}TmW z=9{o47?(Ex31o)}=p=wSV$8`bH#FUA$7iU?ARr# zMXA|(8pH1%VA){DB%mt?3zws3T?@Hi>P#{1X-j{0dsuW~PO*I%)+lSf#5D2_kDieS zGThp0gmS^;29=w(J4ioL> z2vxI++^Ovu*otc)k#1>oj!yTY+i==OXM|qyql~0e9W-o=QT5E?0dmm9KGn~YZGF{W z6nlfE3kK0RMG3q>lU&FOgGO#*o-#wn138SaC29J@6f*-HI3pICOUpU*1F1bs2!aku zj@U3DSYwtBtnvu~+GMtl$g`={$2}&p(`!@eZjBpt zH}itrIlMS{7wAbcBRHQd9QOdJ2B49-xMmN4sFBGBs5KpZOF+>cfuaU3mlLD9>^#7H zv*Mvb#fnq1-OZ1SWO?}`@)~L6f+Y<+kS%l6EMg|b5Ns)L?bF}>`&;gO;+Ah;e+lii zr4^6;>OX$;#W#QSE0LZ|1Ov7cPkG6(G{|g9+SGU>!A#)}tU2L1_6AwiEgsCpd?zo# z#Y59yih~8voqy%4fg`Cy%mh0J%R^6!nChs{J;0-)F@lL7eaxl>bjq+s1N|Z&g_uZ+ z6<*0uN$ISIc-X+tJAi@99h{Hmr3MdN9 za+nby5nd9*=O#Ycy0)pY-tw+TMYPmsN*!Z9`Ti#70-pGZD$)r@ zlqcQ6xUlICK~;AU?{>O_y*1rIyc)8?^o-?1tUHinq0=28Jts^w&xvRS3NV3sPzRx! z3v#L|0{5|sfO}pFnv^}0nu&h!nR*n$3`HZs8mVVhEzQyz8E8;*Av>q1X$Ki)mU0p+ zY>a^__F_S!o%U}sj89fvb}YdBMk0hDL{ zSJ;t?GJT7?7-z5n;Y>Ws>09bh6e^=GywyesRcz69i9%&lg%WOYPW33DI}Ix%4J&0B zEG$Bl&_LfXR*gFHnzT)Vi~3%IegowNHEF ztquHp(-avRmEq1WdE-ZTkBysO`{=v6|TjO=uFw7h`m|5=6oizkJi0 zifF^&WauOgDC}u(5auui^ol^{J?I%cB3x3^pZ5CYX(G;lrURk$o1CB`CIhlD|~`3Z#?Jz#OeW3yJR%Q`WWYGjL8%7Dh6wn}lZ zxk`2Dl&e&)1}#JXt|?0aK!d{~yESxVcWWBlo=&XNu`U^u%E;WPWo#!n$E&`Io_iJs zFgJSVZ_pWJ0?dS}(K#7fs5Sih#s3}@{*Ar4-RTy0GJoh4w0WJu?JBppldz4w0li*LQr&UDAEDHqGy|MuPYee-`m_=VU0yXPKrb`&2Uo_)ssl*OCP?j6=FOswdOh=XGp>_OfRz5=*`CKLZ9cg z>}yxQj)+r?s9ULY_3I8=udH2oD-a+3x`S&!{pUBm`%Ujpj~7%v4SnjvkG$)VcmC3~ zfaOG?cO5l+-zGwD_jeY*B59&o^9ZRY@pZee*zPcWkPTuqb^jkIX$nQ`XL~6z!kG@0 z6i%JK>SUB8wbBYEByNVDHq{4##Cvtvo)x?z z00iF^HwqmSjuD$IGC<41?$s%+g=)YDijg@v6s&<7R2T43K<`YlF}zt>4!>ySR9tyI zw0^^ivi*~YyROTblXAw1IT{EJmK)|kGZ>g+1~C6bFiKE}Wg#O_l`uJR27H6SJ(+1d zOt&)5@t7lHFw|clZ$8Q^0+lR9`BftJH-lD?gDs8jTS>3b715xdS*?Y->cmcV323Cf zaAYG`6EzJGPr>P1v=>xqClO%LD!a7aNKGRj3ZIp)DB~i1WZj`ct5d831`bDPOUm;- zn#W1QWVDSK;c|P7f4bNfCRfR*um@{TqrvOkMZ~sDf{>cS{1gzPwALC3SsB1&G=Lc{ zE!ydZZb1dtHX+p-Cl+U@2(ufMflDiCP%vF7E_PKa3Y-gr=kr;}*m@XzKsqv6klY*% ziJy#~j_z5oLPRMr_yK*!B!sBM-4ZepU58r0ONj~n04D{?i5ny|207OeZBS3N z(0+|*#WbZqIEtla6=MMw5L!}L3->~|)DCP7we2@Wullnve$Y_*fek#iD8HsRc=Xb;3HD-?VhD}5Pw@sA z6jcB#jt_H{0ZKy*iE;xmY4Q94R%3E&zdKn0o$hCTLY6E6H5xL~?r7Dsav8_-@JxL< z(ES?dRN^oyvjYN4PnAiaI21FTWQJ2*5DPC8959!R@Nl5bWy;`i$RwnVlj=rTS2z1r zPU+LrHaH-3P5!aYMoT+jj+zjwOVn{nO;99nB;G&>WXED7aY|b>qN1$#5HWQ*RV4Ih zDubiabYX?ZAkr+KH7_W(s-ov*)7Aqdc_bjB=k&(9I{}p%Z5HWMHINHO1R3rikm*H%Oql|? zFcD;0g614HI_L`%peOYQhQ8pS|Hm5iO-F>j$w80I6ZB0E`lcg7AN}Yqkkvr@e!-2J zBaH|51>RY81$Pq~1A>3gu4rs%PRbwS`-#*cGWTae6` z9Kb;pUd8Bi;7*7lubLG4@$zudikxiGL1$TVA6IUJ!e0IOS4L8`S5ke9q!u#> z+~==OyL8j0x4TLStt@Z~l%1>Fr6fTb#PyF8H%rd0!b(&jTTy(U;Avvwv+L0fe* zt92S5v})4DWSdxy5k3s6Wjd@pBSFqbnbrmvf*7!t3^s@%h<|9csI44paKXd&(AK~P zZlS0xe&s-0=~?g=(>Ta$OGVw0wt9oOQ)%&e-?j=io&%}{NwYxDBRHC|$MN8-yfenb zxdbH4+h83kiIz2;A*wCCKpYgs_XhDRq zIR!W?um&kCCdmAwwkCEvIUyijP&3{++qZyXVy1ebWg{c15TB~}T_Naox(wj4S4=ZM z=E|3YCoLaJx^)IypocTCseub%VWs1~*6>o2&PSG055Q-mrSLOHyNJquaXX@?v?IFq z@KofH{C>8GB=Qi$%{FT-hs#VTC(UejibIPu3$NZ@2h&$aTggGhFUU$Qt(uh4 zIXTTH%A18}&FG+c~A<;<1+lq>}gG>}d6R3ERc zRC4oFkX5k81~RJRJl$wywq|Ug={p!-bRaNF)n+E1>v~Wu*R?1hWfYK#DS#}EtyH)W z4=sonD-Z?HNVg|GudMssh6*i$9KOa=l#~`Et-7C9rD>I5uDQ0yscH%%~;Y$ONUkJ+A?>Hfq7~0&{FF<07a8FcS zfFu>H`nowv$@R_`h=nMbbgR9#vdI6aEnkXU+;Cm-3Z7ws+#Z&y#_O9V6t6%Ut33gy zIZ78G77aU^#)`OvEI?9%qQdumx21YA6Gu*#Qy4;|oy+cKtwjJwmZ=RFV-{EEg=e|- z*B)TW<9$rFQXZWXrAL?ugBt`kieFl=HpL_}d2);$F{+vh@r$#+xLdUf)fkV{$94v* zdaM?mP53!J)-~=ws&IxFgl)_k*F!5z4ysDY=%AT2B2C>UZzA955{@L2*SZ&}e$FhC zGD||M`&zRs$`!Jeurba*YYCVq;q&!(VQ z+c&zqI?+Uf8Lc>%vNm<2wg9tczv|eODrgDnz?Vnf4Xd~TnqHE-5mKbZ8e?`Qv8+l9 zVAg6C@gpV&CG&;W-+9Hpw0uxb@MT}9w>OQS14Jq}xtFf=6z&%&w<#I3^}nK8=`DoFgD=rHSB`dB%s&fO#h7y~ zg+SxO&T++KM!=AUZ);XuB@-5Qit=+|8A~HRyXT9G5Y83|~|-od|b0cs7p;6PW-W)2UX9 z=%Naq?43IBv>{79cnvQGUf5{*D_BsBPyT||%$(MOjwf%zDC9mzlVCH%|G{2#ig+3k ziJzDjh6Q%-0YZuP0+(TG?GYntN_bz@5-{m4O& zj$RZm$p^-yi8u(eY!C`xrfWnTaQ9tdBdpi@Q{niyK1bpHVbd;lp{M&A>L^RzzXqc$ zJ0_b`X!Ti>3(7S614UCxH9pr^EKqZvK4_}zH#VJQdy&=#krk>`*f59XE8@pk>gc96 zQC|;rLk;R_Q$tOQVyGK-Iijl{4}#heT(bynnuEGw0@Te@LTy7X9t<(m%?Z@alc5He zqA4!zddOhL{pHAm9?-C23_(1!xTR4qleP4=$52juP}GlcV$>ty_q$O~111eTF!9t$ ze-R%zBKg!Wa4pakCIyegyQF{2CrhJNT^U~s9kZKDimfyVc?p{oK!?t6p7(INTbLm; z8qHK2H~r{95;HDSt(KBH`?%hHSh^Ma#6(Xj^;b$s_pp?`)2>C&R7=sWVXwO>DRbgG z)lhx+x-@=i>38f-4FPb2#*;FYLUgL5SIqP<%FaL9%Cv`YHB1QiWuqd6`;tMix|Tt=L>8m@G}Hz2W-UWT6EE5N zU|yRy%~~)owaPw5MiU`Eb!%nIrXbuG%7KAuv)3ru?;IO6{K4aBS2zBNTz$U+$~ zu$!Iy1BIb4D9{ROl>bZ~dIq<)2yw6jg!0=QWHQxb8E&X%VCO$&U|N4dhU+J10Hz5U zuA7)47hTH(nHc765v-2;)_YNSFQ^@)#I?(c)Z&}O=vIp~G0+N?**QnC*N@p2ZSy31 zce9q|1lqzNi&^UWjny^&ZkV#OvHjTnrwtcJG*RRHehR78PEXFvuKE4Qo|50svX4N) znsBhS+txD_%7;}46Sp-7lk&>J)FQ&N7+%dQYc~x7zN4Qo3$8d%$ZnTk)!p_B|_ z1=hNdbnOpdks6AQ|C;=45q5?KHY1mzq3-utevelw8h?(kr2L*1u{*g6np10F4j5UQ zD}s;+yO6^QvWBO!YD|JQENIicJj0YZijXi>5ug>1+|xQZ)B@48skuG{QmY0%Ll~Yw zIn;oF_QPiR9$?cA>Q2ebr>c#VW??DQ5UO>#nK#>%0>)?CL|E948Jea*d$dxH@7CZ^ z{D`)8D7K9lrvjgsAPtE?yES;|ESe}aH+n+Ve@+StDB7j@7wtlX>wZ*AS;BZrBhtGI zZ~2`?&V*I|eV4)RPTD zuceco;uSqw5OILpWXp%zd&&I9e)WgC*^V89k-4sSeO~+fx_NIQY2SVcC*3Ka4DWv_!9|u)}=t-a3w~%`B5kJK-O7HfRke~VamQ}S6_TK zNLH267is1m=V878jv`nu6JBgw&)cP+8Nii{mO%7G)=X90vm?2#AtcyR_Th;Z2j-v5Y}a{3p@=>o;7f z*ZyN>GikpSz>xBfS1*|}sq@4G%@OuV0X(Ptzs)yB%;3_jL<;p^6500W5L8gNvq^{} zWFMG7`@jUY4@{8k0~1S#^xER3Ohu-Nu0(WehzqV4H%cgH{b!(JMQy05URR1yp@1fts=u{W5ho!orAzzg}Cz0avr?yI;oX6to5$D zj=@{FJ55Js#U*hh(~nMqIPq%iIaoVBe&=6*^6L*DYQ9ujPA&NgbO&bFY7fR+8*7Oh zu1Dt(qoLYr3FEEVT7n$5%!eFdz?(48leIoxCoJ~5uP&7k;h&9jnpNB5_uTX2w>^_> z$#Eb5-KhDj0Np3dT~BHGOCP?Tn!Hyrq)AaKfHoXN$;oosa!3Rt>e$+|ZY9Fqf89aU zzkpvjLry<(i%zJ196O$mnQ9|nwJ8RxG%wnSHNqOQFxcOkd2koNreDF{3dP@0Dg)-M z-4EZ2bkx!#4H4Yj`oUoayi|DvcnQ_4gO@rcz?%`EH1;LHYu*Ts8!tj6ux}A2YdsOA zqMAnW^OQ}37nWD&7c{)3i3i1BLpp-qCvV&!lK?uuTu*FcifjDfh8muX(fiS(o~;ws zNi%DuAA^@bPvEQyGxl^ zv5vnjFq$SQXYU8XpQ4l0)8KS^)z>Z_zA)Gs0NYmdDZAic?z_ zJ)O#I55-YVF7l;9Yuh21)-0T%+-u1jzM>YNdV^hh%4DnzF7@mxS9(j8QcpimHpgF5+@&t(*8ZWMUHWRYQW_YpJzuNmBjr7PqkThz zJIa0AcT~Kp7W4-O6V42=%#EsYLr9i-M!X+S5JKT63eW9#?A21;ApwKo4W08QU#U$!(~8TH@IhTsH45T zyL(`Cdw2IM#>yl6!E^nyO=G=7lOCu6hQ-<3y3hA5qfo9(u3WYqIk1VwMR=Xv*Y&EiVZe;TI;hbm#;z;J(g zpgdS9_x^Dq1Z#bjQG@GWfNMK2oZx$21HVbypOl_HDg79E>+}D^r1Tk+^8Y-3-&5-E zFZYI9ATtI*clX%f-jUMq{L{9CLxW*yFx;|kWMoUYr_?`I_R@SapDWLm;rinurMz!= zXvDB`C{^@!P~UsFPU1?^YO~T=F8$F&FUKYLgo{S50#_4PeV%60)3~N{6}e_`9mRDt z*G#TsxQ^vIj!U$0JlAZlIb8MS%q5+`@>=feVf!DG(nkTD-k&3S?%O)15yJQzEmt;+ zPxg+K_9l$5n(i(4m$#QHLnAPxy`_;}dZ7VQE97 zl(@AtxT|Muv@$fnxZTw^xV^WoMjnk&Vp#)s^Vmqg^=oNxf8W*~@x$#yd#*4}S?;}j zs8YUoSWphxzkBU@G$`(J?$93o-9wJyk)h$C(UKUslAB$waC66dX~f-bayX#Y7@1{wk3(yDq@3KrT{c&d+dEpRC2DBcUmhJCDs2UWeS?ET)@hsf zlq*A<#vSpDzY0quvS7k7!xr@I)@rQ^-{cp{n8j(*7F9 zDyiqfk#YsJGrSqd20}PC$gnE+z|s2mPoU)%%2_l5-SjM4v9-N@#j?)wvQB=tmbNY~ z!C-s4wr<a&>S={j3#-;26qh( z?HzK<~!V$Y_~LHU42aBDqb#0YkY)k6lyk@x`&iM%ia@sZVq*;5w&o zPhW3&?fxsF-+DfXUg@DK@u76BS^>gM()Kp)`&|3N%lZZ@olC=c^TLH8>oqJ-JHNtV zeV&fR%R}Mp9Nt;~$9a+(0DK4rR7NA9-idv|y6_3`THdI)SHpFzf8)^JO*=+5?dbml zi7*CuZ+YR)(V@YG;-d>Y+S=PXY((^y7Yz*cnrQd_AK>2!Tq^<(KN@{k)0aobwwmfW zQE4Vm@(qiA3xcQJ6_36nooS?yc#F{gf?UGKyv$+X|b_4B5Q3yln{8z3#bs zbyxiSP?O_9`DXW9|8BDYs4v7G&~M}w?MLzNwvnNM%8;WU(UA0(J1O@buJ>`>4~;#* z^&r>#xE|*EFqi)7=gePW7SHBNxbZpMuj5+JReFii^<2KypSb6FTragPQ%Tp8r%#lw zPeUF0+rX8Muk-o+?YqJA?xsvh6k{GQ71$og-!R`te=mZ-v1=BUdV0nNj0Jv$IxeG* zw{i(DFSVK)PWF_0Vg|dsSoAKW%&)`pG%_YD8*kygH2!zH zhPvvgqFG&k#5Q4f)I{_a>e~iPvbJUQY5Z(2kGxRJ#r&(M6krh%-%1rZ=je%=NRm#pj3k|C83~hiMA02S#rNVkpeb5= z_Brd;pL^bh^DnsYiu=@mHQ7q|%veF5l2tXlkA|y*T5j zqh}s->~XV>cNu2SnR~*CCxtDoFFW~^Q|HY;?esGiENojO5Pr*Q|G3$_OTeSF3DLzS zuKM()@v~LO6pfzhWs3OdL^M#J&X7JE*DhL< z_#l6BXt|bk1n2giGC65Yskbe>a0nKO#|Ce5cy1XNI7wFlVq}a`r1V(^YD%=yz2*M? zaCB@~PBK~exZQUEBLZNs(iTb(ghSgxOjzoPbuqiyhTS?UnAAzVed1nxA@^>$wOrX- zhI5x_<>12dJ{(893Nd7HAUG$2HQS(S3onsRoveEoB+YdF-oIbILqW5(yrZc$CO-#s7CO_1IaKOA{6ov2^Ky3*}hj6b^Z8^kc z6UMa+$+6J(By^j{;`-x`GyKi5$MZ+CoX7JH#)EX3dL2S?^Oan$;<_?^msokyXZ7xC zu2*x($(}f~AX-^U<=*blyZiW}c{lq8hauU@&`{Vf8Wd_Ld}0Y`WoQt$hej0;cN#-JcDrQ(2$LV>PXvB8XhhWLM`ef{x31awrhxqx-Nft z+Zw(X4@vMfk3N#zP15V)wCQAKaDf~>LK!r`Agb)pG0yI=-8ffATkI}K%+dRSL$-iiWA$FY?rT67TC)>!FhJf&cR7<*|g2jtOxP_p=xeqHTmU{G%>bK z&Oy&hY{w7tPWreTD`3@JwN`-Kg(2X3UnI{g@;uEiq!{N#hO3)e|=C+I5>wFH|u@weG^8+%k=nYd&j&k<$ zTaO!aUMAJ`If6r#*o}Zi;zBTez0xdfvK3DO-ufMQmE4SQE#1omf_b0E2CKq1DaG?X zLY<d)icQAz85bgaB{gk`8}BpuX^%DB<(I;# z9}^8M$NBLlysti0K}(k(`Q3`nizrV#m05Va=;jftt9`gM3dgMT5hgwJ{gYff%tPoN zP8bpi%`$%Q>YFApadcbrlELXlf9(IOuWi`*0z-4!;S5Zw_cnz^vz>-^LEGGmCi}5X zrH8%-9GAFyxwdodouP2_hj^nj=?@#V0U_xUPh+gRcs-_U9~wzA8cJb5 z{n9qY3kY!QPPCb+-n~$H=Wn|BA~(I-wl3*RQ%P!IF@n)JOW~Gz-Sf88a+OTqK?Ovr zYfdkmf6nsu_V10q`JA=u*Pm9)H)UyM<{W9U3SBUdx!w`oy?SEtcs(bSezq%p{Yxm_ zD!RVDcp4?7qEJ*Jsf>)3nV#9Qt<*oN8!02<7D8s<3@b83^b_8oe?i%%RdNwG;=z!sTt2hf!eqH)Y`eA^xQt%8$kz==K_|B3!qL zWHn};I$r&@gq|}nP^!z&UxJrdE&&4DD2?&2m;De||QU-g=n!MCZSx=cs zQXWzb0(ZM4Y2!9qD3Ka%I(x&08iE}&@Vv)Pb{b1k`#UIe8rOeC>ywG2XMkZRbuQqN zmX)Mm&%HF#Bz+6_%Cpw_r0COa44ywar1W5Ij_c1)DS9wt?`vFw^`&}vCpwZ#y`^Eu zeRNTop{x16vM3@v)p_tc;=1^$@9)Ft;SYp~sXU|RMcl5rU4kKo$3}>XC@<( zAN~^5`b@`*QX?(+0Iib$PzgFq$Gv>nN%~CgHFlEp z8@X2m!T%kspkHm<*0&Gjd~ROR8wZZ9T$0R5TGXxfCFy&(mu;7%ui}1DU0S{}QC#v~ zK2}jil0KJv&2J=W;iJC%Wu#Bz`me@EGRnU?zv%6u{B4yj7>Wd5YVpPqdLp`O*CYTT%VcF}7`!<4)u1!{nXL?`Qc{-pBd% z>%MV*4mXP-JLYNL%LYu!G$|VwoIbE4Rh`0GHC(d93EZN+dp8le42r3>vRytkLX$%BqJ8% zv<=lrKCNM!f?9p1nbYAJA#q@v@v@HWz{ToqTu`*J{SXzZZ;$l(s@mtJeYMZ4-+z$r zHP#we)tP^*R}o^T8SUQHNkmj_{+YSw{?ax3H!B+1NYX1VEP5@JaUYj#z{%fKql?IX z4teDRc!W!1aBUKKDl)Y^?;6UO&$lOY)j=Ir>q(%mJ@Jxy zZ==&s;JXnn@n-cG!^*30oeWO(*PUpzv4W_HJA4?s$NKQ84iIL%kEqEu?fiFmTXE>S z`FYDXae}^`Z=}u0hF70W##41(A3XJwS9sFA@?tK!$BgvVKl|*bowv%OI9zC#C^L4C zIO6fV2l)ONzWXbF)xVSLGD@VLCwV`M_gle>V2X8lSa{#I{iY?`7!7v}4efGX`;r^A z3dH2SCPlnOMQ`a8b=a56M?I^^qxOjRs-7f$FmRE7_2XwuWpOc7t$!p#>eG8k(*>qe zBz<@d>1(;JC{7j+!x$)%g<9~4*O1`|3yn@RDLtFr84?cdZqhW>h4~>mNXInL2ftg0+ zl_GR{`9?CH)I!CbWAF4aw}I!{LYwgU?>E;8#us5@8Xp)pb#!|--!JF;`KNi_0e(gA zx^Ck7y*1e(xEi7FHkU>p|Ae|WQto@XGJlBj@meezmWDYpNb%l<9YybA%Kcjk*BGi# zx74K{;l0wocl&Cln)gNOKA$or&tAsGb((mJCG9zV+xsdT zhei{p;zi}{$*m$2H_ENBVX$J~$-zq*^?i9uoNnS*eS0gH#+me(1V`uc;^eyYX91>* z^yVussuNKbF1xU|%(MoJ77$b&ZHt%K7*X7Ik9o-P^(`)%-Y$K!z?Gy$*O&1z(x-AI@Bfnf`ZA?Q zZK!+y2JU4;B>9zI#C3MvvwOH-#6UE+td%ed z+d}Bdj-fH)nPDoL!6U?3lbDL)XCYIF3(GREw^-ExL?cWVZB z^BD0@^G^%U44Fb5t$C+$a4`{F4m-@hvcTra?RJ#OTC@anynbt0(OW^i$8@?#;N$si zCB2g08Flbo4Sb^Ot*m;GlT^;y<$WEUeM=VibuR5AXqY8m*ObSWk9Bm8Em=I)xpa(Y z7NN9l$>MFDOItR#wLxS_do{L2!%6x?gw~05>6eif9Lf8WNsA_v^lM2AzH9s9Nh}nT zN@?Hq*G_VnDI%h0N4fX-$&dXdJ;T85U$$sBHP}?y?Dr-T)4tZSdm0F)FS*pu)>Y4MDMG`RcbvFv6XcF*3Fhu zWlPAC7mQ+C6=)C1zmM;w$Cvm$j^8c(s?JzXcQX!RkP7Ovm=hP3;wF5O0o*GEWAbc} zn=^2+5?Vwdul+WwKXi*KZ0fTv*Qo5*7tFOc5gVES6;{pfZwXCF7)J%N%_F7WzI~ek zyBpSkE5E-_imh|Xqk5FXEmtjG5H9I_^%it(H;F}?U%k@BP$#&qdQ^ci@z*{;9*yO{ zpkvjyhvlVP;=HG|wbjD*Txg%?Jp_LB*L_u@;kh+qlh+Z3TX3_NlXZl(@A9i$|0KW8 z20|y74bbR$e`=*Wy7@EiU1v+IV#96K{Pk$J;X#A}U6^FiWQEJf6J#ZI@Z;Ud?@|1o zd1lL*#23Jd>%0hC`perYVK}0YrY*2g`4k#M=xrNFZ*ws*BJXI)o&M@PrvjwKyS zJC=2Hc64kgUAlDH($1w_OP4QQv8;Vr$FjxCmMmMkY}vBTWnIgbFI&;s-r3Q) zxN}M8(#~a_ot<5s%R5(ewRd%NE$&* zB=6n#uJl^aj8QQkSpwUCys`zjzM8rt0EiVG`lkuz1ZtXH}2vcNJ>ltG5zqH5ej#)QR(TbD9fpSJ%m@vtW561b+sX*?nEEP2H@nrXlSehtT82FFomxHeaUv2tY!`Fjv1mEYv??4_2oZ*;w$NyvpTyj zzv9OCeegq{UiQ>cuYLWS?oBsOn{m`>9ZS2{t>19|MHly$um1QWbLQsqjfI)Vb*|`s z=r5l9=Z3C3?|LZLxN`NjzB~S8#?a=^{`6;8ZvDlx&u_Z)&)(6tXx{wG?z!*&cR%pp zLl1xQQ=iKgnvOZ4`>b`Zc<+N>{HObJ$Ios(W%XG<{K?Or|GUqp!ii|kyU#oS z!i}3QyZn_`Uj3RaJ>_k?M)zHR<82ST??WGc^ob9CXmIE=Z+=bdwV70UVQO2-U(_~! z(+R1L>2uR3H=LL`BXdrA+Ueu(%buJ*IXyqWv~bbc2f7-LZOqSFxo$$*Z?w)yDp zY-8tw^l{^VwW@bh(|HYz>(|XWFTbgIL#}cB-`6*ukUDomS87_mF}otyc%bw6+{)D4 z%l+w#n{R%{wz0za=We^Or}XJl5l_`?fRv(v$WH7CvJ&iDtOIQ^y{ zjQ{Gi3)7A1;N}_UTzKaA->k~|>B};6mIeo=ElBq^UEVnU!R043FGx4!f@#_DKfC$K z^o&$mQe%B0pa0L`*O}i0&!wJkczECbH@xxB+pl=#8*aaI?*EuJ{elaB{cPK!v#x&i=I+-+%d=|8m~lpZ=%Mf9cB`F1q-NSG{KQ>)&+8 zM?U_@XCM3g-+yDqvBzC?^}qk>x#!0Rc7OXj(@q*3ntQ_L>u>nrhi?4qPaS*Qi6^Z; z_o9nM|2N$Dmw)%wuYK##zx{G#^p48d+fHp;^x%gc`Rw0+`5WK)vo&wOyZw%n{@Yi- z^!!B^UwKt7KfO3_(NBLiIMj9KS!>tbdDo`xV~>B~iLX5Q&p&+bc`w}Ddee8(H=UE8 zlg`dK@PTRL@6Vjna9~dA_`IK9lwO+7rTknrH=}Xm^rLc@*% z?X|Q1v|}utB$OYNsnl`4-PA!Bz&B#t~>Q0|<%I0t&z4Mgu$1^v5I5j(a({EC* z${pJ}GuxP*oqbjAjLiDR1!-s_)lpcGo}DeE#y`NTMIA3sjX#iIm71Pfm0O-a zBXiU9GiK!%%~+Ufncgye{Py%sZ$G|p%|4eJ8Y5eQ6n=<3iXU4zN z^ndP2bu}Egdgk~i^5g%QX`Hn()tFtLU(YV!mBNXsE7PxP7{7Ve+{R-YE=-T#mVN&N zO~<7>?oS{1=Be!cof&^`@xU*0et3G8w{J|3e8~@3alCRdTFXNJ-d~-VV?#gWOUVZd^-ciSe zCpCpzPWst``_4GMJzOyK-lrA>4{cd^;;*-~dC!HN_ddU+^Edu?JN?F%u9KU;+x7lw zr4@^2-M^xJZt1+ApLqX;YnGNa9@=^TD=r>tx#XTt-G7Pq<gA zp}V2MpOy9-5LcNqQmgW(&+@}AK1k>3>s(`Sg5Ryr(|NKq2D8~nZv}FV?cq`>|HL50 z4!EQqS8R=xxotHOKLg6 zKhID56z=E!SNK7$DZkYZ8Vb1$!5qr-{jO;~HD(I_$qoLtw4Vj2;P@b&DyG?|JIMO% z8gku>5McGXaw7&IiHWDZkmzslrt7`8A&Zw=G`kjsBL<%k~9c+UIPvjRCw7*pCk~ z{@a7uM>YGW=8rG5rP^s*5X|$>2J->?2Iu`n{t`-M15Da|dXV>jDzy11QpKXoBmaB; zTQgpYR;K5t(*AoW-wQUT))zX`*ZQ5)PotfUsSe7_`Ddn1=EUXIY;Co)0fz5yP6?GD z#lOc-<&QDU`u?&0v|K9lw|O<@IAN8(Qa(TUF|cL%ofBM^*OQ&X2XD(MIyK`p_`xsf zc__lallszr*f>9HJ(UeoZ6Mssfe`Gkj9n={j3AUBZnwu~Qg a{(JfKr6(qr?DQ{j{g`V8c2C#J;{OYR@jqq& literal 0 HcmV?d00001 diff --git a/x/tokenfactory/types/constants.go b/x/tokenfactory/types/constants.go index 066fcad70..eeca93fcf 100644 --- a/x/tokenfactory/types/constants.go +++ b/x/tokenfactory/types/constants.go @@ -2,4 +2,4 @@ package types const ConsensusVersion = 2 -var TrackBeforeSendGasLimit = uint64(100_000) +var TrackBeforeSendGasLimit = uint64(500_000) From 810f87f07948ae572a9e83818bcb49a1f3fe0430 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 22 Nov 2024 15:16:32 +0200 Subject: [PATCH 20/29] upd deps --- go.mod | 45 ++++++++++++------------ go.sum | 107 ++++++++++++++++++++++----------------------------------- 2 files changed, 63 insertions(+), 89 deletions(-) diff --git a/go.mod b/go.mod index 2816f7fc5..16e84cbce 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/neutron-org/neutron/v5 -go 1.22.6 +go 1.22.7 + +toolchain go1.22.9 require ( cosmossdk.io/client/v2 v2.0.0-beta.4 @@ -8,24 +10,24 @@ require ( cosmossdk.io/errors v1.0.1 cosmossdk.io/log v1.4.1 cosmossdk.io/math v1.4.0 - cosmossdk.io/store v1.1.0 + cosmossdk.io/store v1.1.1 cosmossdk.io/x/evidence v0.1.1 cosmossdk.io/x/feegrant v0.1.1 cosmossdk.io/x/tx v0.13.5 cosmossdk.io/x/upgrade v0.1.4 github.com/CosmWasm/wasmd v0.53.0 github.com/CosmWasm/wasmvm/v2 v2.1.3 - github.com/cometbft/cometbft v0.38.11 + github.com/cometbft/cometbft v0.38.15 github.com/cosmos/admin-module/v2 v2.0.0-20240430142959-8b3328d1b1a2 github.com/cosmos/cosmos-db v1.0.2 github.com/cosmos/cosmos-proto v1.0.0-beta.5 - github.com/cosmos/cosmos-sdk v0.50.9 + github.com/cosmos/cosmos-sdk v0.50.10 github.com/cosmos/gogoproto v1.7.0 github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.0.2 github.com/cosmos/ibc-go/modules/capability v1.0.1 github.com/cosmos/ibc-go/v8 v8.5.2 github.com/cosmos/ics23/go v0.11.0 - github.com/cosmos/interchain-security/v5 v5.1.1 + github.com/cosmos/interchain-security/v5 v5.2.0 github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.4 @@ -38,7 +40,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/skip-mev/block-sdk/v2 v2.1.5 github.com/skip-mev/feemarket v1.1.1 - github.com/skip-mev/slinky v1.0.12 + github.com/skip-mev/slinky v1.0.13 github.com/spf13/cast v1.7.0 github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 @@ -72,8 +74,6 @@ require ( github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/bits-and-blooms/bitset v1.13.0 // indirect - github.com/btcsuite/btcd v0.22.0-beta // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect @@ -84,7 +84,7 @@ require ( github.com/cockroachdb/pebble v1.1.1 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/cometbft/cometbft-db v0.12.0 // indirect + github.com/cometbft/cometbft-db v0.14.1 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect @@ -92,7 +92,7 @@ require ( github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect github.com/danieljoos/wincred v1.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v4 v4.2.0 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect @@ -115,7 +115,7 @@ require ( github.com/golang/glog v1.2.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v1.12.1 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect @@ -156,7 +156,7 @@ 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/minio/highwayhash v1.0.2 // indirect + github.com/minio/highwayhash v1.0.3 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -167,17 +167,17 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/oxyno-zeta/gomock-extra-matcher v1.2.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect - github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/common v0.60.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/rs/cors v1.8.3 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/sasha-s/go-deadlock v0.3.1 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect github.com/shamaton/msgpack/v2 v2.2.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect @@ -198,12 +198,12 @@ require ( go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.26.0 // indirect - golang.org/x/net v0.28.0 // indirect + golang.org/x/crypto v0.28.0 // indirect + golang.org/x/net v0.30.0 // indirect golang.org/x/oauth2 v0.23.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.24.0 // indirect - golang.org/x/term v0.23.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/term v0.25.0 // indirect golang.org/x/text v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.186.0 // indirect @@ -221,12 +221,11 @@ replace ( cosmossdk.io/math => cosmossdk.io/math v1.4.0 github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 github.com/CosmWasm/wasmd => github.com/neutron-org/wasmd v0.53.0-neutron - github.com/cometbft/cometbft => github.com/neutron-org/cometbft v0.0.0-20241111105801-a7fe160b0b62 + github.com/btcsuite/btcd/btcec/v2 => github.com/btcsuite/btcd/btcec/v2 v2.3.2 github.com/cosmos/admin-module/v2 => github.com/neutron-org/admin-module/v2 v2.0.2 - github.com/cosmos/cosmos-sdk => github.com/neutron-org/cosmos-sdk v0.50.9-neutron.0.20240924163649-207f347e9c53 + github.com/cosmos/cosmos-sdk => github.com/neutron-org/cosmos-sdk v0.50.10-neutron // explicitely replace iavl to v1.2.0 cause sometimes go mod tidy uses not right version github.com/cosmos/iavl => github.com/cosmos/iavl v1.2.0 - github.com/cosmos/interchain-security/v5 => github.com/cosmos/interchain-security/v5 v5.0.0-20240802125602-fa1e09444aae github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/prometheus/procfs => github.com/prometheus/procfs v0.12.0 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 diff --git a/go.sum b/go.sum index 206c16b78..00c6e66db 100644 --- a/go.sum +++ b/go.sum @@ -202,8 +202,8 @@ cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= cosmossdk.io/log v1.4.1/go.mod h1:k08v0Pyq+gCP6phvdI6RCGhLf/r425UT6Rk/m+o74rU= cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= -cosmossdk.io/store v1.1.0 h1:LnKwgYMc9BInn9PhpTFEQVbL9UK475G2H911CGGnWHk= -cosmossdk.io/store v1.1.0/go.mod h1:oZfW/4Fc/zYqu3JmQcQdUJ3fqu5vnYTn3LZFFy8P8ng= +cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= +cosmossdk.io/store v1.1.1/go.mod h1:8DwVTz83/2PSI366FERGbWSH7hL6sB7HbYp8bqksNwM= cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= cosmossdk.io/x/circuit v0.1.1/go.mod h1:B6f/urRuQH8gjt4eLIXfZJucrbreuYrKh5CSjaOxr+Q= cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= @@ -241,9 +241,8 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= 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= -github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/adlio/schema v1.3.6 h1:k1/zc2jNfeiZBA5aFTRy37jlBIuCkXCm0XmvpzCKI9I= +github.com/adlio/schema v1.3.6/go.mod h1:qkxwLgPBd1FgLRHYVCmQT/rrBr3JH38J9LjmVzWNudg= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -275,23 +274,11 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2 github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= -github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= @@ -346,8 +333,10 @@ github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/cometbft/cometbft-db v0.12.0 h1:v77/z0VyfSU7k682IzZeZPFZrQAKiQwkqGN0QzAjMi0= -github.com/cometbft/cometbft-db v0.12.0/go.mod h1:aX2NbCrjNVd2ZajYxt1BsiFf/Z+TQ2MN0VxdicheYuw= +github.com/cometbft/cometbft v0.38.15 h1:5veFd8k1uXM27PBg9sMO3hAfRJ3vbh4OmmLf6cVrqXg= +github.com/cometbft/cometbft v0.38.15/go.mod h1:+wh6ap6xctVG+JOHwbl8pPKZ0GeqdPYqISu7F4b43cQ= +github.com/cometbft/cometbft-db v0.14.1 h1:SxoamPghqICBAIcGpleHbmoPqy+crij/++eZz3DlerQ= +github.com/cometbft/cometbft-db v0.14.1/go.mod h1:KHP1YghilyGV/xjD5DP3+2hyigWx0WTp9X+0Gnx0RxQ= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -379,8 +368,8 @@ github.com/cosmos/ibc-go/v8 v8.5.2 h1:27s9oeD2AxLQF3e9BQsYt9doONyZ7FwZi/qkBv6Sdk github.com/cosmos/ibc-go/v8 v8.5.2/go.mod h1:P5hkAvq0Qbg0h18uLxDVA9q1kOJ0l36htMsskiNwXbo= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= -github.com/cosmos/interchain-security/v5 v5.0.0-20240802125602-fa1e09444aae h1:/EWV9qryltapge0v4ctvl2jV3Nne5nsbd+GYblj/jWA= -github.com/cosmos/interchain-security/v5 v5.0.0-20240802125602-fa1e09444aae/go.mod h1:P3TM8JmE9Q20Jfch3jnFcQ4IXJp5twueRnUudi6XEGI= +github.com/cosmos/interchain-security/v5 v5.2.0 h1:ZB4sMH5kG4Fmuk+WLKykXv8qSSoafo1eVlSo0G5scKE= +github.com/cosmos/interchain-security/v5 v5.2.0/go.mod h1:vmeTcTxFCl1eV0o6xpl/IRT7Basz0szVVGzbppnInMg= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= @@ -391,16 +380,14 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= -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/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/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8BzuWsEs= @@ -563,8 +550,8 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXi github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -729,8 +716,6 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -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.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= @@ -742,7 +727,6 @@ github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -757,7 +741,6 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= @@ -806,8 +789,8 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -845,10 +828,8 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neutron-org/admin-module/v2 v2.0.2 h1:XDDFWjvkVBKRf3lBFCazT1zAXZ3dHX8GaZ4ol8Hdk8I= github.com/neutron-org/admin-module/v2 v2.0.2/go.mod h1:RfOyabXsdJ5btcOKyKPZDYiZhtuKFubbJMOb8EJZtvA= -github.com/neutron-org/cometbft v0.0.0-20241111105801-a7fe160b0b62 h1:erXDgRxrEtWScO9i8ZYjr0cnjxTJ0BT+WrUsRMbMVSU= -github.com/neutron-org/cometbft v0.0.0-20241111105801-a7fe160b0b62/go.mod h1:jHPx9vQpWzPHEAiYI/7EDKaB1NXhK6o3SArrrY8ExKc= -github.com/neutron-org/cosmos-sdk v0.50.9-neutron.0.20240924163649-207f347e9c53 h1:7FJOHOt9F0oea0b5jrn090u/zn7+LdBmT6ZDmrJtTqs= -github.com/neutron-org/cosmos-sdk v0.50.9-neutron.0.20240924163649-207f347e9c53/go.mod h1:TMH6wpoYBcg7Cp5BEg8fneLr+8XloNQkf2MRNF9V6JE= +github.com/neutron-org/cosmos-sdk v0.50.10-neutron h1:1q8P0l29Mm22m8wUstKlCZpKScJOa5bFFqkO/RbHL5w= +github.com/neutron-org/cosmos-sdk v0.50.10-neutron/go.mod h1:6Eesrx3ZE7vxBZWpK++30H+Uc7Q4ahQWCL7JKU/LEdU= github.com/neutron-org/wasmd v0.53.0-neutron h1:Dv1VP1+QjYeb6RMo03sxw0Pe42JU0MPxefwNaG22KVs= github.com/neutron-org/wasmd v0.53.0-neutron/go.mod h1:FJl/aWjdpGof3usAMFQpDe07Rkx77PUzp0cygFMOvtw= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -868,7 +849,6 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -879,8 +859,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= -github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= +github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -901,9 +881,8 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= 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-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCRJjJzl4udgEf7hawInF9texMeO2jrU= -github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= @@ -940,8 +919,8 @@ 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.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= +github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= 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= @@ -956,8 +935,8 @@ github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/f github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= @@ -969,8 +948,8 @@ github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgY 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= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shamaton/msgpack/v2 v2.2.0 h1:IP1m01pHwCrMa6ZccP9B3bqxEMKMSmMVAVKk54g3L/Y= github.com/shamaton/msgpack/v2 v2.2.0/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI= @@ -987,8 +966,8 @@ github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= github.com/skip-mev/feemarket v1.1.1 h1:L34K7N2J6o635kzNYRAvQ93+hAFtSiJ2t03jmaNx0zw= github.com/skip-mev/feemarket v1.1.1/go.mod h1:DUa6djUsTeMOrbrcIZqWSVxU9IZNCXp96ruaojyBNpc= -github.com/skip-mev/slinky v1.0.12 h1:qmZHB6c5fgDhO/pv67YcZc2M25t3gZcceVmJtA9zjOo= -github.com/skip-mev/slinky v1.0.12/go.mod h1:8mxMdQ8MY8QAxgxLvUKTfDwX6XCAUeqZwkU/r+ZsELU= +github.com/skip-mev/slinky v1.0.13 h1:Ym+xqrhq1kJzyyJICGc2gB43+EETGy72sumZUU1wCt8= +github.com/skip-mev/slinky v1.0.13/go.mod h1:OgOJivOCJQqjGefvoe/kzszCJKgK/hrXluoPiGJHTwU= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 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= @@ -1111,7 +1090,6 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1119,13 +1097,11 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1166,7 +1142,6 @@ 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.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1227,8 +1202,8 @@ 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.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1281,7 +1256,6 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1367,13 +1341,14 @@ 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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.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.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= -golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= +golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 50c5ceef9940ba1767cac3e28406fd0010f8b223 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 22 Nov 2024 15:27:02 +0200 Subject: [PATCH 21/29] upgrades --- app/upgrades/v5.0.2/upgrades.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/upgrades/v5.0.2/upgrades.go b/app/upgrades/v5.0.2/upgrades.go index c0e20d180..a783821b4 100644 --- a/app/upgrades/v5.0.2/upgrades.go +++ b/app/upgrades/v5.0.2/upgrades.go @@ -13,8 +13,8 @@ import ( ) func CreateUpgradeHandler( - _ *module.Manager, - _ module.Configurator, + mm *module.Manager, + configurator module.Configurator, _ *upgrades.UpgradeKeepers, _ upgrades.StoreKeys, _ codec.Codec, @@ -24,6 +24,11 @@ func CreateUpgradeHandler( ctx.Logger().Info("Starting module migrations...") + vm, err := mm.RunMigrations(ctx, configurator, vm) + if err != nil { + return vm, err + } + ctx.Logger().Info(fmt.Sprintf("Migration {%s} applied", UpgradeName)) return vm, nil } From 0f9cb22ce5160b8d5fa2c89f34807d743ca56b5e Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 22 Nov 2024 15:41:17 +0200 Subject: [PATCH 22/29] remove unnecessary replace --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index 16e84cbce..575826094 100644 --- a/go.mod +++ b/go.mod @@ -218,7 +218,6 @@ require ( ) replace ( - cosmossdk.io/math => cosmossdk.io/math v1.4.0 github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 github.com/CosmWasm/wasmd => github.com/neutron-org/wasmd v0.53.0-neutron github.com/btcsuite/btcd/btcec/v2 => github.com/btcsuite/btcd/btcec/v2 v2.3.2 From fa76dff78c2313110ad5551988d7da2ec3cae295 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 22 Nov 2024 16:21:41 +0200 Subject: [PATCH 23/29] upd deps --- go.mod | 1 + go.sum | 4 ++-- x/tokenfactory/keeper/before_send_test.go | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 575826094..d8d10f339 100644 --- a/go.mod +++ b/go.mod @@ -225,6 +225,7 @@ replace ( github.com/cosmos/cosmos-sdk => github.com/neutron-org/cosmos-sdk v0.50.10-neutron // explicitely replace iavl to v1.2.0 cause sometimes go mod tidy uses not right version github.com/cosmos/iavl => github.com/cosmos/iavl v1.2.0 + github.com/cosmos/interchain-security/v5 => github.com/cosmos/interchain-security/v5 v5.0.0-20240802125602-fa1e09444aae github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/prometheus/procfs => github.com/prometheus/procfs v0.12.0 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 diff --git a/go.sum b/go.sum index 00c6e66db..9c5d098c2 100644 --- a/go.sum +++ b/go.sum @@ -368,8 +368,8 @@ github.com/cosmos/ibc-go/v8 v8.5.2 h1:27s9oeD2AxLQF3e9BQsYt9doONyZ7FwZi/qkBv6Sdk github.com/cosmos/ibc-go/v8 v8.5.2/go.mod h1:P5hkAvq0Qbg0h18uLxDVA9q1kOJ0l36htMsskiNwXbo= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= -github.com/cosmos/interchain-security/v5 v5.2.0 h1:ZB4sMH5kG4Fmuk+WLKykXv8qSSoafo1eVlSo0G5scKE= -github.com/cosmos/interchain-security/v5 v5.2.0/go.mod h1:vmeTcTxFCl1eV0o6xpl/IRT7Basz0szVVGzbppnInMg= +github.com/cosmos/interchain-security/v5 v5.0.0-20240802125602-fa1e09444aae h1:/EWV9qryltapge0v4ctvl2jV3Nne5nsbd+GYblj/jWA= +github.com/cosmos/interchain-security/v5 v5.0.0-20240802125602-fa1e09444aae/go.mod h1:P3TM8JmE9Q20Jfch3jnFcQ4IXJp5twueRnUudi6XEGI= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= diff --git a/x/tokenfactory/keeper/before_send_test.go b/x/tokenfactory/keeper/before_send_test.go index c47560596..30dfc9160 100644 --- a/x/tokenfactory/keeper/before_send_test.go +++ b/x/tokenfactory/keeper/before_send_test.go @@ -65,7 +65,7 @@ func (suite *KeeperTestSuite) TestBeforeSendHook() { }{ { desc: "should not allow sending 100 amount of *any* denom", - wasmFile: "./testdata/no100.wasm", + wasmFile: "./testdata/no100.wasm", // https://github.com/neutron-org/neutron-dev-contracts/tree/chore/additional-tf-test-contracts/contracts/no100 sendMsgs: []SendMsgTestCase{ { desc: "sending 1 of factorydenom should not error", @@ -255,7 +255,7 @@ func (suite *KeeperTestSuite) TestInfiniteTrackBeforeSend() { }{ { name: "sending tokenfactory denom from module to module with infinite contract should panic", - wasmFile: "./testdata/infinite_track_beforesend.wasm", + wasmFile: "./testdata/infinite_track_beforesend.wasm", // https://github.com/neutron-org/neutron-dev-contracts/tree/chore/additional-tf-test-contracts/contracts/infinite-track-beforesend useFactoryDenom: true, }, { @@ -272,7 +272,7 @@ func (suite *KeeperTestSuite) TestInfiniteTrackBeforeSend() { }, { name: "Try using no 100", - wasmFile: "./testdata/no100.wasm", + wasmFile: "./testdata/no100.wasm", // https://github.com/neutron-org/neutron-dev-contracts/tree/chore/additional-tf-test-contracts/contracts/no100 useFactoryDenom: true, }, } { From d5e86d2c8d8c35a5a11ab34e9e4900ec28058a31 Mon Sep 17 00:00:00 2001 From: Andrei Zavgorodnii Date: Sat, 23 Nov 2024 18:13:46 +0000 Subject: [PATCH 24/29] added an explanatory comment for the TrackBeforeSendGasLimit value increase --- x/tokenfactory/types/constants.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x/tokenfactory/types/constants.go b/x/tokenfactory/types/constants.go index eeca93fcf..350fe3122 100644 --- a/x/tokenfactory/types/constants.go +++ b/x/tokenfactory/types/constants.go @@ -2,4 +2,6 @@ package types const ConsensusVersion = 2 +// TrackBeforeSendGasLimit value is increased to allow existing approved tokenfactory hooks to work properly. +// In the next coordinated upgrade, this will become a chain parameter. var TrackBeforeSendGasLimit = uint64(500_000) From cca46e0ec4e4ad2b1b20fed7b3ea04a813659fbc Mon Sep 17 00:00:00 2001 From: Mike Mozhaev Date: Sat, 23 Nov 2024 20:25:42 +0200 Subject: [PATCH 25/29] Update x/tokenfactory/keeper/before_send_test.go Co-authored-by: swelf19 <62722506+swelf19@users.noreply.github.com> --- x/tokenfactory/keeper/before_send_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/tokenfactory/keeper/before_send_test.go b/x/tokenfactory/keeper/before_send_test.go index 30dfc9160..3887ccabb 100644 --- a/x/tokenfactory/keeper/before_send_test.go +++ b/x/tokenfactory/keeper/before_send_test.go @@ -330,7 +330,7 @@ func (suite *KeeperTestSuite) TestInfiniteTrackBeforeSend() { suite.Require().NoError(err) // send should happen regardless of trackBeforeSend results - distributionModuleAddress := suite.GetNeutronZoneApp(suite.ChainA).AccountKeeper.GetModuleAddress("dex") + distributionModuleAddress := suite.GetNeutronZoneApp(suite.ChainA).AccountKeeper.GetModuleAddress(dextypes.ModuleName) distributionModuleBalances := suite.GetNeutronZoneApp(suite.ChainA).BankKeeper.GetAllBalances(suite.ChainA.GetContext(), distributionModuleAddress) suite.Require().True(distributionModuleBalances.Equal(tokenToSend)) } From ed4b390a35b81ce25a77ccba63cbf343faeaf004 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Sat, 23 Nov 2024 21:01:18 +0200 Subject: [PATCH 26/29] fix static build --- Dockerfile.builder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.builder b/Dockerfile.builder index ded10401f..9e9c084dd 100644 --- a/Dockerfile.builder +++ b/Dockerfile.builder @@ -14,7 +14,7 @@ ARG GIT_COMMIT ARG BUILD_TAGS ARG ENABLED_PROPOSALS -ENV GOTOOLCHAIN go1.22.6 +ENV GOTOOLCHAIN go1.22.9 RUN apk add --no-cache \ ca-certificates \ From fcfffd67eac9dd02f13faaa3f14fb534432731f7 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Sun, 24 Nov 2024 12:28:57 +0200 Subject: [PATCH 27/29] review fixes + format --- app/app.go | 4 ++-- x/state-verifier/keeper/keeper.go | 10 +++++----- x/state-verifier/keeper/keeper_test.go | 4 ++-- x/state-verifier/module.go | 1 + x/state-verifier/types/keys.go | 4 ---- 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/app/app.go b/app/app.go index fef07e4fa..8f1759ac0 100644 --- a/app/app.go +++ b/app/app.go @@ -11,7 +11,7 @@ import ( "time" dynamicfeestypes "github.com/neutron-org/neutron/v5/x/dynamicfees/types" - state_verifier "github.com/neutron-org/neutron/v5/x/state-verifier" + stateverifier "github.com/neutron-org/neutron/v5/x/state-verifier" svkeeper "github.com/neutron-org/neutron/v5/x/state-verifier/keeper" stateverifiertypes "github.com/neutron-org/neutron/v5/x/state-verifier/types" @@ -936,7 +936,7 @@ func New( consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper), // always be last to make sure that it checks for all invariants and not only part of them crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), - state_verifier.NewAppModule(appCodec, app.StateVerifierKeeper), + stateverifier.NewAppModule(appCodec, app.StateVerifierKeeper), ) app.mm.SetOrderPreBlockers( diff --git a/x/state-verifier/keeper/keeper.go b/x/state-verifier/keeper/keeper.go index 1e558d8ec..8b558b1da 100644 --- a/x/state-verifier/keeper/keeper.go +++ b/x/state-verifier/keeper/keeper.go @@ -101,13 +101,13 @@ func (k *Keeper) Verify(ctx sdk.Context, blockHeight int64, values []*icqtypes.S return errors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) } - for _, result := range values { - proof, err := ibccommitmenttypes.ConvertProofs(result.Proof) + for _, value := range values { + proof, err := ibccommitmenttypes.ConvertProofs(value.Proof) if err != nil { return errors.Wrapf(sdkerrors.ErrInvalidType, "failed to convert crypto.ProofOps to MerkleProof: %v", err) } - path := ibccommitmenttypes.NewMerklePath(result.StoragePrefix, string(result.Key)) + path := ibccommitmenttypes.NewMerklePath(value.StoragePrefix, string(value.Key)) // identify what kind proofs (non-existence proof always has *ics23.CommitmentProof_Nonexist as the first item) we got // and call corresponding method to verify it switch proof.GetProofs()[0].GetProof().(type) { @@ -116,9 +116,9 @@ func (k *Keeper) Verify(ctx sdk.Context, blockHeight int64, values []*icqtypes.S if err := proof.VerifyNonMembership(ibccommitmenttypes.GetSDKSpecs(), cs.Root, path); err != nil { return errors.Wrapf(icqtypes.ErrInvalidProof, "failed to verify proof: %v", err) } - result.Value = nil + value.Value = nil case *ics23.CommitmentProof_Exist: - if err := proof.VerifyMembership(ibccommitmenttypes.GetSDKSpecs(), cs.Root, path, result.Value); err != nil { + if err := proof.VerifyMembership(ibccommitmenttypes.GetSDKSpecs(), cs.Root, path, value.Value); err != nil { return errors.Wrapf(icqtypes.ErrInvalidProof, "failed to verify proof: %v", err) } default: diff --git a/x/state-verifier/keeper/keeper_test.go b/x/state-verifier/keeper/keeper_test.go index c7f1cb6c9..d6c052d2e 100644 --- a/x/state-verifier/keeper/keeper_test.go +++ b/x/state-verifier/keeper/keeper_test.go @@ -111,7 +111,7 @@ func (suite *KeeperTestSuite) TestVerifyValue() { Proof: resp.ProofOps, Value: resp.Value, StoragePrefix: ibchost.StoreKey, - }}, resp.Height - 2, fmt.Errorf("Please ensure proof was submitted with correct proofHeight and to the correct chain.") + }}, resp.Height - 2, fmt.Errorf("Please ensure proof was submitted with correct proofHeight and to the correct chain.") //nolint:revive }, }, { @@ -132,7 +132,7 @@ func (suite *KeeperTestSuite) TestVerifyValue() { Proof: resp.ProofOps, Value: resp.Value, StoragePrefix: "kekekek", - }}, resp.Height, fmt.Errorf("Please ensure the path and value are both correct.") + }}, resp.Height, fmt.Errorf("Please ensure the path and value are both correct.") //nolint:revive }, }, } diff --git a/x/state-verifier/module.go b/x/state-verifier/module.go index 8769e8025..6cb0e965f 100644 --- a/x/state-verifier/module.go +++ b/x/state-verifier/module.go @@ -87,6 +87,7 @@ func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *r func (a AppModuleBasic) GetTxCmd() *cobra.Command { return &cobra.Command{} } + func (a AppModuleBasic) GetQueryCmd() *cobra.Command { return &cobra.Command{} } diff --git a/x/state-verifier/types/keys.go b/x/state-verifier/types/keys.go index 36ea25bae..0df1de90a 100644 --- a/x/state-verifier/types/keys.go +++ b/x/state-verifier/types/keys.go @@ -19,7 +19,3 @@ var ConsensusStateKey = []byte{prefixConsensusStateKey} func GetConsensusStateKey(height int64) []byte { return append(ConsensusStateKey, []byte(strconv.FormatInt(height, 10))...) } - -func ExtractHeightFromConsensusStateKey(key []byte) (int64, error) { - return strconv.ParseInt(string(key[len(ConsensusStateKey):]), 10, 64) -} From e0083885a8481fe347a3feae654dae690eac27aa Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Tue, 26 Nov 2024 13:55:03 +0200 Subject: [PATCH 28/29] strconv.FormatInt -> Uint64ToBigEndian for int encoding --- x/state-verifier/keeper/keeper.go | 7 +------ x/state-verifier/types/keys.go | 6 ++++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/x/state-verifier/keeper/keeper.go b/x/state-verifier/keeper/keeper.go index 8b558b1da..f70a7d1b8 100644 --- a/x/state-verifier/keeper/keeper.go +++ b/x/state-verifier/keeper/keeper.go @@ -2,7 +2,6 @@ package keeper import ( "fmt" - "strconv" "cosmossdk.io/core/comet" "cosmossdk.io/core/header" @@ -143,11 +142,7 @@ func (k *Keeper) GetAllConsensusStates(ctx sdk.Context) ([]*types.ConsensusState for ; iterator.Valid(); iterator.Next() { cs := tendermint.ConsensusState{} k.cdc.MustUnmarshal(iterator.Value(), &cs) - height, err := strconv.ParseInt(string(iterator.Key()), 10, 64) - if err != nil { - return nil, errors.Wrapf(err, "failed to extract height from consensus state key") - } - + height := int64(sdk.BigEndianToUint64(iterator.Key())) states = append(states, &types.ConsensusState{ Height: height, Cs: &cs, diff --git a/x/state-verifier/types/keys.go b/x/state-verifier/types/keys.go index 0df1de90a..fbe933b08 100644 --- a/x/state-verifier/types/keys.go +++ b/x/state-verifier/types/keys.go @@ -1,6 +1,8 @@ package types -import "strconv" +import ( + "github.com/cosmos/cosmos-sdk/types" +) const ( // ModuleName defines the module name @@ -17,5 +19,5 @@ const ( var ConsensusStateKey = []byte{prefixConsensusStateKey} func GetConsensusStateKey(height int64) []byte { - return append(ConsensusStateKey, []byte(strconv.FormatInt(height, 10))...) + return append(ConsensusStateKey, types.Uint64ToBigEndian(uint64(height))...) } From 4a57aacee21ae13733476699a1eff559ae0053c2 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Tue, 26 Nov 2024 15:45:20 +0200 Subject: [PATCH 29/29] reuse VerifyStorageValue in ICQ and state_verifier --- utils/storageverification/errors.go | 11 +++++ utils/storageverification/verify.go | 50 +++++++++++++++++++++++ x/interchainqueries/keeper/keeper_test.go | 4 +- x/interchainqueries/keeper/msg_server.go | 44 ++++---------------- x/state-verifier/keeper/keeper.go | 32 +++------------ 5 files changed, 77 insertions(+), 64 deletions(-) create mode 100644 utils/storageverification/errors.go create mode 100644 utils/storageverification/verify.go diff --git a/utils/storageverification/errors.go b/utils/storageverification/errors.go new file mode 100644 index 000000000..80386c10a --- /dev/null +++ b/utils/storageverification/errors.go @@ -0,0 +1,11 @@ +package storageverification + +import "cosmossdk.io/errors" + +const StateVerificationCodespace = "state_verification" + +var ( + ErrInvalidType = errors.Register(StateVerificationCodespace, 1, "invalid type") + ErrInvalidStorageValue = errors.Register(StateVerificationCodespace, 2, "failed to check storage value") + ErrInvalidProof = errors.Register(StateVerificationCodespace, 3, "merkle proof is invalid") +) diff --git a/utils/storageverification/verify.go b/utils/storageverification/verify.go new file mode 100644 index 000000000..a17d14bce --- /dev/null +++ b/utils/storageverification/verify.go @@ -0,0 +1,50 @@ +package storageverification + +import ( + "cosmossdk.io/errors" + ibccommitmenttypes "github.com/cosmos/ibc-go/v8/modules/core/23-commitment/types" + "github.com/cosmos/ibc-go/v8/modules/core/exported" + ics23 "github.com/cosmos/ics23/go" + + "github.com/neutron-org/neutron/v5/x/interchainqueries/types" +) + +type VerifyCallback func(index int) error + +// VerifyStorageValues verifies stValues slice against proof using proofSpecs +// A caller can provide verifyCallback method that will be called for each storage value from the slice with an index of the value in the slice +// to do any additional user-defined checks of storage values +func VerifyStorageValues(stValues []*types.StorageValue, root exported.Root, proofSpecs []*ics23.ProofSpec, verifyCallback VerifyCallback) error { + for index, value := range stValues { + proof, err := ibccommitmenttypes.ConvertProofs(value.Proof) + if err != nil { + return errors.Wrapf(ErrInvalidType, "failed to convert crypto.ProofOps to MerkleProof: %v", err) + } + + if verifyCallback != nil { + if err := verifyCallback(index); err != nil { + return errors.Wrapf(ErrInvalidStorageValue, err.Error()) + } + } + + path := ibccommitmenttypes.NewMerklePath(value.StoragePrefix, string(value.Key)) + // identify what kind proofs (non-existence proof always has *ics23.CommitmentProof_Nonexist as the first item) we got + // and call corresponding method to verify it + switch proof.GetProofs()[0].GetProof().(type) { + // we can get non-existence proof if someone queried some key which is not exists in the storage on remote chain + case *ics23.CommitmentProof_Nonexist: + if err := proof.VerifyNonMembership(proofSpecs, root, path); err != nil { + return errors.Wrapf(ErrInvalidProof, "failed to verify proof: %v", err) + } + value.Value = nil + case *ics23.CommitmentProof_Exist: + if err := proof.VerifyMembership(proofSpecs, root, path, value.Value); err != nil { + return errors.Wrapf(ErrInvalidProof, "failed to verify proof: %v", err) + } + default: + return errors.Wrapf(ErrInvalidProof, "unknown proof type %T", proof.GetProofs()[0].GetProof()) + } + } + + return nil +} diff --git a/x/interchainqueries/keeper/keeper_test.go b/x/interchainqueries/keeper/keeper_test.go index 9ac2b5228..fafb48f77 100644 --- a/x/interchainqueries/keeper/keeper_test.go +++ b/x/interchainqueries/keeper/keeper_test.go @@ -989,7 +989,7 @@ func (suite *KeeperTestSuite) TestSubmitInterchainQueryResult() { }, } }, - iqtypes.ErrInvalidType, + iqtypes.ErrInvalidSubmittedResult, }, { "non-registered key in KV result", @@ -1239,7 +1239,7 @@ func (suite *KeeperTestSuite) TestSubmitInterchainQueryResult() { }, } }, - iqtypes.ErrInvalidProof, + iqtypes.ErrInvalidSubmittedResult, }, { "query result height is too old", diff --git a/x/interchainqueries/keeper/msg_server.go b/x/interchainqueries/keeper/msg_server.go index 50f30fa97..f92811f29 100644 --- a/x/interchainqueries/keeper/msg_server.go +++ b/x/interchainqueries/keeper/msg_server.go @@ -15,9 +15,8 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ibcclienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" //nolint:staticcheck ibcconnectiontypes "github.com/cosmos/ibc-go/v8/modules/core/03-connection/types" - ibccommitmenttypes "github.com/cosmos/ibc-go/v8/modules/core/23-commitment/types" - ics23 "github.com/cosmos/ics23/go" + "github.com/neutron-org/neutron/v5/utils/storageverification" "github.com/neutron-org/neutron/v5/x/interchainqueries/types" ) @@ -235,43 +234,18 @@ func (m msgServer) SubmitQueryResult(goCtx context.Context, msg *types.MsgSubmit return nil, err } - for index, result := range msg.Result.KvResults { - proof, err := ibccommitmenttypes.ConvertProofs(result.Proof) - if err != nil { - ctx.Logger().Debug("SubmitQueryResult: failed to ConvertProofs", - "error", err, "query", query, "message", msg) - return nil, errors.Wrapf(types.ErrInvalidType, "failed to convert crypto.ProofOps to MerkleProof: %v", err) + if err := storageverification.VerifyStorageValues(msg.Result.KvResults, consensusState.GetRoot(), clientState.ProofSpecs, func(index int) error { + if !bytes.Equal(msg.Result.KvResults[index].Key, query.Keys[index].Key) { + return errors.Wrapf(types.ErrInvalidSubmittedResult, "KV key from result is not equal to registered query key: %v != %v", msg.Result.KvResults[index].Key, query.Keys[index].Key) } - if !bytes.Equal(result.Key, query.Keys[index].Key) { - return nil, errors.Wrapf(types.ErrInvalidSubmittedResult, "KV key from result is not equal to registered query key: %v != %v", result.Key, query.Keys[index].Key) + if msg.Result.KvResults[index].StoragePrefix != query.Keys[index].Path { + return errors.Wrapf(types.ErrInvalidSubmittedResult, "KV path from result is not equal to registered query storage prefix: %v != %v", msg.Result.KvResults[index].StoragePrefix, query.Keys[index].Path) } - if result.StoragePrefix != query.Keys[index].Path { - return nil, errors.Wrapf(types.ErrInvalidSubmittedResult, "KV path from result is not equal to registered query storage prefix: %v != %v", result.StoragePrefix, query.Keys[index].Path) - } - - path := ibccommitmenttypes.NewMerklePath(result.StoragePrefix, string(result.Key)) - // identify what kind proofs (non-existence proof always has *ics23.CommitmentProof_Nonexist as the first item) we got - // and call corresponding method to verify it - switch proof.GetProofs()[0].GetProof().(type) { - // we can get non-existence proof if someone queried some key which is not exists in the storage on remote chain - case *ics23.CommitmentProof_Nonexist: - if err := proof.VerifyNonMembership(clientState.ProofSpecs, consensusState.GetRoot(), path); err != nil { - ctx.Logger().Debug("SubmitQueryResult: failed to VerifyNonMembership", - "error", err, "query", query, "message", msg, "path", path) - return nil, errors.Wrapf(types.ErrInvalidProof, "failed to verify proof: %v", err) - } - result.Value = nil - case *ics23.CommitmentProof_Exist: - if err := proof.VerifyMembership(clientState.ProofSpecs, consensusState.GetRoot(), path, result.Value); err != nil { - ctx.Logger().Debug("SubmitQueryResult: failed to VerifyMembership", - "error", err, "query", query, "message", msg, "path", path) - return nil, errors.Wrapf(types.ErrInvalidProof, "failed to verify proof: %v", err) - } - default: - return nil, errors.Wrapf(types.ErrInvalidProof, "unknown proof type %T", proof.GetProofs()[0].GetProof()) - } + return nil + }); err != nil { + return nil, errors.Wrapf(types.ErrInvalidSubmittedResult, "failed to verify submitted result: %v", err) } if err = m.saveKVQueryResult(ctx, query, msg.Result); err != nil { diff --git a/x/state-verifier/keeper/keeper.go b/x/state-verifier/keeper/keeper.go index f70a7d1b8..187b9a40a 100644 --- a/x/state-verifier/keeper/keeper.go +++ b/x/state-verifier/keeper/keeper.go @@ -9,14 +9,13 @@ import ( "cosmossdk.io/log" "cosmossdk.io/store/prefix" storetypes "cosmossdk.io/store/types" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ibccommitmenttypes "github.com/cosmos/ibc-go/v8/modules/core/23-commitment/types" tendermint "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint" - ics23 "github.com/cosmos/ics23/go" - - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/neutron-org/neutron/v5/utils/storageverification" icqtypes "github.com/neutron-org/neutron/v5/x/interchainqueries/types" "github.com/neutron-org/neutron/v5/x/state-verifier/types" ) @@ -100,29 +99,8 @@ func (k *Keeper) Verify(ctx sdk.Context, blockHeight int64, values []*icqtypes.S return errors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) } - for _, value := range values { - proof, err := ibccommitmenttypes.ConvertProofs(value.Proof) - if err != nil { - return errors.Wrapf(sdkerrors.ErrInvalidType, "failed to convert crypto.ProofOps to MerkleProof: %v", err) - } - - path := ibccommitmenttypes.NewMerklePath(value.StoragePrefix, string(value.Key)) - // identify what kind proofs (non-existence proof always has *ics23.CommitmentProof_Nonexist as the first item) we got - // and call corresponding method to verify it - switch proof.GetProofs()[0].GetProof().(type) { - // we can get non-existence proof if someone queried some key which is not exists in the storage on remote chain - case *ics23.CommitmentProof_Nonexist: - if err := proof.VerifyNonMembership(ibccommitmenttypes.GetSDKSpecs(), cs.Root, path); err != nil { - return errors.Wrapf(icqtypes.ErrInvalidProof, "failed to verify proof: %v", err) - } - value.Value = nil - case *ics23.CommitmentProof_Exist: - if err := proof.VerifyMembership(ibccommitmenttypes.GetSDKSpecs(), cs.Root, path, value.Value); err != nil { - return errors.Wrapf(icqtypes.ErrInvalidProof, "failed to verify proof: %v", err) - } - default: - return errors.Wrapf(icqtypes.ErrInvalidProof, "unknown proof type %T", proof.GetProofs()[0].GetProof()) - } + if err := storageverification.VerifyStorageValues(values, cs.Root, ibccommitmenttypes.GetSDKSpecs(), nil); err != nil { + return errors.Wrap(sdkerrors.ErrInvalidRequest, err.Error()) } return nil