From ccc1f8970ab5b62efe28ffbbac6ea7857bfe3e82 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 May 2022 08:12:08 +0000 Subject: [PATCH 01/94] Bump github.com/spf13/cast from 1.4.1 to 1.5.0 Bumps [github.com/spf13/cast](https://github.com/spf13/cast) from 1.4.1 to 1.5.0. - [Release notes](https://github.com/spf13/cast/releases) - [Commits](https://github.com/spf13/cast/compare/v1.4.1...v1.5.0) --- updated-dependencies: - dependency-name: github.com/spf13/cast dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index ebdf4078ef..7117bf97b8 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa - github.com/spf13/cast v1.4.1 + github.com/spf13/cast v1.5.0 github.com/spf13/cobra v1.4.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.11.0 diff --git a/go.sum b/go.sum index 09cb25ca72..325055a558 100644 --- a/go.sum +++ b/go.sum @@ -322,6 +322,8 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= @@ -621,6 +623,8 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= 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= @@ -868,6 +872,8 @@ github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRr 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= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= @@ -916,8 +922,9 @@ github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= From 2da02caf586b13d227a5b01eadec36eb542cf633 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 May 2022 08:17:52 +0000 Subject: [PATCH 02/94] Bump github.com/prometheus/client_golang from 1.12.1 to 1.12.2 Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.12.1 to 1.12.2. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.12.1...v1.12.2) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index ebdf4078ef..eae6371881 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.12.1 + github.com/prometheus/client_golang v1.12.2 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa diff --git a/go.sum b/go.sum index 09cb25ca72..332929899a 100644 --- a/go.sum +++ b/go.sum @@ -819,8 +819,9 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= From aadc8bfb17c019bb8798caaf46147c161461d72e Mon Sep 17 00:00:00 2001 From: pinosu <95283998+pinosu@users.noreply.github.com> Date: Fri, 20 May 2022 09:04:21 +0200 Subject: [PATCH 03/94] Publish protobufs on release tags (#869) * Publish protobufs on release tags * Fix regex to match also rc versions --- .github/workflows/proto-buf-publisher.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/proto-buf-publisher.yml b/.github/workflows/proto-buf-publisher.yml index db849119ba..7e000bc5b2 100644 --- a/.github/workflows/proto-buf-publisher.yml +++ b/.github/workflows/proto-buf-publisher.yml @@ -4,10 +4,14 @@ name: Proto Buf Publishing - Action on: push: branches: - - master + - main paths: - 'proto/**' + # Sequence of patterns matched against refs/tags + tags: + - "v[0-9]+.[0-9]+.[0-9]+.*" # Push events to matching v*, //i.e. v20.15.10, v0.27.0-rc1 + jobs: push: runs-on: ubuntu-latest From 1da0a6fa3f667e38ff909d9a32dccbe3945e0833 Mon Sep 17 00:00:00 2001 From: j0nl1 Date: Sun, 29 May 2022 04:04:14 +0200 Subject: [PATCH 04/94] feat: setup and run script in dockerfile --- docker/setup_and_run.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 docker/setup_and_run.sh diff --git a/docker/setup_and_run.sh b/docker/setup_and_run.sh new file mode 100644 index 0000000000..f5bacbf67c --- /dev/null +++ b/docker/setup_and_run.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +./setup_wasmd.sh "$@" +./run_wasmd.sh \ No newline at end of file From 2a9c5c1ea542d3d968bebeea7031a7d0a4e38ffa Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Tue, 31 May 2022 10:07:16 +0200 Subject: [PATCH 05/94] Fix wasm simulations (#870) * Fix wasm simulations + make functions compatible with tgrade * Fix lint issues * Fix simulation setup * Make simulations store msg pass * Use default values params to make operations succeed * Normalize wasm store * Add simulations to circleci config * Run simulation in temp dir * Store sim logs * Increase circleci machine type * Extract reflect contract api into helper * Add execute msg to simulations * Embed refect wasm contract Co-authored-by: Pino' Surace --- .circleci/config.yml | 16 ++ app/app.go | 1 - app/params/weights.go | 3 +- app/sim_test.go | 55 ++++++- x/wasm/keeper/reflect_test.go | 145 +++++------------ x/wasm/keeper/staking_test.go | 35 ++-- x/wasm/keeper/submsg_test.go | 56 +++---- x/wasm/keeper/test_common.go | 13 +- x/wasm/keeper/testdata/reflect.go | 62 +++++++ x/wasm/module.go | 5 +- x/wasm/module_test.go | 4 +- x/wasm/simulation/genesis.go | 2 +- x/wasm/simulation/operations.go | 257 +++++++++++++++++++++++++----- x/wasm/simulation/params.go | 12 +- x/wasm/simulation/sim_utils.go | 53 ++++++ 15 files changed, 499 insertions(+), 220 deletions(-) create mode 100644 x/wasm/keeper/testdata/reflect.go create mode 100644 x/wasm/simulation/sim_utils.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 6de8b2694b..f1d9838eb6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -116,6 +116,19 @@ jobs: cd ./benchmarks go test -bench . + simulations: + executor: golang + parallelism: 1 + resource_class: large + steps: + - checkout + - run: + name: Run simulations + command: | + make test-sim-multi-seed-short + - store_artifacts: + path: /tmp + upload-coverage: executor: golang steps: @@ -218,3 +231,6 @@ workflows: - benchmark: requires: - test-cover + - simulations: + requires: + - setup-dependencies diff --git a/app/app.go b/app/app.go index 25ea186c8a..300ef7b150 100644 --- a/app/app.go +++ b/app/app.go @@ -458,7 +458,6 @@ func NewWasmApp( transferModule := transfer.NewAppModule(app.transferKeeper) transferIBCModule := transfer.NewIBCModule(app.transferKeeper) - _ = app.getSubspace(icahosttypes.SubModuleName) app.icaHostKeeper = icahostkeeper.NewKeeper( appCodec, keys[icahosttypes.StoreKey], diff --git a/app/params/weights.go b/app/params/weights.go index 797996603a..9cb2dd39a4 100644 --- a/app/params/weights.go +++ b/app/params/weights.go @@ -20,6 +20,7 @@ const ( DefaultWeightCommunitySpendProposal int = 5 DefaultWeightTextProposal int = 5 DefaultWeightParamChangeProposal int = 5 - DefaultWeightMsgStoreCode int = 100 + DefaultWeightMsgStoreCode int = 50 DefaultWeightMsgInstantiateContract int = 100 + DefaultWeightMsgExecuteContract int = 100 ) diff --git a/app/sim_test.go b/app/sim_test.go index d8cf98da53..d64488de40 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -6,11 +6,17 @@ import ( "os" "path/filepath" "testing" + "time" + + "github.com/cosmos/cosmos-sdk/store" + "github.com/cosmos/cosmos-sdk/store/prefix" "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/kv" + "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" @@ -118,7 +124,7 @@ func TestAppImportExport(t *testing.T) { t, os.Stdout, app.BaseApp, - simapp.AppStateFn(app.AppCodec(), app.SimulationManager()), + AppStateFn(app.AppCodec(), app.SimulationManager()), simtypes.RandomAccounts, simapp.SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), @@ -190,6 +196,37 @@ func TestAppImportExport(t *testing.T) { // delete persistent tx counter value ctxA.KVStore(app.keys[wasm.StoreKey]).Delete(wasmtypes.TXCounterPrefix) + // reset contract code index in source DB for comparison with dest DB + dropContractHistory := func(s store.KVStore, keys ...[]byte) { + for _, key := range keys { + prefixStore := prefix.NewStore(s, key) + iter := prefixStore.Iterator(nil, nil) + for ; iter.Valid(); iter.Next() { + prefixStore.Delete(iter.Key()) + } + iter.Close() + } + } + prefixes := [][]byte{wasmtypes.ContractCodeHistoryElementPrefix, wasmtypes.ContractByCodeIDAndCreatedSecondaryIndexPrefix} + dropContractHistory(ctxA.KVStore(app.keys[wasm.StoreKey]), prefixes...) + dropContractHistory(ctxB.KVStore(newApp.keys[wasm.StoreKey]), prefixes...) + + normalizeContractInfo := func(ctx sdk.Context, app *WasmApp) { + var index uint64 + app.wasmKeeper.IterateContractInfo(ctx, func(address sdk.AccAddress, info wasmtypes.ContractInfo) bool { + created := &wasmtypes.AbsoluteTxPosition{ + BlockHeight: uint64(0), + TxIndex: index, + } + info.Created = created + store := ctx.KVStore(app.keys[wasm.StoreKey]) + store.Set(wasmtypes.GetContractAddressKey(address), app.appCodec.MustMarshal(&info)) + index++ + return false + }) + } + normalizeContractInfo(ctxA, app) + normalizeContractInfo(ctxB, newApp) // diff both stores for _, skp := range storeKeysPrefixes { storeA := ctxA.KVStore(skp.A) @@ -215,7 +252,7 @@ func TestFullAppSimulation(t *testing.T) { require.NoError(t, os.RemoveAll(dir)) }() encConf := MakeEncodingConfig() - app := NewWasmApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, simapp.FlagPeriodValue, + app := NewWasmApp(logger, db, nil, true, map[int64]bool{}, t.TempDir(), simapp.FlagPeriodValue, encConf, wasm.EnableAllProposals, simapp.EmptyAppOptions{}, nil, fauxMerkleModeOpt) require.Equal(t, "WasmApp", app.Name()) @@ -224,7 +261,7 @@ func TestFullAppSimulation(t *testing.T) { t, os.Stdout, app.BaseApp, - simapp.AppStateFn(app.appCodec, app.SimulationManager()), + AppStateFn(app.appCodec, app.SimulationManager()), simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1 simapp.SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), @@ -241,3 +278,15 @@ func TestFullAppSimulation(t *testing.T) { simapp.PrintStats(db) } } + +// AppStateFn returns the initial application state using a genesis or the simulation parameters. +// It panics if the user provides files for both of them. +// If a file is not given for the genesis or the sim params, it creates a randomized one. +func AppStateFn(codec codec.Codec, manager *module.SimulationManager) simtypes.AppStateFn { + // quick hack to setup app state genesis with our app modules + simapp.ModuleBasics = ModuleBasics + if simapp.FlagGenesisTimeValue == 0 { // always set to have a block time + simapp.FlagGenesisTimeValue = time.Now().Unix() + } + return simapp.AppStateFn(codec, manager) +} diff --git a/x/wasm/keeper/reflect_test.go b/x/wasm/keeper/reflect_test.go index 9b81eb6aab..2f89a265c4 100644 --- a/x/wasm/keeper/reflect_test.go +++ b/x/wasm/keeper/reflect_test.go @@ -6,8 +6,6 @@ import ( "strings" "testing" - "github.com/golang/protobuf/proto" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -16,62 +14,17 @@ import ( authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/golang/protobuf/proto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" "github.com/CosmWasm/wasmd/x/wasm/types" ) // ReflectInitMsg is {} -// ReflectHandleMsg is used to encode handle messages -type ReflectHandleMsg struct { - Reflect *reflectPayload `json:"reflect_msg,omitempty"` - ReflectSubMsg *reflectSubPayload `json:"reflect_sub_msg,omitempty"` - Change *ownerPayload `json:"change_owner,omitempty"` -} - -type ownerPayload struct { - Owner sdk.Address `json:"owner"` -} - -type reflectPayload struct { - Msgs []wasmvmtypes.CosmosMsg `json:"msgs"` -} - -type reflectSubPayload struct { - Msgs []wasmvmtypes.SubMsg `json:"msgs"` -} - -// ReflectQueryMsg is used to encode query messages -type ReflectQueryMsg struct { - Owner *struct{} `json:"owner,omitempty"` - Capitalized *Text `json:"capitalized,omitempty"` - Chain *ChainQuery `json:"chain,omitempty"` - SubMsgResult *SubCall `json:"sub_msg_result,omitempty"` -} - -type ChainQuery struct { - Request *wasmvmtypes.QueryRequest `json:"request,omitempty"` -} - -type Text struct { - Text string `json:"text"` -} - -type SubCall struct { - ID uint64 `json:"id"` -} - -type OwnerResponse struct { - Owner string `json:"owner,omitempty"` -} - -type ChainResponse struct { - Data []byte `json:"data,omitempty"` -} - -func buildReflectQuery(t *testing.T, query *ReflectQueryMsg) []byte { +func buildReflectQuery(t *testing.T, query *testdata.ReflectQueryMsg) []byte { bz, err := json.Marshal(query) require.NoError(t, err) return bz @@ -94,9 +47,7 @@ func TestReflectContractSend(t *testing.T) { _, _, bob := keyPubAddr() // upload reflect code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - reflectID, err := keeper.Create(ctx, creator, reflectCode, nil) + reflectID, err := keeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), reflectID) @@ -148,8 +99,8 @@ func TestReflectContractSend(t *testing.T) { }, }, }} - reflectSend := ReflectHandleMsg{ - Reflect: &reflectPayload{ + reflectSend := testdata.ReflectHandleMsg{ + Reflect: &testdata.ReflectPayload{ Msgs: msgs, }, } @@ -176,9 +127,7 @@ func TestReflectCustomMsg(t *testing.T) { _, _, fred := keyPubAddr() // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - codeID, err := keeper.Create(ctx, creator, reflectCode, nil) + codeID, err := keeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) @@ -189,8 +138,8 @@ func TestReflectCustomMsg(t *testing.T) { require.NotEmpty(t, contractAddr) // set owner to bob - transfer := ReflectHandleMsg{ - Change: &ownerPayload{ + transfer := testdata.ReflectHandleMsg{ + ChangeOwner: &testdata.OwnerPayload{ Owner: bob, }, } @@ -216,8 +165,8 @@ func TestReflectCustomMsg(t *testing.T) { }, }, }} - reflectSend := ReflectHandleMsg{ - Reflect: &reflectPayload{ + reflectSend := testdata.ReflectHandleMsg{ + Reflect: &testdata.ReflectPayload{ Msgs: msgs, }, } @@ -240,8 +189,8 @@ func TestReflectCustomMsg(t *testing.T) { } opaque, err := toReflectRawMsg(cdc, sdkSendMsg) require.NoError(t, err) - reflectOpaque := ReflectHandleMsg{ - Reflect: &reflectPayload{ + reflectOpaque := testdata.ReflectHandleMsg{ + Reflect: &testdata.ReflectPayload{ Msgs: []wasmvmtypes.CosmosMsg{opaque}, }, } @@ -267,9 +216,7 @@ func TestMaskReflectCustomQuery(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) @@ -280,21 +227,21 @@ func TestMaskReflectCustomQuery(t *testing.T) { require.NotEmpty(t, contractAddr) // let's perform a normal query of state - ownerQuery := ReflectQueryMsg{ + ownerQuery := testdata.ReflectQueryMsg{ Owner: &struct{}{}, } ownerQueryBz, err := json.Marshal(ownerQuery) require.NoError(t, err) ownerRes, err := keeper.QuerySmart(ctx, contractAddr, ownerQueryBz) require.NoError(t, err) - var res OwnerResponse + var res testdata.OwnerResponse err = json.Unmarshal(ownerRes, &res) require.NoError(t, err) assert.Equal(t, res.Owner, creator.String()) // and now making use of the custom querier callbacks - customQuery := ReflectQueryMsg{ - Capitalized: &Text{ + customQuery := testdata.ReflectQueryMsg{ + Capitalized: &testdata.Text{ Text: "all Caps noW", }, } @@ -319,9 +266,7 @@ func TestReflectStargateQuery(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, funds...) // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) @@ -338,13 +283,13 @@ func TestReflectStargateQuery(t *testing.T) { }, }, } - simpleQueryBz, err := json.Marshal(ReflectQueryMsg{ - Chain: &ChainQuery{Request: &bankQuery}, + simpleQueryBz, err := json.Marshal(testdata.ReflectQueryMsg{ + Chain: &testdata.ChainQuery{Request: &bankQuery}, }) require.NoError(t, err) simpleRes, err := keeper.QuerySmart(ctx, contractAddr, simpleQueryBz) require.NoError(t, err) - var simpleChain ChainResponse + var simpleChain testdata.ChainResponse mustParse(t, simpleRes, &simpleChain) var simpleBalance wasmvmtypes.AllBalancesResponse mustParse(t, simpleChain.Data, &simpleBalance) @@ -363,9 +308,7 @@ func TestReflectInvalidStargateQuery(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, funds...) // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) @@ -385,8 +328,8 @@ func TestReflectInvalidStargateQuery(t *testing.T) { Data: protoQueryBin, }, } - protoQueryBz, err := json.Marshal(ReflectQueryMsg{ - Chain: &ChainQuery{Request: &protoRequest}, + protoQueryBz, err := json.Marshal(testdata.ReflectQueryMsg{ + Chain: &testdata.ChainQuery{Request: &protoRequest}, }) require.NoError(t, err) @@ -402,8 +345,8 @@ func TestReflectInvalidStargateQuery(t *testing.T) { Data: []byte{}, }, } - protoQueryBz, err = json.Marshal(ReflectQueryMsg{ - Chain: &ChainQuery{Request: &protoRequest}, + protoQueryBz, err = json.Marshal(testdata.ReflectQueryMsg{ + Chain: &testdata.ChainQuery{Request: &protoRequest}, }) require.NoError(t, err) @@ -419,8 +362,8 @@ func TestReflectInvalidStargateQuery(t *testing.T) { Data: []byte{}, }, } - protoQueryBz, err = json.Marshal(ReflectQueryMsg{ - Chain: &ChainQuery{Request: &protoRequest}, + protoQueryBz, err = json.Marshal(testdata.ReflectQueryMsg{ + Chain: &testdata.ChainQuery{Request: &protoRequest}, }) require.NoError(t, err) @@ -443,9 +386,7 @@ func TestMaskReflectWasmQueries(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) // upload reflect code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - reflectID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) + reflectID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), reflectID) @@ -456,10 +397,10 @@ func TestMaskReflectWasmQueries(t *testing.T) { require.NotEmpty(t, reflectAddr) // for control, let's make some queries directly on the reflect - ownerQuery := buildReflectQuery(t, &ReflectQueryMsg{Owner: &struct{}{}}) + ownerQuery := buildReflectQuery(t, &testdata.ReflectQueryMsg{Owner: &struct{}{}}) res, err := keeper.QuerySmart(ctx, reflectAddr, ownerQuery) require.NoError(t, err) - var ownerRes OwnerResponse + var ownerRes testdata.OwnerResponse mustParse(t, res, &ownerRes) require.Equal(t, ownerRes.Owner, creator.String()) @@ -471,7 +412,7 @@ func TestMaskReflectWasmQueries(t *testing.T) { require.Equal(t, stateRes.Owner, creator.String()) // now, let's reflect a smart query into the x/wasm handlers and see if we get the same result - reflectOwnerQuery := ReflectQueryMsg{Chain: &ChainQuery{Request: &wasmvmtypes.QueryRequest{Wasm: &wasmvmtypes.WasmQuery{ + reflectOwnerQuery := testdata.ReflectQueryMsg{Chain: &testdata.ChainQuery{Request: &wasmvmtypes.QueryRequest{Wasm: &wasmvmtypes.WasmQuery{ Smart: &wasmvmtypes.SmartQuery{ ContractAddr: reflectAddr.String(), Msg: ownerQuery, @@ -481,14 +422,14 @@ func TestMaskReflectWasmQueries(t *testing.T) { res, err = keeper.QuerySmart(ctx, reflectAddr, reflectOwnerBin) require.NoError(t, err) // first we pull out the data from chain response, before parsing the original response - var reflectRes ChainResponse + var reflectRes testdata.ChainResponse mustParse(t, res, &reflectRes) - var reflectOwnerRes OwnerResponse + var reflectOwnerRes testdata.OwnerResponse mustParse(t, reflectRes.Data, &reflectOwnerRes) require.Equal(t, reflectOwnerRes.Owner, creator.String()) // and with queryRaw - reflectStateQuery := ReflectQueryMsg{Chain: &ChainQuery{Request: &wasmvmtypes.QueryRequest{Wasm: &wasmvmtypes.WasmQuery{ + reflectStateQuery := testdata.ReflectQueryMsg{Chain: &testdata.ChainQuery{Request: &wasmvmtypes.QueryRequest{Wasm: &wasmvmtypes.WasmQuery{ Raw: &wasmvmtypes.RawQuery{ ContractAddr: reflectAddr.String(), Key: configKey, @@ -498,7 +439,7 @@ func TestMaskReflectWasmQueries(t *testing.T) { res, err = keeper.QuerySmart(ctx, reflectAddr, reflectStateBin) require.NoError(t, err) // first we pull out the data from chain response, before parsing the original response - var reflectRawRes ChainResponse + var reflectRawRes testdata.ChainResponse mustParse(t, res, &reflectRawRes) // now, with the raw data, we can parse it into state var reflectStateRes reflectState @@ -515,9 +456,7 @@ func TestWasmRawQueryWithNil(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) // upload reflect code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - reflectID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) + reflectID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), reflectID) @@ -533,7 +472,7 @@ func TestWasmRawQueryWithNil(t *testing.T) { require.Nil(t, raw) // and with queryRaw - reflectQuery := ReflectQueryMsg{Chain: &ChainQuery{Request: &wasmvmtypes.QueryRequest{Wasm: &wasmvmtypes.WasmQuery{ + reflectQuery := testdata.ReflectQueryMsg{Chain: &testdata.ChainQuery{Request: &wasmvmtypes.QueryRequest{Wasm: &wasmvmtypes.WasmQuery{ Raw: &wasmvmtypes.RawQuery{ ContractAddr: reflectAddr.String(), Key: missingKey, @@ -544,7 +483,7 @@ func TestWasmRawQueryWithNil(t *testing.T) { require.NoError(t, err) // first we pull out the data from chain response, before parsing the original response - var reflectRawRes ChainResponse + var reflectRawRes testdata.ChainResponse mustParse(t, res, &reflectRawRes) // and make sure there is no data require.Empty(t, reflectRawRes.Data) @@ -629,8 +568,8 @@ func fromReflectRawMsg(cdc codec.Codec) CustomEncoder { } type reflectCustomQuery struct { - Ping *struct{} `json:"ping,omitempty"` - Capitalized *Text `json:"capitalized,omitempty"` + Ping *struct{} `json:"ping,omitempty"` + Capitalized *testdata.Text `json:"capitalized,omitempty"` } // this is from the go code back to the contract (capitalized or ping) diff --git a/x/wasm/keeper/staking_test.go b/x/wasm/keeper/staking_test.go index 5265be597d..b6d719f135 100644 --- a/x/wasm/keeper/staking_test.go +++ b/x/wasm/keeper/staking_test.go @@ -5,8 +5,6 @@ import ( "io/ioutil" "testing" - wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" @@ -21,6 +19,9 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" ) type StakingInitMsg struct { @@ -35,12 +36,12 @@ type StakingInitMsg struct { // StakingHandleMsg is used to encode handle messages type StakingHandleMsg struct { - Transfer *transferPayload `json:"transfer,omitempty"` - Bond *struct{} `json:"bond,omitempty"` - Unbond *unbondPayload `json:"unbond,omitempty"` - Claim *struct{} `json:"claim,omitempty"` - Reinvest *struct{} `json:"reinvest,omitempty"` - Change *ownerPayload `json:"change_owner,omitempty"` + Transfer *transferPayload `json:"transfer,omitempty"` + Bond *struct{} `json:"bond,omitempty"` + Unbond *unbondPayload `json:"unbond,omitempty"` + Claim *struct{} `json:"claim,omitempty"` + Reinvest *struct{} `json:"reinvest,omitempty"` + Change *testdata.OwnerPayload `json:"change_owner,omitempty"` } type transferPayload struct { @@ -446,9 +447,7 @@ func TestQueryStakingInfo(t *testing.T) { creator := initInfo.faucet.NewFundedAccount(ctx, deposit...) // upload mask code - maskCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - maskID, err := initInfo.contractKeeper.Create(ctx, creator, maskCode, nil) + maskID, err := initInfo.contractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(2), maskID) @@ -459,21 +458,21 @@ func TestQueryStakingInfo(t *testing.T) { // STEP 3: now, let's reflect some queries. // let's get the bonded denom - reflectBondedQuery := ReflectQueryMsg{Chain: &ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ + reflectBondedQuery := testdata.ReflectQueryMsg{Chain: &testdata.ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ BondedDenom: &struct{}{}, }}}} reflectBondedBin := buildReflectQuery(t, &reflectBondedQuery) res, err := keeper.QuerySmart(ctx, maskAddr, reflectBondedBin) require.NoError(t, err) // first we pull out the data from chain response, before parsing the original response - var reflectRes ChainResponse + var reflectRes testdata.ChainResponse mustParse(t, res, &reflectRes) var bondedRes wasmvmtypes.BondedDenomResponse mustParse(t, reflectRes.Data, &bondedRes) assert.Equal(t, "stake", bondedRes.Denom) // now, let's reflect a smart query into the x/wasm handlers and see if we get the same result - reflectAllValidatorsQuery := ReflectQueryMsg{Chain: &ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ + reflectAllValidatorsQuery := testdata.ReflectQueryMsg{Chain: &testdata.ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ AllValidators: &wasmvmtypes.AllValidatorsQuery{}, }}}} reflectAllValidatorsBin := buildReflectQuery(t, &reflectAllValidatorsQuery) @@ -492,7 +491,7 @@ func TestQueryStakingInfo(t *testing.T) { require.Contains(t, valInfo.MaxChangeRate, "0.010") // find a validator - reflectValidatorQuery := ReflectQueryMsg{Chain: &ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ + reflectValidatorQuery := testdata.ReflectQueryMsg{Chain: &testdata.ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ Validator: &wasmvmtypes.ValidatorQuery{ Address: valAddr.String(), }, @@ -514,7 +513,7 @@ func TestQueryStakingInfo(t *testing.T) { // missing validator noVal := sdk.ValAddress(secp256k1.GenPrivKey().PubKey().Address()) - reflectNoValidatorQuery := ReflectQueryMsg{Chain: &ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ + reflectNoValidatorQuery := testdata.ReflectQueryMsg{Chain: &testdata.ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ Validator: &wasmvmtypes.ValidatorQuery{ Address: noVal.String(), }, @@ -529,7 +528,7 @@ func TestQueryStakingInfo(t *testing.T) { require.Nil(t, noValidatorRes.Validator) // test to get all my delegations - reflectAllDelegationsQuery := ReflectQueryMsg{Chain: &ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ + reflectAllDelegationsQuery := testdata.ReflectQueryMsg{Chain: &testdata.ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ AllDelegations: &wasmvmtypes.AllDelegationsQuery{ Delegator: contractAddr.String(), }, @@ -552,7 +551,7 @@ func TestQueryStakingInfo(t *testing.T) { require.Equal(t, funds[0].Amount.String(), delInfo.Amount.Amount) // test to get one delegations - reflectDelegationQuery := ReflectQueryMsg{Chain: &ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ + reflectDelegationQuery := testdata.ReflectQueryMsg{Chain: &testdata.ChainQuery{Request: &wasmvmtypes.QueryRequest{Staking: &wasmvmtypes.StakingQuery{ Delegation: &wasmvmtypes.DelegationQuery{ Validator: valAddr.String(), Delegator: contractAddr.String(), diff --git a/x/wasm/keeper/submsg_test.go b/x/wasm/keeper/submsg_test.go index 7d83c8ffcd..9d1904fa7f 100644 --- a/x/wasm/keeper/submsg_test.go +++ b/x/wasm/keeper/submsg_test.go @@ -7,13 +7,13 @@ import ( "strconv" "testing" - "github.com/CosmWasm/wasmd/x/wasm/types" - - "github.com/stretchr/testify/assert" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" + "github.com/CosmWasm/wasmd/x/wasm/types" ) // test handing of submessages, very closely related to the reflect_test @@ -31,9 +31,7 @@ func TestDispatchSubMsgSuccessCase(t *testing.T) { _, _, fred := keyPubAddr() // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) @@ -59,8 +57,8 @@ func TestDispatchSubMsgSuccessCase(t *testing.T) { }, }, } - reflectSend := ReflectHandleMsg{ - ReflectSubMsg: &reflectSubPayload{ + reflectSend := testdata.ReflectHandleMsg{ + ReflectSubMsg: &testdata.ReflectSubPayload{ Msgs: []wasmvmtypes.SubMsg{{ ID: 7, Msg: msg, @@ -80,8 +78,8 @@ func TestDispatchSubMsgSuccessCase(t *testing.T) { checkAccount(t, ctx, accKeeper, bankKeeper, creator, creatorBalance) // query the reflect state to ensure the result was stored - query := ReflectQueryMsg{ - SubMsgResult: &SubCall{ID: 7}, + query := testdata.ReflectQueryMsg{ + SubMsgResult: &testdata.SubCall{ID: 7}, } queryBz, err := json.Marshal(query) require.NoError(t, err) @@ -122,9 +120,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { uploader := keepers.Faucet.NewFundedAccount(ctx, contractStart.Add(contractStart...)...) // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - reflectID, err := keepers.ContractKeeper.Create(ctx, uploader, reflectCode, nil) + reflectID, err := keepers.ContractKeeper.Create(ctx, uploader, testdata.ReflectContractWasm(), nil) require.NoError(t, err) // create hackatom contract for testing (for infinite loop) @@ -300,8 +296,8 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { require.NoError(t, err) msg := tc.msg(contractAddr.String(), empty.String()) - reflectSend := ReflectHandleMsg{ - ReflectSubMsg: &reflectSubPayload{ + reflectSend := testdata.ReflectHandleMsg{ + ReflectSubMsg: &testdata.ReflectSubPayload{ Msgs: []wasmvmtypes.SubMsg{{ ID: tc.submsgID, Msg: msg, @@ -331,8 +327,8 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { require.NoError(t, err) // query the reply - query := ReflectQueryMsg{ - SubMsgResult: &SubCall{ID: tc.submsgID}, + query := testdata.ReflectQueryMsg{ + SubMsgResult: &testdata.SubCall{ID: tc.submsgID}, } queryBz, err := json.Marshal(query) require.NoError(t, err) @@ -381,9 +377,7 @@ func TestDispatchSubMsgEncodeToNoSdkMsg(t *testing.T) { _, _, fred := keyPubAddr() // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) // creator instantiates a contract and gives it tokens @@ -403,8 +397,8 @@ func TestDispatchSubMsgEncodeToNoSdkMsg(t *testing.T) { }, }, } - reflectSend := ReflectHandleMsg{ - ReflectSubMsg: &reflectSubPayload{ + reflectSend := testdata.ReflectHandleMsg{ + ReflectSubMsg: &testdata.ReflectSubPayload{ Msgs: []wasmvmtypes.SubMsg{{ ID: 7, Msg: msg, @@ -418,8 +412,8 @@ func TestDispatchSubMsgEncodeToNoSdkMsg(t *testing.T) { require.NoError(t, err) // query the reflect state to ensure the result was stored - query := ReflectQueryMsg{ - SubMsgResult: &SubCall{ID: 7}, + query := testdata.ReflectQueryMsg{ + SubMsgResult: &testdata.SubCall{ID: 7}, } queryBz, err := json.Marshal(query) require.NoError(t, err) @@ -449,9 +443,7 @@ func TestDispatchSubMsgConditionalReplyOn(t *testing.T) { _, _, fred := keyPubAddr() // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) // creator instantiates a contract and gives it tokens @@ -529,8 +521,8 @@ func TestDispatchSubMsgConditionalReplyOn(t *testing.T) { subMsg.ReplyOn = wasmvmtypes.ReplyError } - reflectSend := ReflectHandleMsg{ - ReflectSubMsg: &reflectSubPayload{ + reflectSend := testdata.ReflectHandleMsg{ + ReflectSubMsg: &testdata.ReflectSubPayload{ Msgs: []wasmvmtypes.SubMsg{subMsg}, }, } @@ -545,8 +537,8 @@ func TestDispatchSubMsgConditionalReplyOn(t *testing.T) { } // query the reflect state to check if the result was stored - query := ReflectQueryMsg{ - SubMsgResult: &SubCall{ID: id}, + query := testdata.ReflectQueryMsg{ + SubMsgResult: &testdata.SubCall{ID: id}, } queryBz, err := json.Marshal(query) require.NoError(t, err) diff --git a/x/wasm/keeper/test_common.go b/x/wasm/keeper/test_common.go index 29e47ab42d..717228962d 100644 --- a/x/wasm/keeper/test_common.go +++ b/x/wasm/keeper/test_common.go @@ -8,6 +8,8 @@ import ( "testing" "time" + "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" + "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/std" @@ -72,7 +74,7 @@ import ( "github.com/CosmWasm/wasmd/x/wasm/types" ) -var ModuleBasics = module.NewBasicManager( +var moduleBasics = module.NewBasicManager( auth.AppModuleBasic{}, bank.AppModuleBasic{}, capability.AppModuleBasic{}, @@ -103,8 +105,8 @@ func MakeEncodingConfig(_ testing.TB) wasmappparams.EncodingConfig { std.RegisterInterfaces(interfaceRegistry) std.RegisterLegacyAminoCodec(amino) - ModuleBasics.RegisterLegacyAminoCodec(amino) - ModuleBasics.RegisterInterfaces(interfaceRegistry) + moduleBasics.RegisterLegacyAminoCodec(amino) + moduleBasics.RegisterInterfaces(interfaceRegistry) // add wasmd types types.RegisterInterfaces(interfaceRegistry) types.RegisterLegacyAminoCodec(amino) @@ -545,11 +547,8 @@ func StoreIBCReflectContract(t testing.TB, ctx sdk.Context, keepers TestKeepers) } func StoreReflectContract(t testing.TB, ctx sdk.Context, keepers TestKeepers) uint64 { - wasmCode, err := ioutil.ReadFile("./testdata/reflect.wasm") - require.NoError(t, err) - _, _, creatorAddr := keyPubAddr() - codeID, err := keepers.ContractKeeper.Create(ctx, creatorAddr, wasmCode, nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creatorAddr, testdata.ReflectContractWasm(), nil) require.NoError(t, err) return codeID } diff --git a/x/wasm/keeper/testdata/reflect.go b/x/wasm/keeper/testdata/reflect.go new file mode 100644 index 0000000000..51f5f14d53 --- /dev/null +++ b/x/wasm/keeper/testdata/reflect.go @@ -0,0 +1,62 @@ +package testdata + +import ( + _ "embed" + + typwasmvmtypes "github.com/CosmWasm/wasmvm/types" + "github.com/cosmos/cosmos-sdk/types" +) + +//go:embed reflect.wasm +var reflectContract []byte + +func ReflectContractWasm() []byte { + return reflectContract +} + +// ReflectHandleMsg is used to encode handle messages +type ReflectHandleMsg struct { + Reflect *ReflectPayload `json:"reflect_msg,omitempty"` + ReflectSubMsg *ReflectSubPayload `json:"reflect_sub_msg,omitempty"` + ChangeOwner *OwnerPayload `json:"change_owner,omitempty"` +} + +type OwnerPayload struct { + Owner types.Address `json:"owner"` +} + +type ReflectPayload struct { + Msgs []typwasmvmtypes.CosmosMsg `json:"msgs"` +} + +type ReflectSubPayload struct { + Msgs []typwasmvmtypes.SubMsg `json:"msgs"` +} + +// ReflectQueryMsg is used to encode query messages +type ReflectQueryMsg struct { + Owner *struct{} `json:"owner,omitempty"` + Capitalized *Text `json:"capitalized,omitempty"` + Chain *ChainQuery `json:"chain,omitempty"` + SubMsgResult *SubCall `json:"sub_msg_result,omitempty"` +} + +type ChainQuery struct { + Request *typwasmvmtypes.QueryRequest `json:"request,omitempty"` +} + +type Text struct { + Text string `json:"text"` +} + +type SubCall struct { + ID uint64 `json:"id"` +} + +type OwnerResponse struct { + Owner string `json:"owner,omitempty"` +} + +type ChainResponse struct { + Data []byte `json:"data,omitempty"` +} diff --git a/x/wasm/module.go b/x/wasm/module.go index 9f078bb12f..a237a910d4 100644 --- a/x/wasm/module.go +++ b/x/wasm/module.go @@ -13,7 +13,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - simKeeper "github.com/cosmos/cosmos-sdk/x/simulation" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cast" @@ -105,7 +104,7 @@ type AppModule struct { keeper *Keeper validatorSetSource keeper.ValidatorSetSource accountKeeper types.AccountKeeper // for simulation - bankKeeper simKeeper.BankKeeper + bankKeeper simulation.BankKeeper } // ConsensusVersion is a sequence number for state-breaking change of the @@ -120,7 +119,7 @@ func NewAppModule( keeper *Keeper, validatorSetSource keeper.ValidatorSetSource, ak types.AccountKeeper, - bk simKeeper.BankKeeper, + bk simulation.BankKeeper, ) AppModule { return AppModule{ AppModuleBasic: AppModuleBasic{}, diff --git a/x/wasm/module_test.go b/x/wasm/module_test.go index 5c68cb2c94..ab52363b71 100644 --- a/x/wasm/module_test.go +++ b/x/wasm/module_test.go @@ -6,6 +6,8 @@ import ( "io/ioutil" "testing" + "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" @@ -66,7 +68,7 @@ var ( _, _, addrAcc1 = keyPubAddr() addr1 = addrAcc1.String() testContract = mustLoad("./keeper/testdata/hackatom.wasm") - maskContract = mustLoad("./keeper/testdata/reflect.wasm") + maskContract = testdata.ReflectContractWasm() oldContract = mustLoad("./testdata/escrow_0.7.wasm") ) diff --git a/x/wasm/simulation/genesis.go b/x/wasm/simulation/genesis.go index c9bd60e700..039a4394c4 100644 --- a/x/wasm/simulation/genesis.go +++ b/x/wasm/simulation/genesis.go @@ -8,7 +8,7 @@ import ( // RandomizeGenState generates a random GenesisState for wasm func RandomizedGenState(simstate *module.SimulationState) { - params := RandomParams(simstate.Rand) + params := types.DefaultParams() wasmGenesis := types.GenesisState{ Params: params, Codes: nil, diff --git a/x/wasm/simulation/operations.go b/x/wasm/simulation/operations.go index 40de06a520..66635a2b73 100644 --- a/x/wasm/simulation/operations.go +++ b/x/wasm/simulation/operations.go @@ -1,17 +1,22 @@ package simulation import ( + "encoding/json" "io/ioutil" "math/rand" + wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/cosmos/cosmos-sdk/baseapp" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/simulation" "github.com/CosmWasm/wasmd/app/params" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" "github.com/CosmWasm/wasmd/x/wasm/types" ) @@ -20,6 +25,7 @@ import ( const ( OpWeightMsgStoreCode = "op_weight_msg_store_code" OpWeightMsgInstantiateContract = "op_weight_msg_instantiate_contract" + OpWeightMsgExecuteContract = "op_weight_msg_execute_contract" OpReflectContractPath = "op_reflect_contract_path" ) @@ -27,18 +33,26 @@ const ( type WasmKeeper interface { GetParams(ctx sdk.Context) types.Params IterateCodeInfos(ctx sdk.Context, cb func(uint64, types.CodeInfo) bool) + IterateContractInfo(ctx sdk.Context, cb func(sdk.AccAddress, types.ContractInfo) bool) + QuerySmart(ctx sdk.Context, contractAddr sdk.AccAddress, req []byte) ([]byte, error) + PeekAutoIncrementID(ctx sdk.Context, lastIDKey []byte) uint64 +} +type BankKeeper interface { + simulation.BankKeeper + IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool } // WeightedOperations returns all the operations from the module with their respective weights func WeightedOperations( simstate *module.SimulationState, ak types.AccountKeeper, - bk simulation.BankKeeper, + bk BankKeeper, wasmKeeper WasmKeeper, ) simulation.WeightedOperations { var ( weightMsgStoreCode int weightMsgInstantiateContract int + weightMsgExecuteContract int wasmContractPath string ) @@ -53,32 +67,53 @@ func WeightedOperations( weightMsgInstantiateContract = params.DefaultWeightMsgInstantiateContract }, ) + simstate.AppParams.GetOrGenerate(simstate.Cdc, OpWeightMsgExecuteContract, &weightMsgInstantiateContract, nil, + func(_ *rand.Rand) { + weightMsgExecuteContract = params.DefaultWeightMsgExecuteContract + }, + ) simstate.AppParams.GetOrGenerate(simstate.Cdc, OpReflectContractPath, &wasmContractPath, nil, func(_ *rand.Rand) { - // simulations are run from the `app` folder - wasmContractPath = "../x/wasm/keeper/testdata/reflect.wasm" + wasmContractPath = "" }, ) - wasmBz, err := ioutil.ReadFile(wasmContractPath) - if err != nil { - panic(err) + var wasmBz []byte + if wasmContractPath == "" { + wasmBz = testdata.ReflectContractWasm() + } else { + var err error + wasmBz, err = ioutil.ReadFile(wasmContractPath) + if err != nil { + panic(err) + } } return simulation.WeightedOperations{ simulation.NewWeightedOperation( weightMsgStoreCode, - SimulateMsgStoreCode(ak, bk, wasmKeeper, wasmBz), + SimulateMsgStoreCode(ak, bk, wasmKeeper, wasmBz, 5_000_000), ), simulation.NewWeightedOperation( weightMsgInstantiateContract, - SimulateMsgInstantiateContract(ak, bk, wasmKeeper), + SimulateMsgInstantiateContract(ak, bk, wasmKeeper, DefaultSimulationCodeIDSelector), + ), + simulation.NewWeightedOperation( + weightMsgExecuteContract, + SimulateMsgExecuteContract( + ak, + bk, + wasmKeeper, + DefaultSimulationExecuteContractSelector, + DefaultSimulationExecuteSenderSelector, + DefaultSimulationExecutePayloader, + ), ), } } // SimulateMsgStoreCode generates a MsgStoreCode with random values -func SimulateMsgStoreCode(ak types.AccountKeeper, bk simulation.BankKeeper, wasmKeeper WasmKeeper, wasmBz []byte) simtypes.Operation { +func SimulateMsgStoreCode(ak types.AccountKeeper, bk simulation.BankKeeper, wasmKeeper WasmKeeper, wasmBz []byte, gas uint64) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, @@ -90,15 +125,15 @@ func SimulateMsgStoreCode(ak types.AccountKeeper, bk simulation.BankKeeper, wasm return simtypes.NoOpMsg(types.ModuleName, types.MsgStoreCode{}.Type(), "no chain permission"), nil, nil } - config := &types.AccessConfig{ - Permission: types.AccessTypeEverybody, - } - simAccount, _ := simtypes.RandomAcc(r, accs) + + permission := wasmKeeper.GetParams(ctx).InstantiateDefaultPermission + config := permission.With(simAccount.Address) + msg := types.MsgStoreCode{ Sender: simAccount.Address.String(), WASMByteCode: wasmBz, - InstantiatePermission: config, + InstantiatePermission: &config, } txCtx := simulation.OperationInput{ @@ -115,12 +150,28 @@ func SimulateMsgStoreCode(ak types.AccountKeeper, bk simulation.BankKeeper, wasm ModuleName: types.ModuleName, } - return simulation.GenAndDeliverTxWithRandFees(txCtx) + return GenAndDeliverTxWithRandFees(txCtx, gas) } } +// CodeIDSelector returns code id to be used in simulations +type CodeIDSelector = func(ctx sdk.Context, wasmKeeper WasmKeeper) uint64 + +// DefaultSimulationCodeIDSelector picks the first code id +func DefaultSimulationCodeIDSelector(ctx sdk.Context, wasmKeeper WasmKeeper) uint64 { + var codeID uint64 + wasmKeeper.IterateCodeInfos(ctx, func(u uint64, info types.CodeInfo) bool { + if info.InstantiateConfig.Permission != types.AccessTypeEverybody { + return false + } + codeID = u + return true + }) + return codeID +} + // SimulateMsgInstantiateContract generates a MsgInstantiateContract with random values -func SimulateMsgInstantiateContract(ak types.AccountKeeper, bk simulation.BankKeeper, wasmKeeper WasmKeeper) simtypes.Operation { +func SimulateMsgInstantiateContract(ak types.AccountKeeper, bk BankKeeper, wasmKeeper WasmKeeper, codeSelector CodeIDSelector) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, @@ -130,20 +181,17 @@ func SimulateMsgInstantiateContract(ak types.AccountKeeper, bk simulation.BankKe ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { simAccount, _ := simtypes.RandomAcc(r, accs) - var codeID uint64 - wasmKeeper.IterateCodeInfos(ctx, func(u uint64, info types.CodeInfo) bool { - if info.InstantiateConfig.Permission != types.AccessTypeEverybody { - return false - } - codeID = u - return true - }) - + codeID := codeSelector(ctx, wasmKeeper) if codeID == 0 { return simtypes.NoOpMsg(types.ModuleName, types.MsgInstantiateContract{}.Type(), "no codes with permission available"), nil, nil } - - spendable := bk.SpendableCoins(ctx, simAccount.Address) + deposit := sdk.Coins{} + spendableCoins := bk.SpendableCoins(ctx, simAccount.Address) + for _, v := range spendableCoins { + if bk.IsSendEnabledCoin(ctx, v) { + deposit = deposit.Add(simtypes.RandSubsetCoins(r, sdk.NewCoins(v))...) + } + } msg := types.MsgInstantiateContract{ Sender: simAccount.Address.String(), @@ -151,23 +199,154 @@ func SimulateMsgInstantiateContract(ak types.AccountKeeper, bk simulation.BankKe CodeID: codeID, Label: simtypes.RandStringOfLength(r, 10), Msg: []byte(`{}`), - Funds: simtypes.RandSubsetCoins(r, spendable), + Funds: deposit, } txCtx := simulation.OperationInput{ - R: r, - App: app, - TxGen: simappparams.MakeTestEncodingConfig().TxConfig, - Cdc: nil, - Msg: &msg, - MsgType: msg.Type(), - Context: ctx, - SimAccount: simAccount, - AccountKeeper: ak, - Bankkeeper: bk, - ModuleName: types.ModuleName, + R: r, + App: app, + TxGen: simappparams.MakeTestEncodingConfig().TxConfig, + Cdc: nil, + Msg: &msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: deposit, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + +// MsgExecuteContractSelector returns contract address to be used in simulations +type MsgExecuteContractSelector = func(ctx sdk.Context, wasmKeeper WasmKeeper) sdk.AccAddress + +// MsgExecutePayloader extension point to modify msg with custom payload +type MsgExecutePayloader func(msg *types.MsgExecuteContract) error + +// MsgExecuteSenderSelector extension point that returns the sender address +type MsgExecuteSenderSelector func(wasmKeeper WasmKeeper, ctx sdk.Context, contractAddr sdk.AccAddress, accs []simtypes.Account) (simtypes.Account, error) + +// SimulateMsgExecuteContract create a execute message a reflect contract instance +func SimulateMsgExecuteContract( + ak types.AccountKeeper, + bk BankKeeper, + wasmKeeper WasmKeeper, + contractSelector MsgExecuteContractSelector, + senderSelector MsgExecuteSenderSelector, + payloader MsgExecutePayloader, +) simtypes.Operation { + return func( + r *rand.Rand, + app *baseapp.BaseApp, + ctx sdk.Context, + accs []simtypes.Account, + chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + contractAddr := contractSelector(ctx, wasmKeeper) + if contractAddr == nil { + return simtypes.NoOpMsg(types.ModuleName, types.MsgExecuteContract{}.Type(), "no contract instance available"), nil, nil + } + simAccount, err := senderSelector(wasmKeeper, ctx, contractAddr, accs) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.MsgExecuteContract{}.Type(), "query contract owner"), nil, err + } + + deposit := sdk.Coins{} + spendableCoins := bk.SpendableCoins(ctx, simAccount.Address) + for _, v := range spendableCoins { + if bk.IsSendEnabledCoin(ctx, v) { + deposit = deposit.Add(simtypes.RandSubsetCoins(r, sdk.NewCoins(v))...) + } + } + if deposit.IsZero() { + return simtypes.NoOpMsg(types.ModuleName, types.MsgExecuteContract{}.Type(), "broke account"), nil, nil + } + msg := types.MsgExecuteContract{ + Sender: simAccount.Address.String(), + Contract: contractAddr.String(), + Funds: deposit, + } + if err := payloader(&msg); err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.MsgExecuteContract{}.Type(), "contract execute payload"), nil, err } + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: simappparams.MakeTestEncodingConfig().TxConfig, + Cdc: nil, + Msg: &msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: deposit, + } return simulation.GenAndDeliverTxWithRandFees(txCtx) } } + +// DefaultSimulationExecuteContractSelector picks the first contract address +func DefaultSimulationExecuteContractSelector(ctx sdk.Context, wasmKeeper WasmKeeper) sdk.AccAddress { + var r sdk.AccAddress + wasmKeeper.IterateContractInfo(ctx, func(address sdk.AccAddress, info types.ContractInfo) bool { + r = address + return true + }) + return r +} + +// DefaultSimulationExecuteSenderSelector queries reflect contract for owner address and selects accounts +func DefaultSimulationExecuteSenderSelector(wasmKeeper WasmKeeper, ctx sdk.Context, contractAddr sdk.AccAddress, accs []simtypes.Account) (simtypes.Account, error) { + var none simtypes.Account + bz, err := json.Marshal(testdata.ReflectQueryMsg{Owner: &struct{}{}}) + if err != nil { + return none, sdkerrors.Wrap(err, "build smart query") + } + got, err := wasmKeeper.QuerySmart(ctx, contractAddr, bz) + if err != nil { + return none, sdkerrors.Wrap(err, "exec smart query") + } + var ownerRes testdata.OwnerResponse + if err := json.Unmarshal(got, &ownerRes); err != nil || ownerRes.Owner == "" { + return none, sdkerrors.Wrap(err, "parse smart query response") + } + ownerAddr, err := sdk.AccAddressFromBech32(ownerRes.Owner) + if err != nil { + return none, sdkerrors.Wrap(err, "parse contract owner address") + } + simAccount, ok := simtypes.FindAccount(accs, ownerAddr) + if !ok { + return none, sdkerrors.Wrap(err, "unknown contract owner address") + } + return simAccount, nil +} + +// DefaultSimulationExecutePayloader implements a bank msg to send the +// tokens from contract account back to original sender +func DefaultSimulationExecutePayloader(msg *types.MsgExecuteContract) error { + reflectSend := testdata.ReflectHandleMsg{ + Reflect: &testdata.ReflectPayload{ + Msgs: []wasmvmtypes.CosmosMsg{{ + Bank: &wasmvmtypes.BankMsg{ + Send: &wasmvmtypes.SendMsg{ + ToAddress: msg.Sender, // + Amount: wasmkeeper.ConvertSdkCoinsToWasmCoins(msg.Funds), + }, + }, + }}, + }, + } + reflectSendBz, err := json.Marshal(reflectSend) + if err != nil { + return err + } + msg.Msg = reflectSendBz + return nil +} diff --git a/x/wasm/simulation/params.go b/x/wasm/simulation/params.go index 0de0d0b4ad..a6d55b1541 100644 --- a/x/wasm/simulation/params.go +++ b/x/wasm/simulation/params.go @@ -12,7 +12,7 @@ import ( ) func ParamChanges(r *rand.Rand, cdc codec.Codec) []simtypes.ParamChange { - params := RandomParams(r) + params := types.DefaultParams() return []simtypes.ParamChange{ simulation.NewSimParamChange(types.ModuleName, string(types.ParamStoreKeyUploadAccess), func(r *rand.Rand) string { @@ -30,13 +30,3 @@ func ParamChanges(r *rand.Rand, cdc codec.Codec) []simtypes.ParamChange { ), } } - -func RandomParams(r *rand.Rand) types.Params { - permissionType := types.AccessType(simtypes.RandIntBetween(r, 1, 3)) - account, _ := simtypes.RandomAcc(r, simtypes.RandomAccounts(r, 10)) - accessConfig := permissionType.With(account.Address) - return types.Params{ - CodeUploadAccess: accessConfig, - InstantiateDefaultPermission: accessConfig.Permission, - } -} diff --git a/x/wasm/simulation/sim_utils.go b/x/wasm/simulation/sim_utils.go new file mode 100644 index 0000000000..4f9a00b0bf --- /dev/null +++ b/x/wasm/simulation/sim_utils.go @@ -0,0 +1,53 @@ +package simulation + +import ( + "github.com/cosmos/cosmos-sdk/simapp/helpers" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" +) + +// GenAndDeliverTxWithRandFees generates a transaction with a random fee and delivers it. +func GenAndDeliverTxWithRandFees(txCtx simulation.OperationInput, gas uint64) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + account := txCtx.AccountKeeper.GetAccount(txCtx.Context, txCtx.SimAccount.Address) + spendable := txCtx.Bankkeeper.SpendableCoins(txCtx.Context, account.GetAddress()) + + var fees sdk.Coins + var err error + + coins, hasNeg := spendable.SafeSub(txCtx.CoinsSpentInMsg) + if hasNeg { + return simtypes.NoOpMsg(txCtx.ModuleName, txCtx.MsgType, "message doesn't leave room for fees"), nil, err + } + + fees, err = simtypes.RandomFees(txCtx.R, txCtx.Context, coins) + if err != nil { + return simtypes.NoOpMsg(txCtx.ModuleName, txCtx.MsgType, "unable to generate fees"), nil, err + } + return GenAndDeliverTx(txCtx, fees, gas) +} + +// GenAndDeliverTx generates a transactions and delivers it. +func GenAndDeliverTx(txCtx simulation.OperationInput, fees sdk.Coins, gas uint64) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + account := txCtx.AccountKeeper.GetAccount(txCtx.Context, txCtx.SimAccount.Address) + tx, err := helpers.GenTx( + txCtx.TxGen, + []sdk.Msg{txCtx.Msg}, + fees, + gas, + txCtx.Context.ChainID(), + []uint64{account.GetAccountNumber()}, + []uint64{account.GetSequence()}, + txCtx.SimAccount.PrivKey, + ) + if err != nil { + return simtypes.NoOpMsg(txCtx.ModuleName, txCtx.MsgType, "unable to generate mock tx"), nil, err + } + + _, _, err = txCtx.App.Deliver(txCtx.TxGen.TxEncoder(), tx) + if err != nil { + return simtypes.NoOpMsg(txCtx.ModuleName, txCtx.MsgType, "unable to deliver tx"), nil, err + } + + return simtypes.NewOperationMsg(txCtx.Msg, true, "", txCtx.Cdc), nil, nil +} From f6ca36f1de3bccafaf4f7390650601c55dce1687 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 1 Jun 2022 12:08:48 +0200 Subject: [PATCH 06/94] Remove obsolete ibc callback --- x/wasm/ibc.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/x/wasm/ibc.go b/x/wasm/ibc.go index 4d99b0f244..7e76f6e9a9 100644 --- a/x/wasm/ibc.go +++ b/x/wasm/ibc.go @@ -299,17 +299,6 @@ func (i IBCHandler) OnTimeoutPacket(ctx sdk.Context, packet channeltypes.Packet, return nil } -func (i IBCHandler) NegotiateAppVersion( - ctx sdk.Context, - order channeltypes.Order, - connectionID string, - portID string, - counterparty channeltypes.Counterparty, - proposedVersion string, -) (version string, err error) { - return proposedVersion, nil // accept all -} - func newIBCPacket(packet channeltypes.Packet) wasmvmtypes.IBCPacket { timeout := wasmvmtypes.IBCTimeout{ Timestamp: packet.TimeoutTimestamp, From 3997ab1229a35fc02b03225f2fe1f34e552c9ae7 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Fri, 3 Jun 2022 01:57:11 +0700 Subject: [PATCH 07/94] Update config.yml --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f1d9838eb6..b658e762e0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -62,7 +62,7 @@ jobs: lint: docker: - - image: golangci/golangci-lint:v1.43.0 + - image: golangci/golangci-lint:v1.46.2 steps: - checkout - run: From 0decdac28503ae99511bc1ee36a9c71b6c47a331 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Jun 2022 08:22:07 +0000 Subject: [PATCH 08/94] Bump github.com/stretchr/testify from 1.7.1 to 1.7.2 Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.7.1 to 1.7.2. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.7.1...v1.7.2) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index d6385d46be..413ea998d0 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/spf13/cobra v1.4.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.11.0 - github.com/stretchr/testify v1.7.1 + github.com/stretchr/testify v1.7.2 github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca github.com/tendermint/tendermint v0.34.19 github.com/tendermint/tm-db v0.6.7 @@ -118,7 +118,7 @@ require ( golang.org/x/text v0.3.7 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect ) diff --git a/go.sum b/go.sum index d924bb2bc7..d75e51f2a6 100644 --- a/go.sum +++ b/go.sum @@ -968,8 +968,9 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1625,8 +1626,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= 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= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 59e0710d8323a4b3897dd3d29ddee1f0b7502021 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Mon, 13 Jun 2022 10:28:56 +0200 Subject: [PATCH 09/94] Bump sdk version to v0.45.5 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 413ea998d0..f9276486c7 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/CosmWasm/wasmvm v1.0.0 - github.com/cosmos/cosmos-sdk v0.45.4 + github.com/cosmos/cosmos-sdk v0.45.5 github.com/cosmos/iavl v0.17.3 github.com/cosmos/ibc-go/v3 v3.0.0 github.com/cosmos/interchain-accounts v0.1.0 diff --git a/go.sum b/go.sum index d75e51f2a6..8f71a28710 100644 --- a/go.sum +++ b/go.sum @@ -227,8 +227,8 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= github.com/cosmos/cosmos-sdk v0.45.1/go.mod h1:XXS/asyCqWNWkx2rW6pSuen+EVcpAFxq6khrhnZgHaQ= -github.com/cosmos/cosmos-sdk v0.45.4 h1:eStDAhJdMY8n5arbBRe+OwpNeBSunxSBHp1g55ulfdA= -github.com/cosmos/cosmos-sdk v0.45.4/go.mod h1:WOqtDxN3eCCmnYLVla10xG7lEXkFjpTaqm2a2WasgCc= +github.com/cosmos/cosmos-sdk v0.45.5 h1:GVrZM+lss6y626Pq6loxh/3KLRgK/J6/alTkcKkYmGU= +github.com/cosmos/cosmos-sdk v0.45.5/go.mod h1:WOqtDxN3eCCmnYLVla10xG7lEXkFjpTaqm2a2WasgCc= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= From 8d8d082c8788033c74a963e3fa2108657f7dc91e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jun 2022 08:20:51 +0000 Subject: [PATCH 10/94] Bump github.com/stretchr/testify from 1.7.2 to 1.8.0 Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.7.2 to 1.8.0. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.7.2...v1.8.0) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 413ea998d0..fb469c5004 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/spf13/cobra v1.4.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.11.0 - github.com/stretchr/testify v1.7.2 + github.com/stretchr/testify v1.8.0 github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca github.com/tendermint/tendermint v0.34.19 github.com/tendermint/tm-db v0.6.7 diff --git a/go.sum b/go.sum index d75e51f2a6..1e2039cc67 100644 --- a/go.sum +++ b/go.sum @@ -960,8 +960,9 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= 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.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -969,8 +970,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= From 72e8b7d40b624f1323e06d185637e9fe33c8c9dc Mon Sep 17 00:00:00 2001 From: "shiki.takahashi" Date: Fri, 8 Jul 2022 15:55:43 +0900 Subject: [PATCH 11/94] Remove unnecessary string --- x/wasm/client/cli/genesis_msg.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/wasm/client/cli/genesis_msg.go b/x/wasm/client/cli/genesis_msg.go index c77ab3519c..f4ba94fbd2 100644 --- a/x/wasm/client/cli/genesis_msg.go +++ b/x/wasm/client/cli/genesis_msg.go @@ -127,7 +127,7 @@ func GenesisInstantiateContractCmd(defaultNodeHome string, genesisMutator Genesi } // permissions correct? if !codeInfo.Info.InstantiateConfig.Allowed(senderAddr) { - return fmt.Errorf("permissions were not granted for %state", senderAddr) + return fmt.Errorf("permissions were not granted for %s", senderAddr) } state.GenMsgs = append(state.GenMsgs, types.GenesisState_GenMsgs{ Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &msg}, @@ -180,7 +180,7 @@ func GenesisExecuteContractCmd(defaultNodeHome string, genesisMutator GenesisMut // - does contract address exists? if !hasContract(state, msg.Contract) { - return fmt.Errorf("unknown contract: %state", msg.Contract) + return fmt.Errorf("unknown contract: %s", msg.Contract) } state.GenMsgs = append(state.GenMsgs, types.GenesisState_GenMsgs{ Sum: &types.GenesisState_GenMsgs_ExecuteContract{ExecuteContract: &msg}, From ffd8a3c8710d06bb473c3c7a26fcb1a67203e27f Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 8 Jul 2022 13:13:21 +0200 Subject: [PATCH 12/94] Prevent migration to a restricted code --- x/wasm/keeper/contract_keeper.go | 2 +- x/wasm/keeper/keeper.go | 4 ++++ x/wasm/keeper/keeper_test.go | 13 +++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/x/wasm/keeper/contract_keeper.go b/x/wasm/keeper/contract_keeper.go index 9dc0a4be9d..a6a0adf0e1 100644 --- a/x/wasm/keeper/contract_keeper.go +++ b/x/wasm/keeper/contract_keeper.go @@ -75,7 +75,7 @@ func (p PermissionedKeeper) UnpinCode(ctx sdk.Context, codeID uint64) error { return p.nested.unpinCode(ctx, codeID) } -// SetExtraContractAttributes updates the extra attributes that can be stored with the contract info +// SetContractInfoExtension updates the extra attributes that can be stored with the contract info func (p PermissionedKeeper) SetContractInfoExtension(ctx sdk.Context, contract sdk.AccAddress, extra types.ContractInfoExtension) error { return p.nested.setContractInfoExtension(ctx, contract, extra) } diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 3fdcbec483..d261a8b9ce 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -395,6 +395,10 @@ func (k Keeper) migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "unknown code") } + if !authZ.CanInstantiateContract(newCodeInfo.InstantiateConfig, caller) { + return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "to use new code") + } + // check for IBC flag switch report, err := k.wasmVM.AnalyzeCode(newCodeInfo.CodeHash); { case err != nil: diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index bb20a39267..44527ac97c 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -875,6 +875,10 @@ func TestMigrate(t *testing.T) { ibcCodeID := StoreIBCReflectContract(t, ctx, keepers).CodeID require.NotEqual(t, originalCodeID, newCodeID) + restrictedCodeID := StoreHackatomExampleContract(t, ctx, keepers).CodeID + keeper.SetAccessConfig(ctx, restrictedCodeID, types.AllowNobody) + require.NotEqual(t, originalCodeID, restrictedCodeID) + anyAddr := RandomAccountAddress(t) newVerifierAddr := RandomAccountAddress(t) initMsgBz := HackatomExampleInitMsg{ @@ -952,6 +956,15 @@ func TestMigrate(t *testing.T) { toCodeID: originalCodeID, expErr: sdkerrors.ErrUnauthorized, }, + "prevent migration when new code is restricted": { + admin: creator, + caller: creator, + initMsg: initMsgBz, + fromCodeID: originalCodeID, + toCodeID: restrictedCodeID, + migrateMsg: migMsgBz, + expErr: sdkerrors.ErrUnauthorized, + }, "fail with non existing code id": { admin: creator, caller: creator, From e5ff7c195a1f7cb9eb61333a64a403bc7adcd890 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 8 Jul 2022 14:28:45 +0200 Subject: [PATCH 13/94] Restrict code access config modifications --- x/wasm/keeper/authz_policy.go | 9 ++++ x/wasm/keeper/contract_keeper.go | 6 +-- x/wasm/keeper/keeper.go | 9 +++- x/wasm/keeper/keeper_test.go | 84 +++++++++++++++++++++++++++++++ x/wasm/keeper/proposal_handler.go | 3 +- x/wasm/types/exported_keepers.go | 2 +- x/wasm/types/types.go | 22 ++++++-- x/wasm/types/types_test.go | 77 +++++++++++++++++++++++++++- 8 files changed, 199 insertions(+), 13 deletions(-) diff --git a/x/wasm/keeper/authz_policy.go b/x/wasm/keeper/authz_policy.go index 32d8c9952b..1a222719a8 100644 --- a/x/wasm/keeper/authz_policy.go +++ b/x/wasm/keeper/authz_policy.go @@ -10,6 +10,7 @@ type AuthorizationPolicy interface { CanCreateCode(c types.AccessConfig, creator sdk.AccAddress) bool CanInstantiateContract(c types.AccessConfig, actor sdk.AccAddress) bool CanModifyContract(admin, actor sdk.AccAddress) bool + CanModifyCodeAccessConfig(creator, actor sdk.AccAddress, isSubset bool) bool } type DefaultAuthorizationPolicy struct{} @@ -26,6 +27,10 @@ func (p DefaultAuthorizationPolicy) CanModifyContract(admin, actor sdk.AccAddres return admin != nil && admin.Equals(actor) } +func (p DefaultAuthorizationPolicy) CanModifyCodeAccessConfig(creator, actor sdk.AccAddress, isSubset bool) bool { + return creator != nil && creator.Equals(actor) && isSubset +} + type GovAuthorizationPolicy struct{} func (p GovAuthorizationPolicy) CanCreateCode(types.AccessConfig, sdk.AccAddress) bool { @@ -39,3 +44,7 @@ func (p GovAuthorizationPolicy) CanInstantiateContract(types.AccessConfig, sdk.A func (p GovAuthorizationPolicy) CanModifyContract(sdk.AccAddress, sdk.AccAddress) bool { return true } + +func (p GovAuthorizationPolicy) CanModifyCodeAccessConfig(sdk.AccAddress, sdk.AccAddress, bool) bool { + return true +} diff --git a/x/wasm/keeper/contract_keeper.go b/x/wasm/keeper/contract_keeper.go index 9dc0a4be9d..852ef687e8 100644 --- a/x/wasm/keeper/contract_keeper.go +++ b/x/wasm/keeper/contract_keeper.go @@ -19,7 +19,7 @@ type decoratedKeeper interface { execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) ([]byte, error) Sudo(ctx sdk.Context, contractAddress sdk.AccAddress, msg []byte) ([]byte, error) setContractInfoExtension(ctx sdk.Context, contract sdk.AccAddress, extra types.ContractInfoExtension) error - setAccessConfig(ctx sdk.Context, codeID uint64, config types.AccessConfig) error + setAccessConfig(ctx sdk.Context, codeID uint64, caller sdk.AccAddress, newConfig types.AccessConfig, autz AuthorizationPolicy) error } type PermissionedKeeper struct { @@ -81,6 +81,6 @@ func (p PermissionedKeeper) SetContractInfoExtension(ctx sdk.Context, contract s } // SetAccessConfig updates the access config of a code id. -func (p PermissionedKeeper) SetAccessConfig(ctx sdk.Context, codeID uint64, config types.AccessConfig) error { - return p.nested.setAccessConfig(ctx, codeID, config) +func (p PermissionedKeeper) SetAccessConfig(ctx sdk.Context, codeID uint64, caller sdk.AccAddress, newConfig types.AccessConfig) error { + return p.nested.setAccessConfig(ctx, codeID, caller, newConfig, p.authZPolicy) } diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 3fdcbec483..12928d26b3 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -879,12 +879,17 @@ func (k Keeper) setContractInfoExtension(ctx sdk.Context, contractAddr sdk.AccAd } // setAccessConfig updates the access config of a code id. -func (k Keeper) setAccessConfig(ctx sdk.Context, codeID uint64, config types.AccessConfig) error { +func (k Keeper) setAccessConfig(ctx sdk.Context, codeID uint64, caller sdk.AccAddress, newConfig types.AccessConfig, authz AuthorizationPolicy) error { info := k.GetCodeInfo(ctx, codeID) if info == nil { return sdkerrors.Wrap(types.ErrNotFound, "code info") } - info.InstantiateConfig = config + isSubset := newConfig.Permission.IsSubset(k.getInstantiateAccessConfig(ctx)) + if !authz.CanModifyCodeAccessConfig(sdk.MustAccAddressFromBech32(info.Creator), caller, isSubset) { + return sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "can not modify code access config") + } + + info.InstantiateConfig = newConfig k.storeCodeInfo(ctx, codeID, *info) return nil } diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index bb20a39267..b6a425a72f 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -1823,3 +1823,87 @@ func TestBuildContractAddress(t *testing.T) { }) } } +func TestSetAccessConfig(t *testing.T) { + parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures) + k := keepers.WasmKeeper + creatorAddr := RandomAccountAddress(t) + nonCreatorAddr := RandomAccountAddress(t) + + specs := map[string]struct { + authz AuthorizationPolicy + chainPermission types.AccessType + newConfig types.AccessConfig + caller sdk.AccAddress + expErr bool + }{ + "user with new permissions == chain permissions": { + authz: DefaultAuthorizationPolicy{}, + chainPermission: types.AccessTypeEverybody, + newConfig: types.AllowEverybody, + caller: creatorAddr, + }, + "user with new permissions < chain permissions": { + authz: DefaultAuthorizationPolicy{}, + chainPermission: types.AccessTypeEverybody, + newConfig: types.AllowNobody, + caller: creatorAddr, + }, + "user with new permissions > chain permissions": { + authz: DefaultAuthorizationPolicy{}, + chainPermission: types.AccessTypeNobody, + newConfig: types.AllowEverybody, + caller: creatorAddr, + expErr: true, + }, + "different actor": { + authz: DefaultAuthorizationPolicy{}, + chainPermission: types.AccessTypeEverybody, + newConfig: types.AllowEverybody, + caller: nonCreatorAddr, + expErr: true, + }, + "gov with new permissions == chain permissions": { + authz: GovAuthorizationPolicy{}, + chainPermission: types.AccessTypeEverybody, + newConfig: types.AllowEverybody, + caller: creatorAddr, + }, + "gov with new permissions < chain permissions": { + authz: GovAuthorizationPolicy{}, + chainPermission: types.AccessTypeEverybody, + newConfig: types.AllowNobody, + caller: creatorAddr, + }, + "gov with new permissions > chain permissions": { + authz: GovAuthorizationPolicy{}, + chainPermission: types.AccessTypeNobody, + newConfig: types.AccessTypeOnlyAddress.With(creatorAddr), + caller: creatorAddr, + }, + "gov without actor": { + authz: GovAuthorizationPolicy{}, + chainPermission: types.AccessTypeEverybody, + newConfig: types.AllowEverybody, + }, + } + const codeID = 1 + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + ctx, _ := parentCtx.CacheContext() + newParams := types.DefaultParams() + newParams.InstantiateDefaultPermission = spec.chainPermission + k.SetParams(ctx, newParams) + + k.storeCodeInfo(ctx, codeID, types.NewCodeInfo(nil, creatorAddr, types.AllowNobody)) + // when + gotErr := k.setAccessConfig(ctx, codeID, spec.caller, spec.newConfig, spec.authz) + if spec.expErr { + require.Error(t, gotErr) + return + } + require.NoError(t, gotErr) + + }) + } + +} diff --git a/x/wasm/keeper/proposal_handler.go b/x/wasm/keeper/proposal_handler.go index 9da330ce0f..beac2563bb 100644 --- a/x/wasm/keeper/proposal_handler.go +++ b/x/wasm/keeper/proposal_handler.go @@ -229,8 +229,9 @@ func handleUpdateInstantiateConfigProposal(ctx sdk.Context, k types.ContractOpsK return err } + var emptyCaller sdk.AccAddress for _, accessConfigUpdate := range p.AccessConfigUpdates { - if err := k.SetAccessConfig(ctx, accessConfigUpdate.CodeID, accessConfigUpdate.InstantiatePermission); err != nil { + if err := k.SetAccessConfig(ctx, accessConfigUpdate.CodeID, emptyCaller, accessConfigUpdate.InstantiatePermission); err != nil { return sdkerrors.Wrapf(err, "code id: %d", accessConfigUpdate.CodeID) } } diff --git a/x/wasm/types/exported_keepers.go b/x/wasm/types/exported_keepers.go index bb919a3189..cb08488386 100644 --- a/x/wasm/types/exported_keepers.go +++ b/x/wasm/types/exported_keepers.go @@ -55,7 +55,7 @@ type ContractOpsKeeper interface { SetContractInfoExtension(ctx sdk.Context, contract sdk.AccAddress, extra ContractInfoExtension) error // SetAccessConfig updates the access config of a code id. - SetAccessConfig(ctx sdk.Context, codeID uint64, config AccessConfig) error + SetAccessConfig(ctx sdk.Context, codeID uint64, caller sdk.AccAddress, newConfig AccessConfig) error } // IBCContractKeeper IBC lifecycle event handler diff --git a/x/wasm/types/types.go b/x/wasm/types/types.go index 7c9e14e64e..e3da189f85 100644 --- a/x/wasm/types/types.go +++ b/x/wasm/types/types.go @@ -333,18 +333,30 @@ func VerifyAddressLen() func(addr []byte) error { // IsSubset will return true if the caller is the same as the superset, // or if the caller is more restrictive than the superset. -func (a AccessConfig) IsSubset(superSet AccessConfig) bool { - switch superSet.Permission { +func (a AccessType) IsSubset(superSet AccessType) bool { + switch superSet { case AccessTypeEverybody: // Everything is a subset of this - return a.Permission != AccessTypeUnspecified + return a != AccessTypeUnspecified case AccessTypeNobody: // Only an exact match is a subset of this - return a.Permission == AccessTypeNobody + return a == AccessTypeNobody case AccessTypeOnlyAddress: // An exact match or nobody - return a.Permission == AccessTypeNobody || (a.Permission == AccessTypeOnlyAddress && a.Address == superSet.Address) + return a == AccessTypeNobody || a == AccessTypeOnlyAddress default: return false } } + +// IsSubset will return true if the caller is the same as the superset, +// or if the caller is more restrictive than the superset. +func (a AccessConfig) IsSubset(superSet AccessConfig) bool { + switch superSet.Permission { + case AccessTypeOnlyAddress: + // An exact match or nobody + return a.Permission == AccessTypeNobody || (a.Permission == AccessTypeOnlyAddress && a.Address == superSet.Address) + default: + return a.Permission.IsSubset(superSet.Permission) + } +} diff --git a/x/wasm/types/types_test.go b/x/wasm/types/types_test.go index 117415930d..91b39419c5 100644 --- a/x/wasm/types/types_test.go +++ b/x/wasm/types/types_test.go @@ -373,7 +373,7 @@ func TestVerifyAddressLen(t *testing.T) { } } -func TestAccesConfigSubset(t *testing.T) { +func TestAccessConfigSubset(t *testing.T) { specs := map[string]struct { check AccessConfig superSet AccessConfig @@ -453,3 +453,78 @@ func TestAccesConfigSubset(t *testing.T) { }) } } + +func TestAccessTypeSubset(t *testing.T) { + specs := map[string]struct { + check AccessType + superSet AccessType + isSubSet bool + }{ + "nobody <= nobody": { + superSet: AccessTypeNobody, + check: AccessTypeNobody, + isSubSet: true, + }, + "only > nobody": { + superSet: AccessTypeNobody, + check: AccessTypeOnlyAddress, + isSubSet: false, + }, + "everybody > nobody": { + superSet: AccessTypeNobody, + check: AccessTypeEverybody, + isSubSet: false, + }, + "unspecified > nobody": { + superSet: AccessTypeNobody, + check: AccessTypeUnspecified, + isSubSet: false, + }, + "nobody <= everybody": { + superSet: AccessTypeEverybody, + check: AccessTypeNobody, + isSubSet: true, + }, + "only <= everybody": { + superSet: AccessTypeEverybody, + check: AccessTypeOnlyAddress, + isSubSet: true, + }, + "everybody <= everybody": { + superSet: AccessTypeEverybody, + check: AccessTypeEverybody, + isSubSet: true, + }, + "unspecified > everybody": { + superSet: AccessTypeEverybody, + check: AccessTypeUnspecified, + isSubSet: false, + }, + "nobody <= only": { + superSet: AccessTypeOnlyAddress, + check: AccessTypeNobody, + isSubSet: true, + }, + "only <= only(same)": { + superSet: AccessTypeOnlyAddress, + check: AccessTypeOnlyAddress, + isSubSet: true, + }, + "everybody > only": { + superSet: AccessTypeOnlyAddress, + check: AccessTypeEverybody, + isSubSet: false, + }, + "nobody > unspecified": { + superSet: AccessTypeUnspecified, + check: AccessTypeNobody, + isSubSet: false, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + subset := spec.check.IsSubset(spec.superSet) + require.Equal(t, spec.isSubSet, subset) + }) + } +} From b570f49f5eaa8da93a0727b75c8eda9f47f7ea4e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 11 Jul 2022 08:40:41 +0200 Subject: [PATCH 14/94] Remove outdated proto.md --- docs/proto/proto.md | 1121 ------------------------------------------- 1 file changed, 1121 deletions(-) delete mode 100644 docs/proto/proto.md diff --git a/docs/proto/proto.md b/docs/proto/proto.md deleted file mode 100644 index 6637b9a28f..0000000000 --- a/docs/proto/proto.md +++ /dev/null @@ -1,1121 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [x/wasm/types/genesis.proto](#x/wasm/types/genesis.proto) - - [Code](#cosmwasm.wasm.v1beta1.Code) - - [Contract](#cosmwasm.wasm.v1beta1.Contract) - - [GenesisState](#cosmwasm.wasm.v1beta1.GenesisState) - - [GenesisState.GenMsgs](#cosmwasm.wasm.v1beta1.GenesisState.GenMsgs) - - [Sequence](#cosmwasm.wasm.v1beta1.Sequence) - -- [x/wasm/types/ibc.proto](#x/wasm/types/ibc.proto) - - [MsgIBCCloseChannel](#cosmwasm.wasm.v1beta1.MsgIBCCloseChannel) - - [MsgIBCSend](#cosmwasm.wasm.v1beta1.MsgIBCSend) - -- [x/wasm/types/proposal.proto](#x/wasm/types/proposal.proto) - - [ClearAdminProposal](#cosmwasm.wasm.v1beta1.ClearAdminProposal) - - [InstantiateContractProposal](#cosmwasm.wasm.v1beta1.InstantiateContractProposal) - - [MigrateContractProposal](#cosmwasm.wasm.v1beta1.MigrateContractProposal) - - [PinCodesProposal](#cosmwasm.wasm.v1beta1.PinCodesProposal) - - [StoreCodeProposal](#cosmwasm.wasm.v1beta1.StoreCodeProposal) - - [UnpinCodesProposal](#cosmwasm.wasm.v1beta1.UnpinCodesProposal) - - [UpdateAdminProposal](#cosmwasm.wasm.v1beta1.UpdateAdminProposal) - -- [x/wasm/types/query.proto](#x/wasm/types/query.proto) - - [CodeInfoResponse](#cosmwasm.wasm.v1beta1.CodeInfoResponse) - - [ContractInfoWithAddress](#cosmwasm.wasm.v1beta1.ContractInfoWithAddress) - - [QueryAllContractStateRequest](#cosmwasm.wasm.v1beta1.QueryAllContractStateRequest) - - [QueryAllContractStateResponse](#cosmwasm.wasm.v1beta1.QueryAllContractStateResponse) - - [QueryCodeRequest](#cosmwasm.wasm.v1beta1.QueryCodeRequest) - - [QueryCodeResponse](#cosmwasm.wasm.v1beta1.QueryCodeResponse) - - [QueryCodesRequest](#cosmwasm.wasm.v1beta1.QueryCodesRequest) - - [QueryCodesResponse](#cosmwasm.wasm.v1beta1.QueryCodesResponse) - - [QueryContractHistoryRequest](#cosmwasm.wasm.v1beta1.QueryContractHistoryRequest) - - [QueryContractHistoryResponse](#cosmwasm.wasm.v1beta1.QueryContractHistoryResponse) - - [QueryContractInfoRequest](#cosmwasm.wasm.v1beta1.QueryContractInfoRequest) - - [QueryContractInfoResponse](#cosmwasm.wasm.v1beta1.QueryContractInfoResponse) - - [QueryContractsByCodeRequest](#cosmwasm.wasm.v1beta1.QueryContractsByCodeRequest) - - [QueryContractsByCodeResponse](#cosmwasm.wasm.v1beta1.QueryContractsByCodeResponse) - - [QueryRawContractStateRequest](#cosmwasm.wasm.v1beta1.QueryRawContractStateRequest) - - [QueryRawContractStateResponse](#cosmwasm.wasm.v1beta1.QueryRawContractStateResponse) - - [QuerySmartContractStateRequest](#cosmwasm.wasm.v1beta1.QuerySmartContractStateRequest) - - [QuerySmartContractStateResponse](#cosmwasm.wasm.v1beta1.QuerySmartContractStateResponse) - - - [Query](#cosmwasm.wasm.v1beta1.Query) - -- [x/wasm/types/tx.proto](#x/wasm/types/tx.proto) - - [MsgClearAdmin](#cosmwasm.wasm.v1beta1.MsgClearAdmin) - - [MsgClearAdminResponse](#cosmwasm.wasm.v1beta1.MsgClearAdminResponse) - - [MsgExecuteContract](#cosmwasm.wasm.v1beta1.MsgExecuteContract) - - [MsgExecuteContractResponse](#cosmwasm.wasm.v1beta1.MsgExecuteContractResponse) - - [MsgInstantiateContract](#cosmwasm.wasm.v1beta1.MsgInstantiateContract) - - [MsgInstantiateContractResponse](#cosmwasm.wasm.v1beta1.MsgInstantiateContractResponse) - - [MsgMigrateContract](#cosmwasm.wasm.v1beta1.MsgMigrateContract) - - [MsgMigrateContractResponse](#cosmwasm.wasm.v1beta1.MsgMigrateContractResponse) - - [MsgStoreCode](#cosmwasm.wasm.v1beta1.MsgStoreCode) - - [MsgStoreCodeResponse](#cosmwasm.wasm.v1beta1.MsgStoreCodeResponse) - - [MsgUpdateAdmin](#cosmwasm.wasm.v1beta1.MsgUpdateAdmin) - - [MsgUpdateAdminResponse](#cosmwasm.wasm.v1beta1.MsgUpdateAdminResponse) - - - [Msg](#cosmwasm.wasm.v1beta1.Msg) - -- [x/wasm/types/types.proto](#x/wasm/types/types.proto) - - [AbsoluteTxPosition](#cosmwasm.wasm.v1beta1.AbsoluteTxPosition) - - [AccessConfig](#cosmwasm.wasm.v1beta1.AccessConfig) - - [AccessTypeParam](#cosmwasm.wasm.v1beta1.AccessTypeParam) - - [CodeInfo](#cosmwasm.wasm.v1beta1.CodeInfo) - - [ContractCodeHistoryEntry](#cosmwasm.wasm.v1beta1.ContractCodeHistoryEntry) - - [ContractInfo](#cosmwasm.wasm.v1beta1.ContractInfo) - - [Model](#cosmwasm.wasm.v1beta1.Model) - - [Params](#cosmwasm.wasm.v1beta1.Params) - - - [AccessType](#cosmwasm.wasm.v1beta1.AccessType) - - [ContractCodeHistoryOperationType](#cosmwasm.wasm.v1beta1.ContractCodeHistoryOperationType) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## x/wasm/types/genesis.proto - - - - - -### Code -Code struct encompasses CodeInfo and CodeBytes - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code_id | [uint64](#uint64) | | | -| code_info | [CodeInfo](#cosmwasm.wasm.v1beta1.CodeInfo) | | | -| code_bytes | [bytes](#bytes) | | | -| pinned | [bool](#bool) | | Pinned to wasmvm cache | - - - - - - - - -### Contract -Contract struct encompasses ContractAddress, ContractInfo, and ContractState - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| contract_address | [string](#string) | | | -| contract_info | [ContractInfo](#cosmwasm.wasm.v1beta1.ContractInfo) | | | -| contract_state | [Model](#cosmwasm.wasm.v1beta1.Model) | repeated | | - - - - - - - - -### GenesisState -GenesisState - genesis state of x/wasm - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| params | [Params](#cosmwasm.wasm.v1beta1.Params) | | | -| codes | [Code](#cosmwasm.wasm.v1beta1.Code) | repeated | | -| contracts | [Contract](#cosmwasm.wasm.v1beta1.Contract) | repeated | | -| sequences | [Sequence](#cosmwasm.wasm.v1beta1.Sequence) | repeated | | -| gen_msgs | [GenesisState.GenMsgs](#cosmwasm.wasm.v1beta1.GenesisState.GenMsgs) | repeated | | - - - - - - - - -### GenesisState.GenMsgs -GenMsgs define the messages that can be executed during genesis phase in order. -The intention is to have more human readable data that is auditable. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| store_code | [MsgStoreCode](#cosmwasm.wasm.v1beta1.MsgStoreCode) | | | -| instantiate_contract | [MsgInstantiateContract](#cosmwasm.wasm.v1beta1.MsgInstantiateContract) | | | -| execute_contract | [MsgExecuteContract](#cosmwasm.wasm.v1beta1.MsgExecuteContract) | | | - - - - - - - - -### Sequence -Sequence key and value of an id generation counter - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id_key | [bytes](#bytes) | | | -| value | [uint64](#uint64) | | | - - - - - - - - - - - - - - - - -

Top

- -## x/wasm/types/ibc.proto - - - - - -### MsgIBCCloseChannel -MsgIBCCloseChannel port and channel need to be owned by the contract - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| channel | [string](#string) | | | - - - - - - - - -### MsgIBCSend -MsgIBCSend - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| channel | [string](#string) | | the channel by which the packet will be sent | -| timeout_height | [uint64](#uint64) | | Timeout height relative to the current block height. The timeout is disabled when set to 0. | -| timeout_timestamp | [uint64](#uint64) | | Timeout timestamp (in nanoseconds) relative to the current block timestamp. The timeout is disabled when set to 0. | -| data | [bytes](#bytes) | | data is the payload to transfer | - - - - - - - - - - - - - - - - -

Top

- -## x/wasm/types/proposal.proto - - - - - -### ClearAdminProposal -ClearAdminProposal gov proposal content type to clear the admin of a contract. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| title | [string](#string) | | Title is a short summary | -| description | [string](#string) | | Description is a human readable text | -| contract | [string](#string) | | Contract is the address of the smart contract | - - - - - - - - -### InstantiateContractProposal -InstantiateContractProposal gov proposal content type to instantiate a contract. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| title | [string](#string) | | Title is a short summary | -| description | [string](#string) | | Description is a human readable text | -| run_as | [string](#string) | | RunAs is the address that is passed to the contract's environment as sender | -| admin | [string](#string) | | Admin is an optional address that can execute migrations | -| code_id | [uint64](#uint64) | | CodeID is the reference to the stored WASM code | -| label | [string](#string) | | Label is optional metadata to be stored with a constract instance. | -| init_msg | [bytes](#bytes) | | InitMsg json encoded message to be passed to the contract on instantiation | -| funds | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | Funds coins that are transferred to the contract on instantiation | - - - - - - - - -### MigrateContractProposal -MigrateContractProposal gov proposal content type to migrate a contract. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| title | [string](#string) | | Title is a short summary | -| description | [string](#string) | | Description is a human readable text | -| run_as | [string](#string) | | RunAs is the address that is passed to the contract's environment as sender | -| contract | [string](#string) | | Contract is the address of the smart contract | -| code_id | [uint64](#uint64) | | CodeID references the new WASM code | -| migrate_msg | [bytes](#bytes) | | MigrateMsg json encoded message to be passed to the contract on migration | - - - - - - - - -### PinCodesProposal -PinCodesProposal gov proposal content type to pin a set of code ids in the wasmvm cache. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| title | [string](#string) | | Title is a short summary | -| description | [string](#string) | | Description is a human readable text | -| code_ids | [uint64](#uint64) | repeated | CodeIDs references the new WASM codes | - - - - - - - - -### StoreCodeProposal -StoreCodeProposal gov proposal content type to submit WASM code to the system - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| title | [string](#string) | | Title is a short summary | -| description | [string](#string) | | Description is a human readable text | -| run_as | [string](#string) | | RunAs is the address that is passed to the contract's environment as sender | -| wasm_byte_code | [bytes](#bytes) | | WASMByteCode can be raw or gzip compressed | -| source | [string](#string) | | Source is a valid absolute HTTPS URI to the contract's source code, optional | -| builder | [string](#string) | | Builder is a valid docker image name with tag, optional | -| instantiate_permission | [AccessConfig](#cosmwasm.wasm.v1beta1.AccessConfig) | | InstantiatePermission to apply on contract creation, optional | - - - - - - - - -### UnpinCodesProposal -UnpinCodesProposal gov proposal content type to unpin a set of code ids in the wasmvm cache. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| title | [string](#string) | | Title is a short summary | -| description | [string](#string) | | Description is a human readable text | -| code_ids | [uint64](#uint64) | repeated | CodeIDs references the WASM codes | - - - - - - - - -### UpdateAdminProposal -UpdateAdminProposal gov proposal content type to set an admin for a contract. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| title | [string](#string) | | Title is a short summary | -| description | [string](#string) | | Description is a human readable text | -| new_admin | [string](#string) | | NewAdmin address to be set | -| contract | [string](#string) | | Contract is the address of the smart contract | - - - - - - - - - - - - - - - - -

Top

- -## x/wasm/types/query.proto - - - - - -### CodeInfoResponse -CodeInfoResponse contains code meta data from CodeInfo - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code_id | [uint64](#uint64) | | id for legacy support | -| creator | [string](#string) | | | -| data_hash | [bytes](#bytes) | | | -| source | [string](#string) | | | -| builder | [string](#string) | | | - - - - - - - - -### ContractInfoWithAddress -ContractInfoWithAddress adds the address (key) to the ContractInfo representation - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| address | [string](#string) | | | -| contract_info | [ContractInfo](#cosmwasm.wasm.v1beta1.ContractInfo) | | | - - - - - - - - -### QueryAllContractStateRequest -QueryAllContractStateRequest is the request type for the Query/AllContractState RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| address | [string](#string) | | address is the address of the contract | -| pagination | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. | - - - - - - - - -### QueryAllContractStateResponse -QueryAllContractStateResponse is the response type for the Query/AllContractState RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| models | [Model](#cosmwasm.wasm.v1beta1.Model) | repeated | | -| pagination | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination defines the pagination in the response. | - - - - - - - - -### QueryCodeRequest -QueryCodeRequest is the request type for the Query/Code RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code_id | [uint64](#uint64) | | grpc-gateway_out does not support Go style CodID | - - - - - - - - -### QueryCodeResponse -QueryCodeResponse is the response type for the Query/Code RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code_info | [CodeInfoResponse](#cosmwasm.wasm.v1beta1.CodeInfoResponse) | | | -| data | [bytes](#bytes) | | | - - - - - - - - -### QueryCodesRequest -QueryCodesRequest is the request type for the Query/Codes RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| pagination | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. | - - - - - - - - -### QueryCodesResponse -QueryCodesResponse is the response type for the Query/Codes RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code_infos | [CodeInfoResponse](#cosmwasm.wasm.v1beta1.CodeInfoResponse) | repeated | | -| pagination | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination defines the pagination in the response. | - - - - - - - - -### QueryContractHistoryRequest -QueryContractHistoryRequest is the request type for the Query/ContractHistory RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| address | [string](#string) | | address is the address of the contract to query | -| pagination | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. | - - - - - - - - -### QueryContractHistoryResponse -QueryContractHistoryResponse is the response type for the Query/ContractHistory RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| entries | [ContractCodeHistoryEntry](#cosmwasm.wasm.v1beta1.ContractCodeHistoryEntry) | repeated | | -| pagination | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination defines the pagination in the response. | - - - - - - - - -### QueryContractInfoRequest -QueryContractInfoRequest is the request type for the Query/ContractInfo RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| address | [string](#string) | | address is the address of the contract to query | - - - - - - - - -### QueryContractInfoResponse -QueryContractInfoResponse is the response type for the Query/ContractInfo RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| address | [string](#string) | | address is the address of the contract | -| contract_info | [ContractInfo](#cosmwasm.wasm.v1beta1.ContractInfo) | | | - - - - - - - - -### QueryContractsByCodeRequest -QueryContractsByCodeRequest is the request type for the Query/ContractsByCode RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code_id | [uint64](#uint64) | | grpc-gateway_out does not support Go style CodID | -| pagination | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. | - - - - - - - - -### QueryContractsByCodeResponse -QueryContractsByCodeResponse is the response type for the Query/ContractsByCode RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| contract_infos | [ContractInfoWithAddress](#cosmwasm.wasm.v1beta1.ContractInfoWithAddress) | repeated | | -| pagination | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination defines the pagination in the response. | - - - - - - - - -### QueryRawContractStateRequest -QueryRawContractStateRequest is the request type for the Query/RawContractState RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| address | [string](#string) | | address is the address of the contract | -| query_data | [bytes](#bytes) | | | - - - - - - - - -### QueryRawContractStateResponse -QueryRawContractStateResponse is the response type for the Query/RawContractState RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| data | [bytes](#bytes) | | Data contains the raw store data | - - - - - - - - -### QuerySmartContractStateRequest -QuerySmartContractStateRequest is the request type for the Query/SmartContractState RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| address | [string](#string) | | address is the address of the contract | -| query_data | [bytes](#bytes) | | QueryData contains the query data passed to the contract | - - - - - - - - -### QuerySmartContractStateResponse -QuerySmartContractStateResponse is the response type for the Query/SmartContractState RPC method - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| data | [bytes](#bytes) | | Data contains the json data returned from the smart contract | - - - - - - - - - - - - - - -### Query -Query provides defines the gRPC querier service - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| ContractInfo | [QueryContractInfoRequest](#cosmwasm.wasm.v1beta1.QueryContractInfoRequest) | [QueryContractInfoResponse](#cosmwasm.wasm.v1beta1.QueryContractInfoResponse) | ContractInfo gets the contract meta data | -| ContractHistory | [QueryContractHistoryRequest](#cosmwasm.wasm.v1beta1.QueryContractHistoryRequest) | [QueryContractHistoryResponse](#cosmwasm.wasm.v1beta1.QueryContractHistoryResponse) | ContractHistory gets the contract code history | -| ContractsByCode | [QueryContractsByCodeRequest](#cosmwasm.wasm.v1beta1.QueryContractsByCodeRequest) | [QueryContractsByCodeResponse](#cosmwasm.wasm.v1beta1.QueryContractsByCodeResponse) | ContractsByCode lists all smart contracts for a code id | -| AllContractState | [QueryAllContractStateRequest](#cosmwasm.wasm.v1beta1.QueryAllContractStateRequest) | [QueryAllContractStateResponse](#cosmwasm.wasm.v1beta1.QueryAllContractStateResponse) | AllContractState gets all raw store data for a single contract | -| RawContractState | [QueryRawContractStateRequest](#cosmwasm.wasm.v1beta1.QueryRawContractStateRequest) | [QueryRawContractStateResponse](#cosmwasm.wasm.v1beta1.QueryRawContractStateResponse) | RawContractState gets single key from the raw store data of a contract | -| SmartContractState | [QuerySmartContractStateRequest](#cosmwasm.wasm.v1beta1.QuerySmartContractStateRequest) | [QuerySmartContractStateResponse](#cosmwasm.wasm.v1beta1.QuerySmartContractStateResponse) | SmartContractState get smart query result from the contract | -| Code | [QueryCodeRequest](#cosmwasm.wasm.v1beta1.QueryCodeRequest) | [QueryCodeResponse](#cosmwasm.wasm.v1beta1.QueryCodeResponse) | Code gets the binary code and metadata for a singe wasm code | -| Codes | [QueryCodesRequest](#cosmwasm.wasm.v1beta1.QueryCodesRequest) | [QueryCodesResponse](#cosmwasm.wasm.v1beta1.QueryCodesResponse) | Codes gets the metadata for all stored wasm codes | - - - - - - -

Top

- -## x/wasm/types/tx.proto - - - - - -### MsgClearAdmin -MsgClearAdmin removes any admin stored for a smart contract - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| sender | [string](#string) | | Sender is the that actor that signed the messages | -| contract | [string](#string) | | Contract is the address of the smart contract | - - - - - - - - -### MsgClearAdminResponse -MsgClearAdminResponse returns empty data - - - - - - - - -### MsgExecuteContract -MsgExecuteContract submits the given message data to a smart contract - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| sender | [string](#string) | | Sender is the that actor that signed the messages | -| contract | [string](#string) | | Contract is the address of the smart contract | -| msg | [bytes](#bytes) | | Msg json encoded message to be passed to the contract | -| funds | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | Funds coins that are transferred to the contract on execution | - - - - - - - - -### MsgExecuteContractResponse -MsgExecuteContractResponse returns execution result data. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| data | [bytes](#bytes) | | Data contains base64-encoded bytes to returned from the contract | - - - - - - - - -### MsgInstantiateContract -MsgInstantiateContract create a new smart contract instance for the given code id. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| sender | [string](#string) | | Sender is the that actor that signed the messages | -| admin | [string](#string) | | Admin is an optional address that can execute migrations | -| code_id | [uint64](#uint64) | | CodeID is the reference to the stored WASM code | -| label | [string](#string) | | Label is optional metadata to be stored with a contract instance. | -| init_msg | [bytes](#bytes) | | InitMsg json encoded message to be passed to the contract on instantiation | -| funds | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | Funds coins that are transferred to the contract on instantiation | - - - - - - - - -### MsgInstantiateContractResponse -MsgInstantiateContractResponse return instantiation result data - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| address | [string](#string) | | Address is the bech32 address of the new contract instance. | -| data | [bytes](#bytes) | | Data contains base64-encoded bytes to returned from the contract | - - - - - - - - -### MsgMigrateContract -MsgMigrateContract runs a code upgrade/ downgrade for a smart contract - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| sender | [string](#string) | | Sender is the that actor that signed the messages | -| contract | [string](#string) | | Contract is the address of the smart contract | -| code_id | [uint64](#uint64) | | CodeID references the new WASM code | -| migrate_msg | [bytes](#bytes) | | MigrateMsg json encoded message to be passed to the contract on migration | - - - - - - - - -### MsgMigrateContractResponse -MsgMigrateContractResponse returns contract migration result data. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| data | [bytes](#bytes) | | Data contains same raw bytes returned as data from the wasm contract. (May be empty) | - - - - - - - - -### MsgStoreCode -MsgStoreCode submit Wasm code to the system - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| sender | [string](#string) | | Sender is the that actor that signed the messages | -| wasm_byte_code | [bytes](#bytes) | | WASMByteCode can be raw or gzip compressed | -| source | [string](#string) | | Source is a valid absolute HTTPS URI to the contract's source code, optional | -| builder | [string](#string) | | Builder is a valid docker image name with tag, optional | -| instantiate_permission | [AccessConfig](#cosmwasm.wasm.v1beta1.AccessConfig) | | InstantiatePermission access control to apply on contract creation, optional | - - - - - - - - -### MsgStoreCodeResponse -MsgStoreCodeResponse returns store result data. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code_id | [uint64](#uint64) | | CodeID is the reference to the stored WASM code | - - - - - - - - -### MsgUpdateAdmin -MsgUpdateAdmin sets a new admin for a smart contract - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| sender | [string](#string) | | Sender is the that actor that signed the messages | -| new_admin | [string](#string) | | NewAdmin address to be set | -| contract | [string](#string) | | Contract is the address of the smart contract | - - - - - - - - -### MsgUpdateAdminResponse -MsgUpdateAdminResponse returns empty data - - - - - - - - - - - - - - -### Msg -Msg defines the wasm Msg service. - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| StoreCode | [MsgStoreCode](#cosmwasm.wasm.v1beta1.MsgStoreCode) | [MsgStoreCodeResponse](#cosmwasm.wasm.v1beta1.MsgStoreCodeResponse) | StoreCode to submit Wasm code to the system | -| InstantiateContract | [MsgInstantiateContract](#cosmwasm.wasm.v1beta1.MsgInstantiateContract) | [MsgInstantiateContractResponse](#cosmwasm.wasm.v1beta1.MsgInstantiateContractResponse) | Instantiate creates a new smart contract instance for the given code id. | -| ExecuteContract | [MsgExecuteContract](#cosmwasm.wasm.v1beta1.MsgExecuteContract) | [MsgExecuteContractResponse](#cosmwasm.wasm.v1beta1.MsgExecuteContractResponse) | Execute submits the given message data to a smart contract | -| MigrateContract | [MsgMigrateContract](#cosmwasm.wasm.v1beta1.MsgMigrateContract) | [MsgMigrateContractResponse](#cosmwasm.wasm.v1beta1.MsgMigrateContractResponse) | Migrate runs a code upgrade/ downgrade for a smart contract | -| UpdateAdmin | [MsgUpdateAdmin](#cosmwasm.wasm.v1beta1.MsgUpdateAdmin) | [MsgUpdateAdminResponse](#cosmwasm.wasm.v1beta1.MsgUpdateAdminResponse) | UpdateAdmin sets a new admin for a smart contract | -| ClearAdmin | [MsgClearAdmin](#cosmwasm.wasm.v1beta1.MsgClearAdmin) | [MsgClearAdminResponse](#cosmwasm.wasm.v1beta1.MsgClearAdminResponse) | ClearAdmin removes any admin stored for a smart contract | - - - - - - -

Top

- -## x/wasm/types/types.proto - - - - - -### AbsoluteTxPosition -AbsoluteTxPosition is a unique transaction position that allows for global ordering of transactions. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| block_height | [uint64](#uint64) | | BlockHeight is the block the contract was created at | -| tx_index | [uint64](#uint64) | | TxIndex is a monotonic counter within the block (actual transaction index, or gas consumed) | - - - - - - - - -### AccessConfig -AccessConfig access control type. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| permission | [AccessType](#cosmwasm.wasm.v1beta1.AccessType) | | | -| address | [string](#string) | | | - - - - - - - - -### AccessTypeParam -AccessTypeParam - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| value | [AccessType](#cosmwasm.wasm.v1beta1.AccessType) | | | - - - - - - - - -### CodeInfo -CodeInfo is data for the uploaded contract WASM code - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code_hash | [bytes](#bytes) | | CodeHash is the unique identifier created by wasmvm | -| creator | [string](#string) | | Creator address who initially stored the code | -| source | [string](#string) | | Source is a valid absolute HTTPS URI to the contract's source code, optional | -| builder | [string](#string) | | Builder is a valid docker image name with tag, optional | -| instantiate_config | [AccessConfig](#cosmwasm.wasm.v1beta1.AccessConfig) | | InstantiateConfig access control to apply on contract creation, optional | - - - - - - - - -### ContractCodeHistoryEntry -ContractCodeHistoryEntry metadata to a contract. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| operation | [ContractCodeHistoryOperationType](#cosmwasm.wasm.v1beta1.ContractCodeHistoryOperationType) | | | -| code_id | [uint64](#uint64) | | CodeID is the reference to the stored WASM code | -| updated | [AbsoluteTxPosition](#cosmwasm.wasm.v1beta1.AbsoluteTxPosition) | | Updated Tx position when the operation was executed. | -| msg | [bytes](#bytes) | | | - - - - - - - - -### ContractInfo -ContractInfo stores a WASM contract instance - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code_id | [uint64](#uint64) | | CodeID is the reference to the stored Wasm code | -| creator | [string](#string) | | Creator address who initially instantiated the contract | -| admin | [string](#string) | | Admin is an optional address that can execute migrations | -| label | [string](#string) | | Label is optional metadata to be stored with a contract instance. | -| created | [AbsoluteTxPosition](#cosmwasm.wasm.v1beta1.AbsoluteTxPosition) | | Created Tx position when the contract was instantiated. This data should kept internal and not be exposed via query results. Just use for sorting | -| ibc_port_id | [string](#string) | | | - - - - - - - - -### Model -Model is a struct that holds a KV pair - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [bytes](#bytes) | | hex-encode key to read it better (this is often ascii) | -| value | [bytes](#bytes) | | base64-encode raw value | - - - - - - - - -### Params -Params defines the set of wasm parameters. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| code_upload_access | [AccessConfig](#cosmwasm.wasm.v1beta1.AccessConfig) | | | -| instantiate_default_permission | [AccessType](#cosmwasm.wasm.v1beta1.AccessType) | | | -| max_wasm_code_size | [uint64](#uint64) | | | - - - - - - - - - - -### AccessType -AccessType permission types - -| Name | Number | Description | -| ---- | ------ | ----------- | -| ACCESS_TYPE_UNSPECIFIED | 0 | AccessTypeUnspecified placeholder for empty value | -| ACCESS_TYPE_NOBODY | 1 | AccessTypeNobody forbidden | -| ACCESS_TYPE_ONLY_ADDRESS | 2 | AccessTypeOnlyAddress restricted to an address | -| ACCESS_TYPE_EVERYBODY | 3 | AccessTypeEverybody unrestricted | - - - - - -### ContractCodeHistoryOperationType -ContractCodeHistoryOperationType actions that caused a code change - -| Name | Number | Description | -| ---- | ------ | ----------- | -| CONTRACT_CODE_HISTORY_OPERATION_TYPE_UNSPECIFIED | 0 | ContractCodeHistoryOperationTypeUnspecified placeholder for empty value | -| CONTRACT_CODE_HISTORY_OPERATION_TYPE_INIT | 1 | ContractCodeHistoryOperationTypeInit on chain contract instantiation | -| CONTRACT_CODE_HISTORY_OPERATION_TYPE_MIGRATE | 2 | ContractCodeHistoryOperationTypeMigrate code migration | -| CONTRACT_CODE_HISTORY_OPERATION_TYPE_GENESIS | 3 | ContractCodeHistoryOperationTypeGenesis based on genesis data | - - - - - - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - From 29340b692a94e71fa01be3fcf4fa41f47fb35187 Mon Sep 17 00:00:00 2001 From: "shiki.takahashi" Date: Tue, 19 Jul 2022 16:24:34 +0900 Subject: [PATCH 15/94] Remove unnecessary error check --- x/wasm/keeper/proposal_handler.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x/wasm/keeper/proposal_handler.go b/x/wasm/keeper/proposal_handler.go index 9da330ce0f..6d99fb3624 100644 --- a/x/wasm/keeper/proposal_handler.go +++ b/x/wasm/keeper/proposal_handler.go @@ -107,9 +107,7 @@ func handleMigrateProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.M if err != nil { return sdkerrors.Wrap(err, "contract") } - if err != nil { - return sdkerrors.Wrap(err, "run as address") - } + // runAs is not used if this is permissioned, so just put any valid address there (second contractAddr) data, err := k.Migrate(ctx, contractAddr, contractAddr, p.CodeID, p.Msg) if err != nil { From 3864815113aabf281442e800e2fa6f7a8b3d6aeb Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Thu, 21 Jul 2022 10:02:59 +0700 Subject: [PATCH 16/94] Create .gitpod.yml --- .gitpod.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitpod.yml diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000000..1a76547d87 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1 @@ +image: github.com/notional-labs/cosmos From ee44cc06d0a6c8a35c5657cb765f6c6ba39902fa Mon Sep 17 00:00:00 2001 From: Assaf Morami Date: Thu, 28 Jul 2022 12:52:06 +0300 Subject: [PATCH 17/94] Don't pass non-wasm events to reply() Output events are not part of consensus and can be non-deterministic --- x/wasm/keeper/msg_dispatcher.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/x/wasm/keeper/msg_dispatcher.go b/x/wasm/keeper/msg_dispatcher.go index a3e7e3a142..1a32af409f 100644 --- a/x/wasm/keeper/msg_dispatcher.go +++ b/x/wasm/keeper/msg_dispatcher.go @@ -107,6 +107,9 @@ func (d MessageDispatcher) DispatchSubmessages(ctx sdk.Context, contractAddr sdk commit() filteredEvents = filterEvents(append(em.Events(), events...)) ctx.EventManager().EmitEvents(filteredEvents) + if msg.Msg.Wasm != nil { + filteredEvents = []sdk.Event{} + } } // on failure, revert state from sandbox, and ignore events (just skip doing the above) // we only callback if requested. Short-circuit here the cases we don't want to From 9671a21430e5a0e64c4adf5dc7d273c1a976a7ff Mon Sep 17 00:00:00 2001 From: Assaf Morami Date: Thu, 28 Jul 2022 12:53:28 +0300 Subject: [PATCH 18/94] Oops --- x/wasm/keeper/msg_dispatcher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/wasm/keeper/msg_dispatcher.go b/x/wasm/keeper/msg_dispatcher.go index 1a32af409f..51650d85ef 100644 --- a/x/wasm/keeper/msg_dispatcher.go +++ b/x/wasm/keeper/msg_dispatcher.go @@ -107,7 +107,7 @@ func (d MessageDispatcher) DispatchSubmessages(ctx sdk.Context, contractAddr sdk commit() filteredEvents = filterEvents(append(em.Events(), events...)) ctx.EventManager().EmitEvents(filteredEvents) - if msg.Msg.Wasm != nil { + if msg.Msg.Wasm == nil { filteredEvents = []sdk.Event{} } } // on failure, revert state from sandbox, and ignore events (just skip doing the above) From f7211b8dd05d040d6fbe67fb20980dcd2bb0e6f4 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Fri, 29 Jul 2022 07:54:13 +0200 Subject: [PATCH 19/94] Add changelog for fix --- CHANGELOG.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a718846617..9467435b3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,20 @@ ## [Unreleased](https://github.com/CosmWasm/wasmd/tree/HEAD) -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.27.0...HEAD) +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.28.0...HEAD) + +## [v0.27.0](https://github.com/CosmWasm/wasmd/tree/v0.28.0) (2022-07-29) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.27.0...v0.28.0) + +**API Breaking** + +No + +**Fixed Bugs** + +- Fix: Make events in reply completely determinisitic by stripping out anything coming from Cosmos SDK (not CosmWasm codebase) [\#917](https://github.com/CosmWasm/wasmd/pull/917) ([assafmo](https://github.com/assafmo)) + ## [v0.27.0](https://github.com/CosmWasm/wasmd/tree/v0.27.0) (2022-05-19) From ce1cf7446dc80c06cbdd54c3e003a7f6e49f56e4 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Fri, 29 Jul 2022 08:09:39 +0200 Subject: [PATCH 20/94] Fix tests in keeper --- CHANGELOG.md | 6 ++++ x/wasm/keeper/msg_dispatcher_test.go | 47 ++++++++++++++++++++++++++-- x/wasm/keeper/submsg_test.go | 15 +++------ 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9467435b3e..fedf6aafec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,12 @@ No - Fix: Make events in reply completely determinisitic by stripping out anything coming from Cosmos SDK (not CosmWasm codebase) [\#917](https://github.com/CosmWasm/wasmd/pull/917) ([assafmo](https://github.com/assafmo)) +Migration notes: + +* Contracts can no longer parse events from any calls except if they call another contract (or instantiate it, migrate it, etc). +The main issue here is likely "Custom" queries from a blockchain, which want to send info (eg. how many tokens were swapped). +Since those custom bindings are maintained by the chain, they can use the data field to pass any deterministic information +back to the contract. We recommend using JSON encoding there with some documented format the contracts can parse out easily. ## [v0.27.0](https://github.com/CosmWasm/wasmd/tree/v0.27.0) (2022-05-19) diff --git a/x/wasm/keeper/msg_dispatcher_test.go b/x/wasm/keeper/msg_dispatcher_test.go index 529a208ff0..e514ae4119 100644 --- a/x/wasm/keeper/msg_dispatcher_test.go +++ b/x/wasm/keeper/msg_dispatcher_test.go @@ -296,8 +296,9 @@ func TestDispatchSubmessages(t *testing.T) { expCommits: []bool{true}, expEvents: []sdk.Event{sdk.NewEvent("execute", sdk.NewAttribute("foo", "bar"))}, }, - "reply gets proper events": { - msgs: []wasmvmtypes.SubMsg{{ID: 1, ReplyOn: wasmvmtypes.ReplyAlways}}, + "wasm reply gets proper events": { + // put fake wasmmsg in here to show where it comes from + msgs: []wasmvmtypes.SubMsg{{ID: 1, ReplyOn: wasmvmtypes.ReplyAlways, Msg: wasmvmtypes.CosmosMsg{Wasm: &wasmvmtypes.WasmMsg{}}}}, replyer: &mockReplyer{ replyFn: func(ctx sdk.Context, contractAddress sdk.AccAddress, reply wasmvmtypes.Reply) ([]byte, error) { if reply.Result.Err != "" { @@ -343,6 +344,48 @@ func TestDispatchSubmessages(t *testing.T) { sdk.NewEvent("wasm-reply"), }, }, + "non-wasm reply events get filtered": { + // show events from a stargate message gets filtered out + msgs: []wasmvmtypes.SubMsg{{ID: 1, ReplyOn: wasmvmtypes.ReplyAlways, Msg: wasmvmtypes.CosmosMsg{Stargate: &wasmvmtypes.StargateMsg{}}}}, + replyer: &mockReplyer{ + replyFn: func(ctx sdk.Context, contractAddress sdk.AccAddress, reply wasmvmtypes.Reply) ([]byte, error) { + if reply.Result.Err != "" { + return nil, errors.New(reply.Result.Err) + } + res := reply.Result.Ok + + // ensure the input events are what we expect + // I didn't use require.Equal() to act more like a contract... but maybe that would be better + if len(res.Events) != 0 { + return nil, errors.New("events not filtered out") + } + + // let's add a custom event here and see if it makes it out + ctx.EventManager().EmitEvent(sdk.NewEvent("stargate-reply")) + + // update data from what we got in + return res.Data, nil + }, + }, + msgHandler: &wasmtesting.MockMessageHandler{ + DispatchMsgFn: func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { + events = []sdk.Event{ + // this is filtered out + sdk.NewEvent("message", sdk.NewAttribute("stargate", "something-something")), + // we still emit this to the client, but not the contract + sdk.NewEvent("non-determinstic"), + } + return events, [][]byte{[]byte("subData")}, nil + }, + }, + expData: []byte("subData"), + expCommits: []bool{true}, + expEvents: []sdk.Event{ + sdk.NewEvent("non-determinstic"), + // the event from reply is also exposed + sdk.NewEvent("stargate-reply"), + }, + }, } for name, spec := range specs { t.Run(name, func(t *testing.T) { diff --git a/x/wasm/keeper/submsg_test.go b/x/wasm/keeper/submsg_test.go index 7d83c8ffcd..4d7075761f 100644 --- a/x/wasm/keeper/submsg_test.go +++ b/x/wasm/keeper/submsg_test.go @@ -96,15 +96,8 @@ func TestDispatchSubMsgSuccessCase(t *testing.T) { require.NotNil(t, res.Result.Ok) sub := res.Result.Ok assert.Empty(t, sub.Data) - require.Len(t, sub.Events, 3) - assert.Equal(t, "coin_spent", sub.Events[0].Type) - assert.Equal(t, "coin_received", sub.Events[1].Type) - transfer := sub.Events[2] - assert.Equal(t, "transfer", transfer.Type) - assert.Equal(t, wasmvmtypes.EventAttribute{ - Key: "recipient", - Value: fred.String(), - }, transfer.Attributes[0]) + // as of v0.28.0 we strip out all events that don't come from wasm contracts. can't trust the sdk. + require.Len(t, sub.Events, 0) } func TestDispatchSubMsgErrorHandling(t *testing.T) { @@ -247,7 +240,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { "send tokens": { submsgID: 5, msg: validBankSend, - resultAssertions: []assertion{assertReturnedEvents(3), assertGasUsed(112000, 112900)}, + resultAssertions: []assertion{assertReturnedEvents(0), assertGasUsed(95000, 96000)}, }, "not enough tokens": { submsgID: 6, @@ -267,7 +260,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { msg: validBankSend, gasLimit: &subGasLimit, // uses same gas as call without limit (note we do not charge the 40k on reply) - resultAssertions: []assertion{assertReturnedEvents(3), assertGasUsed(112000, 113000)}, + resultAssertions: []assertion{assertReturnedEvents(0), assertGasUsed(95000, 96000)}, }, "not enough tokens with limit": { submsgID: 16, From e08c8a37c8a2d3fc0d9a99db9fca1e19bf3f1c43 Mon Sep 17 00:00:00 2001 From: Alex Lynham Date: Thu, 28 Jul 2022 11:04:24 +0100 Subject: [PATCH 21/94] Add sorting fix from terra devs --- x/wasm/keeper/keeper.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 3fdcbec483..29b8b2f3eb 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -500,6 +500,16 @@ func (k Keeper) reply(ctx sdk.Context, contractAddress sdk.AccAddress, reply was // prepare querier querier := k.newQueryHandler(ctx, contractAddress) gas := k.runtimeGasForContract(ctx) + if reply.Result.Ok != nil { + events := reply.Result.Ok.Events + for _, e := range events { + attributes := e.Attributes + sort.SliceStable(attributes, func(i, j int) bool { + return bytes.Compare([]byte(attributes[i].Key), []byte(attributes[j].Key)) == -1 + }) + } + } + res, gasUsed, execErr := k.wasmVM.Reply(codeInfo.CodeHash, env, reply, prefixStore, cosmwasmAPI, querier, k.gasMeter(ctx), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) if execErr != nil { From 393f49e5cbfe836876db9aa7e59e64372cd63c88 Mon Sep 17 00:00:00 2001 From: Alex Lynham Date: Thu, 28 Jul 2022 11:18:46 +0100 Subject: [PATCH 22/94] Fix imports --- x/wasm/keeper/keeper.go | 1 + 1 file changed, 1 insertion(+) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 29b8b2f3eb..6dd3ad8581 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -7,6 +7,7 @@ import ( "fmt" "math" "path/filepath" + "sort" "strconv" "strings" "time" From a697c70650ba48a0d1ccc992cc64307e27bd3f24 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Fri, 29 Jul 2022 08:34:23 +0200 Subject: [PATCH 23/94] Code cleanup suggested by @peterbourgon --- x/wasm/keeper/keeper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 6dd3ad8581..3f4f883bd1 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -506,7 +506,7 @@ func (k Keeper) reply(ctx sdk.Context, contractAddress sdk.AccAddress, reply was for _, e := range events { attributes := e.Attributes sort.SliceStable(attributes, func(i, j int) bool { - return bytes.Compare([]byte(attributes[i].Key), []byte(attributes[j].Key)) == -1 + return attributes[i].Key < attributes[j].Key }) } } From c25550d775aaaea61d3b6e58cfa829a3c316f91a Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Fri, 29 Jul 2022 08:42:47 +0200 Subject: [PATCH 24/94] put sorting fix next to event filtering --- x/wasm/keeper/keeper.go | 10 ---------- x/wasm/keeper/msg_dispatcher.go | 9 +++++++++ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 3f4f883bd1..986a185e0a 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -7,7 +7,6 @@ import ( "fmt" "math" "path/filepath" - "sort" "strconv" "strings" "time" @@ -501,15 +500,6 @@ func (k Keeper) reply(ctx sdk.Context, contractAddress sdk.AccAddress, reply was // prepare querier querier := k.newQueryHandler(ctx, contractAddress) gas := k.runtimeGasForContract(ctx) - if reply.Result.Ok != nil { - events := reply.Result.Ok.Events - for _, e := range events { - attributes := e.Attributes - sort.SliceStable(attributes, func(i, j int) bool { - return attributes[i].Key < attributes[j].Key - }) - } - } res, gasUsed, execErr := k.wasmVM.Reply(codeInfo.CodeHash, env, reply, prefixStore, cosmwasmAPI, querier, k.gasMeter(ctx), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) diff --git a/x/wasm/keeper/msg_dispatcher.go b/x/wasm/keeper/msg_dispatcher.go index 51650d85ef..59a836fa5f 100644 --- a/x/wasm/keeper/msg_dispatcher.go +++ b/x/wasm/keeper/msg_dispatcher.go @@ -1,7 +1,9 @@ package keeper import ( + "bytes" "fmt" + "sort" wasmvmtypes "github.com/CosmWasm/wasmvm/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -109,6 +111,13 @@ func (d MessageDispatcher) DispatchSubmessages(ctx sdk.Context, contractAddr sdk ctx.EventManager().EmitEvents(filteredEvents) if msg.Msg.Wasm == nil { filteredEvents = []sdk.Event{} + } else { + for _, e := range filteredEvents { + attributes := e.Attributes + sort.SliceStable(attributes, func(i, j int) bool { + return bytes.Compare(attributes[i].Key, attributes[j].Key) < 0 + }) + } } } // on failure, revert state from sandbox, and ignore events (just skip doing the above) From 90a3781351c8838c5819096940d73744823a82d2 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Fri, 29 Jul 2022 08:45:15 +0200 Subject: [PATCH 25/94] Add changelog entry --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fedf6aafec..a3f7e06fa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ [Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.28.0...HEAD) -## [v0.27.0](https://github.com/CosmWasm/wasmd/tree/v0.28.0) (2022-07-29) +## [v0.28.0](https://github.com/CosmWasm/wasmd/tree/v0.28.0) (2022-07-29) [Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.27.0...v0.28.0) @@ -22,6 +22,7 @@ Migration notes: The main issue here is likely "Custom" queries from a blockchain, which want to send info (eg. how many tokens were swapped). Since those custom bindings are maintained by the chain, they can use the data field to pass any deterministic information back to the contract. We recommend using JSON encoding there with some documented format the contracts can parse out easily. +* For possible non-determinism issues, we also sort all attributes in events. Better safe than sorry. ## [v0.27.0](https://github.com/CosmWasm/wasmd/tree/v0.27.0) (2022-05-19) From 960f7dae519589bc0456be86f8fc93b9adb6f4c2 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Tue, 16 Aug 2022 00:59:58 +0700 Subject: [PATCH 26/94] Update dependabot.yml --- .github/dependabot.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1c9557cc89..376c012334 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,5 +1,10 @@ version: 2 -updates: +updates: +- package-ecosystem: github-actions + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 - package-ecosystem: gomod directory: "/" schedule: From 00082a25b84e8e1e4ede623da9ec3a59b786765b Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Tue, 23 Aug 2022 17:01:04 +0200 Subject: [PATCH 27/94] Make app keepers public (#951) * use ecosystem convention for keeper names in app.go * fix linting * Revert variable renaming * Deprecate attribute access helper * Formatting only * Replace usage of deprecated test helper * Address linter report Co-authored-by: faddat --- app/app.go | 302 ++++++++++++++++---------------- app/app_test.go | 2 +- app/export.go | 51 +++--- app/sim_test.go | 2 +- app/test_access.go | 17 +- app/test_helpers.go | 10 +- x/wasm/client/cli/query.go | 4 +- x/wasm/client/cli/tx.go | 4 +- x/wasm/ibctesting/chain.go | 91 +++------- x/wasm/ibctesting/endpoint.go | 20 +-- x/wasm/ibctesting/path.go | 4 +- x/wasm/ibctesting/wasm.go | 11 +- x/wasm/ioutils/ioutil.go | 3 +- x/wasm/keeper/test_common.go | 4 +- x/wasm/relay_pingpong_test.go | 2 +- x/wasm/relay_test.go | 8 +- x/wasm/simulation/operations.go | 5 +- x/wasm/types/types.go | 9 +- 18 files changed, 253 insertions(+), 296 deletions(-) diff --git a/app/app.go b/app/app.go index 300ef7b150..23259d0d0d 100644 --- a/app/app.go +++ b/app/app.go @@ -243,33 +243,33 @@ type WasmApp struct { memKeys map[string]*sdk.MemoryStoreKey // keepers - accountKeeper authkeeper.AccountKeeper - bankKeeper bankkeeper.Keeper - capabilityKeeper *capabilitykeeper.Keeper - stakingKeeper stakingkeeper.Keeper - slashingKeeper slashingkeeper.Keeper - mintKeeper mintkeeper.Keeper - distrKeeper distrkeeper.Keeper - govKeeper govkeeper.Keeper - crisisKeeper crisiskeeper.Keeper - upgradeKeeper upgradekeeper.Keeper - paramsKeeper paramskeeper.Keeper - evidenceKeeper evidencekeeper.Keeper - ibcKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly - icaControllerKeeper icacontrollerkeeper.Keeper - icaHostKeeper icahostkeeper.Keeper - interTxKeeper intertxkeeper.Keeper - transferKeeper ibctransferkeeper.Keeper - feeGrantKeeper feegrantkeeper.Keeper - authzKeeper authzkeeper.Keeper - wasmKeeper wasm.Keeper - - scopedIBCKeeper capabilitykeeper.ScopedKeeper - scopedICAHostKeeper capabilitykeeper.ScopedKeeper - scopedICAControllerKeeper capabilitykeeper.ScopedKeeper - scopedInterTxKeeper capabilitykeeper.ScopedKeeper - scopedTransferKeeper capabilitykeeper.ScopedKeeper - scopedWasmKeeper capabilitykeeper.ScopedKeeper + AccountKeeper authkeeper.AccountKeeper + BankKeeper bankkeeper.Keeper + CapabilityKeeper *capabilitykeeper.Keeper + StakingKeeper stakingkeeper.Keeper + SlashingKeeper slashingkeeper.Keeper + MintKeeper mintkeeper.Keeper + DistrKeeper distrkeeper.Keeper + GovKeeper govkeeper.Keeper + CrisisKeeper crisiskeeper.Keeper + UpgradeKeeper upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper + EvidenceKeeper evidencekeeper.Keeper + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + ICAControllerKeeper icacontrollerkeeper.Keeper + ICAHostKeeper icahostkeeper.Keeper + InterTxKeeper intertxkeeper.Keeper + TransferKeeper ibctransferkeeper.Keeper + FeeGrantKeeper feegrantkeeper.Keeper + AuthzKeeper authzkeeper.Keeper + WasmKeeper wasm.Keeper + + ScopedIBCKeeper capabilitykeeper.ScopedKeeper + ScopedICAHostKeeper capabilitykeeper.ScopedKeeper + ScopedICAControllerKeeper capabilitykeeper.ScopedKeeper + ScopedInterTxKeeper capabilitykeeper.ScopedKeeper + ScopedTransferKeeper capabilitykeeper.ScopedKeeper + ScopedWasmKeeper capabilitykeeper.ScopedKeeper // the module manager mm *module.Manager @@ -324,7 +324,7 @@ func NewWasmApp( memKeys: memKeys, } - app.paramsKeeper = initParamsKeeper( + app.ParamsKeeper = initParamsKeeper( appCodec, legacyAmino, keys[paramstypes.StoreKey], @@ -332,86 +332,86 @@ func NewWasmApp( ) // set the BaseApp's parameter store - bApp.SetParamStore(app.paramsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable())) + bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable())) // add capability keeper and ScopeToModule for ibc module - app.capabilityKeeper = capabilitykeeper.NewKeeper( + app.CapabilityKeeper = capabilitykeeper.NewKeeper( appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey], ) - scopedIBCKeeper := app.capabilityKeeper.ScopeToModule(ibchost.ModuleName) - scopedICAHostKeeper := app.capabilityKeeper.ScopeToModule(icahosttypes.SubModuleName) - scopedICAControllerKeeper := app.capabilityKeeper.ScopeToModule(icacontrollertypes.SubModuleName) - scopedInterTxKeeper := app.capabilityKeeper.ScopeToModule(intertxtypes.ModuleName) - scopedTransferKeeper := app.capabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) - scopedWasmKeeper := app.capabilityKeeper.ScopeToModule(wasm.ModuleName) - app.capabilityKeeper.Seal() + scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName) + scopedICAHostKeeper := app.CapabilityKeeper.ScopeToModule(icahosttypes.SubModuleName) + scopedICAControllerKeeper := app.CapabilityKeeper.ScopeToModule(icacontrollertypes.SubModuleName) + scopedInterTxKeeper := app.CapabilityKeeper.ScopeToModule(intertxtypes.ModuleName) + scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) + scopedWasmKeeper := app.CapabilityKeeper.ScopeToModule(wasm.ModuleName) + app.CapabilityKeeper.Seal() // add keepers - app.accountKeeper = authkeeper.NewAccountKeeper( + app.AccountKeeper = authkeeper.NewAccountKeeper( appCodec, keys[authtypes.StoreKey], app.getSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, ) - app.bankKeeper = bankkeeper.NewBaseKeeper( + app.BankKeeper = bankkeeper.NewBaseKeeper( appCodec, keys[banktypes.StoreKey], - app.accountKeeper, + app.AccountKeeper, app.getSubspace(banktypes.ModuleName), app.ModuleAccountAddrs(), ) - app.authzKeeper = authzkeeper.NewKeeper( + app.AuthzKeeper = authzkeeper.NewKeeper( keys[authzkeeper.StoreKey], appCodec, app.BaseApp.MsgServiceRouter(), ) - app.feeGrantKeeper = feegrantkeeper.NewKeeper( + app.FeeGrantKeeper = feegrantkeeper.NewKeeper( appCodec, keys[feegrant.StoreKey], - app.accountKeeper, + app.AccountKeeper, ) stakingKeeper := stakingkeeper.NewKeeper( appCodec, keys[stakingtypes.StoreKey], - app.accountKeeper, - app.bankKeeper, + app.AccountKeeper, + app.BankKeeper, app.getSubspace(stakingtypes.ModuleName), ) - app.mintKeeper = mintkeeper.NewKeeper( + app.MintKeeper = mintkeeper.NewKeeper( appCodec, keys[minttypes.StoreKey], app.getSubspace(minttypes.ModuleName), &stakingKeeper, - app.accountKeeper, - app.bankKeeper, + app.AccountKeeper, + app.BankKeeper, authtypes.FeeCollectorName, ) - app.distrKeeper = distrkeeper.NewKeeper( + app.DistrKeeper = distrkeeper.NewKeeper( appCodec, keys[distrtypes.StoreKey], app.getSubspace(distrtypes.ModuleName), - app.accountKeeper, - app.bankKeeper, + app.AccountKeeper, + app.BankKeeper, &stakingKeeper, authtypes.FeeCollectorName, app.ModuleAccountAddrs(), ) - app.slashingKeeper = slashingkeeper.NewKeeper( + app.SlashingKeeper = slashingkeeper.NewKeeper( appCodec, keys[slashingtypes.StoreKey], &stakingKeeper, app.getSubspace(slashingtypes.ModuleName), ) - app.crisisKeeper = crisiskeeper.NewKeeper( + app.CrisisKeeper = crisiskeeper.NewKeeper( app.getSubspace(crisistypes.ModuleName), invCheckPeriod, - app.bankKeeper, + app.BankKeeper, authtypes.FeeCollectorName, ) - app.upgradeKeeper = upgradekeeper.NewKeeper( + app.UpgradeKeeper = upgradekeeper.NewKeeper( skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, @@ -421,16 +421,16 @@ func NewWasmApp( // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks - app.stakingKeeper = *stakingKeeper.SetHooks( - stakingtypes.NewMultiStakingHooks(app.distrKeeper.Hooks(), app.slashingKeeper.Hooks()), + app.StakingKeeper = *stakingKeeper.SetHooks( + stakingtypes.NewMultiStakingHooks(app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks()), ) - app.ibcKeeper = ibckeeper.NewKeeper( + app.IBCKeeper = ibckeeper.NewKeeper( appCodec, keys[ibchost.StoreKey], app.getSubspace(ibchost.ModuleName), - app.stakingKeeper, - app.upgradeKeeper, + app.StakingKeeper, + app.UpgradeKeeper, scopedIBCKeeper, ) @@ -438,66 +438,66 @@ func NewWasmApp( govRouter := govtypes.NewRouter() govRouter. AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). - AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.paramsKeeper)). - AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.distrKeeper)). - AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.upgradeKeeper)). - AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(app.ibcKeeper.ClientKeeper)) + AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). + AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). + AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)). + AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)) // Create Transfer Keepers - app.transferKeeper = ibctransferkeeper.NewKeeper( + app.TransferKeeper = ibctransferkeeper.NewKeeper( appCodec, keys[ibctransfertypes.StoreKey], app.getSubspace(ibctransfertypes.ModuleName), - app.ibcKeeper.ChannelKeeper, - app.ibcKeeper.ChannelKeeper, - &app.ibcKeeper.PortKeeper, - app.accountKeeper, - app.bankKeeper, + app.IBCKeeper.ChannelKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + app.AccountKeeper, + app.BankKeeper, scopedTransferKeeper, ) - transferModule := transfer.NewAppModule(app.transferKeeper) - transferIBCModule := transfer.NewIBCModule(app.transferKeeper) + transferModule := transfer.NewAppModule(app.TransferKeeper) + transferIBCModule := transfer.NewIBCModule(app.TransferKeeper) - app.icaHostKeeper = icahostkeeper.NewKeeper( + app.ICAHostKeeper = icahostkeeper.NewKeeper( appCodec, keys[icahosttypes.StoreKey], app.getSubspace(icahosttypes.SubModuleName), - app.ibcKeeper.ChannelKeeper, - &app.ibcKeeper.PortKeeper, - app.accountKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + app.AccountKeeper, scopedICAHostKeeper, app.MsgServiceRouter(), ) - app.icaControllerKeeper = icacontrollerkeeper.NewKeeper( + app.ICAControllerKeeper = icacontrollerkeeper.NewKeeper( appCodec, keys[icacontrollertypes.StoreKey], app.getSubspace(icacontrollertypes.SubModuleName), - app.ibcKeeper.ChannelKeeper, // may be replaced with middleware such as ics29 fee - app.ibcKeeper.ChannelKeeper, - &app.ibcKeeper.PortKeeper, + app.IBCKeeper.ChannelKeeper, // may be replaced with middleware such as ics29 fee + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, scopedICAControllerKeeper, app.MsgServiceRouter(), ) - icaModule := ica.NewAppModule(&app.icaControllerKeeper, &app.icaHostKeeper) - icaHostIBCModule := icahost.NewIBCModule(app.icaHostKeeper) + icaModule := ica.NewAppModule(&app.ICAControllerKeeper, &app.ICAHostKeeper) + icaHostIBCModule := icahost.NewIBCModule(app.ICAHostKeeper) // For wasmd we use the demo controller from https://github.com/cosmos/interchain-accounts but see notes below - app.interTxKeeper = intertxkeeper.NewKeeper(appCodec, keys[intertxtypes.StoreKey], app.icaControllerKeeper, scopedInterTxKeeper) + app.InterTxKeeper = intertxkeeper.NewKeeper(appCodec, keys[intertxtypes.StoreKey], app.ICAControllerKeeper, scopedInterTxKeeper) // Note: please do your research before using this in production app, this is a demo and not an officially // supported IBC team implementation. Do your own research before using it. - interTxModule := intertx.NewAppModule(appCodec, app.interTxKeeper) - interTxIBCModule := intertx.NewIBCModule(app.interTxKeeper) + interTxModule := intertx.NewAppModule(appCodec, app.InterTxKeeper) + interTxIBCModule := intertx.NewIBCModule(app.InterTxKeeper) // You will likely want to swap out the second argument with your own reviewed and maintained ica auth module - icaControllerIBCModule := icacontroller.NewIBCModule(app.icaControllerKeeper, interTxIBCModule) + icaControllerIBCModule := icacontroller.NewIBCModule(app.ICAControllerKeeper, interTxIBCModule) // create evidence keeper with router evidenceKeeper := evidencekeeper.NewKeeper( appCodec, keys[evidencetypes.StoreKey], - &app.stakingKeeper, - app.slashingKeeper, + &app.StakingKeeper, + app.SlashingKeeper, ) - app.evidenceKeeper = *evidenceKeeper + app.EvidenceKeeper = *evidenceKeeper wasmDir := filepath.Join(homePath, "wasm") wasmConfig, err := wasm.ReadWasmConfig(appOpts) @@ -508,18 +508,18 @@ func NewWasmApp( // The last arguments can contain custom message handlers, and custom query handlers, // if we want to allow any custom callbacks supportedFeatures := "iterator,staking,stargate" - app.wasmKeeper = wasm.NewKeeper( + app.WasmKeeper = wasm.NewKeeper( appCodec, keys[wasm.StoreKey], app.getSubspace(wasm.ModuleName), - app.accountKeeper, - app.bankKeeper, - app.stakingKeeper, - app.distrKeeper, - app.ibcKeeper.ChannelKeeper, - &app.ibcKeeper.PortKeeper, + app.AccountKeeper, + app.BankKeeper, + app.StakingKeeper, + app.DistrKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, scopedWasmKeeper, - app.transferKeeper, + app.TransferKeeper, app.MsgServiceRouter(), app.GRPCQueryRouter(), wasmDir, @@ -533,22 +533,22 @@ func NewWasmApp( // The gov proposal types can be individually enabled if len(enabledProposals) != 0 { - govRouter.AddRoute(wasm.RouterKey, wasm.NewWasmProposalHandler(app.wasmKeeper, enabledProposals)) + govRouter.AddRoute(wasm.RouterKey, wasm.NewWasmProposalHandler(app.WasmKeeper, enabledProposals)) } ibcRouter. - AddRoute(wasm.ModuleName, wasm.NewIBCHandler(app.wasmKeeper, app.ibcKeeper.ChannelKeeper)). + AddRoute(wasm.ModuleName, wasm.NewIBCHandler(app.WasmKeeper, app.IBCKeeper.ChannelKeeper)). AddRoute(ibctransfertypes.ModuleName, transferIBCModule). AddRoute(icacontrollertypes.SubModuleName, icaControllerIBCModule). AddRoute(icahosttypes.SubModuleName, icaHostIBCModule). AddRoute(intertxtypes.ModuleName, icaControllerIBCModule) - app.ibcKeeper.SetRouter(ibcRouter) + app.IBCKeeper.SetRouter(ibcRouter) - app.govKeeper = govkeeper.NewKeeper( + app.GovKeeper = govkeeper.NewKeeper( appCodec, keys[govtypes.StoreKey], app.getSubspace(govtypes.ModuleName), - app.accountKeeper, - app.bankKeeper, + app.AccountKeeper, + app.BankKeeper, &stakingKeeper, govRouter, ) @@ -562,31 +562,31 @@ func NewWasmApp( // must be passed by reference here. app.mm = module.NewManager( genutil.NewAppModule( - app.accountKeeper, - app.stakingKeeper, + app.AccountKeeper, + app.StakingKeeper, app.BaseApp.DeliverTx, encodingConfig.TxConfig, ), - auth.NewAppModule(appCodec, app.accountKeeper, nil), - vesting.NewAppModule(app.accountKeeper, app.bankKeeper), - bank.NewAppModule(appCodec, app.bankKeeper, app.accountKeeper), - capability.NewAppModule(appCodec, *app.capabilityKeeper), - gov.NewAppModule(appCodec, app.govKeeper, app.accountKeeper, app.bankKeeper), - mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper), - slashing.NewAppModule(appCodec, app.slashingKeeper, app.accountKeeper, app.bankKeeper, app.stakingKeeper), - distr.NewAppModule(appCodec, app.distrKeeper, app.accountKeeper, app.bankKeeper, app.stakingKeeper), - staking.NewAppModule(appCodec, app.stakingKeeper, app.accountKeeper, app.bankKeeper), - upgrade.NewAppModule(app.upgradeKeeper), - wasm.NewAppModule(appCodec, &app.wasmKeeper, app.stakingKeeper, app.accountKeeper, app.bankKeeper), - evidence.NewAppModule(app.evidenceKeeper), - feegrantmodule.NewAppModule(appCodec, app.accountKeeper, app.bankKeeper, app.feeGrantKeeper, app.interfaceRegistry), - authzmodule.NewAppModule(appCodec, app.authzKeeper, app.accountKeeper, app.bankKeeper, app.interfaceRegistry), - ibc.NewAppModule(app.ibcKeeper), - params.NewAppModule(app.paramsKeeper), + auth.NewAppModule(appCodec, app.AccountKeeper, nil), + vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), + capability.NewAppModule(appCodec, *app.CapabilityKeeper), + gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + upgrade.NewAppModule(app.UpgradeKeeper), + wasm.NewAppModule(appCodec, &app.WasmKeeper, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + evidence.NewAppModule(app.EvidenceKeeper), + feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), + authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + ibc.NewAppModule(app.IBCKeeper), + params.NewAppModule(app.ParamsKeeper), transferModule, icaModule, interTxModule, - crisis.NewAppModule(&app.crisisKeeper, skipGenesisInvariants), // always be last to make sure that it checks for all invariants and not only part of them + crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), // always be last to make sure that it checks for all invariants and not only part of them ) // During begin block slashing happens after distr.BeginBlocker so that @@ -679,7 +679,7 @@ func NewWasmApp( // Uncomment if you want to set a custom migration order here. // app.mm.SetOrderMigrations(custom order) - app.mm.RegisterInvariants(&app.crisisKeeper) + app.mm.RegisterInvariants(&app.CrisisKeeper) app.mm.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) @@ -690,20 +690,20 @@ func NewWasmApp( // NOTE: this is not required apps that don't use the simulator for fuzz testing // transactions app.sm = module.NewSimulationManager( - auth.NewAppModule(appCodec, app.accountKeeper, authsims.RandomGenesisAccounts), - bank.NewAppModule(appCodec, app.bankKeeper, app.accountKeeper), - capability.NewAppModule(appCodec, *app.capabilityKeeper), - feegrantmodule.NewAppModule(appCodec, app.accountKeeper, app.bankKeeper, app.feeGrantKeeper, app.interfaceRegistry), - authzmodule.NewAppModule(appCodec, app.authzKeeper, app.accountKeeper, app.bankKeeper, app.interfaceRegistry), - gov.NewAppModule(appCodec, app.govKeeper, app.accountKeeper, app.bankKeeper), - mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper), - staking.NewAppModule(appCodec, app.stakingKeeper, app.accountKeeper, app.bankKeeper), - distr.NewAppModule(appCodec, app.distrKeeper, app.accountKeeper, app.bankKeeper, app.stakingKeeper), - slashing.NewAppModule(appCodec, app.slashingKeeper, app.accountKeeper, app.bankKeeper, app.stakingKeeper), - params.NewAppModule(app.paramsKeeper), - evidence.NewAppModule(app.evidenceKeeper), - wasm.NewAppModule(appCodec, &app.wasmKeeper, app.stakingKeeper, app.accountKeeper, app.bankKeeper), - ibc.NewAppModule(app.ibcKeeper), + auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), + capability.NewAppModule(appCodec, *app.CapabilityKeeper), + feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), + authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), + staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + params.NewAppModule(app.ParamsKeeper), + evidence.NewAppModule(app.EvidenceKeeper), + wasm.NewAppModule(appCodec, &app.WasmKeeper, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + ibc.NewAppModule(app.IBCKeeper), transferModule, ) @@ -716,13 +716,13 @@ func NewWasmApp( anteHandler, err := NewAnteHandler( HandlerOptions{ HandlerOptions: ante.HandlerOptions{ - AccountKeeper: app.accountKeeper, - BankKeeper: app.bankKeeper, - FeegrantKeeper: app.feeGrantKeeper, + AccountKeeper: app.AccountKeeper, + BankKeeper: app.BankKeeper, + FeegrantKeeper: app.FeeGrantKeeper, SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), SigGasConsumer: ante.DefaultSigVerificationGasConsumer, }, - IBCKeeper: app.ibcKeeper, + IBCKeeper: app.IBCKeeper, WasmConfig: &wasmConfig, TXCounterStoreKey: keys[wasm.StoreKey], }, @@ -741,19 +741,19 @@ func NewWasmApp( // see cmd/wasmd/root.go: 206 - 214 approx if manager := app.SnapshotManager(); manager != nil { err := manager.RegisterExtensions( - wasmkeeper.NewWasmSnapshotter(app.CommitMultiStore(), &app.wasmKeeper), + wasmkeeper.NewWasmSnapshotter(app.CommitMultiStore(), &app.WasmKeeper), ) if err != nil { panic(fmt.Errorf("failed to register snapshot extension: %s", err)) } } - app.scopedIBCKeeper = scopedIBCKeeper - app.scopedTransferKeeper = scopedTransferKeeper - app.scopedWasmKeeper = scopedWasmKeeper - app.scopedICAHostKeeper = scopedICAHostKeeper - app.scopedICAControllerKeeper = scopedICAControllerKeeper - app.scopedInterTxKeeper = scopedInterTxKeeper + app.ScopedIBCKeeper = scopedIBCKeeper + app.ScopedTransferKeeper = scopedTransferKeeper + app.ScopedWasmKeeper = scopedWasmKeeper + app.ScopedICAHostKeeper = scopedICAHostKeeper + app.ScopedICAControllerKeeper = scopedICAControllerKeeper + app.ScopedInterTxKeeper = scopedInterTxKeeper if loadLatest { if err := app.LoadLatestVersion(); err != nil { @@ -762,7 +762,7 @@ func NewWasmApp( ctx := app.BaseApp.NewUncachedContext(true, tmproto.Header{}) // Initialize pinned codes in wasmvm as they are not persisted there - if err := app.wasmKeeper.InitializePinnedCodes(ctx); err != nil { + if err := app.WasmKeeper.InitializePinnedCodes(ctx); err != nil { tmos.Exit(fmt.Sprintf("failed initialize pinned codes %s", err)) } } @@ -790,7 +790,7 @@ func (app *WasmApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci panic(err) } - app.upgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap()) + app.UpgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap()) return app.mm.InitGenesis(ctx, app.appCodec, genesisState) } @@ -822,7 +822,7 @@ func (app *WasmApp) LegacyAmino() *codec.LegacyAmino { //nolint:staticcheck // // NOTE: This is solely to be used for testing purposes. func (app *WasmApp) getSubspace(moduleName string) paramstypes.Subspace { - subspace, _ := app.paramsKeeper.GetSubspace(moduleName) + subspace, _ := app.ParamsKeeper.GetSubspace(moduleName) return subspace } diff --git a/app/app_test.go b/app/app_test.go index a3bd66ab6f..9a5ec80f88 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -47,7 +47,7 @@ func TestBlockedAddrs(t *testing.T) { for acc := range maccPerms { t.Run(acc, func(t *testing.T) { - require.True(t, gapp.bankKeeper.BlockedAddr(gapp.accountKeeper.GetModuleAddress(acc)), + require.True(t, gapp.BankKeeper.BlockedAddr(gapp.AccountKeeper.GetModuleAddress(acc)), "ensure that blocked addresses are properly set in bank keeper", ) }) diff --git a/app/export.go b/app/export.go index 4740592806..c494a9b6da 100644 --- a/app/export.go +++ b/app/export.go @@ -35,7 +35,7 @@ func (app *WasmApp) ExportAppStateAndValidators( return servertypes.ExportedApp{}, err } - validators, err := staking.WriteValidators(ctx, app.stakingKeeper) + validators, err := staking.WriteValidators(ctx, app.StakingKeeper) return servertypes.ExportedApp{ AppState: appState, Validators: validators, @@ -46,7 +46,8 @@ func (app *WasmApp) ExportAppStateAndValidators( // prepare for fresh start at zero height // NOTE zero height genesis is a temporary feature which will be deprecated -// in favour of export at a block height +// +// in favour of export at a block height func (app *WasmApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []string) { applyAllowedAddrs := false @@ -66,18 +67,18 @@ func (app *WasmApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [ } /* Just to be safe, assert the invariants on current state. */ - app.crisisKeeper.AssertInvariants(ctx) + app.CrisisKeeper.AssertInvariants(ctx) /* Handle fee distribution state. */ // withdraw all validator commission - app.stakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { - _, _ = app.distrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator()) //nolint:errcheck + app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { + _, _ = app.DistrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator()) //nolint:errcheck return false }) // withdraw all delegator rewards - dels := app.stakingKeeper.GetAllDelegations(ctx) + dels := app.StakingKeeper.GetAllDelegations(ctx) for _, delegation := range dels { valAddr, err := sdk.ValAddressFromBech32(delegation.ValidatorAddress) if err != nil { @@ -88,28 +89,28 @@ func (app *WasmApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [ if err != nil { panic(err) } - _, _ = app.distrKeeper.WithdrawDelegationRewards(ctx, delAddr, valAddr) //nolint:errcheck + _, _ = app.DistrKeeper.WithdrawDelegationRewards(ctx, delAddr, valAddr) //nolint:errcheck } // clear validator slash events - app.distrKeeper.DeleteAllValidatorSlashEvents(ctx) + app.DistrKeeper.DeleteAllValidatorSlashEvents(ctx) // clear validator historical rewards - app.distrKeeper.DeleteAllValidatorHistoricalRewards(ctx) + app.DistrKeeper.DeleteAllValidatorHistoricalRewards(ctx) // set context height to zero height := ctx.BlockHeight() ctx = ctx.WithBlockHeight(0) // reinitialize all validators - app.stakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { + app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { // donate any unwithdrawn outstanding reward fraction tokens to the community pool - scraps := app.distrKeeper.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator()) - feePool := app.distrKeeper.GetFeePool(ctx) + scraps := app.DistrKeeper.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator()) + feePool := app.DistrKeeper.GetFeePool(ctx) feePool.CommunityPool = feePool.CommunityPool.Add(scraps...) - app.distrKeeper.SetFeePool(ctx, feePool) + app.DistrKeeper.SetFeePool(ctx, feePool) - app.distrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) + app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) return false }) @@ -123,8 +124,8 @@ func (app *WasmApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [ if err != nil { panic(err) } - app.distrKeeper.Hooks().BeforeDelegationCreated(ctx, delAddr, valAddr) - app.distrKeeper.Hooks().AfterDelegationModified(ctx, delAddr, valAddr) + app.DistrKeeper.Hooks().BeforeDelegationCreated(ctx, delAddr, valAddr) + app.DistrKeeper.Hooks().AfterDelegationModified(ctx, delAddr, valAddr) } // reset context height @@ -133,20 +134,20 @@ func (app *WasmApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [ /* Handle staking state. */ // iterate through redelegations, reset creation height - app.stakingKeeper.IterateRedelegations(ctx, func(_ int64, red stakingtypes.Redelegation) (stop bool) { + app.StakingKeeper.IterateRedelegations(ctx, func(_ int64, red stakingtypes.Redelegation) (stop bool) { for i := range red.Entries { red.Entries[i].CreationHeight = 0 } - app.stakingKeeper.SetRedelegation(ctx, red) + app.StakingKeeper.SetRedelegation(ctx, red) return false }) // iterate through unbonding delegations, reset creation height - app.stakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) (stop bool) { + app.StakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) (stop bool) { for i := range ubd.Entries { ubd.Entries[i].CreationHeight = 0 } - app.stakingKeeper.SetUnbondingDelegation(ctx, ubd) + app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) return false }) @@ -158,7 +159,7 @@ func (app *WasmApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [ for ; iter.Valid(); iter.Next() { addr := sdk.ValAddress(iter.Key()[1:]) - validator, found := app.stakingKeeper.GetValidator(ctx, addr) + validator, found := app.StakingKeeper.GetValidator(ctx, addr) if !found { panic("expected validator, not found") } @@ -168,13 +169,13 @@ func (app *WasmApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [ validator.Jailed = true } - app.stakingKeeper.SetValidator(ctx, validator) + app.StakingKeeper.SetValidator(ctx, validator) counter++ } iter.Close() - _, err := app.stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + _, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) if err != nil { log.Fatal(err) } @@ -182,11 +183,11 @@ func (app *WasmApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [ /* Handle slashing state. */ // reset start height on signing infos - app.slashingKeeper.IterateValidatorSigningInfos( + app.SlashingKeeper.IterateValidatorSigningInfos( ctx, func(addr sdk.ConsAddress, info slashingtypes.ValidatorSigningInfo) (stop bool) { info.StartHeight = 0 - app.slashingKeeper.SetValidatorSigningInfo(ctx, addr, info) + app.SlashingKeeper.SetValidatorSigningInfo(ctx, addr, info) return false }, ) diff --git a/app/sim_test.go b/app/sim_test.go index d64488de40..41f729099e 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -213,7 +213,7 @@ func TestAppImportExport(t *testing.T) { normalizeContractInfo := func(ctx sdk.Context, app *WasmApp) { var index uint64 - app.wasmKeeper.IterateContractInfo(ctx, func(address sdk.AccAddress, info wasmtypes.ContractInfo) bool { + app.WasmKeeper.IterateContractInfo(ctx, func(address sdk.AccAddress, info wasmtypes.ContractInfo) bool { created := &wasmtypes.AbsoluteTxPosition{ BlockHeight: uint64(0), TxIndex: index, diff --git a/app/test_access.go b/app/test_access.go index 6dadec1e0c..d992a89602 100644 --- a/app/test_access.go +++ b/app/test_access.go @@ -18,6 +18,7 @@ import ( "github.com/CosmWasm/wasmd/x/wasm" ) +// Deprecated: use public app attributes directly type TestSupport struct { t testing.TB app *WasmApp @@ -28,11 +29,11 @@ func NewTestSupport(t testing.TB, app *WasmApp) *TestSupport { } func (s TestSupport) IBCKeeper() *ibckeeper.Keeper { - return s.app.ibcKeeper + return s.app.IBCKeeper } func (s TestSupport) WasmKeeper() wasm.Keeper { - return s.app.wasmKeeper + return s.app.WasmKeeper } func (s TestSupport) AppCodec() codec.Codec { @@ -40,27 +41,27 @@ func (s TestSupport) AppCodec() codec.Codec { } func (s TestSupport) ScopedWasmIBCKeeper() capabilitykeeper.ScopedKeeper { - return s.app.scopedWasmKeeper + return s.app.ScopedWasmKeeper } func (s TestSupport) ScopeIBCKeeper() capabilitykeeper.ScopedKeeper { - return s.app.scopedIBCKeeper + return s.app.ScopedIBCKeeper } func (s TestSupport) ScopedTransferKeeper() capabilitykeeper.ScopedKeeper { - return s.app.scopedTransferKeeper + return s.app.ScopedTransferKeeper } func (s TestSupport) StakingKeeper() stakingkeeper.Keeper { - return s.app.stakingKeeper + return s.app.StakingKeeper } func (s TestSupport) BankKeeper() bankkeeper.Keeper { - return s.app.bankKeeper + return s.app.BankKeeper } func (s TestSupport) TransferKeeper() ibctransferkeeper.Keeper { - return s.app.transferKeeper + return s.app.TransferKeeper } func (s TestSupport) GetBaseApp() *baseapp.BaseApp { diff --git a/app/test_helpers.go b/app/test_helpers.go index 11e72135b3..cf3de89a82 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -201,7 +201,7 @@ func createIncrementalAccounts(accNum int) []sdk.AccAddress { // AddTestAddrsFromPubKeys adds the addresses into the WasmApp providing only the public keys. func AddTestAddrsFromPubKeys(app *WasmApp, ctx sdk.Context, pubKeys []cryptotypes.PubKey, accAmt sdk.Int) { - initCoins := sdk.NewCoins(sdk.NewCoin(app.stakingKeeper.BondDenom(ctx), accAmt)) + initCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), accAmt)) for _, pk := range pubKeys { initAccountWithCoins(app, ctx, sdk.AccAddress(pk.Address()), initCoins) @@ -223,7 +223,7 @@ func AddTestAddrsIncremental(app *WasmApp, ctx sdk.Context, accNum int, accAmt s func addTestAddrs(app *WasmApp, ctx sdk.Context, accNum int, accAmt sdk.Int, strategy GenerateAccountStrategy) []sdk.AccAddress { testAddrs := strategy(accNum) - initCoins := sdk.NewCoins(sdk.NewCoin(app.stakingKeeper.BondDenom(ctx), accAmt)) + initCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), accAmt)) // fill all the addresses with some coins, set the loose pool tokens simultaneously for _, addr := range testAddrs { @@ -234,12 +234,12 @@ func addTestAddrs(app *WasmApp, ctx sdk.Context, accNum int, accAmt sdk.Int, str } func initAccountWithCoins(app *WasmApp, ctx sdk.Context, addr sdk.AccAddress, coins sdk.Coins) { - err := app.bankKeeper.MintCoins(ctx, minttypes.ModuleName, coins) + err := app.BankKeeper.MintCoins(ctx, minttypes.ModuleName, coins) if err != nil { panic(err) } - err = app.bankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr, coins) + err = app.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr, coins) if err != nil { panic(err) } @@ -280,7 +280,7 @@ func TestAddr(addr string, bech string) (sdk.AccAddress, error) { // CheckBalance checks the balance of an account. func CheckBalance(t *testing.T, app *WasmApp, addr sdk.AccAddress, balances sdk.Coins) { ctxCheck := app.BaseApp.NewContext(true, tmproto.Header{}) - require.True(t, balances.IsEqual(app.bankKeeper.GetAllBalances(ctxCheck, addr))) + require.True(t, balances.IsEqual(app.BankKeeper.GetAllBalances(ctxCheck, addr))) } const DefaultGas = 1200000 diff --git a/x/wasm/client/cli/query.go b/x/wasm/client/cli/query.go index 49cea64ea4..e7a21167af 100644 --- a/x/wasm/client/cli/query.go +++ b/x/wasm/client/cli/query.go @@ -7,7 +7,7 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "os" "strconv" wasmvm "github.com/CosmWasm/wasmvm" @@ -174,7 +174,7 @@ func GetCmdQueryCode() *cobra.Command { } fmt.Printf("Downloading wasm code to %s\n", args[1]) - return ioutil.WriteFile(args[1], res.Data, 0o600) + return os.WriteFile(args[1], res.Data, 0o600) }, } flags.AddQueryFlagsToCmd(cmd) diff --git a/x/wasm/client/cli/tx.go b/x/wasm/client/cli/tx.go index 8f3203ea68..662758abcc 100644 --- a/x/wasm/client/cli/tx.go +++ b/x/wasm/client/cli/tx.go @@ -3,7 +3,7 @@ package cli import ( "errors" "fmt" - "io/ioutil" + "os" "strconv" "github.com/cosmos/cosmos-sdk/client" @@ -81,7 +81,7 @@ func StoreCodeCmd() *cobra.Command { } func parseStoreCodeArgs(file string, sender sdk.AccAddress, flags *flag.FlagSet) (types.MsgStoreCode, error) { - wasm, err := ioutil.ReadFile(file) + wasm, err := os.ReadFile(file) if err != nil { return types.MsgStoreCode{}, err } diff --git a/x/wasm/ibctesting/chain.go b/x/wasm/ibctesting/chain.go index 16f46b7b32..b5e99f962a 100644 --- a/x/wasm/ibctesting/chain.go +++ b/x/wasm/ibctesting/chain.go @@ -6,7 +6,6 @@ import ( "testing" "time" - "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" @@ -17,7 +16,6 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/cosmos/cosmos-sdk/x/staking/teststaking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" @@ -25,10 +23,8 @@ import ( commitmenttypes "github.com/cosmos/ibc-go/v3/modules/core/23-commitment/types" host "github.com/cosmos/ibc-go/v3/modules/core/24-host" "github.com/cosmos/ibc-go/v3/modules/core/exported" - ibckeeper "github.com/cosmos/ibc-go/v3/modules/core/keeper" "github.com/cosmos/ibc-go/v3/modules/core/types" ibctmtypes "github.com/cosmos/ibc-go/v3/modules/light-clients/07-tendermint/types" - ibctesting "github.com/cosmos/ibc-go/v3/testing" "github.com/cosmos/ibc-go/v3/testing/mock" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" @@ -38,7 +34,9 @@ import ( tmtypes "github.com/tendermint/tendermint/types" tmversion "github.com/tendermint/tendermint/version" - wasmd "github.com/CosmWasm/wasmd/app" + "github.com/CosmWasm/wasmd/app" + "github.com/CosmWasm/wasmd/app/params" + "github.com/CosmWasm/wasmd/x/wasm" ) @@ -51,7 +49,7 @@ type TestChain struct { t *testing.T Coordinator *Coordinator - App ibctesting.TestingApp + App *app.WasmApp ChainID string LastHeader *ibctmtypes.Header // header for last block height committed CurrentHeader tmproto.Header // header for current block height @@ -104,7 +102,7 @@ func NewTestChain(t *testing.T, coord *Coordinator, chainID string, opts ...wasm Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, amount)), } - app := NewTestingAppDecorator(t, wasmd.SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, opts, balance)) + wasmApp := app.SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, opts, balance) // create current header and call begin block header := tmproto.Header{ @@ -113,18 +111,18 @@ func NewTestChain(t *testing.T, coord *Coordinator, chainID string, opts ...wasm Time: coord.CurrentTime.UTC(), } - txConfig := app.GetTxConfig() + txConfig := params.MakeEncodingConfig().TxConfig // create an account to send transactions from chain := &TestChain{ t: t, Coordinator: coord, ChainID: chainID, - App: app, + App: wasmApp, CurrentHeader: header, - QueryServer: app.GetIBCKeeper(), + QueryServer: wasmApp.IBCKeeper, TxConfig: txConfig, - Codec: app.AppCodec(), + Codec: wasmApp.AppCodec(), Vals: valSet, Signers: signers, senderPrivKey: senderPrivKey, @@ -138,7 +136,7 @@ func NewTestChain(t *testing.T, coord *Coordinator, chainID string, opts ...wasm // GetContext returns the current context for the application. func (chain *TestChain) GetContext() sdk.Context { - return chain.App.GetBaseApp().NewContext(false, chain.CurrentHeader) + return chain.App.BaseApp.NewContext(false, chain.CurrentHeader) } // QueryProof performs an abci query with the given key and returns the proto encoded merkle proof @@ -244,10 +242,10 @@ func (chain *TestChain) SendMsgs(msgs ...sdk.Msg) (*sdk.Result, error) { // ensure the chain has the latest time chain.Coordinator.UpdateTimeForChain(chain) - _, r, err := wasmd.SignAndDeliver( + _, r, err := app.SignAndDeliver( chain.t, chain.TxConfig, - chain.App.GetBaseApp(), + chain.App.BaseApp, chain.GetContext().BlockHeader(), msgs, chain.ChainID, @@ -291,7 +289,7 @@ func (chain *TestChain) captureIBCEvents(r *sdk.Result) { // GetClientState retrieves the client state for the provided clientID. The client is // expected to exist otherwise testing will fail. func (chain *TestChain) GetClientState(clientID string) exported.ClientState { - clientState, found := chain.App.GetIBCKeeper().ClientKeeper.GetClientState(chain.GetContext(), clientID) + clientState, found := chain.App.IBCKeeper.ClientKeeper.GetClientState(chain.GetContext(), clientID) require.True(chain.t, found) return clientState @@ -300,13 +298,13 @@ func (chain *TestChain) GetClientState(clientID string) exported.ClientState { // GetConsensusState retrieves the consensus state for the provided clientID and height. // It will return a success boolean depending on if consensus state exists or not. func (chain *TestChain) GetConsensusState(clientID string, height exported.Height) (exported.ConsensusState, bool) { - return chain.App.GetIBCKeeper().ClientKeeper.GetClientConsensusState(chain.GetContext(), clientID, height) + return chain.App.IBCKeeper.ClientKeeper.GetClientConsensusState(chain.GetContext(), clientID, height) } // GetValsAtHeight will return the validator set of the chain at a given height. It will return // a success boolean depending on if the validator set exists or not at that height. func (chain *TestChain) GetValsAtHeight(height int64) (*tmtypes.ValidatorSet, bool) { - histInfo, ok := chain.App.GetStakingKeeper().GetHistoricalInfo(chain.GetContext(), height) + histInfo, ok := chain.App.StakingKeeper.GetHistoricalInfo(chain.GetContext(), height) if !ok { return nil, false } @@ -323,7 +321,7 @@ func (chain *TestChain) GetValsAtHeight(height int64) (*tmtypes.ValidatorSet, bo // GetAcknowledgement retrieves an acknowledgement for the provided packet. If the // acknowledgement does not exist then testing will fail. func (chain *TestChain) GetAcknowledgement(packet exported.PacketI) []byte { - ack, found := chain.App.GetIBCKeeper().ChannelKeeper.GetPacketAcknowledgement(chain.GetContext(), packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + ack, found := chain.App.IBCKeeper.ChannelKeeper.GetPacketAcknowledgement(chain.GetContext(), packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) require.True(chain.t, found) return ack @@ -331,7 +329,7 @@ func (chain *TestChain) GetAcknowledgement(packet exported.PacketI) []byte { // GetPrefix returns the prefix for used by a chain in connection creation func (chain *TestChain) GetPrefix() commitmenttypes.MerklePrefix { - return commitmenttypes.NewMerklePrefix(chain.App.GetIBCKeeper().ConnectionKeeper.GetCommitmentPrefix().Bytes()) + return commitmenttypes.NewMerklePrefix(chain.App.IBCKeeper.ConnectionKeeper.GetCommitmentPrefix().Bytes()) } // ConstructUpdateTMClientHeader will construct a valid 07-tendermint Header to update the @@ -490,10 +488,10 @@ func CreateSortedSignerArray(altPrivVal, suitePrivVal tmtypes.PrivValidator, // Other applications must bind to the port in InitGenesis or modify this code. func (chain *TestChain) CreatePortCapability(scopedKeeper capabilitykeeper.ScopedKeeper, portID string) { // check if the portId is already binded, if not bind it - _, ok := chain.App.GetScopedIBCKeeper().GetCapability(chain.GetContext(), host.PortPath(portID)) + _, ok := chain.App.ScopedIBCKeeper.GetCapability(chain.GetContext(), host.PortPath(portID)) if !ok { // create capability using the IBC capability keeper - cap, err := chain.App.GetScopedIBCKeeper().NewCapability(chain.GetContext(), host.PortPath(portID)) + cap, err := chain.App.ScopedIBCKeeper.NewCapability(chain.GetContext(), host.PortPath(portID)) require.NoError(chain.t, err) // claim capability using the scopedKeeper @@ -509,7 +507,7 @@ func (chain *TestChain) CreatePortCapability(scopedKeeper capabilitykeeper.Scope // GetPortCapability returns the port capability for the given portID. The capability must // exist, otherwise testing will fail. func (chain *TestChain) GetPortCapability(portID string) *capabilitytypes.Capability { - cap, ok := chain.App.GetScopedIBCKeeper().GetCapability(chain.GetContext(), host.PortPath(portID)) + cap, ok := chain.App.ScopedIBCKeeper.GetCapability(chain.GetContext(), host.PortPath(portID)) require.True(chain.t, ok) return cap @@ -521,9 +519,9 @@ func (chain *TestChain) GetPortCapability(portID string) *capabilitytypes.Capabi func (chain *TestChain) CreateChannelCapability(scopedKeeper capabilitykeeper.ScopedKeeper, portID, channelID string) { capName := host.ChannelCapabilityPath(portID, channelID) // check if the portId is already binded, if not bind it - _, ok := chain.App.GetScopedIBCKeeper().GetCapability(chain.GetContext(), capName) + _, ok := chain.App.ScopedIBCKeeper.GetCapability(chain.GetContext(), capName) if !ok { - cap, err := chain.App.GetScopedIBCKeeper().NewCapability(chain.GetContext(), capName) + cap, err := chain.App.ScopedIBCKeeper.NewCapability(chain.GetContext(), capName) require.NoError(chain.t, err) err = scopedKeeper.ClaimCapability(chain.GetContext(), cap, capName) require.NoError(chain.t, err) @@ -537,55 +535,16 @@ func (chain *TestChain) CreateChannelCapability(scopedKeeper capabilitykeeper.Sc // GetChannelCapability returns the channel capability for the given portID and channelID. // The capability must exist, otherwise testing will fail. func (chain *TestChain) GetChannelCapability(portID, channelID string) *capabilitytypes.Capability { - cap, ok := chain.App.GetScopedIBCKeeper().GetCapability(chain.GetContext(), host.ChannelCapabilityPath(portID, channelID)) + cap, ok := chain.App.ScopedIBCKeeper.GetCapability(chain.GetContext(), host.ChannelCapabilityPath(portID, channelID)) require.True(chain.t, ok) return cap } func (chain *TestChain) Balance(acc sdk.AccAddress, denom string) sdk.Coin { - return chain.GetTestSupport().BankKeeper().GetBalance(chain.GetContext(), acc, denom) + return chain.App.BankKeeper.GetBalance(chain.GetContext(), acc, denom) } func (chain *TestChain) AllBalances(acc sdk.AccAddress) sdk.Coins { - return chain.GetTestSupport().BankKeeper().GetAllBalances(chain.GetContext(), acc) -} - -func (chain TestChain) GetTestSupport() *wasmd.TestSupport { - return chain.App.(*TestingAppDecorator).TestSupport() -} - -var _ ibctesting.TestingApp = TestingAppDecorator{} - -type TestingAppDecorator struct { - *wasmd.WasmApp - t *testing.T -} - -func NewTestingAppDecorator(t *testing.T, wasmApp *wasmd.WasmApp) *TestingAppDecorator { - return &TestingAppDecorator{WasmApp: wasmApp, t: t} -} - -func (a TestingAppDecorator) GetBaseApp() *baseapp.BaseApp { - return a.TestSupport().GetBaseApp() -} - -func (a TestingAppDecorator) GetStakingKeeper() stakingkeeper.Keeper { - return a.TestSupport().StakingKeeper() -} - -func (a TestingAppDecorator) GetIBCKeeper() *ibckeeper.Keeper { - return a.TestSupport().IBCKeeper() -} - -func (a TestingAppDecorator) GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper { - return a.TestSupport().ScopeIBCKeeper() -} - -func (a TestingAppDecorator) GetTxConfig() client.TxConfig { - return a.TestSupport().GetTxConfig() -} - -func (a TestingAppDecorator) TestSupport() *wasmd.TestSupport { - return wasmd.NewTestSupport(a.t, a.WasmApp) + return chain.App.BankKeeper.GetAllBalances(chain.GetContext(), acc) } diff --git a/x/wasm/ibctesting/endpoint.go b/x/wasm/ibctesting/endpoint.go index 9411a79724..9d62ce7f62 100644 --- a/x/wasm/ibctesting/endpoint.go +++ b/x/wasm/ibctesting/endpoint.go @@ -381,7 +381,7 @@ func (endpoint *Endpoint) SendPacket(packet exported.PacketI) error { channelCap := endpoint.Chain.GetChannelCapability(packet.GetSourcePort(), packet.GetSourceChannel()) // no need to send message, acting as a module - err := endpoint.Chain.App.GetIBCKeeper().ChannelKeeper.SendPacket(endpoint.Chain.GetContext(), channelCap, packet) + err := endpoint.Chain.App.IBCKeeper.ChannelKeeper.SendPacket(endpoint.Chain.GetContext(), channelCap, packet) if err != nil { return err } @@ -415,7 +415,7 @@ func (endpoint *Endpoint) WriteAcknowledgement(ack exported.Acknowledgement, pac channelCap := endpoint.Chain.GetChannelCapability(packet.GetDestPort(), packet.GetDestChannel()) // no need to send message, acting as a handler - err := endpoint.Chain.App.GetIBCKeeper().ChannelKeeper.WriteAcknowledgement(endpoint.Chain.GetContext(), channelCap, packet, ack) + err := endpoint.Chain.App.IBCKeeper.ChannelKeeper.WriteAcknowledgement(endpoint.Chain.GetContext(), channelCap, packet, ack) if err != nil { return err } @@ -452,7 +452,7 @@ func (endpoint *Endpoint) TimeoutPacket(packet channeltypes.Packet) error { } proof, proofHeight := endpoint.Counterparty.QueryProof(packetKey) - nextSeqRecv, found := endpoint.Counterparty.Chain.App.GetIBCKeeper().ChannelKeeper.GetNextSequenceRecv(endpoint.Counterparty.Chain.GetContext(), endpoint.ChannelConfig.PortID, endpoint.ChannelID) + nextSeqRecv, found := endpoint.Counterparty.Chain.App.IBCKeeper.ChannelKeeper.GetNextSequenceRecv(endpoint.Counterparty.Chain.GetContext(), endpoint.ChannelConfig.PortID, endpoint.ChannelID) require.True(endpoint.Chain.t, found) timeoutMsg := channeltypes.NewMsgTimeout( @@ -468,7 +468,7 @@ func (endpoint *Endpoint) SetChannelClosed() error { channel := endpoint.GetChannel() channel.State = channeltypes.CLOSED - endpoint.Chain.App.GetIBCKeeper().ChannelKeeper.SetChannel(endpoint.Chain.GetContext(), endpoint.ChannelConfig.PortID, endpoint.ChannelID, channel) + endpoint.Chain.App.IBCKeeper.ChannelKeeper.SetChannel(endpoint.Chain.GetContext(), endpoint.ChannelConfig.PortID, endpoint.ChannelID, channel) endpoint.Chain.Coordinator.CommitBlock(endpoint.Chain) @@ -483,7 +483,7 @@ func (endpoint *Endpoint) GetClientState() exported.ClientState { // SetClientState sets the client state for this endpoint. func (endpoint *Endpoint) SetClientState(clientState exported.ClientState) { - endpoint.Chain.App.GetIBCKeeper().ClientKeeper.SetClientState(endpoint.Chain.GetContext(), endpoint.ClientID, clientState) + endpoint.Chain.App.IBCKeeper.ClientKeeper.SetClientState(endpoint.Chain.GetContext(), endpoint.ClientID, clientState) } // GetConsensusState retrieves the Consensus State for this endpoint at the provided height. @@ -497,13 +497,13 @@ func (endpoint *Endpoint) GetConsensusState(height exported.Height) exported.Con // SetConsensusState sets the consensus state for this endpoint. func (endpoint *Endpoint) SetConsensusState(consensusState exported.ConsensusState, height exported.Height) { - endpoint.Chain.App.GetIBCKeeper().ClientKeeper.SetClientConsensusState(endpoint.Chain.GetContext(), endpoint.ClientID, height, consensusState) + endpoint.Chain.App.IBCKeeper.ClientKeeper.SetClientConsensusState(endpoint.Chain.GetContext(), endpoint.ClientID, height, consensusState) } // GetConnection retrieves an IBC Connection for the endpoint. The // connection is expected to exist otherwise testing will fail. func (endpoint *Endpoint) GetConnection() connectiontypes.ConnectionEnd { - connection, found := endpoint.Chain.App.GetIBCKeeper().ConnectionKeeper.GetConnection(endpoint.Chain.GetContext(), endpoint.ConnectionID) + connection, found := endpoint.Chain.App.IBCKeeper.ConnectionKeeper.GetConnection(endpoint.Chain.GetContext(), endpoint.ConnectionID) require.True(endpoint.Chain.t, found) return connection @@ -511,13 +511,13 @@ func (endpoint *Endpoint) GetConnection() connectiontypes.ConnectionEnd { // SetConnection sets the connection for this endpoint. func (endpoint *Endpoint) SetConnection(connection connectiontypes.ConnectionEnd) { - endpoint.Chain.App.GetIBCKeeper().ConnectionKeeper.SetConnection(endpoint.Chain.GetContext(), endpoint.ConnectionID, connection) + endpoint.Chain.App.IBCKeeper.ConnectionKeeper.SetConnection(endpoint.Chain.GetContext(), endpoint.ConnectionID, connection) } // GetChannel retrieves an IBC Channel for the endpoint. The channel // is expected to exist otherwise testing will fail. func (endpoint *Endpoint) GetChannel() channeltypes.Channel { - channel, found := endpoint.Chain.App.GetIBCKeeper().ChannelKeeper.GetChannel(endpoint.Chain.GetContext(), endpoint.ChannelConfig.PortID, endpoint.ChannelID) + channel, found := endpoint.Chain.App.IBCKeeper.ChannelKeeper.GetChannel(endpoint.Chain.GetContext(), endpoint.ChannelConfig.PortID, endpoint.ChannelID) require.True(endpoint.Chain.t, found) return channel @@ -525,7 +525,7 @@ func (endpoint *Endpoint) GetChannel() channeltypes.Channel { // SetChannel sets the channel for this endpoint. func (endpoint *Endpoint) SetChannel(channel channeltypes.Channel) { - endpoint.Chain.App.GetIBCKeeper().ChannelKeeper.SetChannel(endpoint.Chain.GetContext(), endpoint.ChannelConfig.PortID, endpoint.ChannelID, channel) + endpoint.Chain.App.IBCKeeper.ChannelKeeper.SetChannel(endpoint.Chain.GetContext(), endpoint.ChannelConfig.PortID, endpoint.ChannelID, channel) } // QueryClientStateProof performs and abci query for a client stat associated diff --git a/x/wasm/ibctesting/path.go b/x/wasm/ibctesting/path.go index 2ce5e044a6..15912bd400 100644 --- a/x/wasm/ibctesting/path.go +++ b/x/wasm/ibctesting/path.go @@ -40,7 +40,7 @@ func (path *Path) SetChannelOrdered() { // if EndpointA does not contain a packet commitment for that packet. An error is returned // if a relay step fails or the packet commitment does not exist on either endpoint. func (path *Path) RelayPacket(packet channeltypes.Packet, ack []byte) error { - pc := path.EndpointA.Chain.App.GetIBCKeeper().ChannelKeeper.GetPacketCommitment(path.EndpointA.Chain.GetContext(), packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) + pc := path.EndpointA.Chain.App.IBCKeeper.ChannelKeeper.GetPacketCommitment(path.EndpointA.Chain.GetContext(), packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) if bytes.Equal(pc, channeltypes.CommitPacket(path.EndpointA.Chain.App.AppCodec(), packet)) { // packet found, relay from A to B @@ -59,7 +59,7 @@ func (path *Path) RelayPacket(packet channeltypes.Packet, ack []byte) error { } - pc = path.EndpointB.Chain.App.GetIBCKeeper().ChannelKeeper.GetPacketCommitment(path.EndpointB.Chain.GetContext(), packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) + pc = path.EndpointB.Chain.App.IBCKeeper.ChannelKeeper.GetPacketCommitment(path.EndpointB.Chain.GetContext(), packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) if bytes.Equal(pc, channeltypes.CommitPacket(path.EndpointB.Chain.App.AppCodec(), packet)) { // packet found, relay B to A diff --git a/x/wasm/ibctesting/wasm.go b/x/wasm/ibctesting/wasm.go index 6957f63404..4639688f01 100644 --- a/x/wasm/ibctesting/wasm.go +++ b/x/wasm/ibctesting/wasm.go @@ -5,11 +5,9 @@ import ( "compress/gzip" "encoding/json" "fmt" - "io/ioutil" + "os" "strings" - wasmd "github.com/CosmWasm/wasmd/app" - ibctesting "github.com/cosmos/ibc-go/v3/testing" sdk "github.com/cosmos/cosmos-sdk/types" @@ -37,7 +35,7 @@ func (chain *TestChain) SeedNewContractInstance() sdk.AccAddress { } func (chain *TestChain) StoreCodeFile(filename string) types.MsgStoreCodeResponse { - wasmCode, err := ioutil.ReadFile(filename) + wasmCode, err := os.ReadFile(filename) require.NoError(chain.t, err) if strings.HasSuffix(filename, "wasm") { // compress for gas limit var buf bytes.Buffer @@ -135,8 +133,5 @@ func (chain *TestChain) parseSDKResultData(r *sdk.Result) sdk.TxMsgData { // ContractInfo is a helper function to returns the ContractInfo for the given contract address func (chain *TestChain) ContractInfo(contractAddr sdk.AccAddress) *types.ContractInfo { - type testSupporter interface { - TestSupport() *wasmd.TestSupport - } - return chain.App.(testSupporter).TestSupport().WasmKeeper().GetContractInfo(chain.GetContext(), contractAddr) + return chain.App.WasmKeeper.GetContractInfo(chain.GetContext(), contractAddr) } diff --git a/x/wasm/ioutils/ioutil.go b/x/wasm/ioutils/ioutil.go index 9c7bd81f04..5740132342 100644 --- a/x/wasm/ioutils/ioutil.go +++ b/x/wasm/ioutils/ioutil.go @@ -4,7 +4,6 @@ import ( "bytes" "compress/gzip" "io" - "io/ioutil" "github.com/CosmWasm/wasmd/x/wasm/types" ) @@ -26,7 +25,7 @@ func Uncompress(src []byte, limit uint64) ([]byte, error) { } zr.Multistream(false) defer zr.Close() - return ioutil.ReadAll(LimitReader(zr, int64(limit))) + return io.ReadAll(LimitReader(zr, int64(limit))) } // LimitReader returns a Reader that reads from r diff --git a/x/wasm/keeper/test_common.go b/x/wasm/keeper/test_common.go index 717228962d..9fedc3e7f1 100644 --- a/x/wasm/keeper/test_common.go +++ b/x/wasm/keeper/test_common.go @@ -4,7 +4,7 @@ import ( "encoding/binary" "encoding/json" "fmt" - "io/ioutil" + "os" "testing" "time" @@ -558,7 +558,7 @@ func StoreExampleContract(t testing.TB, ctx sdk.Context, keepers TestKeepers, wa creator, _, creatorAddr := keyPubAddr() fundAccounts(t, ctx, keepers.AccountKeeper, keepers.BankKeeper, creatorAddr, anyAmount) - wasmCode, err := ioutil.ReadFile(wasmFile) + wasmCode, err := os.ReadFile(wasmFile) require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creatorAddr, wasmCode, nil) diff --git a/x/wasm/relay_pingpong_test.go b/x/wasm/relay_pingpong_test.go index 46c32497b3..8dfa403e82 100644 --- a/x/wasm/relay_pingpong_test.go +++ b/x/wasm/relay_pingpong_test.go @@ -326,7 +326,7 @@ func (p player) incrementCounter(key []byte, store wasmvm.KVStore) uint64 { } func (p player) QueryState(key []byte) uint64 { - raw := p.chain.GetTestSupport().WasmKeeper().QueryRaw(p.chain.GetContext(), p.contractAddr, key) + raw := p.chain.App.WasmKeeper.QueryRaw(p.chain.GetContext(), p.contractAddr, key) return sdk.BigEndianToUint64(raw) } diff --git a/x/wasm/relay_test.go b/x/wasm/relay_test.go index 5edd182d59..63e4bdc467 100644 --- a/x/wasm/relay_test.go +++ b/x/wasm/relay_test.go @@ -193,7 +193,7 @@ func TestContractCanInitiateIBCTransferMsg(t *testing.T) { require.Equal(t, 0, len(chainB.PendingSendPackets)) // and dest chain balance contains voucher - bankKeeperB := chainB.GetTestSupport().BankKeeper() + bankKeeperB := chainB.App.BankKeeper expBalance := ibctransfertypes.GetTransferCoin(path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID, coinToSendToB.Denom, coinToSendToB.Amount) gotBalance := chainB.Balance(chainB.SenderAccount.GetAddress(), expBalance.Denom) assert.Equal(t, expBalance, gotBalance, "got total balance: %s", bankKeeperB.GetAllBalances(chainB.GetContext(), chainB.SenderAccount.GetAddress())) @@ -268,7 +268,7 @@ func TestContractCanEmulateIBCTransferMessage(t *testing.T) { require.Equal(t, 0, len(chainB.PendingSendPackets)) // and dest chain balance contains voucher - bankKeeperB := chainB.GetTestSupport().BankKeeper() + bankKeeperB := chainB.App.BankKeeper expBalance := ibctransfertypes.GetTransferCoin(path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID, coinToSendToB.Denom, coinToSendToB.Amount) gotBalance := chainB.Balance(chainB.SenderAccount.GetAddress(), expBalance.Denom) assert.Equal(t, expBalance, gotBalance, "got total balance: %s", bankKeeperB.GetAllBalances(chainB.GetContext(), chainB.SenderAccount.GetAddress())) @@ -535,7 +535,7 @@ func (c *ackReceiverContract) IBCPacketReceive(codeID wasmvm.Checksum, env wasmv // call original ibctransfer keeper to not copy all code into this ibcPacket := toIBCPacket(packet) ctx := c.chain.GetContext() // HACK: please note that this is not reverted after checkTX - err := c.chain.GetTestSupport().TransferKeeper().OnRecvPacket(ctx, ibcPacket, src) + err := c.chain.App.TransferKeeper.OnRecvPacket(ctx, ibcPacket, src) if err != nil { return nil, 0, sdkerrors.Wrap(err, "within our smart contract") } @@ -560,7 +560,7 @@ func (c *ackReceiverContract) IBCPacketAck(codeID wasmvm.Checksum, env wasmvmtyp // call original ibctransfer keeper to not copy all code into this ctx := c.chain.GetContext() // HACK: please note that this is not reverted after checkTX ibcPacket := toIBCPacket(msg.OriginalPacket) - err := c.chain.GetTestSupport().TransferKeeper().OnAcknowledgementPacket(ctx, ibcPacket, data, ack) + err := c.chain.App.TransferKeeper.OnAcknowledgementPacket(ctx, ibcPacket, data, ack) if err != nil { return nil, 0, sdkerrors.Wrap(err, "within our smart contract") } diff --git a/x/wasm/simulation/operations.go b/x/wasm/simulation/operations.go index 66635a2b73..41903002a1 100644 --- a/x/wasm/simulation/operations.go +++ b/x/wasm/simulation/operations.go @@ -2,8 +2,8 @@ package simulation import ( "encoding/json" - "io/ioutil" "math/rand" + "os" wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/cosmos/cosmos-sdk/baseapp" @@ -21,6 +21,7 @@ import ( ) // Simulation operation weights constants +// //nolint:gosec const ( OpWeightMsgStoreCode = "op_weight_msg_store_code" @@ -83,7 +84,7 @@ func WeightedOperations( wasmBz = testdata.ReflectContractWasm() } else { var err error - wasmBz, err = ioutil.ReadFile(wasmContractPath) + wasmBz, err = os.ReadFile(wasmContractPath) if err != nil { panic(err) } diff --git a/x/wasm/types/types.go b/x/wasm/types/types.go index 7c9e14e64e..887e895b29 100644 --- a/x/wasm/types/types.go +++ b/x/wasm/types/types.go @@ -128,10 +128,11 @@ func (c *ContractInfo) SetExtension(ext ContractInfoExtension) error { // ReadExtension copies the extension value to the pointer passed as argument so that there is no need to cast // For example with a custom extension of type `MyContractDetails` it will look as following: -// var d MyContractDetails -// if err := info.ReadExtension(&d); err != nil { -// return nil, sdkerrors.Wrap(err, "extension") -// } +// +// var d MyContractDetails +// if err := info.ReadExtension(&d); err != nil { +// return nil, sdkerrors.Wrap(err, "extension") +// } func (c *ContractInfo) ReadExtension(e ContractInfoExtension) error { rv := reflect.ValueOf(e) if rv.Kind() != reflect.Ptr || rv.IsNil() { From 20fb936205e3d60800b711dc538c1d0860d267d3 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 24 Aug 2022 08:54:57 +0200 Subject: [PATCH 28/94] Fix keeper test --- x/wasm/keeper/keeper_test.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index 91ebdb4ee7..14ce0d9732 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -875,9 +875,9 @@ func TestMigrate(t *testing.T) { ibcCodeID := StoreIBCReflectContract(t, ctx, keepers).CodeID require.NotEqual(t, originalCodeID, newCodeID) - restrictedCodeID := StoreHackatomExampleContract(t, ctx, keepers).CodeID - keeper.SetAccessConfig(ctx, restrictedCodeID, types.AllowNobody) - require.NotEqual(t, originalCodeID, restrictedCodeID) + restrictedCodeExample := StoreHackatomExampleContract(t, ctx, keepers) + require.NoError(t, keeper.SetAccessConfig(ctx, restrictedCodeExample.CodeID, restrictedCodeExample.CreatorAddr, types.AllowNobody)) + require.NotEqual(t, originalCodeID, restrictedCodeExample.CodeID) anyAddr := RandomAccountAddress(t) newVerifierAddr := RandomAccountAddress(t) @@ -961,7 +961,7 @@ func TestMigrate(t *testing.T) { caller: creator, initMsg: initMsgBz, fromCodeID: originalCodeID, - toCodeID: restrictedCodeID, + toCodeID: restrictedCodeExample.CodeID, migrateMsg: migMsgBz, expErr: sdkerrors.ErrUnauthorized, }, @@ -1836,6 +1836,7 @@ func TestBuildContractAddress(t *testing.T) { }) } } + func TestSetAccessConfig(t *testing.T) { parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures) k := keepers.WasmKeeper @@ -1915,8 +1916,6 @@ func TestSetAccessConfig(t *testing.T) { return } require.NoError(t, gotErr) - }) } - } From c3b0a722ad8248aa70be12569712c779d32b2382 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Aug 2022 08:17:33 +0000 Subject: [PATCH 29/94] Bump actions/checkout from 2.3.5 to 3.0.2 Bumps [actions/checkout](https://github.com/actions/checkout) from 2.3.5 to 3.0.2. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2.3.5...v3.0.2) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analizer.yml | 2 +- .github/workflows/proto-buf-publisher.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analizer.yml b/.github/workflows/codeql-analizer.yml index 0232dc356e..919e1603a7 100644 --- a/.github/workflows/codeql-analizer.yml +++ b/.github/workflows/codeql-analizer.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2.3.5 + uses: actions/checkout@v3.0.2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/proto-buf-publisher.yml b/.github/workflows/proto-buf-publisher.yml index 7e000bc5b2..445d44498d 100644 --- a/.github/workflows/proto-buf-publisher.yml +++ b/.github/workflows/proto-buf-publisher.yml @@ -16,7 +16,7 @@ jobs: push: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.0.2 - uses: bufbuild/buf-setup-action@v0.7.0 # lint checks From 4875db205574786f13b9b53a4f751f9f95d79ae9 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Wed, 24 Aug 2022 15:21:16 +0700 Subject: [PATCH 30/94] depracte-ioutil (#934) --- benchmarks/app_test.go | 4 ++-- x/wasm/client/cli/genesis_msg_test.go | 7 +++---- x/wasm/ioutils/ioutil_test.go | 6 +++--- x/wasm/ioutils/utils_test.go | 4 ++-- x/wasm/keeper/bench_test.go | 4 ++-- x/wasm/keeper/genesis_test.go | 11 +++++------ x/wasm/keeper/keeper_test.go | 8 ++++---- x/wasm/keeper/legacy_querier_test.go | 8 ++++---- x/wasm/keeper/proposal_integration_test.go | 12 ++++++------ x/wasm/keeper/querier_test.go | 10 +++++----- x/wasm/keeper/reflect_test.go | 4 ++-- x/wasm/keeper/snapshotter_integration_test.go | 4 ++-- x/wasm/keeper/staking_test.go | 6 +++--- x/wasm/keeper/submsg_test.go | 4 ++-- x/wasm/module_test.go | 4 ++-- 15 files changed, 47 insertions(+), 49 deletions(-) diff --git a/benchmarks/app_test.go b/benchmarks/app_test.go index 1fbfb48663..88773e6b42 100644 --- a/benchmarks/app_test.go +++ b/benchmarks/app_test.go @@ -2,7 +2,7 @@ package benchmarks import ( "encoding/json" - "io/ioutil" + "os" "testing" "time" @@ -119,7 +119,7 @@ func InitializeWasmApp(b testing.TB, db dbm.DB, numAccounts int) AppInfo { wasmApp.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: height, Time: time.Now()}}) // upload the code - cw20Code, err := ioutil.ReadFile("./testdata/cw20_base.wasm") + cw20Code, err := os.ReadFile("./testdata/cw20_base.wasm") require.NoError(b, err) storeMsg := wasmtypes.MsgStoreCode{ Sender: addr.String(), diff --git a/x/wasm/client/cli/genesis_msg_test.go b/x/wasm/client/cli/genesis_msg_test.go index 4de9e7e3d5..78a1c53b58 100644 --- a/x/wasm/client/cli/genesis_msg_test.go +++ b/x/wasm/client/cli/genesis_msg_test.go @@ -3,7 +3,6 @@ package cli import ( "context" "encoding/json" - "io/ioutil" "os" "path" "testing" @@ -42,7 +41,7 @@ func TestGenesisStoreCodeCmd(t *testing.T) { minimalWasmGenesis := types.GenesisState{ Params: types.DefaultParams(), } - anyValidWasmFile, err := ioutil.TempFile(t.TempDir(), "wasm") + anyValidWasmFile, err := os.CreateTemp(t.TempDir(), "wasm") require.NoError(t, err) anyValidWasmFile.Write(wasmIdent) require.NoError(t, anyValidWasmFile.Close()) @@ -109,7 +108,7 @@ func TestInstantiateContractCmd(t *testing.T) { minimalWasmGenesis := types.GenesisState{ Params: types.DefaultParams(), } - anyValidWasmFile, err := ioutil.TempFile(t.TempDir(), "wasm") + anyValidWasmFile, err := os.CreateTemp(t.TempDir(), "wasm") require.NoError(t, err) anyValidWasmFile.Write(wasmIdent) require.NoError(t, anyValidWasmFile.Close()) @@ -368,7 +367,7 @@ func TestExecuteContractCmd(t *testing.T) { minimalWasmGenesis := types.GenesisState{ Params: types.DefaultParams(), } - anyValidWasmFile, err := ioutil.TempFile(t.TempDir(), "wasm") + anyValidWasmFile, err := os.CreateTemp(t.TempDir(), "wasm") require.NoError(t, err) anyValidWasmFile.Write(wasmIdent) require.NoError(t, anyValidWasmFile.Close()) diff --git a/x/wasm/ioutils/ioutil_test.go b/x/wasm/ioutils/ioutil_test.go index 13bbbb110e..93a478ae00 100644 --- a/x/wasm/ioutils/ioutil_test.go +++ b/x/wasm/ioutils/ioutil_test.go @@ -5,7 +5,7 @@ import ( "compress/gzip" "errors" "io" - "io/ioutil" + "os" "strings" "testing" @@ -16,10 +16,10 @@ import ( ) func TestUncompress(t *testing.T) { - wasmRaw, err := ioutil.ReadFile("../keeper/testdata/hackatom.wasm") + wasmRaw, err := os.ReadFile("../keeper/testdata/hackatom.wasm") require.NoError(t, err) - wasmGzipped, err := ioutil.ReadFile("../keeper/testdata/hackatom.wasm.gzip") + wasmGzipped, err := os.ReadFile("../keeper/testdata/hackatom.wasm.gzip") require.NoError(t, err) const maxSize = 400_000 diff --git a/x/wasm/ioutils/utils_test.go b/x/wasm/ioutils/utils_test.go index 0d2c0a130e..cd4846f092 100644 --- a/x/wasm/ioutils/utils_test.go +++ b/x/wasm/ioutils/utils_test.go @@ -1,14 +1,14 @@ package ioutils import ( - "io/ioutil" + "os" "testing" "github.com/stretchr/testify/require" ) func GetTestData() ([]byte, []byte, []byte, error) { - wasmCode, err := ioutil.ReadFile("../keeper/testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("../keeper/testdata/hackatom.wasm") if err != nil { return nil, nil, nil, err } diff --git a/x/wasm/keeper/bench_test.go b/x/wasm/keeper/bench_test.go index ca5489d5bb..1ad1693bb5 100644 --- a/x/wasm/keeper/bench_test.go +++ b/x/wasm/keeper/bench_test.go @@ -1,7 +1,7 @@ package keeper import ( - "io/ioutil" + "os" "testing" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" @@ -89,7 +89,7 @@ func BenchmarkCompilation(b *testing.B) { ctx, keepers := createTestInput(b, false, SupportedFeatures, wasmConfig, db) // print out code size for comparisons - code, err := ioutil.ReadFile(spec.wasmFile) + code, err := os.ReadFile(spec.wasmFile) require.NoError(b, err) b.Logf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b(size: %d) ", len(code)) diff --git a/x/wasm/keeper/genesis_test.go b/x/wasm/keeper/genesis_test.go index ff7c6db53a..f4e5b476aa 100644 --- a/x/wasm/keeper/genesis_test.go +++ b/x/wasm/keeper/genesis_test.go @@ -6,7 +6,6 @@ import ( "encoding/base64" "errors" "fmt" - "io/ioutil" "math/rand" "os" "testing" @@ -40,7 +39,7 @@ func TestGenesisExportImport(t *testing.T) { wasmKeeper, srcCtx, srcStoreKeys := setupKeeper(t) contractKeeper := NewGovPermissionKeeper(wasmKeeper) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) // store some test data @@ -153,7 +152,7 @@ func TestGenesisExportImport(t *testing.T) { } func TestGenesisInit(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) myCodeInfo := wasmTypes.CodeInfoFixture(wasmTypes.WithSHA256CodeHash(wasmCode)) @@ -498,7 +497,7 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { keeper, ctx, _ := setupKeeper(t) contractKeeper := NewGovPermissionKeeper(keeper) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) wasmCodeHash := sha256.Sum256(wasmCode) @@ -564,7 +563,7 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { } func TestSupportedGenMsgTypes(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) var ( myAddress sdk.AccAddress = bytes.Repeat([]byte{1}, types.ContractAddrLen) @@ -636,7 +635,7 @@ func TestSupportedGenMsgTypes(t *testing.T) { func setupKeeper(t *testing.T) (*Keeper, sdk.Context, []sdk.StoreKey) { t.Helper() - tempDir, err := ioutil.TempDir("", "wasm") + tempDir, err := os.MkdirTemp("", "wasm") require.NoError(t, err) t.Cleanup(func() { os.RemoveAll(tempDir) }) var ( diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index 14ce0d9732..ba1ccdc739 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -4,8 +4,8 @@ import ( "bytes" "encoding/json" "errors" - "io/ioutil" "math" + "os" "testing" "time" @@ -31,7 +31,7 @@ import ( // When migrated to go 1.16, embed package should be used instead. func init() { - b, err := ioutil.ReadFile("./testdata/hackatom.wasm") + b, err := os.ReadFile("./testdata/hackatom.wasm") if err != nil { panic(err) } @@ -348,7 +348,7 @@ func TestCreateWithGzippedPayload(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm.gzip") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm.gzip") require.NoError(t, err, "reading gzipped WASM code") contractID, err := keeper.Create(ctx, creator, wasmCode, nil) @@ -1097,7 +1097,7 @@ func TestMigrateWithDispatchedMessage(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) fred := keepers.Faucet.NewFundedAccount(ctx, sdk.NewInt64Coin("denom", 5000)) - burnerCode, err := ioutil.ReadFile("./testdata/burner.wasm") + burnerCode, err := os.ReadFile("./testdata/burner.wasm") require.NoError(t, err) originalContractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) diff --git a/x/wasm/keeper/legacy_querier_test.go b/x/wasm/keeper/legacy_querier_test.go index e21dd23536..dac7eaa784 100644 --- a/x/wasm/keeper/legacy_querier_test.go +++ b/x/wasm/keeper/legacy_querier_test.go @@ -5,7 +5,7 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "os" "testing" sdk "github.com/cosmos/cosmos-sdk/types" @@ -24,7 +24,7 @@ func TestLegacyQueryContractState(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) anyAddr := keepers.Faucet.NewFundedAccount(ctx, sdk.NewInt64Coin("denom", 5000)) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) contractID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) @@ -162,7 +162,7 @@ func TestLegacyQueryContractListByCodeOrdering(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) anyAddr := keepers.Faucet.NewFundedAccount(ctx, topUp...) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) @@ -312,7 +312,7 @@ func TestLegacyQueryContractHistory(t *testing.T) { } func TestLegacyQueryCodeList(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) specs := map[string]struct { diff --git a/x/wasm/keeper/proposal_integration_test.go b/x/wasm/keeper/proposal_integration_test.go index 3d5097b501..6d9b765295 100644 --- a/x/wasm/keeper/proposal_integration_test.go +++ b/x/wasm/keeper/proposal_integration_test.go @@ -5,7 +5,7 @@ import ( "encoding/hex" "encoding/json" "errors" - "io/ioutil" + "os" "testing" "github.com/cosmos/cosmos-sdk/x/params/client/utils" @@ -30,7 +30,7 @@ func TestStoreCodeProposal(t *testing.T) { CodeUploadAccess: types.AllowNobody, InstantiateDefaultPermission: types.AccessTypeNobody, }) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) myActorAddress := RandomBech32AccountAddress(t) @@ -68,7 +68,7 @@ func TestInstantiateProposal(t *testing.T) { InstantiateDefaultPermission: types.AccessTypeNobody, }) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) require.NoError(t, wasmKeeper.importCode(ctx, 1, @@ -131,7 +131,7 @@ func TestInstantiateProposal_NoAdmin(t *testing.T) { InstantiateDefaultPermission: types.AccessTypeNobody, }) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) require.NoError(t, wasmKeeper.importCode(ctx, 1, @@ -203,7 +203,7 @@ func TestMigrateProposal(t *testing.T) { InstantiateDefaultPermission: types.AccessTypeNobody, }) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) codeInfoFixture := types.CodeInfoFixture(types.WithSHA256CodeHash(wasmCode)) @@ -394,7 +394,7 @@ func TestAdminProposals(t *testing.T) { otherAddress sdk.AccAddress = bytes.Repeat([]byte{0x2}, types.ContractAddrLen) contractAddr = BuildContractAddress(1, 1) ) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) specs := map[string]struct { diff --git a/x/wasm/keeper/querier_test.go b/x/wasm/keeper/querier_test.go index f473f52fac..d9721f91b4 100644 --- a/x/wasm/keeper/querier_test.go +++ b/x/wasm/keeper/querier_test.go @@ -5,7 +5,7 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "os" "testing" "time" @@ -265,7 +265,7 @@ func TestQueryContractListByCodeOrdering(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) anyAddr := keepers.Faucet.NewFundedAccount(ctx, topUp...) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) @@ -454,7 +454,7 @@ func TestQueryContractHistory(t *testing.T) { } func TestQueryCodeList(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) ctx, keepers := CreateTestInput(t, false, SupportedFeatures) @@ -656,7 +656,7 @@ func TestQueryPinnedCodes(t *testing.T) { } func TestQueryCodeInfo(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) ctx, keepers := CreateTestInput(t, false, SupportedFeatures) @@ -711,7 +711,7 @@ func TestQueryCodeInfo(t *testing.T) { } func TestQueryCodeInfoList(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) ctx, keepers := CreateTestInput(t, false, SupportedFeatures) diff --git a/x/wasm/keeper/reflect_test.go b/x/wasm/keeper/reflect_test.go index 2f89a265c4..079324fac5 100644 --- a/x/wasm/keeper/reflect_test.go +++ b/x/wasm/keeper/reflect_test.go @@ -2,7 +2,7 @@ package keeper import ( "encoding/json" - "io/ioutil" + "os" "strings" "testing" @@ -52,7 +52,7 @@ func TestReflectContractSend(t *testing.T) { require.Equal(t, uint64(1), reflectID) // upload hackatom escrow code - escrowCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + escrowCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) escrowID, err := keeper.Create(ctx, creator, escrowCode, nil) require.NoError(t, err) diff --git a/x/wasm/keeper/snapshotter_integration_test.go b/x/wasm/keeper/snapshotter_integration_test.go index 49f2ca6baf..bef6cf0050 100644 --- a/x/wasm/keeper/snapshotter_integration_test.go +++ b/x/wasm/keeper/snapshotter_integration_test.go @@ -2,7 +2,7 @@ package keeper_test import ( "crypto/sha256" - "io/ioutil" + "os" "testing" "time" @@ -53,7 +53,7 @@ func TestSnapshotter(t *testing.T) { srcCodeIDToChecksum := make(map[uint64][]byte, len(spec.wasmFiles)) for i, v := range spec.wasmFiles { - wasmCode, err := ioutil.ReadFile(v) + wasmCode, err := os.ReadFile(v) require.NoError(t, err) codeID, err := contractKeeper.Create(ctx, genesisAddr, wasmCode, nil) require.NoError(t, err) diff --git a/x/wasm/keeper/staking_test.go b/x/wasm/keeper/staking_test.go index b6d719f135..633cbcf1fa 100644 --- a/x/wasm/keeper/staking_test.go +++ b/x/wasm/keeper/staking_test.go @@ -2,7 +2,7 @@ package keeper import ( "encoding/json" - "io/ioutil" + "os" "testing" wasmvmtypes "github.com/CosmWasm/wasmvm/types" @@ -106,7 +106,7 @@ func TestInitializeStaking(t *testing.T) { creator := k.Faucet.NewFundedAccount(ctx, deposit...) // upload staking derivates code - stakingCode, err := ioutil.ReadFile("./testdata/staking.wasm") + stakingCode, err := os.ReadFile("./testdata/staking.wasm") require.NoError(t, err) stakingID, err := keeper.Create(ctx, creator, stakingCode, nil) require.NoError(t, err) @@ -189,7 +189,7 @@ func initializeStaking(t *testing.T) initInfo { creator := k.Faucet.NewFundedAccount(ctx, deposit...) // upload staking derivates code - stakingCode, err := ioutil.ReadFile("./testdata/staking.wasm") + stakingCode, err := os.ReadFile("./testdata/staking.wasm") require.NoError(t, err) stakingID, err := k.ContractKeeper.Create(ctx, creator, stakingCode, nil) require.NoError(t, err) diff --git a/x/wasm/keeper/submsg_test.go b/x/wasm/keeper/submsg_test.go index 4cf25fc894..d1f1d30cda 100644 --- a/x/wasm/keeper/submsg_test.go +++ b/x/wasm/keeper/submsg_test.go @@ -3,7 +3,7 @@ package keeper import ( "encoding/json" "fmt" - "io/ioutil" + "os" "strconv" "testing" @@ -117,7 +117,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { require.NoError(t, err) // create hackatom contract for testing (for infinite loop) - hackatomCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + hackatomCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) hackatomID, err := keepers.ContractKeeper.Create(ctx, uploader, hackatomCode, nil) require.NoError(t, err) diff --git a/x/wasm/module_test.go b/x/wasm/module_test.go index ab52363b71..f9dde8769e 100644 --- a/x/wasm/module_test.go +++ b/x/wasm/module_test.go @@ -3,7 +3,7 @@ package wasm import ( "encoding/json" "fmt" - "io/ioutil" + "os" "testing" "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" @@ -57,7 +57,7 @@ func keyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { } func mustLoad(path string) []byte { - bz, err := ioutil.ReadFile(path) + bz, err := os.ReadFile(path) if err != nil { panic(err) } From 8631dc32af1107fbc7473468c58fc1343ad2ef46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Aug 2022 10:34:20 +0200 Subject: [PATCH 31/94] Bump github/codeql-action from 1 to 2 (#954) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 1 to 2. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v1...v2) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql-analizer.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analizer.yml b/.github/workflows/codeql-analizer.yml index 0232dc356e..c1ee968796 100644 --- a/.github/workflows/codeql-analizer.yml +++ b/.github/workflows/codeql-analizer.yml @@ -23,13 +23,13 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: 'go' queries: crypto-com/cosmos-sdk-codeql@main,security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 From ef493a3795d9b414d91a3a8c850f279926470200 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Aug 2022 08:35:30 +0000 Subject: [PATCH 32/94] Bump bufbuild/buf-setup-action from 0.7.0 to 1.7.0 Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 0.7.0 to 1.7.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v0.7.0...v1.7.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/proto-buf-publisher.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/proto-buf-publisher.yml b/.github/workflows/proto-buf-publisher.yml index 445d44498d..454e49dda5 100644 --- a/.github/workflows/proto-buf-publisher.yml +++ b/.github/workflows/proto-buf-publisher.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3.0.2 - - uses: bufbuild/buf-setup-action@v0.7.0 + - uses: bufbuild/buf-setup-action@v1.7.0 # lint checks - uses: bufbuild/buf-lint-action@v1 From 61bda97df2822e7c27071d2c59e43d1ec8e3f916 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Wed, 24 Aug 2022 16:52:55 +0700 Subject: [PATCH 33/94] close 815: upgrade to go 1.18 (#866) * close 815: upgrade to go 1.18 * Update CHANGELOG.md * updater ci and docker to go 1.18 * update image per: https://discuss.circleci.com/t/legacy-convenience-image-deprecation/41034 * Update config.yml * go get -> go install, except dockerfile for protos --- .circleci/config.yml | 3 +- CHANGELOG.md | 3 ++ Dockerfile | 2 +- Makefile | 2 +- README.md | 2 +- contrib/devtools/Makefile | 6 +-- contrib/prototools-docker/Dockerfile | 2 +- go.mod | 2 +- go.sum | 78 +--------------------------- scripts/protocgen.sh | 2 +- 10 files changed, 14 insertions(+), 88 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b658e762e0..f0767528e5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,8 +3,7 @@ version: 2.1 executors: golang: docker: - - image: circleci/golang:1.17 - working_directory: /go/src/github.com/cosmwasm/wasmd + - image: cimg/go:1.18 commands: make: diff --git a/CHANGELOG.md b/CHANGELOG.md index a3f7e06fa4..cbba596eda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog ## [Unreleased](https://github.com/CosmWasm/wasmd/tree/HEAD) +- Upgrade go to v1.18 [\#866]https://github.com/CosmWasm/wasmd/pull/866/) ([faddat](https://github.com/faddat)) + + [Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.28.0...HEAD) diff --git a/Dockerfile b/Dockerfile index 3c0ff55178..ea887a4d31 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # docker build . -t cosmwasm/wasmd:latest # docker run --rm -it cosmwasm/wasmd:latest /bin/sh -FROM golang:1.17-alpine3.15 AS go-builder +FROM golang:1.18-alpine3.15 AS go-builder ARG arch=x86_64 # this comes from standard alpine nightly file diff --git a/Makefile b/Makefile index 4a007fd788..69c1e24699 100644 --- a/Makefile +++ b/Makefile @@ -108,7 +108,7 @@ go.sum: go.mod draw-deps: @# requires brew install graphviz or apt-get install graphviz - go get github.com/RobotsAndPencils/goviz + go install github.com/RobotsAndPencils/goviz @goviz -i ./cmd/wasmd -d 2 | dot -Tpng -o dependency-graph.png clean: diff --git a/README.md b/README.md index 02ced0d3a9..2c4944dd35 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This code was forked from the `cosmos/gaia` repository as a basis and then we ad many gaia-specific files. However, the `wasmd` binary should function just like `gaiad` except for the addition of the `x/wasm` module. -**Note**: Requires [Go 1.17+](https://golang.org/dl/) +**Note**: Requires [Go 1.18+](https://golang.org/dl/) For critical security issues & disclosure, see [SECURITY.md](SECURITY.md). ## Compatibility with CosmWasm contracts diff --git a/contrib/devtools/Makefile b/contrib/devtools/Makefile index ac05cc6779..b349abd256 100644 --- a/contrib/devtools/Makefile +++ b/contrib/devtools/Makefile @@ -61,7 +61,7 @@ tools-stamp: statik runsim golangci-lint statik: $(STATIK) $(STATIK): @echo "Installing statik..." - @(cd /tmp && go get github.com/rakyll/statik@v0.1.6) + @(cd /tmp && go install github.com/rakyll/statik@v0.1.6) # Install the runsim binary with a temporary workaround of entering an outside # directory as the "go get" command ignores the -mod option and will polute the @@ -71,12 +71,12 @@ $(STATIK): runsim: $(RUNSIM) $(RUNSIM): @echo "Installing runsim..." - @(cd /tmp && go get github.com/cosmos/tools/cmd/runsim@v1.0.0) + @(cd /tmp && go install github.com/cosmos/tools/cmd/runsim@v1.0.0) golangci-lint: $(GOLANGCI_LINT) $(GOLANGCI_LINT): @echo "Installing golangci-lint..." - @(cd /tmp && go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.28.0) + @(cd /tmp && go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.46.2) tools-clean: rm -f $(STATIK) $(GOLANGCI_LINT) $(RUNSIM) diff --git a/contrib/prototools-docker/Dockerfile b/contrib/prototools-docker/Dockerfile index 7d5af0d1fb..3ed6974c24 100644 --- a/contrib/prototools-docker/Dockerfile +++ b/contrib/prototools-docker/Dockerfile @@ -39,7 +39,7 @@ RUN GO111MODULE=on go get \ RUN upx --lzma /usr/local/bin/* -FROM golang:1.17.3-alpine +FROM golang:1.18-alpine ENV LD_LIBRARY_PATH=/lib64:/lib WORKDIR /work diff --git a/go.mod b/go.mod index 9d00684e0d..457017b764 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/CosmWasm/wasmd -go 1.17 +go 1.18 require ( github.com/CosmWasm/wasmvm v1.0.0 diff --git a/go.sum b/go.sum index 1cf0811d1e..fad4ada7b4 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= 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= @@ -28,18 +27,13 @@ cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aD cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= 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= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= 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/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= 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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= @@ -151,7 +145,6 @@ github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -210,7 +203,6 @@ github.com/confio/ics23/go v0.7.0 h1:00d2kukk7sPoHWL4zZBZwzxnpA2pec1NPdwbSokJ5w8 github.com/confio/ics23/go v0.7.0/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= github.com/containerd/continuity v0.2.1 h1:/EeEo2EtN3umhbbgCveyjifoMYg0pS+nMMEemaYw634= github.com/containerd/continuity v0.2.1/go.mod h1:wCYX+dRqZdImhGucXOqTQn05AhX6EUDaGEMUzTFFpLg= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -300,12 +292,10 @@ github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= -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 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= @@ -435,7 +425,6 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= 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.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -470,11 +459,8 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= @@ -512,7 +498,6 @@ github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIv github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -524,7 +509,6 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -557,7 +541,6 @@ github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 h1:uUjLpLt6bVvZ72SQc/B4dXcPBw4Vgd7soowdRl52qEM= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= @@ -581,7 +564,6 @@ github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1C 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.9.0 h1:npqHz788dryJiR/l6K/RUQAyh2SwV91+d1dnh4RjO9w= -github.com/jhump/protoreflect v1.9.0/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= @@ -633,7 +615,6 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= @@ -690,7 +671,6 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -728,7 +708,6 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/neilotoole/errgroup v0.1.5/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= 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= @@ -744,7 +723,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.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= 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= @@ -777,11 +755,6 @@ github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa 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/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= -github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= @@ -789,7 +762,6 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0= @@ -843,7 +815,6 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= @@ -880,18 +851,14 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.23.0/go.mod h1:6c7hFfxPOy7TacJc4Fcdi24/J0NKYGzjG8FWRI916Qo= github.com/rs/zerolog v1.26.0 h1:ORM4ibhEZeTeQlCojCK2kPz1ogAY4bGs4tD+SaAdGaE= github.com/rs/zerolog v1.26.0/go.mod h1:yBiM87lvSqX8h0Ww4sdzNSkVYZ8dL2xjZJG1lAuGZEo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= -github.com/sagikazarmark/crypt v0.5.0/go.mod h1:l+nzl7KWh51rpzp2h7t4MZWyiEWdhNpOAnclKvg+mdA= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa h1:0U2s5loxrTy6/VgfVoLuVLFJcURKLH49ie0zSch7gh4= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= @@ -922,7 +889,7 @@ github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= @@ -930,8 +897,6 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= @@ -945,8 +910,6 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= @@ -1035,13 +998,10 @@ go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.etcd.io/etcd/client/v2 v2.305.2/go.mod h1:2D7ZejHVMIfog1221iLSYlQRzrtECw3kz4I4VAQm3qI= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1201,11 +1161,7 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1219,16 +1175,12 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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= @@ -1339,17 +1291,11 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1412,10 +1358,8 @@ golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWc golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -1440,7 +1384,6 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= @@ -1467,7 +1410,6 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= @@ -1478,12 +1420,7 @@ google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqiv google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1559,19 +1496,8 @@ google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac h1:qSNTkEN+L2mvWcLgJOR+8bdHX9rN/IdU3A1Ghpfb1Rg= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= @@ -1587,7 +1513,6 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= @@ -1605,7 +1530,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index f9d5572f1e..b1e876716c 100755 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -8,7 +8,7 @@ protoc_gen_gocosmos() { return 1 fi - go get github.com/regen-network/cosmos-proto/protoc-gen-gocosmos@latest 2>/dev/null + go install github.com/regen-network/cosmos-proto/protoc-gen-gocosmos@latest 2>/dev/null } protoc_gen_gocosmos From c993eefb1127cc2d9c8ffa671debbdcd87d72bbc Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Wed, 24 Aug 2022 14:29:27 +0200 Subject: [PATCH 34/94] Revert changes in protogen script (#956) * Revert protocgen changes from #866 * Go mod tidy * Bump proto-gen image one version --- Makefile | 2 +- go.sum | 5 ----- scripts/protocgen.sh | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 69c1e24699..870b97bf81 100644 --- a/Makefile +++ b/Makefile @@ -165,7 +165,7 @@ format: format-tools ############################################################################### ### Protobuf ### ############################################################################### -PROTO_BUILDER_IMAGE=tendermintdev/sdk-proto-gen@sha256:372dce7be2f465123e26459973ca798fc489ff2c75aeecd814c0ca8ced24faca +PROTO_BUILDER_IMAGE=tendermintdev/sdk-proto-gen:v0.2 PROTO_FORMATTER_IMAGE=tendermintdev/docker-build-proto@sha256:aabcfe2fc19c31c0f198d4cd26393f5e5ca9502d7ea3feafbfe972448fee7cae proto-all: proto-format proto-lint proto-gen format diff --git a/go.sum b/go.sum index fad4ada7b4..a001b55bea 100644 --- a/go.sum +++ b/go.sum @@ -218,7 +218,6 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= -github.com/cosmos/cosmos-sdk v0.45.1/go.mod h1:XXS/asyCqWNWkx2rW6pSuen+EVcpAFxq6khrhnZgHaQ= github.com/cosmos/cosmos-sdk v0.45.5 h1:GVrZM+lss6y626Pq6loxh/3KLRgK/J6/alTkcKkYmGU= github.com/cosmos/cosmos-sdk v0.45.5/go.mod h1:WOqtDxN3eCCmnYLVla10xG7lEXkFjpTaqm2a2WasgCc= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= @@ -313,7 +312,6 @@ github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= @@ -606,7 +604,6 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= 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= @@ -845,7 +842,6 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So 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= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= @@ -889,7 +885,6 @@ github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index b1e876716c..f9d5572f1e 100755 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -8,7 +8,7 @@ protoc_gen_gocosmos() { return 1 fi - go install github.com/regen-network/cosmos-proto/protoc-gen-gocosmos@latest 2>/dev/null + go get github.com/regen-network/cosmos-proto/protoc-gen-gocosmos@latest 2>/dev/null } protoc_gen_gocosmos From 60da5c03d6f878a67455cd07d40c3d9c49023927 Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Thu, 25 Aug 2022 10:52:47 +0200 Subject: [PATCH 35/94] Ugrade sdk to v0.45.7 (#959) * 457 * upgrade ci * go get -> go install * change denom to new format * Update config.yml * Revert "change denom to new format" This reverts commit e637cf5aa417f5df9b91c196d97de85dcb70db01. * bump ibc-go to v3.2.x * Update config.yml * ibc-go v3.2.0 * Revert ibc-go version upgrade Co-authored-by: Jacob Gadikian --- Makefile | 2 +- app/test_helpers.go | 6 +- benchmarks/app_test.go | 8 +- contrib/devtools/Makefile | 2 +- go.mod | 51 +-- go.sum | 629 +++++++++++++++++++++++++++------ x/wasm/simulation/sim_utils.go | 1 + 7 files changed, 561 insertions(+), 138 deletions(-) diff --git a/Makefile b/Makefile index 870b97bf81..aea212d4f6 100644 --- a/Makefile +++ b/Makefile @@ -108,7 +108,7 @@ go.sum: go.mod draw-deps: @# requires brew install graphviz or apt-get install graphviz - go install github.com/RobotsAndPencils/goviz + go install github.com/RobotsAndPencils/goviz@latest @goviz -i ./cmd/wasmd -d 2 | dot -Tpng -o dependency-graph.png clean: diff --git a/app/test_helpers.go b/app/test_helpers.go index cf3de89a82..5aec561089 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "encoding/json" "fmt" + "math/rand" "path/filepath" "strconv" "testing" @@ -294,10 +295,11 @@ func SignCheckDeliver( chainID string, accNums, accSeqs []uint64, expSimPass, expPass bool, priv ...cryptotypes.PrivKey, ) (sdk.GasInfo, *sdk.Result, error) { tx, err := helpers.GenTx( + rand.New(rand.NewSource(time.Now().UnixNano())), txCfg, msgs, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}, - 2*DefaultGas, + helpers.DefaultGenTxGas, chainID, accNums, accSeqs, @@ -343,6 +345,7 @@ func SignAndDeliver( chainID string, accNums, accSeqs []uint64, expSimPass, expPass bool, priv ...cryptotypes.PrivKey, ) (sdk.GasInfo, *sdk.Result, error) { tx, err := helpers.GenTx( + rand.New(rand.NewSource(time.Now().UnixNano())), txCfg, msgs, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}, @@ -380,6 +383,7 @@ func GenSequenceOfTxs(txGen client.TxConfig, msgs []sdk.Msg, accNums []uint64, i var err error for i := 0; i < numToGenerate; i++ { txs[i], err = helpers.GenTx( + rand.New(rand.NewSource(time.Now().UnixNano())), txGen, msgs, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}, diff --git a/benchmarks/app_test.go b/benchmarks/app_test.go index 88773e6b42..e1e8954f5c 100644 --- a/benchmarks/app_test.go +++ b/benchmarks/app_test.go @@ -2,6 +2,7 @@ package benchmarks import ( "encoding/json" + "math/rand" "os" "testing" "time" @@ -125,7 +126,8 @@ func InitializeWasmApp(b testing.TB, db dbm.DB, numAccounts int) AppInfo { Sender: addr.String(), WASMByteCode: cw20Code, } - storeTx, err := helpers.GenTx(txGen, []sdk.Msg{&storeMsg}, nil, 55123123, "", []uint64{0}, []uint64{0}, minter) + storeTx, err := helpers.GenTx(rand.New(rand.NewSource(time.Now().UnixNano())), + txGen, []sdk.Msg{&storeMsg}, nil, 55123123, "", []uint64{0}, []uint64{0}, minter) require.NoError(b, err) _, res, err := wasmApp.Deliver(txGen.TxEncoder(), storeTx) require.NoError(b, err) @@ -159,7 +161,8 @@ func InitializeWasmApp(b testing.TB, db dbm.DB, numAccounts int) AppInfo { Msg: initBz, } gasWanted := 500000 + 10000*uint64(numAccounts) - initTx, err := helpers.GenTx(txGen, []sdk.Msg{&initMsg}, nil, gasWanted, "", []uint64{0}, []uint64{1}, minter) + initTx, err := helpers.GenTx(rand.New(rand.NewSource(time.Now().UnixNano())), + txGen, []sdk.Msg{&initMsg}, nil, gasWanted, "", []uint64{0}, []uint64{1}, minter) require.NoError(b, err) _, res, err = wasmApp.Deliver(txGen.TxEncoder(), initTx) require.NoError(b, err) @@ -192,6 +195,7 @@ func GenSequenceOfTxs(b testing.TB, info *AppInfo, msgGen func(*AppInfo) ([]sdk. msgs, err := msgGen(info) require.NoError(b, err) txs[i], err = helpers.GenTx( + rand.New(rand.NewSource(time.Now().UnixNano())), info.TxConfig, msgs, fees, diff --git a/contrib/devtools/Makefile b/contrib/devtools/Makefile index b349abd256..611f0c4d87 100644 --- a/contrib/devtools/Makefile +++ b/contrib/devtools/Makefile @@ -76,7 +76,7 @@ $(RUNSIM): golangci-lint: $(GOLANGCI_LINT) $(GOLANGCI_LINT): @echo "Installing golangci-lint..." - @(cd /tmp && go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.46.2) + @(cd /tmp && go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.47.0) tools-clean: rm -f $(STATIK) $(GOLANGCI_LINT) $(RUNSIM) diff --git a/go.mod b/go.mod index 457017b764..41b41dd53b 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.18 require ( github.com/CosmWasm/wasmvm v1.0.0 - github.com/cosmos/cosmos-sdk v0.45.5 - github.com/cosmos/iavl v0.17.3 + github.com/cosmos/cosmos-sdk v0.45.7 + github.com/cosmos/iavl v0.19.1 github.com/cosmos/ibc-go/v3 v3.0.0 github.com/cosmos/interchain-accounts v0.1.0 github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b @@ -20,15 +20,15 @@ require ( github.com/regen-network/cosmos-proto v0.3.1 github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa github.com/spf13/cast v1.5.0 - github.com/spf13/cobra v1.4.0 + github.com/spf13/cobra v1.5.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.11.0 + github.com/spf13/viper v1.12.0 github.com/stretchr/testify v1.8.0 github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca - github.com/tendermint/tendermint v0.34.19 + github.com/tendermint/tendermint v0.34.20 github.com/tendermint/tm-db v0.6.7 - google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac - google.golang.org/grpc v1.45.0 + google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd + google.golang.org/grpc v1.48.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -38,10 +38,10 @@ require ( github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect github.com/DataDog/zstd v1.4.5 // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect - github.com/armon/go-metrics v0.3.10 // indirect + github.com/armon/go-metrics v0.4.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect - github.com/btcsuite/btcd v0.22.0-beta // indirect + github.com/btcsuite/btcd v0.22.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/coinbase/rosetta-sdk-go v0.7.0 // indirect @@ -59,9 +59,9 @@ require ( github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/go-kit/kit v0.12.0 // indirect - github.com/go-kit/log v0.2.0 // indirect + github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/gateway v1.1.0 // indirect @@ -82,42 +82,43 @@ require ( github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/lib/pq v1.10.4 // indirect - github.com/libp2p/go-buffer-pool v0.0.2 // indirect + github.com/klauspost/compress v1.15.1 // indirect + github.com/lib/pq v1.10.6 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/magiconair/properties v1.8.6 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 // indirect github.com/minio/highwayhash v1.0.2 // indirect - github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/pelletier/go-toml v1.9.4 // indirect - github.com/pelletier/go-toml/v2 v2.0.0-beta.8 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.2 // indirect github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/common v0.34.0 // indirect github.com/prometheus/procfs v0.7.3 // indirect github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect github.com/rs/cors v1.8.2 // indirect - github.com/rs/zerolog v1.26.0 // indirect + github.com/rs/zerolog v1.27.0 // indirect github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa // indirect github.com/spf13/afero v1.8.2 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/subosito/gotenv v1.2.0 // indirect + github.com/subosito/gotenv v1.4.0 // indirect github.com/tendermint/btcd v0.1.1 // indirect github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/zondax/hid v0.9.0 // indirect go.etcd.io/bbolt v1.3.6 // indirect - golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect - golang.org/x/net v0.0.0-20220412020605-290c469a71a5 // indirect - golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/net v0.0.0-20220617184016-355a448f1bc9 // indirect + golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect + golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/ini.v1 v1.66.4 // indirect + gopkg.in/ini.v1 v1.66.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect ) diff --git a/go.sum b/go.sum index a001b55bea..7342a2a03b 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,5 @@ -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= +4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= 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= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= @@ -12,6 +13,7 @@ cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6 cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= @@ -27,30 +29,41 @@ cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aD cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= 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= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= 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/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= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= 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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= 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.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= 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= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0-beta.2 h1:/BZRNzm8N4K4eWfK28dL4yescorxtO7YG1yun8fy+pI= filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= +github.com/Antonboom/errname v0.1.6/go.mod h1:7lz79JAnuoMNDAWE9MeeIr1/c/VpSUWatBv2FH9NYpI= +github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= @@ -71,6 +84,7 @@ github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= @@ -82,30 +96,34 @@ github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3 github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.1.0/go.mod h1:LGOGuvEgCfCQsy3JF2tRmpGDpzA53iZfyGEWSPwQ6/4= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= 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 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.1.0/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= 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/Workiva/go-datastructures v1.0.52/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= -github.com/adlio/schema v1.1.13/go.mod h1:L5Z7tw+7lRK1Fnpi/LT/ooCP1elkXn0krMWBQHUhEDE= -github.com/adlio/schema v1.3.0 h1:eSVYLxYWbm/6ReZBCkLw4Fz7uqC+ZNoPvA39bOwi52A= -github.com/adlio/schema v1.3.0/go.mod h1:51QzxkpeFs6lRY11kPye26IaFPOV+HqEj01t5aXXKfs= +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/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -114,8 +132,13 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy 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/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= 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/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= @@ -123,35 +146,47 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= +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.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= 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/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.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= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= +github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= -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 v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= +github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +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-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -166,11 +201,14 @@ 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.4.0/go.mod h1:mwHG7klTHnX+rM/ym8LXGl7vYpVmnwT96xWoRB4H5QI= +github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= 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/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/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -179,11 +217,13 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= +github.com/chavacava/garif v0.0.0-20220316182200-5cad0b5181d4/go.mod h1:W8EnPSQ8Nv4fUjc/v1/8tHFqhuOJXnRub0dTfuAQktU= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= 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/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= @@ -198,35 +238,32 @@ github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:z github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go v0.7.0 h1:lmTO/JEpCvZgpbkOITL95rA80CPKb5CtMzLaqF2mCNg= github.com/coinbase/rosetta-sdk-go v0.7.0/go.mod h1:7nD3oBPIiHqhRprqvMgPoGxe/nyq3yftRmpsy29coWE= -github.com/confio/ics23/go v0.6.6/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= github.com/confio/ics23/go v0.7.0 h1:00d2kukk7sPoHWL4zZBZwzxnpA2pec1NPdwbSokJ5w8= github.com/confio/ics23/go v0.7.0/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.2.1 h1:/EeEo2EtN3umhbbgCveyjifoMYg0pS+nMMEemaYw634= -github.com/containerd/continuity v0.2.1/go.mod h1:wCYX+dRqZdImhGucXOqTQn05AhX6EUDaGEMUzTFFpLg= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +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/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= 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 v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= -github.com/cosmos/cosmos-sdk v0.45.5 h1:GVrZM+lss6y626Pq6loxh/3KLRgK/J6/alTkcKkYmGU= -github.com/cosmos/cosmos-sdk v0.45.5/go.mod h1:WOqtDxN3eCCmnYLVla10xG7lEXkFjpTaqm2a2WasgCc= +github.com/cosmos/cosmos-sdk v0.45.7 h1:5H9Ov04WIGoQAMJDdcSD4Vp5Lz6I17voHySH+vjJFCc= +github.com/cosmos/cosmos-sdk v0.45.7/go.mod h1:l8DURPoMMkIEe/Gw59g9KIMDjlYyTsKOWdc3iSSBXvw= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.17.3 h1:s2N819a2olOmiauVa0WAhoIJq9EhSXE9HDBAoR9k+8Y= -github.com/cosmos/iavl v0.17.3/go.mod h1:prJoErZFABYZGDHka1R6Oay4z9PrNeFFiMKHDAMOi4w= +github.com/cosmos/iavl v0.19.1 h1:3gaq9b6SjiB0KBTygRnAvEGml2pQlu1TH8uma5g63Ys= +github.com/cosmos/iavl v0.19.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= github.com/cosmos/ibc-go/v3 v3.0.0 h1:XUNplHVS51Q2gMnTFsFsH9QJ7flsovMamnltKbEgPQ4= github.com/cosmos/ibc-go/v3 v3.0.0/go.mod h1:Mb+1NXiPOLd+CPFlOC6BKeAUaxXlhuWenMmRiUiSmwY= github.com/cosmos/interchain-accounts v0.1.0 h1:QmuwNsf1Hxl3P5GSGt7Z+JeuHPiZw4Z34R/038P5T6s= @@ -241,17 +278,22 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc 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.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 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/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/daixiang0/gci v0.3.3/go.mod h1:1Xr2bxnQbDxCqqulUOv8qpGqkgRw9RSCGGjEC2LjF8o= github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= 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= @@ -267,7 +309,11 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUn github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= 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.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= @@ -286,9 +332,12 @@ github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= @@ -301,8 +350,10 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/firefart/nonamedreturns v1.0.1/go.mod h1:D3dpIBojGGNh5UfElmwPu73SwDCm+VKhHYqwlNOk2uQ= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -311,17 +362,23 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/fzipp/gocyclo v0.5.1/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/go-critic/go-critic v0.6.3/go.mod h1:c6b3ZP1MQ7o6lPR7Rv3lEf7pYQUmAcx8ABHgdZCQt/k= 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= @@ -331,14 +388,16 @@ github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgO github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -346,12 +405,25 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/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 h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= @@ -361,6 +433,9 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E 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/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= @@ -369,7 +444,6 @@ github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -383,6 +457,7 @@ github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71 github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -407,9 +482,21 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/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-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.46.2/go.mod h1:3DkdHnxn9eoTTrpT2gB0TEv8KSziuoqe9FitgQLHvAY= +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.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -422,7 +509,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 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.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -440,25 +529,38 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= @@ -467,23 +569,33 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= +github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +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/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 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.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= 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/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= @@ -493,11 +605,10 @@ github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -507,12 +618,14 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 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.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= 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= @@ -522,6 +635,8 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -539,10 +654,14 @@ github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 h1:uUjLpLt6bVvZ72SQc/B4dXcPBw4Vgd7soowdRl52qEM= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= 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/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= @@ -550,6 +669,10 @@ github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3 github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/improbable-eng/grpc-web v0.14.1 h1:NrN4PY71A6tAz2sKDvC5JCauENWp0ykG8Oq1H3cpFvw= github.com/improbable-eng/grpc-web v0.14.1/go.mod h1:zEjGHa8DAlkoOXmswrNvhUGEYQA9UI7DhrGeHR1DMGU= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= @@ -558,16 +681,30 @@ github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZ 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/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= 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.9.0 h1:npqHz788dryJiR/l6K/RUQAyh2SwV91+d1dnh4RjO9w= +github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f/go.mod h1:qr2b5kx4HbFS7/g4uYO5qv9ei8303JMsC7ESbYiqr2Q= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753 h1:uFlcJKZPLQd7rmOY/RrvBuUaYmAFnlFHKLivhO6cOy8= +github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= 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= @@ -581,22 +718,30 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 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/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.6.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.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +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.2/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= @@ -604,33 +749,50 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= 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.2/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= +github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= +github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= +github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= +github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= -github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +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/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= +github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= @@ -646,13 +808,22 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/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.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.2.1/go.mod h1:+Ro3wqY4vakcYNtkBWdZC7dBg1xSB6sp054wWwmeFm0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= @@ -660,18 +831,26 @@ github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA 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= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +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/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= 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= @@ -680,13 +859,20 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb 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/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= +github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= 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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 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/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= 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/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= @@ -702,43 +888,53 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= 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/neilotoole/errgroup v0.1.5/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/exhaustive v0.7.11/go.mod h1:gX+MP7DWMKJmNa1HfMozK+u04hQd3na9i0hyqf3/dOI= +github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +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.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= 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/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= 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= -github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.0.3 h1:1hbqejyQWCJBvtKAfdO0b1FmaEf2z/bxnjqbARass5k= -github.com/opencontainers/runc v1.0.3/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +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/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= 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= @@ -751,47 +947,65 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh 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/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.0/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= +github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= 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/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= 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/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +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.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.0.0/go.mod h1:KZy4xxPJyy88/gldCe5OdW6OQRtNO3EZE7hXzmnebgA= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= 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= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= @@ -804,30 +1018,38 @@ github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= 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.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= +github.com/quasilyte/go-ruleguard v0.3.16-0.20220213074421-6aa060fab41a/go.mod h1:VMX+OnnSw4LicdiEGtRSD/1X8kW7GuEscjYNr4cOIT4= +github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.16/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.19/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= 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= @@ -837,45 +1059,65 @@ github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzy github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= +github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= +github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= 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= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.26.0 h1:ORM4ibhEZeTeQlCojCK2kPz1ogAY4bGs4tD+SaAdGaE= -github.com/rs/zerolog v1.26.0/go.mod h1:yBiM87lvSqX8h0Ww4sdzNSkVYZ8dL2xjZJG1lAuGZEo= +github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= +github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= 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.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sagikazarmark/crypt v0.5.0/go.mod h1:l+nzl7KWh51rpzp2h7t4MZWyiEWdhNpOAnclKvg+mdA= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa h1:0U2s5loxrTy6/VgfVoLuVLFJcURKLH49ie0zSch7gh4= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.22.4/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= 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.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= +github.com/sivchari/tenv v1.5.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= 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 h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= 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.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -890,10 +1132,10 @@ github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -902,13 +1144,13 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= -github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -921,6 +1163,8 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -928,13 +1172,18 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= +github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= +github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= +github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= @@ -942,62 +1191,98 @@ github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RM github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= 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/tendermint/tendermint v0.34.14/go.mod h1:FrwVm3TvsVicI9Z7FlucHV6Znfd5KBc/Lpp69cCwtk0= -github.com/tendermint/tendermint v0.34.19 h1:y0P1qI5wSa9IRuhKnTDA6IUcOrLi1hXJuALR+R7HFEk= -github.com/tendermint/tendermint v0.34.19/go.mod h1:R5+wgIwSxMdKQcmOaeudL0Cjkr3HDkhpcdum6VeU3R4= -github.com/tendermint/tm-db v0.6.4/go.mod h1:dptYhIpJ2M5kUuenLr+Yyf3zQOv1SgBZcl8/BmWlMBw= +github.com/tendermint/tendermint v0.34.20 h1:/pmvJhO3IqOxhbi8iRXudTjA2YKpaMqrLwFNkyxDSzw= +github.com/tendermint/tendermint v0.34.20/go.mod h1:KtOwCLYJcsS1ymtAfnjjAtXfXClbqcqjdqzFt2Em1Ac= github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= github.com/tidwall/gjson v1.6.7/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/sjson v1.1.4/go.mod h1:wXpKXu8CtDjKAZ+3DrKY5ROCorDFahq8l0tey/Lx1fg= +github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomarrell/wrapcheck/v2 v2.6.1/go.mod h1:Eo+Opt6pyMW1b6cNllOcDSSoHO0aTJ+iF6BfCUbHltA= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd/v2 v2.5.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= 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/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= +github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vmihailenco/msgpack/v5 v5.1.4/go.mod h1:C5gboKD0TJPqWDTVTtrQNfRbiBwHZGo8UTqP/9/XvLI= github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= +github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= 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= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +gitlab.com/bosi/decorder v0.2.1/go.mod h1:6C/nhLSbF6qZbYD8bRmISBwc6vcWdNsiIBkRvjJFrH0= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd/client/v2 v2.305.2/go.mod h1:2D7ZejHVMIfog1221iLSYlQRzrtECw3kz4I4VAQm3qI= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= 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= @@ -1014,16 +1299,21 @@ 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.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= 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= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/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-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1044,15 +1334,19 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220313003712-b769efc7c000/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1068,6 +1362,7 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 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= @@ -1096,6 +1391,9 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1111,7 +1409,6 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1119,6 +1416,7 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1149,16 +1447,23 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9 h1:Yqz/iviulwKwAREEeUd3nbBFn0XuyJqkoft2IlrvOhc= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 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= @@ -1176,10 +1481,14 @@ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1187,6 +1496,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1211,6 +1521,7 @@ golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1220,7 +1531,6 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1245,13 +1555,14 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1266,33 +1577,54 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 h1:CBpWXWQpIRjzmkkA+M7q9Fqnwd2mZr3AFqexg8YTfoM= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 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= @@ -1313,33 +1645,44 @@ golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190228203856-589c23e65e65/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1349,36 +1692,65 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11-0.20220316014157-77aa08bb151a/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= @@ -1388,6 +1760,7 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= @@ -1415,16 +1788,27 @@ google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqiv google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 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/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 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-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1433,6 +1817,7 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -1454,12 +1839,13 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201119123407-9b1e624d6bc4/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1491,10 +1877,26 @@ google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac h1:qSNTkEN+L2mvWcLgJOR+8bdHX9rN/IdU3A1Ghpfb1Rg= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -1510,6 +1912,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= @@ -1521,13 +1924,14 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -1541,15 +1945,19 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/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.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1557,6 +1965,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.3.1/go.mod h1:vlRD9XErLMGT+mDuofSr0mMMquscM/1nQqtRSsh6m70= +mvdan.cc/gofumpt v0.3.1/go.mod h1:w3ymliuxvzVx8DAutBnVyDqYb1Niy/yCJt/lk821YCE= +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-20211214103731-d0ef000c54e5/go.mod h1:b8RRCBm0eeiWR8cfN88xeq2G5SG3VKGO+5UPWi5FSOY= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/x/wasm/simulation/sim_utils.go b/x/wasm/simulation/sim_utils.go index 4f9a00b0bf..b29c18cf28 100644 --- a/x/wasm/simulation/sim_utils.go +++ b/x/wasm/simulation/sim_utils.go @@ -31,6 +31,7 @@ func GenAndDeliverTxWithRandFees(txCtx simulation.OperationInput, gas uint64) (s func GenAndDeliverTx(txCtx simulation.OperationInput, fees sdk.Coins, gas uint64) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { account := txCtx.AccountKeeper.GetAccount(txCtx.Context, txCtx.SimAccount.Address) tx, err := helpers.GenTx( + txCtx.R, txCtx.TxGen, []sdk.Msg{txCtx.Msg}, fees, From e251e1648796e906286985094f41eab7f0530664 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Aug 2022 08:53:51 +0000 Subject: [PATCH 36/94] Bump github.com/prometheus/client_golang from 1.12.2 to 1.13.0 Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.12.2 to 1.13.0. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.12.2...v1.13.0) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 8 ++++---- go.sum | 12 ++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 41b41dd53b..7fd3399cf6 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.12.2 + github.com/prometheus/client_golang v1.13.0 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa @@ -98,8 +98,8 @@ require ( github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.34.0 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect github.com/rs/cors v1.8.2 // indirect github.com/rs/zerolog v1.27.0 // indirect @@ -117,7 +117,7 @@ require ( golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 // indirect golang.org/x/text v0.3.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/ini.v1 v1.66.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect diff --git a/go.sum b/go.sum index 7342a2a03b..5098b6cd0b 100644 --- a/go.sum +++ b/go.sum @@ -1007,8 +1007,9 @@ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= +github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1026,8 +1027,9 @@ github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1035,8 +1037,9 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= @@ -1914,8 +1917,9 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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 559ea2b4771197bdaaaff374949511334d4e0b5a Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 25 Aug 2022 13:51:07 +0200 Subject: [PATCH 37/94] Fix codeql analyzer branch config --- .github/workflows/codeql-analizer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analizer.yml b/.github/workflows/codeql-analizer.yml index 86714b1281..dd4a9c542b 100644 --- a/.github/workflows/codeql-analizer.yml +++ b/.github/workflows/codeql-analizer.yml @@ -5,7 +5,7 @@ on: paths: - "**.go" push: - branches: [ master ] + branches: [ main ] paths: - "**.go" From a35420842ed7a0d5cd5caff129f7253bf9977bf8 Mon Sep 17 00:00:00 2001 From: faddat Date: Thu, 25 Aug 2022 21:55:27 +0000 Subject: [PATCH 38/94] sdk v0.45.8 --- go.mod | 18 +- go.sum | 827 ++------------------------------------------------------- 2 files changed, 39 insertions(+), 806 deletions(-) diff --git a/go.mod b/go.mod index 7fd3399cf6..bbeeeefca6 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/CosmWasm/wasmvm v1.0.0 - github.com/cosmos/cosmos-sdk v0.45.7 + github.com/cosmos/cosmos-sdk v0.45.8 github.com/cosmos/iavl v0.19.1 github.com/cosmos/ibc-go/v3 v3.0.0 github.com/cosmos/interchain-accounts v0.1.0 @@ -25,9 +25,9 @@ require ( github.com/spf13/viper v1.12.0 github.com/stretchr/testify v1.8.0 github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca - github.com/tendermint/tendermint v0.34.20 + github.com/tendermint/tendermint v0.34.21 github.com/tendermint/tm-db v0.6.7 - google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd + google.golang.org/genproto v0.0.0-20220725144611-272f38e5d71b google.golang.org/grpc v1.48.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -51,6 +51,7 @@ require ( github.com/cosmos/gorocksdb v1.2.0 // indirect github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect github.com/cosmos/ledger-go v0.9.2 // indirect + github.com/creachadair/taskgroup v0.3.2 // indirect github.com/danieljoos/wincred v1.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect @@ -82,13 +83,13 @@ require ( github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d // indirect - github.com/klauspost/compress v1.15.1 // indirect + github.com/klauspost/compress v1.15.9 // indirect github.com/lib/pq v1.10.6 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/magiconair/properties v1.8.6 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -113,9 +114,10 @@ require ( github.com/zondax/hid v0.9.0 // indirect go.etcd.io/bbolt v1.3.6 // indirect golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect - golang.org/x/net v0.0.0-20220617184016-355a448f1bc9 // indirect - golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect - golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/net v0.0.0-20220726230323-06994584191e // indirect + golang.org/x/sys v0.0.0-20220727055044-e65921a090b8 // indirect + golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/ini.v1 v1.66.6 // indirect diff --git a/go.sum b/go.sum index 5098b6cd0b..2b287c95b0 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= 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= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= @@ -13,66 +11,36 @@ cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6 cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= 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= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= 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/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= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= 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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= 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.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= 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= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0-beta.2 h1:/BZRNzm8N4K4eWfK28dL4yescorxtO7YG1yun8fy+pI= filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= -github.com/Antonboom/errname v0.1.6/go.mod h1:7lz79JAnuoMNDAWE9MeeIr1/c/VpSUWatBv2FH9NYpI= -github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= @@ -84,35 +52,20 @@ github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= github.com/CosmWasm/wasmvm v1.0.0 h1:NRmnHe3xXsKn2uEcB1F5Ha323JVAhON+BI6L177dlKc= github.com/CosmWasm/wasmvm v1.0.0/go.mod h1:ei0xpvomwSdONsxDuONzV7bL1jSET1M8brEx0FCXc+A= -github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.1.0/go.mod h1:LGOGuvEgCfCQsy3JF2tRmpGDpzA53iZfyGEWSPwQ6/4= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= 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 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.1.0/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= @@ -123,61 +76,35 @@ github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSa github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= 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/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= 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/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= 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/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -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.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= 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/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.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= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= -github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -186,14 +113,12 @@ github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MR github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -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-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= -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= @@ -201,62 +126,41 @@ 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.4.0/go.mod h1:mwHG7klTHnX+rM/ym8LXGl7vYpVmnwT96xWoRB4H5QI= -github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= 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/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/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= 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.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20220316182200-5cad0b5181d4/go.mod h1:W8EnPSQ8Nv4fUjc/v1/8tHFqhuOJXnRub0dTfuAQktU= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= 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/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/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -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-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go v0.7.0 h1:lmTO/JEpCvZgpbkOITL95rA80CPKb5CtMzLaqF2mCNg= github.com/coinbase/rosetta-sdk-go v0.7.0/go.mod h1:7nD3oBPIiHqhRprqvMgPoGxe/nyq3yftRmpsy29coWE= github.com/confio/ics23/go v0.7.0 h1:00d2kukk7sPoHWL4zZBZwzxnpA2pec1NPdwbSokJ5w8= github.com/confio/ics23/go v0.7.0/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= 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/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= 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 v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= -github.com/cosmos/cosmos-sdk v0.45.7 h1:5H9Ov04WIGoQAMJDdcSD4Vp5Lz6I17voHySH+vjJFCc= -github.com/cosmos/cosmos-sdk v0.45.7/go.mod h1:l8DURPoMMkIEe/Gw59g9KIMDjlYyTsKOWdc3iSSBXvw= +github.com/cosmos/cosmos-sdk v0.45.8 h1:UHO5LTkOYLK1pvu9WELCxnp8zw/YcjoNGqqcYiLQ4pE= +github.com/cosmos/cosmos-sdk v0.45.8/go.mod h1:+OKZMhLj+Y6LCzCDsyIvpul/xk7n9lVUn8sikLWD0Jo= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -276,25 +180,18 @@ github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6p github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9QWFanOyI= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= +github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= 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/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/daixiang0/gci v0.3.3/go.mod h1:1Xr2bxnQbDxCqqulUOv8qpGqkgRw9RSCGGjEC2LjF8o= github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= 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.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= @@ -308,16 +205,9 @@ 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/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= 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.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= @@ -331,54 +221,31 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= -github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/firefart/nonamedreturns v1.0.1/go.mod h1:D3dpIBojGGNh5UfElmwPu73SwDCm+VKhHYqwlNOk2uQ= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= 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= -github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/fzipp/gocyclo v0.5.1/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -github.com/go-critic/go-critic v0.6.3/go.mod h1:c6b3ZP1MQ7o6lPR7Rv3lEf7pYQUmAcx8ABHgdZCQt/k= 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= @@ -397,7 +264,6 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -405,25 +271,9 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/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 h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= @@ -433,31 +283,20 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E 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/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -474,7 +313,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -482,21 +320,9 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/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-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.46.2/go.mod h1:3DkdHnxn9eoTTrpT2gB0TEv8KSziuoqe9FitgQLHvAY= -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.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -505,13 +331,9 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 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.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -520,7 +342,6 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -529,38 +350,18 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= @@ -573,21 +374,7 @@ github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qH github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -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/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 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.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= @@ -595,7 +382,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= 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/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= @@ -606,37 +392,23 @@ github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/b github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.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/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 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.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= 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-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -646,65 +418,32 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 h1:uUjLpLt6bVvZ72SQc/B4dXcPBw4Vgd7soowdRl52qEM= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= 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/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/improbable-eng/grpc-web v0.14.1 h1:NrN4PY71A6tAz2sKDvC5JCauENWp0ykG8Oq1H3cpFvw= github.com/improbable-eng/grpc-web v0.14.1/go.mod h1:zEjGHa8DAlkoOXmswrNvhUGEYQA9UI7DhrGeHR1DMGU= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= 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/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= 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.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f/go.mod h1:qr2b5kx4HbFS7/g4uYO5qv9ei8303JMsC7ESbYiqr2Q= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= -github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753 h1:uFlcJKZPLQd7rmOY/RrvBuUaYmAFnlFHKLivhO6cOy8= -github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= 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= @@ -718,57 +457,32 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 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/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.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.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= 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.2/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.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= 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.2/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -776,22 +490,12 @@ github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QT 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/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= @@ -799,58 +503,31 @@ github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HN github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/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.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.2.1/go.mod h1:+Ro3wqY4vakcYNtkBWdZC7dBg1xSB6sp054wWwmeFm0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= 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= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= 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= @@ -858,146 +535,81 @@ 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/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= -github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= 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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 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/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= 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/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= 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 v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= -github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= 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.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= 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.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= 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/neilotoole/errgroup v0.1.5/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.7.11/go.mod h1:gX+MP7DWMKJmNa1HfMozK+u04hQd3na9i0hyqf3/dOI= -github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= -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.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -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/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= 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 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= 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/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= 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= 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/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/pelletier/go-toml/v2 v2.0.0/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= 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/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= 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/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -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.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.0.0/go.mod h1:KZy4xxPJyy88/gldCe5OdW6OQRtNO3EZE7hXzmnebgA= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= 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= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -1005,9 +617,7 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1025,9 +635,7 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b 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.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1041,18 +649,6 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.16-0.20220213074421-6aa060fab41a/go.mod h1:VMX+OnnSw4LicdiEGtRSD/1X8kW7GuEscjYNr4cOIT4= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.16/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.19/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= 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= @@ -1062,16 +658,11 @@ github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzy github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= -github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= -github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= -github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= 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= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= @@ -1083,60 +674,36 @@ github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Q github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= 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.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= -github.com/sagikazarmark/crypt v0.5.0/go.mod h1:l+nzl7KWh51rpzp2h7t4MZWyiEWdhNpOAnclKvg+mdA= -github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa h1:0U2s5loxrTy6/VgfVoLuVLFJcURKLH49ie0zSch7gh4= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil/v3 v3.22.4/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= 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= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= -github.com/sivchari/tenv v1.5.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= 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 h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= 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.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= @@ -1147,27 +714,19 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= 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/amqp v1.0.0/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/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.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1178,44 +737,26 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= -github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= -github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= 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/tendermint/tendermint v0.34.20 h1:/pmvJhO3IqOxhbi8iRXudTjA2YKpaMqrLwFNkyxDSzw= -github.com/tendermint/tendermint v0.34.20/go.mod h1:KtOwCLYJcsS1ymtAfnjjAtXfXClbqcqjdqzFt2Em1Ac= -github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= +github.com/tendermint/tendermint v0.34.21 h1:UiGGnBFHVrZhoQVQ7EfwSOLuCtarqCSsRf8VrklqB7s= +github.com/tendermint/tendermint v0.34.21/go.mod h1:XDvfg6U7grcFTDx7VkzxnhazQ/bspGJAn4DZ6DcLLjQ= github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= github.com/tidwall/gjson v1.6.7/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/sjson v1.1.4/go.mod h1:wXpKXu8CtDjKAZ+3DrKY5ROCorDFahq8l0tey/Lx1fg= -github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.6.1/go.mod h1:Eo+Opt6pyMW1b6cNllOcDSSoHO0aTJ+iF6BfCUbHltA= -github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/tommy-muehle/go-mnd/v2 v2.5.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= @@ -1225,67 +766,24 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= 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/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= -github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= -github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vmihailenco/msgpack/v5 v5.1.4/go.mod h1:C5gboKD0TJPqWDTVTtrQNfRbiBwHZGo8UTqP/9/XvLI= github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= 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= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -gitlab.com/bosi/decorder v0.2.1/go.mod h1:6C/nhLSbF6qZbYD8bRmISBwc6vcWdNsiIBkRvjJFrH0= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.etcd.io/etcd/client/v2 v2.305.2/go.mod h1:2D7ZejHVMIfog1221iLSYlQRzrtECw3kz4I4VAQm3qI= -go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= 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= @@ -1294,29 +792,15 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= 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.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= 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= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/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-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1325,35 +809,19 @@ golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 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-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/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-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220313003712-b769efc7c000/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= @@ -1365,8 +833,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= 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-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -1379,7 +847,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= @@ -1392,11 +859,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1418,8 +880,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1440,33 +900,15 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9 h1:Yqz/iviulwKwAREEeUd3nbBFn0XuyJqkoft2IlrvOhc= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220726230323-06994584191e h1:wOQNKh1uuDGRnmgF0jDxh7ctgGy/3P4rYWQRVJD4/Yg= +golang.org/x/net v0.0.0-20220726230323-06994584191e/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= 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= @@ -1476,30 +918,18 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1510,28 +940,21 @@ golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/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-20190222072716-a9d3bda3a223/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= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1540,7 +963,6 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1558,76 +980,33 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.0.0-20220727055044-e65921a090b8 h1:dyU22nBWzrmTQxtNrr4dzVOvaw35nUYE279vF9UmsI8= +golang.org/x/sys v0.0.0-20220727055044-e65921a090b8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 h1:CBpWXWQpIRjzmkkA+M7q9Fqnwd2mZr3AFqexg8YTfoM= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 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= @@ -1642,50 +1021,33 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb 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= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190228203856-589c23e65e65/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1695,75 +1057,34 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11-0.20220316014157-77aa08bb151a/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= 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= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= @@ -1779,39 +1100,15 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 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/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 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-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1820,7 +1117,6 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -1842,8 +1138,6 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1854,55 +1148,11 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220725144611-272f38e5d71b h1:SfSkJugek6xm7lWywqth4r2iTrYLpD8lOj1nMIIhMNM= +google.golang.org/genproto v0.0.0-20220725144611-272f38e5d71b/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1915,25 +1165,17 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -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 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= @@ -1949,19 +1191,15 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1969,17 +1207,10 @@ 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.3.1/go.mod h1:vlRD9XErLMGT+mDuofSr0mMMquscM/1nQqtRSsh6m70= -mvdan.cc/gofumpt v0.3.1/go.mod h1:w3ymliuxvzVx8DAutBnVyDqYb1Niy/yCJt/lk821YCE= -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-20211214103731-d0ef000c54e5/go.mod h1:b8RRCBm0eeiWR8cfN88xeq2G5SG3VKGO+5UPWi5FSOY= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From b574fa98b0c32feb5451b6e14acdeea09edcebcb Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Fri, 26 Aug 2022 04:58:23 +0700 Subject: [PATCH 39/94] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbba596eda..a735308f23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [Unreleased](https://github.com/CosmWasm/wasmd/tree/HEAD) - Upgrade go to v1.18 [\#866]https://github.com/CosmWasm/wasmd/pull/866/) ([faddat](https://github.com/faddat)) +- Upgrade to cosmos-sdk v0.45.8 [\#964](https://github.com/CosmWasm/wasmd/pull/964/) ([faddat](https://github.com/faddat)) From e714fdf3b44a93462232648ab670ff611c381ce1 Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Wed, 31 Aug 2022 16:17:03 +0200 Subject: [PATCH 40/94] Charge gas to unzip wasm code (#898) * Charge gas for unzip wasm code * Add uncompress test * Apply review feedback * Add testcase to uncompress spec --- app/test_helpers.go | 2 +- x/wasm/ioutils/ioutil.go | 14 +++----- x/wasm/ioutils/ioutil_test.go | 21 ------------ x/wasm/ioutils/utils.go | 2 +- x/wasm/ioutils/utils_test.go | 2 ++ x/wasm/keeper/gas_register.go | 25 ++++++++++++++ x/wasm/keeper/gas_register_test.go | 40 ++++++++++++++++++++++ x/wasm/keeper/keeper.go | 20 +++++++---- x/wasm/keeper/keeper_test.go | 17 +++++++++ x/wasm/keeper/snapshotter.go | 3 ++ x/wasm/keeper/testdata/broken_crc.gzip | Bin 0 -> 809232 bytes x/wasm/keeper/wasmtesting/gas_register.go | 8 +++++ 12 files changed, 114 insertions(+), 40 deletions(-) create mode 100644 x/wasm/keeper/testdata/broken_crc.gzip diff --git a/app/test_helpers.go b/app/test_helpers.go index 5aec561089..ccf49656a6 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -284,7 +284,7 @@ func CheckBalance(t *testing.T, app *WasmApp, addr sdk.AccAddress, balances sdk. require.True(t, balances.IsEqual(app.BankKeeper.GetAllBalances(ctxCheck, addr))) } -const DefaultGas = 1200000 +const DefaultGas = 1_500_000 // SignCheckDeliver checks a generated signed transaction and simulates a // block commitment with the given transaction. A test assertion is made using diff --git a/x/wasm/ioutils/ioutil.go b/x/wasm/ioutils/ioutil.go index 5740132342..a34a43e9ea 100644 --- a/x/wasm/ioutils/ioutil.go +++ b/x/wasm/ioutils/ioutil.go @@ -8,18 +8,12 @@ import ( "github.com/CosmWasm/wasmd/x/wasm/types" ) -// Uncompress returns gzip uncompressed content if input was gzip, or original src otherwise -func Uncompress(src []byte, limit uint64) ([]byte, error) { - switch n := uint64(len(src)); { - case n < 3: - return src, nil - case n > limit: +// Uncompress expects a valid gzip source to unpack or fails. See IsGzip +func Uncompress(gzipSrc []byte, limit uint64) ([]byte, error) { + if uint64(len(gzipSrc)) > limit { return nil, types.ErrLimit } - if !bytes.Equal(gzipIdent, src[0:3]) { - return src, nil - } - zr, err := gzip.NewReader(bytes.NewReader(src)) + zr, err := gzip.NewReader(bytes.NewReader(gzipSrc)) if err != nil { return nil, err } diff --git a/x/wasm/ioutils/ioutil_test.go b/x/wasm/ioutils/ioutil_test.go index 93a478ae00..3399abf293 100644 --- a/x/wasm/ioutils/ioutil_test.go +++ b/x/wasm/ioutils/ioutil_test.go @@ -6,7 +6,6 @@ import ( "errors" "io" "os" - "strings" "testing" "github.com/stretchr/testify/assert" @@ -29,30 +28,10 @@ func TestUncompress(t *testing.T) { expError error expResult []byte }{ - "handle wasm uncompressed": { - src: wasmRaw, - expResult: wasmRaw, - }, "handle wasm compressed": { src: wasmGzipped, expResult: wasmRaw, }, - "handle nil slice": { - src: nil, - expResult: nil, - }, - "handle short unidentified": { - src: []byte{0x1, 0x2}, - expResult: []byte{0x1, 0x2}, - }, - "handle input slice exceeding limit": { - src: []byte(strings.Repeat("a", maxSize+1)), - expError: types.ErrLimit, - }, - "handle input slice at limit": { - src: []byte(strings.Repeat("a", maxSize)), - expResult: []byte(strings.Repeat("a", maxSize)), - }, "handle gzip identifier only": { src: gzipIdent, expError: io.ErrUnexpectedEOF, diff --git a/x/wasm/ioutils/utils.go b/x/wasm/ioutils/utils.go index d4b8abf349..197c44c360 100644 --- a/x/wasm/ioutils/utils.go +++ b/x/wasm/ioutils/utils.go @@ -17,7 +17,7 @@ var ( // IsGzip returns checks if the file contents are gzip compressed func IsGzip(input []byte) bool { - return bytes.Equal(input[:3], gzipIdent) + return len(input) >= 3 && bytes.Equal(gzipIdent, input[0:3]) } // IsWasm checks if the file contents are of wasm binary diff --git a/x/wasm/ioutils/utils_test.go b/x/wasm/ioutils/utils_test.go index cd4846f092..2dea0c5c0f 100644 --- a/x/wasm/ioutils/utils_test.go +++ b/x/wasm/ioutils/utils_test.go @@ -41,6 +41,8 @@ func TestIsGzip(t *testing.T) { require.False(t, IsGzip(wasmCode)) require.False(t, IsGzip(someRandomStr)) + require.False(t, IsGzip(nil)) + require.True(t, IsGzip(gzipData[0:3])) require.True(t, IsGzip(gzipData)) } diff --git a/x/wasm/keeper/gas_register.go b/x/wasm/keeper/gas_register.go index c21606344f..51f8e607cc 100644 --- a/x/wasm/keeper/gas_register.go +++ b/x/wasm/keeper/gas_register.go @@ -54,12 +54,26 @@ const ( DefaultEventAttributeDataFreeTier = 100 ) +// default: 0.15 gas. +// see https://github.com/CosmWasm/wasmd/pull/898#discussion_r937727200 +var defaultPerByteUncompressCost = wasmvmtypes.UFraction{ + Numerator: 15, + Denominator: 100, +} + +// DefaultPerByteUncompressCost is how much SDK gas we charge per source byte to unpack +func DefaultPerByteUncompressCost() wasmvmtypes.UFraction { + return defaultPerByteUncompressCost +} + // GasRegister abstract source for gas costs type GasRegister interface { // NewContractInstanceCosts costs to crate a new contract instance from code NewContractInstanceCosts(pinned bool, msgLen int) sdk.Gas // CompileCosts costs to persist and "compile" a new wasm contract CompileCosts(byteLength int) sdk.Gas + // UncompressCosts costs to unpack a new wasm contract + UncompressCosts(byteLength int) sdk.Gas // InstantiateContractCosts costs when interacting with a wasm contract InstantiateContractCosts(pinned bool, msgLen int) sdk.Gas // ReplyCosts costs to to handle a message reply @@ -78,6 +92,8 @@ type WasmGasRegisterConfig struct { InstanceCost sdk.Gas // CompileCosts costs to persist and "compile" a new wasm contract CompileCost sdk.Gas + // UncompressCost costs per byte to unpack a contract + UncompressCost wasmvmtypes.UFraction // GasMultiplier is how many cosmwasm gas points = 1 sdk gas point // SDK reference costs can be found here: https://github.com/cosmos/cosmos-sdk/blob/02c6c9fafd58da88550ab4d7d494724a477c8a68/store/types/gas.go#L153-L164 GasMultiplier sdk.Gas @@ -107,6 +123,7 @@ func DefaultGasRegisterConfig() WasmGasRegisterConfig { EventAttributeDataCost: DefaultEventAttributeDataCost, EventAttributeDataFreeTier: DefaultEventAttributeDataFreeTier, ContractMessageDataCost: DefaultContractMessageDataCost, + UncompressCost: DefaultPerByteUncompressCost(), } } @@ -143,6 +160,14 @@ func (g WasmGasRegister) CompileCosts(byteLength int) storetypes.Gas { return g.c.CompileCost * uint64(byteLength) } +// UncompressCosts costs to unpack a new wasm contract +func (g WasmGasRegister) UncompressCosts(byteLength int) sdk.Gas { + if byteLength < 0 { + panic(sdkerrors.Wrap(types.ErrInvalid, "negative length")) + } + return g.c.UncompressCost.Mul(uint64(byteLength)).Floor() +} + // InstantiateContractCosts costs when interacting with a wasm contract func (g WasmGasRegister) InstantiateContractCosts(pinned bool, msgLen int) sdk.Gas { if msgLen < 0 { diff --git a/x/wasm/keeper/gas_register_test.go b/x/wasm/keeper/gas_register_test.go index bc3e761a26..03f6cdd863 100644 --- a/x/wasm/keeper/gas_register_test.go +++ b/x/wasm/keeper/gas_register_test.go @@ -5,6 +5,8 @@ import ( "strings" "testing" + "github.com/CosmWasm/wasmd/x/wasm/types" + wasmvmtypes "github.com/CosmWasm/wasmvm/types" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -430,3 +432,41 @@ func TestFromWasmVMGasConversion(t *testing.T) { }) } } + +func TestUncompressCosts(t *testing.T) { + specs := map[string]struct { + lenIn int + exp sdk.Gas + expPanic bool + }{ + "0": { + exp: 0, + }, + "even": { + lenIn: 100, + exp: 15, + }, + "round down when uneven": { + lenIn: 19, + exp: 2, + }, + "max len": { + lenIn: types.MaxWasmSize, + exp: 122880, + }, + "invalid len": { + lenIn: -1, + expPanic: true, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + if spec.expPanic { + assert.Panics(t, func() { NewDefaultWasmGasRegister().UncompressCosts(spec.lenIn) }) + return + } + got := NewDefaultWasmGasRegister().UncompressCosts(spec.lenIn) + assert.Equal(t, spec.exp, got) + }) + } +} diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 372cb4e9a5..c5511f3e41 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -178,12 +178,15 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, return 0, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "instantiate access must be subset of default upload access") } - wasmCode, err = ioutils.Uncompress(wasmCode, uint64(types.MaxWasmSize)) - if err != nil { - return 0, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) + if ioutils.IsGzip(wasmCode) { + ctx.GasMeter().ConsumeGas(k.gasRegister.UncompressCosts(len(wasmCode)), "Uncompress gzip bytecode") + wasmCode, err = ioutils.Uncompress(wasmCode, uint64(types.MaxWasmSize)) + if err != nil { + return 0, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) + } } - ctx.GasMeter().ConsumeGas(k.gasRegister.CompileCosts(len(wasmCode)), "Compiling WASM Bytecode") + ctx.GasMeter().ConsumeGas(k.gasRegister.CompileCosts(len(wasmCode)), "Compiling wasm bytecode") checksum, err := k.wasmVM.Create(wasmCode) if err != nil { return 0, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) @@ -216,9 +219,12 @@ func (k Keeper) storeCodeInfo(ctx sdk.Context, codeID uint64, codeInfo types.Cod } func (k Keeper) importCode(ctx sdk.Context, codeID uint64, codeInfo types.CodeInfo, wasmCode []byte) error { - wasmCode, err := ioutils.Uncompress(wasmCode, uint64(types.MaxWasmSize)) - if err != nil { - return sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) + if ioutils.IsGzip(wasmCode) { + var err error + wasmCode, err = ioutils.Uncompress(wasmCode, uint64(types.MaxWasmSize)) + if err != nil { + return sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) + } } newCodeHash, err := k.wasmVM.Create(wasmCode) if err != nil { diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index ba1ccdc739..ac26f10397 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -360,6 +360,23 @@ func TestCreateWithGzippedPayload(t *testing.T) { require.Equal(t, hackatomWasm, storedCode) } +func TestCreateWithBrokenGzippedPayload(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + keeper := keepers.ContractKeeper + + deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) + creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + + wasmCode, err := os.ReadFile("./testdata/broken_crc.gzip") + require.NoError(t, err, "reading gzipped WASM code") + + gm := sdk.NewInfiniteGasMeter() + contractID, err := keeper.Create(ctx.WithGasMeter(gm), creator, wasmCode, nil) + require.Error(t, err) + assert.Empty(t, contractID) + assert.GreaterOrEqual(t, gm.GasConsumed(), sdk.Gas(121384)) // 809232 * 0.15 (default uncompress costs) = 121384 +} + func TestInstantiate(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) keeper := keepers.ContractKeeper diff --git a/x/wasm/keeper/snapshotter.go b/x/wasm/keeper/snapshotter.go index a781cb07a3..fcece63714 100644 --- a/x/wasm/keeper/snapshotter.go +++ b/x/wasm/keeper/snapshotter.go @@ -99,6 +99,9 @@ func (ws *WasmSnapshotter) Restore( } func restoreV1(ctx sdk.Context, k *Keeper, compressedCode []byte) error { + if !ioutils.IsGzip(compressedCode) { + return types.ErrInvalid.Wrap("not a gzip") + } wasmCode, err := ioutils.Uncompress(compressedCode, uint64(types.MaxWasmSize)) if err != nil { return sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) diff --git a/x/wasm/keeper/testdata/broken_crc.gzip b/x/wasm/keeper/testdata/broken_crc.gzip new file mode 100644 index 0000000000000000000000000000000000000000..378713e2ff7a88e761305426258d73edfa5f9b4a GIT binary patch literal 809232 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

3m6q@~RYn(?_267q?0SfbxL*hGDn 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

i*cJgVZwQDe=E!#?c?_e>8xFw*1 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 z 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%0A!$FOEGbys&vO3)MGc{&XTA!bJ1lr24G>yP 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

V9Ze!Ps!;R|8K5T$*3av>em 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%0Da zQEEqB3sn70JJm9LbVkW6t;WdTIwZL$k4S7@>$I;7b*fc z@2yU(FdTs#d+P=BrtZ<%ubP0E+E+0z1PaS_{sscSp7rY4ttNBHDQg=G3r?jAb)-!e zKg(|JuOK0v0a&qija9g+@KM5_#H`-_kh7GY)}n2dFp6Mq;m*L9+*_cZUMFeU=YS`>d_#tiQSxRp1hls|M|S@&rF{kV2A1&bRIh1X z5AW#|7RW1dU$mp-aEk?@Dh%F!zP1+2y_HB^H#V9*`*kqeP-ru)Y8K=zIhdc_PVFw$ zea%gN0MWF-KDSa3milT*rDMi}LBU?MOjjJ=p-q8`%Rc9WmzcyUUh_)>PD4g!`~eY( zg^OmnPPNq++afHC`35*9z$57MB|nar1OiLR9zk$@jXg2oM@}kkG9QpfqDtl(oEAtC z>dG{7-Le~MoYFk`C+l2Buw|IAvhvuo)g=?EafOu_X`rK`8d*KhAY#+fqs8gep4}^0 zT;eDPD=4CK^2e|F-sxzX8mqQVi%{q}20a4`6_4r0QH~|<;&!#n+F)bo*E6UBtM|S< zDpMp-8KN_0c>yuygXL!F`%RRRS6ts4ZW{g(@_JS1rjDJhW*-H&?}>I`IbxCi2eU?P z3LISTMFQ@0ci}%GVYyVeYb+X7;;_jy_I|Lukad+zlAzNktx?(QsW`Q?c)(!`?L^mxsSuRl| zjRw2Ac*i+8*!!5|&p@WcfuPzm`hZ7va!tiERiu}`vVSCkgu4qFBMvMw=SY0jbhM|{ zixwY9C? zv{Xwe>{YqI;~vG=&jPnPms19CF1JL5Yjwo{hcYc}<%>27Rq?y)r$>1*;;2Yaf*?cL zaET@Ctc2+$lzKQ?Pes*3)YzT&_gQ5cet|QZecwm}M6VUdR>+f=6=F6V z>N`o}abp$6SY>I?^bdk&JAWgnddS*LN~0`y(=f_NiMH69{qkfUb*sVpMl z8B`l@!xJS3oh9d%9p0e9S$&_h9VWCSJS(zj2F=Rv-yzjq%vY%LfAs>) zr>^oGXyr$1LRpx%fT$~QLc=@lyH^w@uQ`UCcY3K@4IYtEtknD$?(G{#BP5Tl{l4_Z zc0fw3C-`7*1R>9U>5cdcLB1gxnvA;{_Xi}xD3thrEKI24W6j}*B%Too>0nGB#+oUF zYz?5AWRkJj*I2G8?MnL+F8D)BzB1~fIO=myH$fBh1gZ_;ALF&W0-ItC*13+wL(1}y z68KUMHyoE0c}gDp=Y;i9;lYi{)NXO#1v*(6Q4cb=YU+#WSk!BxYg3ftWlRiu&;?U7 z9CuCR-ab${l7dC9xu-#fzjbA&b7je=D$>f)ZQIwLJPpZ*Fojd~sLI+iKp#N@cU20; z&A+EP_bySBhof#_dPqcjW(@$I<3zuE=f&?gelgtu!ey+y474!_QXt32Aax!eJQJxH zPYb6ZZY3lh*S@xa1;PveWed$aNK%H6r4uX(9Hv)rQhU6TglA32GXRK?a#VR;lBuE< z{(0zu?T@m1C-uN8BrY4wBQ-V$F^4SSzmAm0Bpdpp{I6VDA2XMj&FjJXU`!QHJOurY4ROApHMh3vM7lD!J`i?gAmm~U1JnwLE%h%S_S$>v}4YU-l|fM zIsoj`?LXN%5bG?}6)gyCKf?M64*dHa-6b&qv<8o6Zd#!v2p$;`rgupc$5ba|{9K zSD{Ai8QA3uY2gg0LGIa*F_bch>YM9>7@oFr5UzfN?TCrE{Uo0c*WsH1@j|$BTU#$Q z7%UR~sPI87RSi0!oo$NSyV&~h8CH%38Ju19 zSJLq3n&&;wi$K#$jN&>Nw^DrGcm^l-?TlLU1~T+$kF(RePyyJ&dW%%c zYYn~Ba|jWqhi|tB?4wJiDy>q{FiARh_T4103ssf|9ZmI4-9yV17y92!$3eeq)uRbG z4pU}$Znfp6Fx?SLB&C3sT|TV2*wLBYqrL~qbn#}S2GfK8SnwnVEENn3bx-fxPsOsnGs6C z??8{HpOFi02qVhLmwpU~_7G8xztLY)tyYojeH{wYd~to55sL9rH%}5i9k z+d)12!wvlGP>>_#`y6ANuExW|VXIu<05Ry}(;8QfTz!!D+L^20fa5{E$1tFJ6;ab? zr8(7)^F;oY=C2oTIp$8WDShLP%(=eOsPdD`lHeA&AW8=f97J3IDKH$1qX|31{$cVW zFcBdPiWt9ZWXPAs47~Og% zNB5X(?4u4Q>#+B;%FoaB^ZT_^T;mmlf?A>a*Et9~0x&1c| z@b)O*#)DZM=t@{O9Kg}B+ZGOho^o@JM2{g*i#K#Ls908dz{^m>e|Uo>x?DS=xOd*j zg=8n`q913xp^xJUH+dg3CEm*tsuLy%bDmv{>(Sv{4zkKqx0F`+zlE2OWFAI zW@259v@p}JU?wAQNDU;eQ|O~Soug2bLwLwp`8eb)sG19JyduI$gVRS*{UoLh7m-81 z22dO}w`%x@DbULVs`k6d$zqj8f59SgJkeiVS??+3%J^rCh#dNR5=;P8Pel?(~xIr@;5udlee@MO1xlHoSF{b&bJyXnpV;`)QF- zP3U?bOg6R9kTr7upKHpvR4&aY9ytnY4ef~WpjY2>t^9cQ4wu>`VzZpUsjLZ3^Ar-?(&bOu%;fJG|< z6n1%Z?;IO@++PB9_m8CvSWL^-N;Qx+2<~rKTZ}0PijpQRp3%GbJdbze)Dm5TBGdl#oFFToahRT5R9A?89A7hK2&(Ov(cRCQ3B^?)E6JwpO>PlU4=U8yG z7fv3i`csjt0cJcmh4TM#(zuqUi)ajrd97q@{0)H1HZ;iUyVmya93rUdreL``86SEV zPtI^R{Uo-9H*`1}4vW*LgqGr6y5dt6UGN;8Ii}4T4jV2dvjg9j>Ok^dJ~B{VZaB3Rcn0c5HbP_3Hq4w zM}r$UF6^4+5|3oa&u8|?NYQzJMdeqxyC*}y2IedW$RnX`b0gguq1TP3M&cN!reDhV zSllu&eB>(|CVFWE(xAsY#cO-uTfy)?-;@ae52D1Oghu`U5;Ah=ifB ze)T45%iut^Xkx3S5@RjqBF((j;;r0)c&eoBz1|%(OA&U?kV{)pXj8|0SU64~q_kn& zSt4gA%+<8x@C@$$t0TnIGs_mu1Uy?IpY#|1;~g!CxpdurX?rBXuB~F=#(`ApXFZi3 zzqy+r2OZZiYoe?(`GUbsrT=q8`=fJgBF{%^BjjrXKcA&$6t;kw|@?mGkCmeZqL4YEyk9g59(aSn|g#$j}kuuMCn*@htp>|2P= z&J(bDflM&nQP)BYroDRU+xi7(9}Y_bh*`Q80^>a4!*E9wQBu#-mkk&XUICJUL85UR z7t^9g)Swm-9x7*nAUUx?^TWNJ{si9OkS0V?t;Zfp1|eD2!&|Nq}P-75j4rRIxGava~1 z{WBd8{87s5Wm(esEJg(-mBEpm%V~K(*QPw<-cl?5FoCC#@zsjEX+5ptFSXiEu003q)@mPbE**M z)#gq{e8)5wTTsqqMvZ-f@}1^&M3xxEluj-QQCfgb6Yv#XM{=iAoFb46b!-b z;+`q;+-8s{y2KX!;T0=5m>N0RD0zgMsD??Ch3noK&N~H+JnsPl!OyZ!*cr7rPXX`| z$@lg014RQjqJTyl9k(|)pq~PnKcz0#yfE!o?Ux}ALwsFqd;1 zeX4-V$D|mqPr5t3;-*MBU@6~dYNv)YP%w*xq)=!wqF#`83IgIKjLluIFJpKp=Ty$@ z`Hm%yR&F$1da9-aYR{2r>=DuF88#2%z~G&ef=^Rcw-NVi2j+x#vhzBhgoNm4OBT#H?94|Gt_n;Zgvgl7@pM3V zY1n~QQF@ho26Y!(o`o40XD)@3a2EhMK*ql%hAaN4;TlXc<(vT>&<}tm{ojGl8^6R9 z#G=&Vkj}g`vv+Cf`-BOTIGY+$NxWg9fgX`7#7SV7bD^A)$=k?RDkr6KIC7Q`#{GXZ zOMn=jDsD2Ahxes?YZRXs5Mk4NF%&;zBBlk|l~~kn*c22#83h5y5Ig7<0$fz(>5?oS zbc!xK`%FMFuzk!ag(ci*>4k2@P8@7#ap;1Nx1D5*n3AC5E~Q;bo_NC+RR1F0B`ON= zg6d?J^2*pXxYFE350JB;Eyv%Ys~EE>k%_pgj6sv+U8>*GNc7cdTLUDCD!Ts_moX1D zY!y&8Vq+6L3zO#COb>sH5vT;vtp*YsI6}kIHl^8pB{qjv@$pyJE-Wn4IgSF$OT>SSd`YbOeC`k(CMLs>nS_-hQ@%p>A4MV?~LW(=UZu z*FS_fzppRk_*me9QF;SqZ|tLW_I;-mmgcZ{#mH+}&GPnRyFgmY{DeGKk8g~+6sQ$J zHDF5rY11kNhH`uji>K8?L!5-Kq99~8*3JD{NMG@ZL7e#l+uV0uwavf&$kFk@fAeWw z!&+2Ep4M8m5+^rMsa3NBLB&GgUd5fTj6?PHH*YvAmmShx_@@!=j_u#CAcgD*6A4Agc+gO%y$_qsvD8#JNYH6k98&m@w|JVpo|F9i62ST=DiLfIgyK!gO~oJ zRZtac54>*<>Uesg$X4r)lT8h=;Dk-^8f_Hbp_qTF?`jY|$Ndc>MCqlf5b1|xkhNAB zXMCc|&i? zfTXESEGOw;q5BhP)`;5zae89fxUdDBLmAA}GP;0XQC%(_c(`?bBPk50fjbN{q&DR`#|`z9{>xvQk7b=8;= zRdKuO5A`a1Re9zCH+3R_3||hpI$sM*-kBz<{1%K0NuteJ;A6HGV;pAPbrrEaa zArDp>&6D+f?ZLksZ6+hkIe65FuIeqY=JJ2RN{~{t_fJ2%ktv8Moa;Q**o>=FF|)tj;oiZgaBGmgFuMs>3VnBZ zqO%f{PSBzk(l*9)mZ2LKU((FpO4?Qf5yG1OoS>}yC7nVr0V;3njmy7?xv}A(D+R6I(@|8R1RLVil2kgT zJDGrT6nj0iBm;YjOUS8F5tPU=U}XBkz0(#6OM5>PlKdnih|Xy>1ZKhAY?$jDIfr2k znGP?Yp7|igJs`E2%N_;`CSJMZmg^kitz`VhGrhqR_>^oO< zNh3?`IktuVT~70?wo)6!`PyoTX%AkECZ`NSB6$mxHL8s;xP#+EGi@<99nmtEve~f= zWr((h-UK0kAyow>mWjG|Uq4@XcH5ZEptzMK<(`~j{s+3Ss?Svb#}wL8*h0WGVVvV$ z4Hf!uAI)U|E!h$2G&IRtgdKO?4XD)|G=usFgV-{2o>If8W54L8UK_i{`~-N+izGei zkp77an`SopQ_4kFrrK3$_ofgg`9P${$h|FlrBwBanb2c0?MsV--;b@fC=|FF8=ASr zC%%6BN;h2er+=!eBHcxnOeIs170`9#uV3ZhtV=El1w&2SH!9SXf95^Fp@S(nfU+zP3n2&V`!w)?b~)aLCas0uQ^ z>LTv<)*8wPRZej2)9M|{xSR_fuhtYfXU7?>eCYV-lBXBb=|dZxuv}nt7!}TF>9A?C zNgq?STB+K=IXF!yH}j&|(>nmr(b61vK9z$PZM{)fk0weQ(*eplN_p-#ogp*EsBgG} zoEhO5Ld&B&^M%EQ1K)C0Q|I#7 z=DU>t+D%`2K(rj6_gBnMFohhM&CAW+qB8Nd%{q?wwcq#83GZLK~Styf|b{@Xv#p#i8H>1wka67WuNm*j?+=v zz4B!pS;-HG%!WMbrbh+n;rYws1?EDJHKa969hAxC$ zliILLi~Mc6(!a$&2cgB6dS_kBL>3^+IHky?q^9q*B3|EB-m}aqz|x%g_$b@tIN%>_x-~usfRlvBaStP|@ulbXJi{ z_P9^Ca`y|Zx1rj(gsBiM-|v7gKgS(BM&l>=ECFcqW?urH{|-2sytV;=70GN6 z)|f8oAQYM?Vpycm_*4z;M+;S$BFeCYOVD)DnN#Cm-i6nvHErN{*a||lS)P9{y4+T@ zvpGkwAHbBxu3%HwDoXX=1LXQHnz=tB1}jbh5Q1aB{T z05pGw)8$gg7Fp>b=gLE|gL56t1jlsTY@@YAn|#+Um*4j0w01XXZgr2Ru2{koC) zclNavGX};G5NSr@I)uNNDX(HXnp7V#cSQQ)gmq20I{L}E?_^RG8#-oT=Y)li_;9ob zmQ*$t;8~_)r1|k-NqVBYW;`o%&f_+}>6}R;Dw&ucxMU~Fm@2kG7FamD#Y8hC=^_YL z=tAR`u@qc~KWqH!=q!1Lxm-LCDMOQjZ=N1zb}0^hAd+AIZr@!$NP%li zvT%SYV9}2ao=V|cf40z7U|T9nNkK3cDg?yg{0QPHfSw{LB(#sgm~|euw2G9@120p=)9+n(t4+6XsbIWd;8)IT%(6y4tR=0*s6CJtMTZe zK=^g7GeGoH*==FQqU0@L+m6L*tLVKS66JzEwMOc*ckdgqsHB+__&nAoMuDAf2n0)$ zh;ixs)V3M-a(?Goplj)S{*n<%98WmJ_!u8n>qE?hTKU)b093zC+5Js4*2N~Xeqppd z2&H#b1!(2g?g!D^vt?A+P)I>5-U}1_x@tr3DdTUMNi#9Tf*mAKFdrHs?1F_D0y^6E zIIKxiBQiaohcuiELT=ao;Kd7km7OuQR88UAU%5ntn@A4aud7bL-P%-vwRL5w18HU~ zP3@F+SsLYbaF>&(VQ?xhYZb44;MKeZ8^-M;p(+9}dz5qdk9{Va3fr?DQK1E~cXIN? zKPS@X7=|7%?_6*=(g1S;K=!96uq$J>1_qbq4`t1Ao<5l!s(zp9{4Gj}a8@6_8TkXr{@q5@0%+?kp&RY}COvJ3R+B?+^-;xdf z)bWh*4`U^6K=WoHXC0ply=3VA{gzAhwb#U{U5P#kkSC@Gb_!SzlRaE;Q0kE04kC^1 z6%|X|J<9{w>bUk(3vlIM1c4KzaW_*(L<63?p)MSq2cW?XVG-~s;;b0Iv16Zwx>_cT zstmQjlt)&AE&C^&Ra@lvJq3q_0x_Fdh|KF66WgNzAk$YLG~FDd4&xTrf<~nVnp3u) zCGd1-%)#Ml1Q}xpD3Y?6*g^gH7MTj`jULtcu^L<&l9Wi+qw6gMF}H+J zrfxIEt$~357U>{peEm}o_l_PJD?KdBw|Bz>(KTn3lU2bOz=?QprSzm9{R8%&LDR#A zbq?M`V9Ul)NBn|Bl=xDu0hHUw&f+30Msm|W<)qhYPlCMZ(-ne;dhS$~imEsPgT2A1 zl^_JLjyL43#}xpX&he`B+a2O~NSU5190@97DJS-xTiyg<-2<3GnlrK)`$vk|X1`|L zk0wk`2&pm{PO=v8l}5|@5Zn&j_coX23GY9xgBO?uE@Sbv+d+~VwXm1Gq56DHGaw4j zyGaCWybd{ea!$R?0+t~KmCgfc=$g;}5Ax;EEvGoc+#VpM*OU^9t2F(N8;_zSj>8sw zl80rql{KGx@Kw3T?o6u;NmeGeb>dK^iDk2)P)MO{=bgiS7}hBYPJVEJpw68R?=koO zTZlKGCm;9&1Z-xte>vh>&K1@CWB9q58&yJ~Z(~Y!szumb^Mlu-14q;#a6_b)TBR-O5 z`JpRfAA(2wWaf7FdxfMMZu6F-aClq;O-U?c zxVJu@5cO4s-j0qb!~&WmYB>vdO>IK4;I*U7@Z`VJm(*xcv{^3zAy3JUK;MCF5*h=! z?u_cr3CBpzehKGt?=c#7&_XY#VtiGo22$$#m*g0OudJN;CB+dj(YCPpU3rZ1ny2z{ zDNv(68C$qSVgTOYv0f|gR6|AzV1WnupelxxjJO8%^ zj`~CBJL#(B(9;&b>EGho843i8LT(6?Yx3xIsXvJ=ELT7Lm6m!KC>BZYOkP3{3pzkJ zDn-;KL)}}Hbjk3@(#f<{d-$!RirjKsCsddeGt6fu7F!GT`9 zy8HmPN|^=^i8&Z|-{_BTSY0;8QHef_h`umfY_&-u1r2lVI56XPi<*L6EgK#*Z)SBX zbss_qycJYnw=IFn=V2UOJ!ESkM(}j!uCXA&)+PUQ z%FrkOf(jdnb?KXvHS{5K)aG;jqHH5t*LZ~Op0hDPTOBb5-(S|&Jb^nU&_xj<9*umO zR4zim-Ii`qXD00qJA~N3=3F)*o7rL1L~Pa@1}?5S|LxJwmI=Wf)-s2nzIVn;+-wR3 zQF}_OA08S2J$qY5rCQ@Hq%Ip3{Ty!RHmdN`&BsQur%Bs4gAH2-@*+n+ zsjIa9DLgd=Yq8uLOL`U}Cr8HYX9wG+i9!SvfPKBxqu44xc1UVP(LQ-hC8MQRo}_#c zpg`dm_`;f1AuHf5WXIB|ROy{zPMmmUf8eBnufP<$hUc;)RPa`6ba|AJ49T>tO~e$+ zfgpFWNXWHdp@XjOQ1~!f=1tJK`99aH8J!0;VwVk&9Yk5HjWo11u6W
QwUtG&;+@qHM*qTPJv_v>u~#)sYP)>qD*nR~uesyH<~~vdEnK)3XDS z_ijWKhf0M*(}2u}^pHvq;sc44=onvW0qtRgGZeZFy#)G@dLD|SD%-vsEpRZ0+({@$4{$+wkC!c5N(}?^bb$l+UdL+8arkU5kg`1h zLE)#-8_|{b8GRZ?4~Iy4&IbG0sM{G>#&lh^!$|yg;=E8`VF$j*liF88EF8@jsa1q5 zDylj<3oKqqm`qTma zzATLp1Un@3p9ovAj;QVTGJTit^4ntB-8)G`M5lD`?R4c@*MM z9We!p+wM}YEIM&`i|9Bg^65oT3t5YsW!VRB`G+qRPFJC!8^aFuh)lX8ixV1uW;}g~ znwx@~bqf=x)68L8cv>Va?)qxkrj zaHJ%4ZX%N{*1TTfXr3xEFzy>(zEuQuHYSNnn>Jr(OG`|>^$y>B4RkW}^iQZ-5biBV z&InK-d?_difYcSln?M;Y6kulkI=Vtqz zuuSwL3qBYt3um$(>&*}hz=SgR&9-N%zL78QaTIbWSTGF2Tir~VB)D#wgRMdF+E$Cl zFA0#IE2QoEe%|2^%Ogc8Tk2-x0@naSZ3w9}S*!SdD=s)k`yi~yjPmBP{F<=8)OlXy zVE!|Kjj0epDV`xClyizW*_dDmzMf5C{QDeO?p(M>82~L_{xc1L2dUG=ZI*Jc`o&Z- zgIC~AqhQIZnl9rd0iSiWf`Yk8CUty>sLn1kqBs-`Mu;YzUk3Q2mh$o<5tMW#c%JWjh?LA|hKA=n!_LUm$98EYNYT}>( z#dPF!cVfB(@YtE{knj`>f4G59O~Z$Mg%a-Z{PK5bMzMLqCkfr;K1*!lbc{Sno5B+| zy2F*Qq<2YHgG$6AWbpr|@G{Xf&ak=7Y!u7sz7~dqZRr4biKrHj70iZ2ckSZTFkeLY zVj0?GcGwCqnho?2G@v4ICw);Vo&^fJ7L5N0eUi?A4R`-^n2f>OEcI@@`kDsOz3Ljj zQIo3sA0ABC(EqjP2x6J{4>m4Yt5q#L0wlgy;j4LBZ_^epvA+~`$G==VBaK3Xgc-L# z@_+gfFI`XZ-$;-KC4nLDoMDekrHRei$u0|4+@j4or=(z4c>eqe2^%<^F*+pbtzLp& zQ`^8BBg)Xhy=;U_%kQFBM$&r`jl?^M5R7QV5{6jfL85bWh$5I`Y18X?R>&s%x)t+u zmSj%=D+@&sJm5vz<7~MLGaEaO@a4)HgAhvRS>r`t4gj3b0?+$@cT$`1BEGWs07wwb zOXT-dPqUi1L4_Hk8WaW%s_+^Cs3gO(&ThT+i%A$b&~hFnF0rPuLc0L@_)8o zNF2WnVCo^KE0zzTkvLh`Egx97d+EXUcP<;XUrcL#$PtaYtXvI?9Gopyt4R7!iiy!! zc3kWeZqPb8_&V=k-m#NUpT)Aw18EtZmx`3bA}e5C4SQ;tm}T zHgI1qXhcUxB4MbUWE;SU4<=D7zI}Vx1mDph535VZ)2(u&{E3*W)1b&qsv9eDHNaHf zSf-^W^fDCw%|=l_9)~+Lp5d|iivqg+*53()_tuvsx=4uV2;i#_{gHa2%a~t;Z1AN( z`)&xG&oxiSTT=MK>$#XPbbyoZU#yR+V1%sSi#}6B1=o4{JV69UOfnHe$ZqJ~K+y&w zN|G>9*Cn-qLe({CvfTg6h*#zf2?-Mn@x0JQoAX)Cpjm^%$lA}ti~!!wpAIeFH%mn!*5B&a*$$V!SM z_BFdsmem^c@RK^yRo$;swSdc5Ms3&GjKG1`6~O+2=)3(&h{kt2zNX^qnePtM`$03j zkE{s!3jWn(!>LYg{k2B2MF|CgPfiV!-!w)v`LOWUQ(GV%xW%n5-xmhVW15#R0?^Pg z1!_H*XREZLUS}oagv23R{V1KblXj|spsDpM+GiolgKsP8>6?wp9btqQfIqy0Zs={s zNBci|Q|MPvGxMmHft7!qi21oL$StGQ5jpAYC~gsqaLClIo^q7{Mif|!=rQLK%id|? ze*)bfLIwT=Wo=g48P-@l-@J$;+j=8 zRk`mu^nbKrxDp)SW1mqAVR_m1XvyBI?hmZBRLA?!d)LzNUZa#xlPP}?C)(w{zPdLBDSL_IS90El9CRtO<;54TNt z6L_fydx#g9vl#Ya!GV*e&pb7qfq6{7-`NBD$(Zu^goQ-BWT3%FE|SIAi7bnkR2Dx@Pz zIjt`s&F*a@2r-(9uR+tb{KaWvFrJ0O=zq;hgwAGec%?A7P309 z`krSFw_GZN7z-i=_qi=I$Gu+=TTn^?=T@zo$ZgpkUS9B#2mr1W!|W~%x)8ZvqQ8`dLes*(M_86syEzuF9w=lz44zd5X(Xj% znR_H=W5@tyx*>BVuLU|FPj!^Gf&1c+icCHJ0tGX73~jG+Q_<&YZ~AZx|NAk8A#nnE z=>G|V_0zb_AJ}QU_1gO9e+sTBvy`#dypwj?hy;E{s!m&tu4CxG6-p2 z=iS9Nu=@t|cL<^26AIdb_JU zjlt#66O3`C;Mn};Z!@&XAr^<+h3j_c6Qg?X`VNV4DuNOTw=KB>K zm031UW*`wV`6|5R6c;eB$S2NS2M6I>DPYvY%NSX#O>o`I4L1VUa?qKbnh|*p3agt< z9G1pTOEVoAAwRK1MRcJ5IIDvG^mA71lX*1n`1^`8Vj{8#8zxhPL1#%9M9b;_Lr7Ui zM7T(dVq)SNyO+^QGhawbhYUwd`4@|bQa2uQ296F-d>9Z~i2)=EQ&fDIXt?3d(K2z1 z?aC^ftF!`FLCeRZ-zmL0pPGpRRochQ&E#4L_A7Po zxou@X{~1?vs3`vxX zVN|jSYG|)wSwdvK!u;)Gn5>HC)Vkk~Cn89wY(5}?Egj7RVc$7um8v)6I3J>RA$48~ zVoghh@S{}u!dsyI4o0>s98nDbXhwUr*sFiFKKVdR=uk+RxL<4h_i`ZjyzV#a4o`;~ zx020cYQbEQws)*59o#xUTqpgIwRRe^Ir3@QZ3%_^4Hyp~yl!J^bwI-+EIwr57SOSOxlqA6_4w(zW;CH|}Eh_#}TT1WA(fLsGc4m%AJ~ zw8}VDf1mnRz+Eq|;Qd2qps)TsbYjS{exzEmo9)Q5j-0OlqO}M>{@W6X*(yQ4p!?V# zTrW_Ch=S_OTB?j(d6sM|a?rLR^kU13bqos_ekKguBoT?Si~B3a+cc*o5cC_*=gfk` z1%>C0S*6e5U&1BUI$eX2dvZg_lcP)es9Qw-K3STAa~*uT!@+%uD~WPz+3ugD%SGU3 zMveykz@ColfJ3wPzbCUF7&4>rGI+v!xte`W5kI45uh`rmg)N0g-=I1&e=Wn2IXjej zO<;ipHCC-V#drT0U@Q=SM&fQ7C#Fic2fL0Vwv^jc3Oe?y;f}ob&7V6X3E_Bcq=S}A zG`oQBMe);f%*VyDmv7>0RuK-w-*4b0bD%x6BbIRuxLnv|8W!&-p_vhsn&ue;Wh7bU zcOX#)08O+*(A{NZo-uDCUFS?Uj?C_!o2H!lFaJT@sY2&Aiv{}LAbbMawX^Oyik>7( zw1)q!lH~?r_8g80r2Q0|2w!Q^ep5z1iw>1#(J(5iiDJI#MI|u+K`Qdo=o(RYK2CxB zf<{&eSc|%WD4SfIO$`k^GLSV2i=+!!(}p1^KN}93;86c7)OTz($F*luA$f_x&SJ8_ zG8TTOwEl=yMW%mD)cUS5B01-jx`+3HeXn70z4(-rfG(I@^IN^rq?fMeLzn1rBBm(2 zAGO37Hh--5{9X}j=Hv!Bza%5k#OasIQ09InO@$AVR1=?axiSi211aXJ1cTU-yp;p!>xz3sIx34jS*$`t1H#X5ZwJ=> zjr0_+!`_Cr%6!9}N(|mZIUMf{aARgIHEEY_yw9MvFqb|O-ml!YDQYFqvcQ%1k+dEk zZL(W>ir|&U$-QXGh5TjUZNG4tg|1Nc;cZhXPz-$81nc)r-(Ak2$pknD85(54e6@jy z2WIlL*4xf1q6XHU#!fF4TEy63F~ja+rqmWfijopzwEnGbr7{d zRuUQCOqRqwBe8*)09hqMVK@48WopQPlOyj zO$MXzV*1UXmw`c10khPAo_Ri^p;)frbgB@fsUcf>U_07UcQw@sqh$E(n1uzB4mXKq zAB8T2#C|8z6T7bNW-;K}NVo>ku`+8bbxD8jV6IO#jLT?lhg#~rnJ|)fT6Euu7SSw5 zHLr4P_wuYdI;XGajeGu#z!1(Jl3XROi4iUWXx&a_G2YS7%)|sjn%HASeeh%Ihg_RS z16{wlOUfOf-}y=9Qib$Y&Ov{ckn`XfexXH4sY7DvJIg=sn6@;z7puSoF;-|oe)s8? z8g$q&j-2~o^ODtd<4a4q& zx5FXU{lAmzb4fsBUe}*ig(aA2e^N*-j6t2?P_@nsk&khL5(95}k&`gla)LvV#Ak&0ed2l?qHDY&{V+3?@*BLh9{9Js zH4l4*N}txaG2Dg&9)J6qbhw{Hezy%4P%;68Me|_!qU-;g1|_d|QW-X|#nHYHg3VFd zv~WtenMsO=$EeXBbVbtj+!1U`3qkMvl_9TeB=3*NGC8yKj zy<6!}{XXzzW&_@xctDz_@lQq(RB;ttVFf&#=x%G*)5xLDhmh`NXYgG~*fK&eo@Jqzy4wAN+Ev*pl&r|s2^-! z%iK*;^%Bt6FzpOtQaI+bBXCu!Spp%Tr_U#sU4iqFxPOSQTp>JN^{D9E-0vFDZhV5a*uoRxy*8c#HNs7}M3LL6a9GI+ARs z>WeP#0n0z|I(Ad%eot%?6qN$oqGQa$6Ho7RTUnTBYg-(E=zX?l+fF;7OX`GY56NkZ zs!%U^e+12S-ngF=Kh3X*eZ}KkPW~}$&~tPmQ{!nlUg5s17WjAa>w=Yw3N^mLYn8MP z+(>%oi%9Lg*k?Xj66u2RuY!-n5UN^_Ea~bae_^ z9e>J@Tv--v(Vhq_Rs&J=hF46VhKU6^1w{_Qdn4@N{PqHepw_<;EL>F^?-t)TM>d~kn$@M?4L4;_Fb=&*XigHW$I?g>STYLy}- zG9;yJhsbT+lVO#W+9cij-%|e5w~7Xo9Op>N_?)DRZ0KWy^;wq3{b!e-K_n}y&*#z& z%cXe9n6RM+7g>cgeSJv33K0ZY9S{iNP)$Um7LBcS zk|E&G^0`E;3D7~P-Gs?yLo7Sv1SxR6;YsSo z+Ex~`Bow4S;=)Z6t_&^#5;`K7aWg>aWIS$dudfqS6urWvQUe_7;5+ znZeRQ4YnbXSZe&VuTFU1-<@Z2CoL%XA?>qg{jX8n(>r)*Khm#U{H{mChwY>HUi|Lh z;0dYJG4fx%+-s{iWp2YTCV79+Z&GiL1<_jV?c!5~APb6a`f?W7x8+=-MjRx#NkCc= zwRXB9#-Rz~U~hh=8P$O;JY=NsIs#jZmnX?&XWX7aKj8y!<4|Yvyv=d6Z9%<@NHb8m zd=ATvA%N|^^La{HqSn7~c=0(9woxP6JkFd(+6aP7^d+$h3BS%9L;NH*`Ze_H78sWr z$9EYFjs;syGBJ@Gr5%v*LPggpI9Ts>@zi@LcC3@gEGfM~#+7nLp4dAxdN9C#(iIIy z2T%LDp@@Omd^N4S0J!YGadJl!VbVkq_xx0)70Zy(Kudc3E=&NVHTjfTG?U4V*spk@ zN4C%dSqYe0!G330+HCDoZGGgwh8+HSE-A25Z>g63fwj zFqI5qqt+HAx-fRwJnh-YcIe{9VVFvm+EJTb5lXI_t$irlsIu#-u*J_HNBjn#iAAY~cduZ#KRJx>9-n z73t^>VSFSm0~XCUEOSo9#kUW9y%&R7Zp&1$_w!M=7bErG&%O{2i+#hK&>|fBHCthf z?hBA@g*{q7R%nDd)LjB)&>4&uFY#u&!msYQ*JXLd&4^knGjwzw;gt@%lvL@~?ghe0 znmtXZfcQFauO}OH$5^USMAkdKJ-H#C?E+nlCld0m6Z^!YzhVeoVvXA+3)%7{ZF~lH( zY!#3wMO;9gB-3GOrL+4MP`^r}Lxj0bXB@QJ*M=3YLxuhG{$c=xZV_p)C2`+o-&=39 zrp{p2OS62M&ErRGfWIl#lE6m5CM=~T$ zm=;SuW(8S-$^DU8&EZ(SJeiXJS8 zj39hziF-%*6wA1ifaC6~2yxf}n1!~kZehgOdH3t7OBq`}rSaE7LSs1%BQ6Z6_utr1 zaIwLwc(8|pws#_QKAWEMDPFDL#2#G#C|C0L0evo@hgL38u?Mu~;}K3=UvNVHH1D zu(B-39Ya4(H^%()rXt7D+2An+?(B|_a&=J~X?Qfxa=CvI?)pwfx?J)|3^)c@ss7ls zIy!&LvF8Hq#RK4Sn<-(oA%6j=n@YfKGBYfT-{aYn)W==2BPNpAR_+56y!=+ZxSeBm zSxh8oIRMdZ=V~Ou6Yq4|H~U?4eO4k(Ei;D>p$0dko~Zd_zcD`g!#6~9&7nPIXDGSf zuZVf3-RN@I_eaNOeh~zDEF2Es9UYIkp`T&;PzJ!TDAW95n26?Qw7yQf{O$D8dq}vv z(vhlI^p<|)t_J(Y`YGpAG*B-kCI-l>U23V2+Ak&Gycz_HjvUycYeKl?JAtK*Ie6&Y z{&4wvobOKy$g_WH`SE*pgNV0w?a^V3Gpb6;#g8p&6Qqcvt>0Ia2^syY%MW^Oj%Rg9 z#%JhS=&^yxLLLUvF%F9ULUa@+xP5$_$cZEoz)Q(0oT(4be*6Pk)zt2bHP_)?KmK8b zx!q2k^nP|@jwVqbHVr|t1kP(Li?nlhSv{_~*&G-$^HZuKw&U^o{1>)8L2`Lex{^tY-wN$F zwV@4QYYuJjM3YW_caYfPV3-C|qqMg8U9AgF$;uHf&r+f({a|92>skzJ7t;@%CBsfq z&#}(m+J6fx!t36KYKD@d&wdhI;@tHwjK~YhYS&7QSAy2WE(nv08Y8t%cJqb1vp9pP zgCZG|evwdAnH`&Ny`#YsI9;BROe*s{6ZMn5O8JY6mAw-qVo>!i388#uE9+E4=Ve@l z18|iCx#sTeef1F$159GZWsmTFiuGVdjRjz2gM^P7iGBRIziiS#RS~gGU1q-WZEr3g zYp)F3Vj`K3dxnE0Z-#`5BJKYViHX1;99<`V`OCZkyvJ{7=0RLXUkuxJZ`cP9PM|iT z8;EGanc_9?GtwgLyfKqQF;5Xq~vILcIuc#fCS0ozoot4NVs9^R18 zXmH5MvXLA&6iIYC!X~oAD=qHNAvdV<)pY#R{n>8Z1T@g&Jj(@UG?+ZXJq&zJqZNIKODAD^=HzCvUp1C zo3w!0KHi z?-&$bnn1rXS6|ARi7x^{=f`aYvL)BS7duEI`k6l-u9x;Kp?hZcf2_~t6G5XiMwI(i zTB%RucZF)R+p>Ja&Ti6z)$5kn1(b(K#!pZ5^L-M83Yo@G=QWbIXYjCAD0rICPg6P~ z-hqp8k6LWP)UGHHTVcUKq40E1nzR1#PErq3Xo^m|Wx7Vk6-e%Fr|Vg!R?}8uYrTL? zhcf5DPb}6*vlk=*0du<|@5F#Y8%p$YV}LanA&P`q;Vgj#bQL0U^YU(W)?wN}USl^m zy0Qsda_s0S`24)Y1(XQrFhSGsdI?T^YXnY@DA|UYLd4syiEErNWpYcULhRpo!xh|u z_v~KNPSGitZZ3vzrr%2EA^k;Hf*l2g z0-ysr46WJzPX{JU1Dtns)8^r2;?O#r?{vlw8>w+OWy_PJ3fQUuP(yYEHmtV#6i&i- z1h&d8*HK4V6~%^FMGvSkEhYO(lYv%8CI;oW|g=aQbY3 z93x_T7}7W18S5C5O@@zP%384q8OM-#6#-JWW;<|O>xvnF8`N4h?3xr@9(DJcTrtr6dUP@{aecER+a)r4UN2LokhjDIx^3g6} zc=Q+hv5|UE9w%$D!ZrbfH2&;X35|&SBd>37!OQY`qqiNGR%6!@w0SyL-xsMHBrjks zo{YW^(X^N354R{J?NpDs3#XU0N5~*GF#O~$v&|pma-Rya+m39U@4(oBLhL;HJc)X| z2Mv37l-s8OfDv*%xzWL6uG(Gz5Tyd-`{aV_{>*!M^hs$!M`L}=yVtfsiMZt?C4ILjm!G2Z_eY(6%Wx&OG zYFH5Qj|f!@2ZD~bjPA-m9(EAAPwFZAjxXIG+qhSrBW{GZEZCdt#x^O}7iA6$#QgvzK-#~z0NASlW~!S$ zvj#HnOW*cbm0+W~+3kklHJAEzFh|c+zA&wknj)Zd4Fj z(DJ0qGibz%?^BYif`bQM5HA8X*_3as2~YDw@XO)w8x36d1fMnIJi#q(Hp?xf3^wn1 zSpi-EoA7AJDN>HUB48bOaVhEdOrW$KxBw+U+P_r${dm93 z7tz}xxg*(*A8KRo*v*L4MfTaR*%@OtTx2n<>ELmP_A{3J^_I?(bf``(j9(`%P>PT5 zuj3m(;C3Xz|7>8$kA(e;@}pb#s%L4qu%ZNNSZTE{wUVbaicluchEL0G-N{FjKsS(M zx2J>QMy^*(Ha!_tapYjit~%sfb{50&Tn!&#-^e>v^>^^oj>~=+a_0)U7qQDSb}vRQ zu*#1mr4x2|X*s@qnzwnOyDXuQ1DQ!W(+>$Q`f)Pp`o*F-Bjt*ZAPxR*HpK|J_?hfn z3i}fG&SrC~x;`z_U3UZ)vduM;pl|m9V%AoQ+f(XLXWAeaV-ukc+x9O_N*t8%1%aVR z7V77h1Amwo7AgU|;GEPhLB|@lG%3Ko9v>ynbZZ7YhG-FqH%WsK&PTYt68+=G=pCO@ z^vXi}5t?q7umUnvS{(ZVioZYC4Z@-+$F3K33;IHY9$TAF^EH0b(G;3IT_&C*KLZBR z@jr$I*xl#bZ(s@!`&NL20GolU4+;*EWYgXmqiN#3pHeb^ede6l?G{dpym+1`H+D>KN+C8jYeYaTw#nuT!2?=anK<=a zE2UlUAiAu$7@Wb#lHLdu@sdHC6D2BHu+BI=noNqD5b=$GJ`zCRzZ$zE9K(iU8~oL8 zG6l|*4-VY_^Z#ZEm70FDSbS4h1!CG&+?^&13x`&^Mj8XOO?vs1-C!W^YrKCFpE~P# zw<^cS!F$MFtKI&KT1`I0&B1LO>8t!Gk7^O9xta9di83z+BqZ4{ zm-pF^Q}x6&sf}9L>z9w-dAqKr49R!*TzeFCSct%@yp@@`$H=I0`YSh02O~&DB1rLe zwD8Fir~57AI-USaq!xQFWuFrrFHErKrM(KERDiArfgnUgw_Z0tH%PB_iIys5OrN3xC=OsW zBC9yVY_F#VdWKI%FuUXEMGU1(xn`$=yxd}~yRFI~Q4q+YM1*`7J4TFzqTquG>=+%s zSBq<6!wa(P2roTcP5oO_n&Dv}d{)JJ(S*aQ02kd=y&OiEmmqGYR8DQWxRxy>IH;2& zcXk{63fmLss>@(26j&7M&GF~5Vl@=}*$-HTmb{T=a_l;^{#SZ1GheUMQwZB5*~<&-h1Ov95j_G=~A}n8%>_Sw~Cu1qmYt;iCsG zZf-=}X;RYwKf{aN8cpFYn6efl8|Z*nMbC<9`-Qsy7?e|!tZ%FR{myVZt2-tBX_@7N zd;_0yFpNC-Mk4d{lUIlM#+uOeR9>;qvS3xpw?Ys}j$hZNbY)TliJI^KOd7)yu}6JG z=~r(gul;EnH(TX$7(TY#S6Y9FAlFzxK0k3P$F5`KmM{@=Y+~xoSX~#%$S1}^wBp4& zr)>|jLhzeyMeka6TpZHVb}obL^lReih$Kez_Df316X=r+#ahL+;uCf2I3z~8&kI_a zcP7yCW6y3~l@M=h{wlTT7;ZPz_Yy^G+kn`eFm%|s-rx9m*_QnpSFQF_IJ0c5qnt7| zeh8a^Gh8RMa7SqQip=z-pXq9U;>y91k^D$g1D;3QTzw|+p*)Oj_?7J;)j(ct&_)%T zc;wUQ5uZwgm{EE$Jp-{qMF#`_b&qqB%XYDT9Qh+bx};hn-!f=s3F>f5lik6Na^5QX zk&=5DV2xF86DwRO?@mDsSJfCDq#&KN1t*0GnP;-D8MKlhJZl_6!Qnv|v_tvc76)XWG(O?^5c;Y63u_g{z0#g1 z#GiA_U;?6$YIYl(e>*<4K(CM>-jUx_p<-=WfMj-|8qoH6RsRxXQQ;R5_0c=!@R*|C z1iV>K!0uX2LlUb&B7rl&m-N+?qKC`8r)&$GDtF6ib|#pCDsnR(RbO9qjkt`1@0~bq zA0tOUg+!T5q!6Rfr~YRC3(0V+r46UK9BlFH;8Z1x){vj}xw14?wgP)TQ@JNXeuQVn z4-|~1;d*ehtIq}h-Bw9#o^d=8UT8X2QR*U1Gd&;#eIkMulquwqmnCvP>e@2t^$Tmt z8-Wso{y-~ohDBi8EUZJg{#Pv$K)RxrFA7g;`J27Y@aASj=5Z5kg^l3t7xwd;^nF-J zS0?LUU_~Urvt})HF8+)wYu%zfe=uR%B-Aq_4*a#a6B3yEjENFKRc(;LO^OxPVods% zIx_9@K-*>kb=4kI0PjjBBrxB`zzslcE%*}@VVOka@X=q79B0{FJ!J`?^$2N^2$0lg zO;F(Ab%Gnl{}McoXUj_Fx~;-J0h?kuxGJ)gx1+RQW6lDig51MkUNiF!Jd7Q)HcLZu zua;_;tLQ`!8QS$%>~-0>x{RgJH{X$l*jk;wDyy$|dihs?|3oFDTqG`Lx?7!og@$If zcFR>2hjOfxG_Z&pX zKlao1y&#B(@M>xk-FGmZlVU{xBxY8%OY~Ws8(~Y!%m(TH;e;vxWyg?5adP0sNuTsj zA^eXq#<65pXukK)f24eiOm$3PpUq;qRaqxkIs$`NqW>0J@cPg{CoV+`&cq2Eni&F} zc2nO3l=OLhV~e3!izj2g^)+3VN@@qb14Al6;MqAM|3`&sJEuh2Xd~%O_jA@mGT-{f z?hHJ`b2ne%Z4?9OS~1#&-{Zu8F#^K4N;RKrQ{=5?NRAZPz(9zljHPjEy}xm<>BV5O zj)FgEZW9hYm}M6+CHD}vp1ImzHO`kR{yz)@}Lr*pX8 z!ZCqb-T5piw^mtc<%`CqJV(PLVbe$YDGaJ*vYN!0xcW7s3Jd%lTbhFZ?0Ts-^0ChR zOe+b&lbO2dcZ1nOC>Dc8Zj+ENg`4yr-X)2(?N;MY--tbcHwnx6TWne)XB9zp1-3g8 zu9SWWHbW9WEiRn*R=*!%y6E~4G*jmk@EG-K;Jf^(ThGoUWWzo}HtQQO2fDGPym>%9 z@(Si#x5wSzpwDh5gC?fU_ge9_M{5zTxNo~VB7|5}Yq3%`r2u~H3#=~y{!usU3@d{M zMhpyiRGet*q1@lay9;kwIc~gVfO}{nMlnjs+>tr^iDW96AsY-gbyfumIK7${kUkc3 zC7p;ib*b!&^hTnBMmFq~7r2Wb_xPg{DzG2!ge?XW-;jwUiMB;g@@z1x0@lnWFPMHEt$FvfXZ@mhx3sL^op1}I`tFLg zr|sgg$quhYEbsTDw*0%Bp1wgs?>v8c61xbPVA`R_H`K9agtG+n`l9cXfzXtNLob21`!Z<{8G02AbOQZv_eK^q*U=Xn@Y}8+4<$0rxSk^u%#jI@&B*;MCQ6 z(~>~{%uBkKssq<|1$pvtO8cuI{!)2EEnMx)G-aUKLs++Jp@335Ebaup6E`BAxEUax z?6suD7Z}$OhU@2;V|7_O6i>X+su&q&ff%_`fO2!aV6?>uYSKpr=0`|Dc|n={1_&!! zOC@`>Kc9VM@LTL>&OaVVS*)c&5%3WN)S>*6f3JYfi8ub$JtDTw-3RJ27LLw^kD>oZ zC<&VwziQ@Gp?EM1dXd-U%=f5uW4BoFo%pj%Q};CF?I91}kpdiCl1ykV9@*cjw>B)?yvU1WtM4p6e3|Cn^???qX-H6p(NS+^Yb_d!{ zV4H=U0}v#Ic#9Q#p|l`-`gY!&+L$YVbQ~$asqXF+{Kei}D6}9VH^04b;z)`xSJvT3 z+Jyp)v6II^|L7Jbu1O?FLqfG=#UG4h}}ntSuZA9i%)w!6>nC#7u? z9lA&*{yHXhj**6LOO*;^@2zEuU+lCiDKX+g`O z;N#j*LtcYdm>_A$n^|X>J|(4Ip7=vF`XE8?8|MyB7mtSrra9^u2@}i&9lTNaw><=2PJ(TxC?nu=3!`#0NGDRO>wh zew2;E6x*~4(7o0)_+Ut%a{@V4OC^q;+ViT7LDm;pRsHG}KZTZ>7D>=~g*t$Blft%= zk5)co3^m-C#}ER3e9j#;?bKm?R||vv!jME6GM$v3`^~G$`20olfSFSycK5UcrgJ{c{%tNJmO0?yT!@EC&1?YL zw;8LbY^nOA+$_jlR$xZ_V~7ugC|$()(-6eoNKI!AWXBb;qNl1MI&ZXXOW;R{D9lQN(gUfv{1+QNv=+Vufb-5 z9l`AF*1^d2RipV%nQ8^m-6*h80Q4-J5wOa+9#D;e4JQiIpHN{<)CBsXZR$pcdkn3hS9{7W@`6dDb=aF~}K+Tnr#Lk)20rt}m6LL3FwY%-dnfpz<9Ocxke*HWL9x^G;IGA zNu<_GfX?HD{k;=7no$8EPHBGXEo`j@Tc5+VP=E(BZ~9cM?vVGP1Ntl$!+B*>C-N&~ zRE~QhGDmY9N|XX<+4pU{g^>2#95Yf2i~q3=X^-nLd)h*B3-9-jaX72`65z)?ZBl3c zAnMhC1U>H$Z$N4lG3vVYU>&3C%RAkr4OON6TkRkx0I$&VKT)rj!_sAw_f`IBYNd6w zU$1v@tx=@pjQ4x@@KW-|iga7+%gKakk=d-2Q0W2Mv$vkJX~=mFp)Xh3xqWd2*W9#v zU-qkBA&44uMK0`(xK|o5T`}D~QxxkuW)5@KcXuTy{E||Df=rBBzjp98VBt_^!zt89 zBKhuXAVb?s6BMy^2Zb*}>Zc%Jw`nnKnVnsnf zE@t2Q&Yj&IS;4~-&5T%Kh#l*N6qt_~Jl%Z-P_34|!_^f&rkVz!Dlva$-VwL@##Xx6 z!I3BeL(L>E^hL71ef*TSvL?Bj2G_(QhHVlhS|JQtYh642B-Qm?~xu z2H{cri{mZw9F79Ewjws^FEM_B=Z536^jtijjvx)|)wgH`(jkxo>J)CyWDz92ARv<0|TuqEJ9JGXC(jQ}B|d#6ucIYiw+zafnD%Q6=YP)O!} zd%!pfp~RYNY{A0wUVZ=cO@{Xu7rn>b6!)YoE;p{vxK+73&I%4FtkTmbV&?6J);Jqx zsL{f=r&f8X3}J;N&|N+#cTN0TU` zWNGCYQG~D(EFGUxUT-D}-iz}eyrn<<%Op!CY)>;E3Doys9;I0cl^oQcWeMaU#6pxfFaH57E{n)7$6vK?ZjWc+aJ6!c7XyHq7`0~=W#pDZP>do+eJA| zNg!*e_==r9sS7&tm=u}A_CcOe`FGXR3!x7`R(H}B) zLf3#c7n7NwAPPHpxWfx*>qiNTeDUh`^VKq~k;_OAgV#>UCM>*<2;^Og z_~~1Kh8aq*d4u&=I7{+)Owh>vud0dZ*pIcCnq^13*-n4K7Jw>aKqgK)!Oc4+WCRFO zUoBbzm>iFKW0;vK?niWebvW$Y4LQ&73K1v$!|b&Y+2QaHO{Tk&BdcRlFW1-RKu-jy zF8~gGwa^Ru&G@GKzXhun)w?vK#J?B&hNfxSha)`kO89k6j7y{(1EDFABv3ImgUl@4 zlS=)QUPMPB1)Hk_SZSk*RKli?73yiKb6N8zE@NYxaytgbVkA{ExGUbQomjCxL&sfQktB!S~^_%oM`acn6-vwVaPw4iHd7Jk>810*kgq_J|MizSx=i1#C?9W;>#Gy-x%84y>gcaxO8VQ2=9=KI?`s zfqltq3v9qTvL{y1%Oj)4BR6av?xECyXPC1VP}89`=jM3MM#Rpm+1m5NMf-5l-b=Hn z$|9-0_dw<4U_NNIW>9~VW>6buT<;D5@Vs#!Y+Q6cwJADO!0f_tSBlU=(Rli09v?&U z?{G5k^!X%{ToB>-u$(H)rQ9m`#X@%CjwEFwwBv=ZTl)eq}^n6+LYOGt%(k-g{ z`B<`wnwY8bt1QTf;V#>y*=awFVVR0}XncUL&(6m!9PJA9u=6Hsa@zCL>H_f0;w-8U zo{Hy-+KZ5A?gR@BHJMwU=WrVo?S0FuzediId#rj^j|?1KP+e1V*L;|PX_=#iy}T5K zj7@$0>=!pvum@Nf--naNnh^umf$K=#TEMI(CJJdu0*=fC5n?wx5v|QX&8S+lo<wv5=%_L!U?8wM|wzSmBy=lw{@cPm_-DkfVu+NN<3IGh7&P$gXy zLo^W~8T6#jj!|zsW>C){tgIKFm;Oax#?IiN3Ix79Cp9PzilP`phWKlbMC)IWo+6t%o;J>EVl7pu z0MFE08#^DJ0s^MHMGIo0;G9`OJuZ-NbXd}>JIqNs-|{?llX3&;vCC!7fB_8aSFN1X zy-Zo?0^fw7DEXN+2fo~+&BC&I6WoBcslf21FdKqjbAECLAB`xCn3)O9!B)-_?8tSD z(}`P>>Torn`$b;ei|RQrPB#l#PEW1!VVOVVa?Z59x>esRqrhtGTN8b6k$@dNIVhIh zFF=dw1YH)|F28_eS4Bi7m#vvEORz~aF>b=|$;fQ%}HN z0pRjO#_f5f9=GpozeKgsnx%Y@GHv7Pe=;JRY2h+!92?mp6ox_G+D5fI_6`N6DA0gB_j*VW>*l( z&#CiBE0kZF7Zm!dtslQ`FNHX(VaG?YBr=LE#{a4Sm#u8DnD4kEC<>cy2NS9nwajH817eSagm|ObnHF41cQyu8dZpOp@*xl` zEoB{&)Y_y5g*mn+{n^By5A2D)*o{Zi=-dBj+0+vrwS2dCFUgibeL~sAWEg;uGU^NQ z^E;{^7*)Rh*`qmD(r6uN02l5wv%#UYkcZ6C)hHvDNK4EAq;IOeS{(lj!$-41@MSk3 z8Ph0?6=tUFc+zNXfWfvUkK|=9OAfur6G=c694+BxDdQDA2niX4zcF67hN){Iw(`9W z@-AFdXzIrz&F0}cRJcj|0W*E0F@iD3wV`)K<#h; zhU_Yr&ddP~hC#sEeECYu6%`sHszT7|KlcD_t3-?h1rjT2ufK~=v{M!q+19KnECrmR zz&M1(C=92P-Y?Nyv6h<7yoHi`p5{k*m-CcDFKb~J8zPxIn2XdQr^>u)=-hsl{=3$k z=}aBkOry62oKB2k3)feHGTaTcny2eWWg%Uj2_@|dKF+vlfnwKe&fF&Ons&uMj`mbs zu9cn>v{la51;>%1)u}=0wU|G*r*<>zz^A0*J~U!!4IHc3dR5ajWTv42eo;sssSuDr zY2NQ*I9%#b-rKC<2Fz#&vn{k&4-f_&8(*w{&Q~}2+Q0MJAuvZ4UZV*vYVQcc)9~FG z@wD+3n@F1j!S1y}Z(F^W8o5OzWc2%nk$4L*k!DEzE>vxGOCqjAiUs@`D2VTsvzu0H z?h-c-TbKhOq{jeNfCjrQJ`D1!zN_V_(G!%~X{G-XPw5m6iDWZJ`J3|3J!+p~SS!42 z5(+aAoWXz2vilI%nhnErm_T#Q&VnTztA&OhaN?m*G zYV-WV>800nCm5YYYF6kwipk~*{e>;Z;)@bmThYy6jb^5{1>R}=LK)fN-hj8ch6KCW z4_yKe6*SDhqc>#&HTWZ5oi)UfGX)Rk@&B+bjp!7YAz4-fftBf%L~4E6o@;_ z3|d`fu*8Ry-&2-lyD(_&V$L8IzEs_0a(WA+gvphv*+abUE%M=z=?1yR7>?#%tKPv( z499VHM{$(&el07sDEwDkxy;k*rnTsHuYfH{7{?6e(_C$$k8mErFYq2=0Jba0kKDBt zZS;=?72#$aeyqF^Rpx;FtPJRSPYMKnAU?Kn36L0{2}VCKAE0~Q0k>8en>Q#lkw2B` z@>mo~fkUSh#{Qfd1rhKS!t|Sjx5ze{Hr|0y@3^Rn{7E;lL`t@sJxxioVsaUxGa|o& zuF^RNC=s2-cHbEg6-1N0A{&ea_eojQRn!PfioY@g%Z)+(fgRH(DY^7uh$UuvgWiIj zvpNkwOFZp)h*?i&KlWGk>!;qTbFTnEitgnI8_@atse^U5rJQ#Cj!z9;2G4HI0e@MQ z^A0QmxeT}exDhdMk7OkKIm?gev`LEw>@bwU@%t=RFqEqyoLby9$2N{^msb9nx?9_syaOu5Wc8rAln_2ty!FdT+15>C2#`UwM-i6ZS!nLS#ii zRE<56$uZVdiZ%u`q0$7x4+kRNhp`B9#d*o4ZS29XsEWHze=^vpCjGaJ0(;|cW9;DY z3kb;FmL3RRP-Ksn!?AR1CHkPTjRcmVcV;T+9Th`tM9$y_NV7du`lD<%@OH4)24$M; zT^rqiA>I=?Tz*)P}OZ!jilO1+dOM)bP^+rL^mHq51}#6{nK6^U;n~ z2|OPlT17Z%^P&!Y?g3!Fqi%#Bl^XR{` zsU)u#hJT#Qz+KW38{mM$@lqpMccF(ex8B#z*r%0d49BqPy>0|IBhzCvBZ=0f|qd_#0XdTsJ~ir2~;vW>Y%>)gVtZc~WRy-2}i6jW1q zbaT^KMW_v7SdaV+KrEkv1on`X!rvl-58Ts(RauEZqN!Y?d`v3#MdW!mY!6=GgN}o6s%E3kTwS~ zFX&rOV$o5wF=qEI#h|;5J#E?X!A<54y!E(Qmc!jsudg2h2mq`e?OJJG?+<&ffi z@^oc=sa5yG*lPofAEW0F%Q%|43FmGyzLORN$N?{MROnfjUk@e@!V~NArP>!m3u0@b zMmF}20Md}d`}j)C8B?Ljbzw>|7~;CegEy4N9%Jr!W#u@-C73Fs{4cezq@5pNO+ow@ zoP4`&YJcqcuqSkvjacuT=sJYf1j`WT-X$tPNwW6M(Aw=|WjC|S1gXGyfa=xet1r7V-zW#t1E2aVQsV7&U1$iE|o|i9W&^B^yI1Wb%bRL znuu|5T~lr*TF_#hz8~Kn_W|`%+?w{ehTbmu;u2sAX4KfOqEtPIzAwogLg#4ZMF`XI zQ#-eoJvvt4m;2*b9d}Bf?yQx+$lXA525)&0>POqU`##$DWK+PFd`p(Odhh?@y)kSv z?y@fQ+|ZwKsegdD_=o>Uh?@)$<^4K6yM;1`g<|>o+nZ29B9aLFc`mlrhiW+f!r2Y7 zchCBPPw1(Vu_cb=31&zSh}d&4+Fe89*O`~Uel_70muu~xiOKWVssP+fGiJ+2h%4H8 zUT3Mt6t30wx6KDAtg^+ZX`7&kw=eloTNzP4 zdhKj>n#aR3fK>F>SPj|(eAE`^@wCbHf2HO-8y@Hxzgj4Ylitk8f6R+lkhtu^0ZQdZ z1aWDnfOu(J>z;HeUCP9C$68i!C=Xyxop^5Xm#3~ptH>a45RC(7?d<3X>q>`suIXch z`j^qmaLk_htO3+*QjM63u>P5{sjBcZGAIL1%&4CnB}Um7vZ8 zuK(N=@v09locdO(XjS9=tYBWWh5U-p5Rtr($IB_I>mp<-O+YEj2pLeB53b;)3p`D; zJxUb=Y)l%cTty=wO-B}d*1r~2ip|}D5`6nIsISPp{NjI(9PK z8u-XkkDv`5U2wpG(y@ z-sl(8%-N|+cLTsbER^9Xa8HiT(Sd}`k-DK^RI2#PXFEdh2YpwO58lSY5||Ridim{z zP+^AhHk|N@dlUxzqcOP`!kb^i0AXrZhD)NCn=tOO>X$M>UG9%|PP?sAT+I|saR{we zyU!Ykp3Emyvd)2}RW)o1Og6++zN&7U!}pP~bi`$h#{SeGpg)y>CJl4y>6+V!iKXNz zH28I2`}Q1#2}$V^+eo7v5_HL1+l~ahg5HL~5Y;QRqnRew4sTsZ56GJEcQQ@t=B_fV zmIQJ*u{bG`(eb9}6jF&$uXpKHX<~pC$_X50yflmWT5z0c=dgtv(<8P8F?S7{P7;T0 z=e%XIrL58UT@~sQieg_os`hz`MG)?%*xm>dicPl7KG{Lk(5B1l$!!!iI?t<3K==M1ScJE+L@>6D=vdAAkqqC;Ma9Ss| zQ-qFyov7{R(>j7DFM=tZ1jAPoFhV*Td1YZ@&263Shql(gsmUqHw2Ac63jW0>FHie~ z0#ald`en};Q#_0S-vnk2?FEy$(tkHZ&PiAgl^Qot-4!VjJ4`=gAXGcS4+1X+J1FAm zw35hEj5cxHazY7XT2@?gtZ(=aw+BX@d8|^_Ckl&I7eG_Fv8x)L@buY)P3&l$H|5 zZKu(|@JZK7YhC|Cw-pWCq~dhRs!L*`Xuh+uS<9$&ufV{ zfSXiahYRi+d^HKRHBg(MR~g~5N}y5{o_#*B`?LrM;}v%HY4AbjivPHB~$6QW*{5bkCY`w(UoxZ)118N36hnQ!I4umhOSw6EJhwJ3A_#44a?Lh zs%7S~AE3Bq8rXG!tBw)x@Ky?HFJ#8BE*RElQVJZrosx{7nPB8~cTLe zP|0pR=brPQX~8&h2uS4pWHbuuI@vcsD+tHL1DQVAV01>h#nov~4p>7M+NYUWTM&lP zhCgpBda(c+H zHi$LcEzK{$>eF)Ayae)twyX~o!CKJItXzelOKi+pyxyk@z7ILrb!rb<)=8$1 zRHlCb(@Pz+pX{H_^^}*HQ(I;jtxCax^WWv&?L`2fz z`v%_Ih%RVPYU7KimaSqg3(0c*XtPvz-E5^Gx~H)(cLH*f6xh)pPSSuk0w ziN%chpZ*BzJG|mvc&^+wNj-505Sqm^9$->yU&RbNJ`nnNdw-3=IL;ksPlBZz0rS;nks#muSL;kEXhEXJ0`<_-j11LrQ_XyP+`j z5I{bz665aWnN=gpy~gk5;aU{W*F-rPC`0kzV+%#j0wRk@C28q*LfTuo+ROV5+7BqN zh-BLxex6AyZhBhBMTVYjh-X|D<<3z1KRp$F3jUn~egbGo;8nY~Kdv+?LT!S3+|Q~# zh+pKwG>@QL1focU#{kwa++bK(TmE`uJneY|)2@5O&-q76ySMcFlBl3+?P76hP*8Vf zH#O_i2t&gzaf%W#n@wRC@;9eM+r?6iMWz5*ZwMrPRwZ7vR6u%&%3xlXjE~(%s&v5i z!YHCYbu!U+S32dmv_>1EM0?k$n&MHX8rV0VK#g2ncKFiMs#8ITZ%#wP_bosC=&DLbN*5;dJG4!9WM3O3s#ja&F{UuD` zoPYkej6Dthm@a59KR6W5)S_=h0RKW#nj-5P7vU6(yK5y_pQZcSaI+Fm43QMcx5{)W z2~-*AmyadHn{kCuM<0k9M5ENH-!r~ZfKgWHvYcpINg}emsvTacz(&=bZFV9328sGQ-gLxZBf?6!d8YvGYa_%e4X%fYJgIa*fsN^SDcC223!@Cqageq5ERalFs@YPz z#@EJX#;u%OKU~|#O#q5UT`wjc7ZDh$6g!bV$a$*mWDF~!hA5Vb;)@x9H^vJe$8p0l zRE%%N1gZlF0I}^XZcw$A3EhpYOP`?lTL!(OIAuAzKD0#s+F@35Y)qaDHn9YD!2DlN zmt1(;dHRWv5kRHD;mFmuu7%#b&!X~agQMcs1@BZsIe8{@yDaO=s*nrjvzA0vrt-WP zAP~zpJ||jdVLdkn@F8IBZ33NpDiTZ2Ig!BT_@pR^oun#ylvm%O8iyy<=_D6Mddu05 zp@{D;J4j;$Ga~mLkj`MknhMl2i=(ZuTBsQiG_X{mb^GME*h9N{p6bqFXJa(L#h?)L znJ)nFDDkuNcJMso2v6qwH4qwn53Zpme5^j$iTsa;mjK zAk~{RNQwwz_+}w%W>&5SJSk-)SB;gI4Pc93Q@(!uwYiZDZ+TNb^Ex`$O>`MNM@-L80RqSQm20;Lm+g zQ-T!lPt4m+gC}CRAH{J&E>&W9B8O>6eMFBL0EfMm1$c?GwLQkT`eJ=oaW4OIMPY(&Dco44SdCoxtEp1N2E`$2O^!PyC2PN^9^Z^+yH|;>9}3PWM@^s>gzc zD#nkBMJ^e4tD%&X_cpg%i2mF4Ffw)r$XwC1p%MqTX8jmDvM4T&E0XsMh6JGYneYG_P$HN%Vy=SxZWE@EC!R)JudFU(`N!!#;nRJ;WCRjNE0Uc9pYqCyzyG-W z3;;Ki0TJr<=}d-;1~T;KUxXPb&GLxWnRZEAHXr89#?$M=+0;|rxoI8B* zFzDfv65(5CL@d9r(6nG?X1RE3PA8TFl0`r@g5=?QL;t;wGnm~f=)g=*x*YcJ9Akvt zEo07%{TiU<=mD7%!||8@kzebeliYp-$H+QUdbTo;#~PP5l9i#;9P~59wX35I7_~=v z13RlKtKC`rm97r5-w}E1c-@P%q}*MMVf?)cK){MW6^H2PSYCnxnKK@P@@=S_fwes> zmCS|e^F4>DxU?`p;XRVyRA7^B2ZBsn#ij8C*GRNG&g_nhARFegvmBpIB((yS)d3v;bCJ-h0TNQ_wqS?rY_Y)1+In zz-1kBvV)X_8LWY95I~18FKbDohbH;Lc*nr`BnV3XDh1=_nq6TuE)?RkZ2%u-Ja{mLQL_TDStn6X5O7kKu+(U!9&`r5*{Q8goY|0?p2oK7S<;& z|J$`;el#NqU1}Osv1r6|fXk6$I#*!t%-NVEP`ieOk|p~J9n2$XM_oA}%Y$$V9=So~ zZmx`>7!ofREV8ajgfhwS#er{%dx&_r>mTMDG+=+9cxyIbi+a)_EU0WGDb5~hSdM@q zr|bqcfMHdkQwAZzF!yS=rw#C#tjDUKg-`?Sv~`H78AP_J4M>6E$m9y5F0M2ahP9>? zak|TWG)dKCku1NqBX?1PYRdtHo5`x;`6dpNcXG(pN{bMG9NJbjY^AWc?n5hUK_@5J zHfT>f`tw;Tn&lfxTMr0D2PA5llibjfijEnLJ@LwPsI>Tg5Mx|t!%j;4;>mnHpFOFu z10Op{gfo9VISoMUA)o6`ea-a7?zSmQMK9d!*j@Z8XBuDY`2?+l3MKwBG{y&0j7fH?Otzo0uv?QH?oiKcm|%52 z`=}OmyPRj)Q~1tN zKheobbn$bHC2h+Oba{iC;{&NIp}4y8OqGYth$vQ@tQ{MPINAJ6*>HYlW1=?b}wi3vEBx$mZ`?G!WZemR)%V0nUN|vJ|f9#YPq|1$2 z&P4AFIV`V&Zy^+3Zn25WY(y)~T0w+Dj@QDe3n1t5Ndkv*NhF~~qH8#om3e$uRZ?9l zWw7@3&(BG*bZ!W5WB}5fwqowAX z`BfI>1*@3*d7}oYyTYvSWEvewus~4)=ZW>pV$lQM-K-rXd1Xtgann z6ztO+Mae+pw|(w5tl2FoUJbKXAa&B097QQm#}#Oq61nglfj+vVT;f!4^L!Hl+N6*7 z1taOE5k^|QN`cGa=NPPbC*$y~8dm$`TLY$wi2lF}px;ot(*6fX!e*0~P6E4OAC>q@ ze*1nRP|sdWPz7to8Sn0%PV{<9R02r;sPY0{j2pN6Ucc!NqtELBa>(&6;JKy9K zSUL7SBYE{^OF0-%b~3YGDo9ik#(I6$b;q1B$2>1pMOc|02Xn z9&|R)Tjsows3mGjX1@8yyF8X>0)4h;1#L=v>U-;-ZsH{<1`1WXXnyOP3+wELL>9%P=QzEejLs@zt-W8FVFmKE(1%6X7d<0<%irw7j z*s!A;YtA&4=!k1zbL9BNbs2SUDn)yN+HkN*urMiIUM*QrbT!Rx1Ow?+(gOI(C2^Rb zcY^3Aw^3cZG()|3#1>!t2&mCt-}|1ydM$Ay>8|?zyayxidq8iE-$>@r(#CxAGLwFC zNE$=4MyShq8>rH!Kd9vCBlAcWt|1W5TvsjA5ZKjkZcD4_HEyvEsR{SZKFEM9Qe_xH z5h#@7+No}8aVS-5Kj97@N0xU+JRcFbZ{8c8VktR%vA&NLXR%3@Y?*y7dy#x%@bkEC z&~s@$c{*)p30Dg^JP*UD)bMCaqJN|uHwTWa{e_?nGTp|Cra1SU6O_-Jcw$rg*fjN~ z{P;b5O-R5{dXh5T1?r;(Gt98L?cxi`hFhtn>wpZiLtn;D0|`e6#L`DEIZIt;H>HhUA?|!ixrS5#sZ~+I zA#AjZGg%p;3nDcDGSTiqpKON0W}tfiUMJZ`Oi6PY)ey!V8lwMARw^I^o~e>Uz??N5 zFFQK&USpZCQ6S2%I5eDI(7$!Ni*L`Xp+9uogL{E>Lxyxf5ewE-bNxSgF%5Ot*IczD zGwp^lCO*;sg4@2_8c0%cF^$y9>2aR_FXE9)hQYX^OE;@hDZM41`$7g5E1i zA$e!QWB1BBBn)e{lfx(brv?EMIF0O#8>mmH}{?ns#_b zO+;=4cnbtQi@HR?Bb2Fh=Mj~kLWUEo+-bzeg3E^65JDl+C93dp%+KmQD76VbN}dDH z7ka3G?4eZ2(`(L9Rq*pnc-Pksm_MQgb$un>SWz#Cles-%!wql^54c!W9%7)B^|bO` z+YW?-hxC^DnhDZaa2$L0rXm`J)<4vsv!64h*fq28@T!z3(zj~`qt8@FlGYrSPoxva z6zDwFx)v)nfnhZ2&qy2c=hJP)iP0*-l;FHS-idS>i7&}p;Bch79KrLO5A?T3NS;S~ z61%AEt>#T5!8#xniL|wlPrGHxry_;xcz~}tWY`=4k7V;gWogaV3#^{L&3*QH+^9FS z8D}#)C#|C2-n`BdSboPkCk&Jq82N+TFVA1@mK@U3WP*m@S!!2Q!+2AA47(s3z*xGb zIM9rTi$`*yeDo<)`R{Fr>0iehNlL;#ZJA+<+-bC-Ov+rg(GeHWcmDu7&=iSUMYlC7 z`t}@a|JO0NtyCuGKP^fVZj$fgJhR7G3T{HRexZXJceh`W_3g$?H8MFS8hi<6;P9d6 zSZ!VoC+Q1VspTadbrl#jzr&EsO$!YNssZo(F8s5Y#-fu>T|fWRFu0YpBooJ8s}Npb zgO+d5QSl+)T-0<$>g!wbBAA^L-9Vb-!dqMRh10lM4aH3PSI$M0cqWbG!Eaw$a z){}3Xl9H$2XIH)jjMHKEp;8%O{-%Nzy-{*Ia zUa(_X39&t^2|TYt(vR@4?K%eJS)RqQE+s_-a8(5X|5d{xS4mj3$Q!HeGMA)UMxkv3 zTN?W6jxh^}bsGfOQe~PEU5|7tqBoWyHiMG4Pqe|bmz!fNZW(GC?f zu5UKru5S*VNuqsnzGwMtaRfAK%i-JDalvnDzUsIZA5Ikw@)mM75n02jQoT)g=SYk&B{8%Z%&rIe~(?fJxHpYa^AXKy=88&6Z z45B|ci)KoW>92b?CJA6=n<6+rAL_H*-_3R1Jo70wwV!N!{d8xL4t)E!H+WZ6{mEeV zin`qoE{6JU<<7sbBBt!sA)qGR_AM**i`>pDlI5N{iimifqQm(JHvgS=hB|WWi3j!+ zR9hb3(hcS)qd4|`9)b1WFbyjR=7i^e32gf`lqh0a-&hXHT_r3t9aijB$+6AK8}rxB z2?M%c{J)2oEfe8O%S)_6R#XxfLEz%~%{IooXeQc5ilLb`s;;G?;+obOG}5b(SGOEGBpx zh%-Hv85#(ezL9JSaU3 z0m=5azgdXLD4j3c5yYOTcyINL%Q)^B$s+8f0(FMgS!FHx6{(5Mh&E4Kf*z;_UT?f+ z9J;JFux`11O35fnW#4CR(yi@R#x{tAzN>OqVXp9vut+c(9NltXJCa4;=dzk^&810h z-8$L-Xbck$+ud#M!wir{^E;rl!Ms%-G>X^?O<-U0W|_|v7aXpZI_6Cl!7SDro4eA@ zuTm)4+-y1k!cZCzDCG4bpW^UzarW4cO}5yrLZNWycee0IBrx~3y2T6pMmsL@`-WX0 z!im{hq}gju?2bfIEMR@Fo=H4CZJ6Qt?m@Xul*U`JHKvIhv|&?hltjwm1k#o!{sH{m z$?8pV_Nlekp_wg!lf0yEL7%DXxsYZFBt^7G_xOh1hxp)h;3}Zu3r+%DN&C^r(|Ta6 zG#;{K$%#~{tSGTTC%QhM0G{(^%y>TmgXpyPS8>+}-rbWgC#MIXi-iWhy({Kspk0E> zSsv_Cj)Z>R^7b6roVJm{uOE~+FgymJ=d!RfgOO=0k)1lsZ2XJPWAcPoe^d3AJ>;Vfa19@^Rj$!!>1f_Jb2bzeuK z#y~|ZnAbM0ZodxNR28=sxn1^LEB^%NT+n>eY5sg%XEXtXJmT~4fN$?$UT>qp(SuBi zWc4&(vmtIfTMFDH2s;dSfKM$}uVfw2gd}odDWGERZCsx%nhxa&5Z{zgOQsdVi39b0-$c7csFx8j zTG_#KPLR1+N7*Wx0*klAv;?Tg=fPfP1H==t_ZlW7zZQq`Yk$2c?&XW(@Shp` zNmNV}xj5S!lwVifZM<1rydA@lK<65yifQ#L-qS?Vr`kj)M*?U4xeI}*i8wL~Kf?h8 z@g)6s|14}>B85X#4RI-=9aq?}2!i;oAKH-Jf`R_OR}knFAnI5@JZP^~nGs6#OcDMw zjoR;pj?%|P3S|t-qb2IpL=g61pxsj2U4^i$aJGxSf42uk56Rm!Lt%{Kl3fCNvn?wG zU~~;ndb5f6H+4XVCBwmg+Lk+}tTxXOzA_yh>g1>f5VkR)m%f)UGp$8mce&y1W@ zX<{x^6R8D~9L|UY>Tyn>c|3pWsLg+O^v;GjUmLB3UacZL@Q|0zp z2AqxFhs9saAEjpssBI-ZHer;5+ul}nlPDuEx)n2*K%6x?yNe2I^f2XHGB|RI8|{yy zd!He$fHrvSoL!gP%tl@f0oG?gJfCi?4Cn|p=}tYu(LI*=w6vK`pVhk2m{c`uJlUq% zyI3<%nbtMVznZ+RcC_^8_7>Z(ja2*<1~4xt&QnXfUq*|(SrjxwkytdJ3|m&(2;Qqn z3U%1K*+ILIO)(B0P8B*~in`Kn;X_oYcSti?&RR&Ulr;?ed<`4H(q~#5MTosH{JAk{ zh%-YSEYGdpbKmF8RDm$QL)#hcED9U`xH%m_a+ZjrDLIG%7{0j4VAq3Z+l*L@`USa? zT~@p^pF!J6CQT|IYBqiBlp?K}h??mxw$V2^I0|L_U`@wiwU7*l0f>S_TVZwGK%ypA zKY%2M5pr~OAu5F&pkhZ@0j!O~2c|_*(RPbyid8x+I>Cbp3){N^aL0DoeaoXzAQX$~ zJ)nfDH}RRYv41oOW8#446y~A}7Mr+~cnvepCB-2(Y6u}=;|)zWO>o@df_4Z-ZY~5F zn8WhdPjg0w`3xob=pRYk%^fA$IY`pwFx+p$*P8?h$Y@gVI=WlJ`I<^*1ahSVCRzYR z@_Wu#iL**CZr3ZiMF}$eNl&Q4Pn#o81*2RJs~qolaUH2CR`HX3`p*PYknp(dS!<|J z3gPBqg&j{f@KHSJQ=Ve* z4Ec$tD9AGR1x@GSR>$_~6yqeXfYLug0P{_@$VR2Ozb-hxb zxw9W1@xkihS+dkeTspdz3W0c0CE>G17*u}6NeVigVjNJnR>ZsB(L&CIG_BPvQ?%4J z{(MlwiWfOG!_|vB`;;z+D|sWjt<4KfVJx)AUrBRME9<05D4}boi8bnIAN?c)xb0H} z_H5IQ2NTlDOvxhry9>Y3D=g>Fk}OGjXnvN(F+AeixEr{8M&~Mh46yZf13F#XU)9Qm z(ZxYlhD9wrP(HCcUeMt6#iA-TLB+g|X>fy~YJ`M4yq{-=yUx)PuW^va*1NcTf&D`C zf24q5s;b%E^#0NesO9@4h?;+fN=67iy;`WdsnQLb-z8pGn3B>oc`U5q+tJr2sd~4G zmj~6POFrnl8e4-_Ed*%m(HYp(lYrQWYb#lEEv6S~P2)A|=*4x*n%D>ga!0#`t z`Wusgc;yPF&l)A=*<;YG832OOH&W;P8^9^LG*c8=Mg-!-z=dLe8k0JrpZEs=jQ!** z-z*dbO)cZhndzRfp^m<;PG2339`H9S&e+2MOB+G>s`(zJ+9-?gLf-M&=i<^e>Pja4tuCJWBO726U z&f@mfX_+@H6n21*ekP6a(mJ94>iIw^o654u!IjxJkw&6P=7MHK2BZ@b-;oM@C?tPeW8+YZf&Z^^#+$GQqkLqko z)i&oj{NNgx>iOwQD0qP}19K*!m3>R2w<8irFF8Wh4E2A=lN-sUBq@k^_sk7uhciRR ztJP9;<0lf@{~hgu+uOH1qnxdfB&_O!sDjMoeiPNdsmLGFE79`)5wc6p%b!*y%dtx$ zA9C;=BV6TKJI|44ER{nqZ`p0#}YB5;SQ0`8<;i_gi20BaWI!ma#{0Ga8@D!HBkv#+*g`!m$| zB36OBh%e1>Ber&$vIOzUcqlbwVb!&lJuM~FDVq-hNj}HIpj8KVV$Jr?G)5@}BmYL5 z#NOH96znOBC+DYa`5tJeY=U&22x;hUZ28+Ls-p<=P!5jqAozV5{S_rc-L#Hbtbnyy z8Mb55JkcbhMum}(Aii3MHvW+rZ71-+49VW{jOR(v`nle*V8voTuELWYprRXr7U{ig zuYt1Yb*vRt8JJ!@tZ{I5YsXZ9{90eVK-`qd^Hw+EqYDfs^*q@tjU||Q-re6x=;ZhF zoCKXlsD=jExPwDb3(aKuQYi8Bhte_9s?B(WuGc?9S=2nOmTO`o; znst{H`s9b1a~y+j9mrCv6=dlW0kpBGrVI0U@{kUrMhL?gZqR)--!vt#;(aKS1xRxy z>wl&yivU>qZ7ck{AVsH9e2*1T^!k{eE^$F}+)GK!vP2el7{qAQdzP{}!PKhC`!jBP z5$>zfV_y_Hn;Oiy361j}8knCMJj_{*oi-c2tArY1t&dwUb#ABr6LxH01K|SOC+gK( zSC1dD7|T>6k$z#Wxbn>O^fSSmBRpvF-ksR22vl(zv9_2;O2W@9Moh!yDnSpd{5OUG z&OHuGiDXXi(T;L$_>3a-g&f&k9q`~>PME-UZk>9ko(owoZuck8&MOQgfkhROcy78C zM}RDD`uNT%W|E(g2OWQ^*z}r3E9WGK*tj;rD5f2?ayXjvDcPj8rIh@iKew!&iBH`3 zh(i5+E3;cXKFZAZajvZsGret4H;|)evk=9;WiG~_XG{3?NGu1O(dZfA53uVx!Ov<| zUJNXyy{V=*LDz1=LA8@kq5XY zTBNmzCaQV4MOKZeC5!?@o#4*a-i|h2UVG;C81wGz$&0)g;QhU3mHvr|!*N!FBg!&+Uq?Os#|f-_ZPb zFhafsu$?)zZubQIEzR+&HRwv}0QHx)3gjduJYSFIFGy(s3rvytpfrx#Ski+T5ESCM zXJOa1LBSz(?~X*4o9%WNkdxC%%1FkyrWM*W3!(x3UppZq`gqzIXj?+%O=eQ zCj?877XR%NDsv@&MmHxbATK|RyE3x8Snk*tnO5~Zwwa``|9Q8A7kaMEZnn8XP(qNO zh@`-mbXmCwS9 zhfKQrL#@&OM8P^uWZaN*GNh?^#+wV*)~OJB-dq$RLC5mQ86uOng2Tz*8+oU<3Gla9 zk-R420t=AO^cH-;F8{6wKR9fTt!xVaZx8cK!?{pMHs?E4ZZS^=`Ae(zd*N4G+c<>! zM6q58jCVXpf4VO#Y}gUZ-Z)5gxJHj1(;g%s>S1&BMN@Z96viJePT`$i=|0fM-Nyat z|JEyZd)lXZef(iDb=cuL^s4#8Xg6LDu8Pl ze>KNQBPq&*mBHY7oKIiG}!Y3 ztLLH!p`IR@B?^ZECn&KmRW1iuQokvl2JLPu?DnD#Akf)VS6}Ra&g!<#E3%)cg^Z)P z6-$nHRSIhZ$!COvzh7x?h>YQ?=mAbAR(admr|gO_h8HY@3*|GSobI_jCeZ?C&GjIk zQlqe0$~Y}EdGsO=El@MJ3`Lq;qI9oCr1w8kgGR0YeV2~+khhbF?NijKX`!c?KRvd& zBdVPNY^f01-aD3_3Z$ckH1VAva6EMJ!o57nfq3H=rrZ07#~o)OuYiwsx5Ie*CPj0O zWPeyWcFt<&KPsaN8RR7Uj2Gj2Z^Pf9;OHo>GRu8bjafc}s~wwwSBgwM9o-gFGL%^} z+p@?jqi%%b*$8|dY-X(@Mnq>rB?&G zU>t0kYAT)6*`PkO(pV&z$_hle5K z?6M{{>9x+%_Pn>>uP6kIf71`Gb(y5Nb+KTyn_k+^?S?w2Is}P$3zx3}K^{e0xiPpT{&l6&(U7tSI6$lQCDz7A079SfBxHgpE{TxwvmFpx#fcwShpztPG-_i(P;W@*fF z%g&i7R;P%KFZ4Zfe&MB+VK;j)SNzMKQ@IIq>DMM!uIzR#(CHXds_Y2?sSH9L#of6O zZ$r)boY6A)Fkn^z8R_I-y`KX7e?$6=V1$;?NtGC9-(72tD(uM>hh_qBcKUGNV)8Yx z=~9xi5U6eabje$C(OM2=IN82c5M;#t%U31GS^%+N>}}3~)QNw8Lp{F)+DXKd&TpJT0^cL_3#B+`vwJ?C)uu*N=6aPSonA&`<1}vFoFBN zLFxK%RY(a}5~>`f9NS~~-#PZECSm@!t0?x4d@Y8!fAy*cd;Og*E)idE6kjQo`$T{m z#V6~O^`X9jlzoQ7U>sb4!5hP9GVEdlPx0dUK>}yp`$;X7F`Y$^- zTn1u6(f8-Qg$&%p?VSMM`hvU9{Y4#x)?3%!fF$RU`8NxynnD=yzKx@GPRRPmIjQehFLXttqT(J#>p@(h5F1ntZ|oP}!gv$>_}pL_m0#@w|A z4YaZzO%e^-JpG+Z5HL2R=d+9<@RX{Svz87SSKko_+#OzUP$VmL>j8B3$WV88uw%6p-r)dm1sWxQK84xbyO}LL+EFhpg>|SX{Jl zJTUwi##`hWqBQVgCV)I0C3 zX$Vb1VCnfGL~m<< zBwXEFfZmAJlU$^#o6b!>;7zRJ}Kem+l0-IBxmTT*hYQpIC< za0g{)|!5HYP8S!`?Llf*KgUqu#s+U@>8s=^18x z`g~{mt5dBG=n~ymp*Vl5iU|S+OGxO>HN;oFGU2v=WCjZ$;w|J!5sa^dC~5&0b#*kQ zjE9B)ysP4|yT{C1JHVeHb9_dzaaN}Gy57)ym%OxBTv8+J2YaChXosO2P4GTGLYQ0IqptVJi@-gnGYeH~DG-A|A=HtNe4CHS-#{h*ef3(_50#I_WJD0JJf+9cJXxu$^|_Q|jNsL}p!gcjQys z>TEphH;6rU|A=7JQpr-5i)^#=Ar!zI45gS2AdLNiNoYu zuoGsYw}6Jo6Ca*|c)E$_bCkNFCFNG(GC_e$8nE$O4q!Wp3YMYY7QiN%(dA0o;^+$2 zbJ!~Bi*VFp2&UD@Pw#6iSe*PCMo@`=&gH_^9LYoU3dJ)!o+feRiZ;{(dg2+5o)~g5 zTEnyE_i1rF2Xt5*1U`Se3)I`x`_d5@EmaGVMt80B8dUIvvtqgT8?;468d-u863-KC znLU#4I9;pTJK1=yJiz0N4g`q^eYGpPu_{+3g>Y7!wVsyRZhAP*fm%JnHMrNPg}Q!o zx)qv%SS zzB!ojPW87X%+Srd*a(h1zP7@C$Oo+{HMaFMOi|zz-?w*-0Db8A1G9iBHovMms2e)% z_@zXLt6JVUWH6{8=N;i5`a3M2e`?!KI5)_S)%bF|yHhpaUy$LVw0_~#-?v(rg$bo7`ksq5 zt^`%@G*DT@BQ&3Bi!bS4DLPgo3kqkn4fM=(0wZZIO&)I+Lb7TCm@&Q|CGsf1un1}wLfd$oGyYBOV=9TI^j-oiZOV;o zCt8p0ixJ(`JT=MxjL00iYi&r!x{X*Cd}0#^82`60<~x~%umrfS1B@r=IN?KD1$r)$ z5zxj{=vraqR(uLo{KPkHGXBSu43p-9AV26;;IG3LN+x;I3E)hRVve176Z8uW_7*k% z=?AQZ997NPmDV&Aws}}2xE5y?efa@T>)fCC0hyAD#6<5zz6voxogrwG7{$wfS)4&k zjRa);=K$$Evf_}oV+Yk@WQdggsgDEm@Nkg*fEj-CHW9n2vA4d9b?X3%_nWKii$8`wFQ&MD8VjMZ}m^h0G1@4eSK ze44B`40F^ajI+^YanTE1)yz~tFcn;Y&cb?M<8t9snS8NGmQteK1dL^I{*YWh@A8A zb>UdSp$3ieDs+p&3&sLx`s)#?(gZ6_=-yq5>S7UntUKm#2wpj<o%XN-;)EJ=m0|RPr-Fp17|&ZNYZLFW*AHVu=*; znE@uqB>Ri#TjibjvxA!0C|nxxdf4cD3eLu;ZdFx*Yn`uc96q76N{dBRXv0)qE0W9g%MYghUIoRD<6`ErNs+N#)dtl>e67h2*i=CV5?86#` z9CrZF6O@aBk2g>~~_+Zf(J#KwxL!|KD(0+4o$g7qJO{!k&8rGAG+E#YKJus%Uqkdu7Wfko^lwEvS(S zkXe{6C!1j$?4Ok(^ICZXci{kxHe6Vbw=zRChy9SKl4Cu`QnM1Ct;uWYYkmBuAlwY3 zHeeyjA;65%*co_npGoC+Tr#s+dXp<#jNM=a)zNkXr-(v|_Q#<{p>}`g?Sx_0M#-lU z8uVR37Tc24Ft+iw%9s20&A}n83A7PUh2O-u@;`Iz(kTl02X6CWlByaFM~LeNT)QhN z2;b^%zpn1@V)Z|GXn&pU2hNE?mUW5@SQ}}NAsHbM2RF%WOz<&_b=U-5KCA-|UHX%E#bqDvmi^!l+)OkJ>bZ0I1mO zxrpo#mwhmOxv?wL#v`QNiWtsxg8lXC@N04=HRuvaxjDnydzn|R(@cmU#VbDtL^Z2mDZ=f>%Wfwfoxi~jwvyVp5x6EwrqMm2Au@MKFY?0@c4u`FTn z2hb}nSmJQ>lg86vn~-;jRh`i>2b`}kqan{ruGG=~$3+<*6&zhmE-hmxh`If9Yyf`dBg-Z1jP7Y~IBl#~>bfK=SY)QKdo&Q$O0lEK8PTG#WZ$Q<)7$?xuKuYi@> z?7;>;{ZQ!T7{Xj-xWY66Ujmbu*|eOzT$^s1YriZX*oAkQ2ZF~ewb{tn$<@+RWdX7x z<2b@!7nA>z4HneqNM5}4eC(B_gLyexHs!Ja#0_%lU5~pWn`eFGC4`f%W!MF0@d8I)BxM zh^VM>{;u+91$kv^AD_D9m=p(t=Y)z3mo*PQfl{sRhmwj7)EGD$^_AAW;Q3_fBsljR zi2^>=ln}6H0j8l=ODiHauI>e(HugUp;<~|6VWCH-EBJ&M5M|L!_qU|l)MDrL4Nh{B zGgz^;Z&C80w3oX5BqwPg{i@$79-K&3B+?~_WWMA|p$DW|9@wZJYdN7el!9ET>Q_j1$X zDwDNOQYqr-SRCnPE50|=0W}SkAD}k`M2CAIMBor*yf4aDP&IDT0b4Me!#W8@oBzw! z{o~7J>?pkDDj0qg3d%1+w7|z5o7JH-=KrI)_BWR#tKaU7IgB)vnqpr5G;r-TpuqMW zI9GB{xi(0Dn$%Y<&-|s9gU3VpEennQrSpA?vuw-A-;$Qz<_Nz>C+bP(Tgmbd`e4sQ zO{8TR9nlFrN8mbCaLXrgadBXkFW{uW`RrZIJOwS~8=B9q18sd?Y-A*pm#`N6EcwqZ44xlaO$sl~=?Dbg*M~KDt|rJ(I*^xmV#)85ozBuD3*-rGsrp zq&nC4tPayyPPab$k@;eFe4UCaIM-n9X`9*|Gs{HaiC`n2DMogh`{8MK9V8y|L+!wx z^N0L-Xu=_%TUQYMJ7g_Rfaq%xXa3l#VM2`QqZl6j;H1M#9O1#&{q|CJJBxk%H`=*W z@GE}N zg}p98Il%VXYp@c;$Z>TbesaSFAKa*5)88flzAfVMMn(@~ayI7EwUSgeJwc{R4Ilkr zy3S)I*DbGFz*x=Tgpz!kO9m=`C9*9V3ZMp`7{CKs!QAvjRGBoYyvW?)trX6DJ!Cs=6` zP{kO(D3TGoBjW~=xzDE(z=iO|*NzASh}|3x9C-P<%9jNE1UA!|5^=v=E-~!Y=@q)+ zplqnXm1Zlae}36kY>7L9nQOnxQwNAbii;CsE5(x6l2mE6{B^6D-uRAX2L)st1>P*gtU%m;2`-+Ry2xxjTK4e-+i@gHjWN-TU+m+KGl_zabLPFU?oNWWj zO!X30N^1H-a0_5c@e76`v+WPhthf})@oajAg@Ub=DQQvDsSk4o5##caEQQ_4C&$$| zbsJfKI{j#}uL|v7i$7$tkN0>-6DC#6NBShV8oSoFA(OYGBf0L=#$QV=EF;A^KbTpJ zKjy0!o1k$i#*35!sEMOeN*!$=f%ApB%_AQteCbI07Y6LqMY0|WKWA|AmZ?AcmZqS} zu8aUns+9_(+r-(ca_ST`cPTMnhIB5Pv3^W4=<1W-(!41CnJ-N0m^?WOLu1!@6_hdF z$6Q2PiAzPZp@VtZWf~EU-Xg%^uyJOS&B=OvLWla?)kEMAypeEXBbEhh^yPrX?se8< z+9E-Wtz}*OYCX@;_mZU5FnHz<0pA6|f1yGwX);ME9NBsA0<`UQhZO+b*F`0co{AQT zy^_qoAix7LFF{o?DMkVIuzp$cpBH2AkwxN({HT0bVyB%?No9OhtA?KJcwvO-y ztyW+F!%byQ*0CgR+`UBzNVV5XIh$W%`nMLC{KRnhvOJlzvHis8Z|^h=>y>FRNe8_ zY#ja@d;1SgWU-ASzC}J!%EX&BEr~{h-9*dX)UoCp?77B|1v9=W8;R4b;0#>|s~Yl1 zLUqRsP00*>PW9ojBn2_a8d8d3l-t*v)GjIj@FJZF*0)J>v88vz_y!Unl~Wz=o!bZ& z?dPh85IMMHEeqWx&k9h`b*spNJ@y->xh|I}T0ytwfQYeqj~F!GjR##krem|`i7WZo zz*Qf^`%Ii^%S@lwvZkI)xX8!fb78L|&p|%rqb}Iq+q%U$6{*E>h*{2YL{q`~Vwc=F zcCD$yg)FXGCnYb!r>u+Ga77K|ew3H-GmQ~}DJ6u$T+vjF%0`EHA`SqmV$8bWLe%~JJ; zdLvZs%bm!T#g?d<$}1U?rH2M%b`Jwdgo}*2tPWDKedTg zgJ@aSCr}PM<}BwF-+sLuCY43%gQ4MNGiejF?={O7S{L+uH zOfW4b>(v1*Fr$?%l!ig55|ctpv>`j}HAANGNCpzMtms7kg+>}-7Duhm%U=D++9VRWARF=3WE8Bgqa6l;ei}JtDj9^pOoy`&^m6QD zpFicUYI%%sARlBJSvT)62ifwwwmnTP?7Wfh=`5t-zjiCmg>m|_m~@b0My$|k?`!Jm zX2a3DZ?K;z?WIhMn5@H@770lX(f0DxL_ZJ!KM!rlZu9UOe`1ZU&t1GLduzu-8c{xh zlcjDb*(2v8*NC8zR6ChQkyhBc<3$79s%=B=F>64d53bNHwPVX%tT8{47CRdD%xQp> z>F^4Fa)k%ONu_o%ra2MMb`}17%Nr{k&WJbjrH(o7N3q%fQx$mZ;3-+mFq`{r0}{C)RC1YM&+D6qm_9h)e<3G!|po%%BTHG2E&k zAMItVr6-w-eID;Mg0qcRT;(t+9q}+o$C3dF&g=E zlSNhOB{+i;v9%=Ap52E65^2ZZ3O}2uoq&qjf>w&i;T^fPz;VEOE-k)Etbq;I{h)=u zx?R(mF`5vxZEqz5KPY7cdf_?aEX!I=0RYae=`NieP&PjFYaX7WlWL<{nC$5w>r6@e zi=Zk>^~gu+d@9B{SeNx2$pv`TpQebWGkU5SkJZQ6PiuGIIu@+{Scicm^LVIE@h0b6 z4QsleWcVZx=_dW5lAJ=OubIJvF+Q0+qu^-iX@=5{^iGBs~0F5aNGruD^8hg36sBA<9!EGP8(k;TK? zsN3ELH(xbeJEhO0r0~T|Q(!uJcz9(^$`{|ms);sXseJBOFm%Q7VQ{Aoy|5i#zFQSC z#c=S8zBW{Lm(DPgwhSoR*10G6tpfN^5kPAf$k^@0^q4G&nvMc+J0Fe-hDgf=)IhFd z%q=BWsg7@^PKp5i`j$o<3Zn$mDS_J6hCw(Ep~KI28{b&J70Zc;E*59djI9ED*4^D< z$$x7Tlq=|`8@p-@=KV~JG*}*tiWzOEcT@|)kn^)#& zxB9(BL$C{g8-CJ2{!qdzb-uwOJgDqfD@)&-FDObJ3|qN7Fs^qe8`b%ouzxMgfsiTL z0v~NxSA{PltAe051ZdWdWdikBj!%I>u>qFG*cUC`WsRLMGug!%Bk^fKyK|2KU*osw4N!`Lt!< zmUFH@aB2~BL37}jA1U)7Sl)5AcIUu8Y(Aw@*FCD4E_dzU$^q%h6~@xdhaal_#W=6hDk3ij=Iv@6Sx z8_lxK1}Jr9o@y31F|}_{SY_TO(Ouj|87@4WHDh?%eWaWY;zGh6Cak9cP7D62rj<25 zBv(Pg0&e^cxDZc;WR3!A_*uUdi=J&}+bKkkf<+WM9AlI}FjNrUsT`Ctnf!X=;;#>0mvK~&NhA?#Xa zF|%~`9A4U~M7H5!)Wy*ykIwt42H+0JA0sy5ZWum|Xo5)A01xE614k2b*!g~#?^vhQ zxDLdtxx(OFYMtmJu8*2nE6OjoKwX)(j6fIFsD;aU8f=*f*0jqguBcF0#MU~KTV^5U z5VP=@x_hch-+|N>UQ$tYkbXMwJo1%0ioq+yZ_ouJBe}jevaX zcZ>%@J-Q5$nzv#03BMbm@N`uE4~t+%rX~CkfP(0@yXkiYHDgcS>P<>i@tmIyjIYe# zWB@rp#=pmuIECso$HnWVc8%I4?cok%26l(~8LXlzy`G%0ml-Rg&$Y|%VC>-DF8i~- zyT>KoA!5EU@+h25q`v^%Yv5#%0G*v`nj5sP7fPD1O#wikIP^29UiDF@O!sB7rxcZb z@y1dLm-$&}Y5bs!6TnZ|Z;kMhr6Ho%!}jr7*1kUx6-6f6j_u48C03Pz3?O5RfeW_H z7U_;|nR)jAfa*1x+{zf0=+ZJ?c5VB&ts$X z*&i5n_d~W|E6ky7<*G_svJMnSZOLsO&P5Pqc2)x~zbfz97F55cO?&(F3yedLm%i+A z*Eud+Ic9oTr44{H5d=QrcrW549L}v+%0CL_lOznD%Qb$1`!`uEnpZp z9|h$DimDuTANA{WN|8R)ymmLI7=9o0761}iX*D@dZ8?h z_x@+w3DPkOxcL|RowKr}ic~bdCjNdXm#xr~ye`K#=9kD;wktZ`uXGxfAfI)-HbWo< zQH=D&hc{LjD!}pV5?puw<{vVKF>V13F8;bTj3f%jT^&2$8A>&#YUQ}>$t`%WIx0*> zqQq2Kq2q;Vdd>^^83Wm^Dl$}%xHyKziC3tAS!ZNQ=Vl=ljS4n^jZ6zrm8xGu}Ok21M*q4$MS(`2W*Wb1X zWKbs)kd-$a6{kTyAg=$W0L(na0y(}SUi!Ky&K4ij)nJOM!k>o`=XMI41&37H1^J@0 znjUi=VuMJNIiY7GANP4)6wmfc458C4s)H?z{sxvn_?Mhf*}5Ir>IQ@(Sxr3>e|of& zW_Mau7+3ct%g7J{Adce^7KMyqkMfWE-_SXw7TG!QEbppl-wF0XBU{NRW6c_mtl@r= zeNjxti_tH4lBa@@WKIAq8AEB8(9! zN@3??`;#P05(N>mniRUNf4 z&X4O=(aD;Yh$i)LI1P065t0HqSG?xXFJM{=m2s#@$; z)7l|N2Pw-vet@}HoDR2uvWfXL%=c!%JX0YhYrz;1ky%Rz3|#1*19!G*loked?&ak< zEA*OKJX-_7yEO&Bz|sm^dt*2a+`;f$5+@{HDAqF-qh+?{`;a{fBVe}Zfxlc6hV@Pa|<(gWK} zW5=qp1SuO{khZ5=(wfOnrKsbIYtAm6XVP8{z*4{xF9VC3E95?XseV_S@2m#cQ(6hhBvyfbPS-^E-@HajRS{{``{nrYg`{3?g-+W0{;dV zrg6M4!66vY;v=m{8?N~BtM`je`lP3wgf5DVOM)*2mK1FwsOehCHUk%mR;iZLea0kt ztqOf$iqq&k2WQ6O!*=u2<1s7$^a>X@tn(h@8ujhLKcZ5T5V5l^`d7-f2^GCon~f0H z8&06Co$K~7^(WzQ@QD{BZq|}-J*E3 ze*Kl74)ych+5Av)$9lfEu@AO$m%fMF{Xk|NL67mFMXORGT)2TO-jOLk4?y{HYe>+g z!=Fn;HLMhI|HTOwFo!O(ciwxeb-o6{lQ1C8Q+eBlvgIQYYtzcy?oRsf>tXceT`hCL z8UqXc^J&;!*ngZP5CUZ$R@`~MkDlm0{%{|Gvco7VNzBVz2G^-ecZaer-rp!98_R4$ z9yLFRvoR=qS>J@U19sVh9m~sHK~|58__#qz{OHAW2)VR~naR`l=xim5vUpPKy>@td zWA85(a83ny^#all7&}pdbD;7C>dZL~0Y-A$ZfsP>7JeaAO{uig)K!B;2V=?l!^M8dL@~zO`lhA}l!3M~A}z&M7!jIp;6R zoV}xJS$g-Mkyp*5Kt!Ur8|?dT*iZ&yC|!&eo_5<#QV{;OPFnvZIdX^wHDCEn+kHa^ z0O7cK>-Wi{wB_QR$|DnB-C9OgC^AlfbKvQx`(&c77@V~nJfK}rG+H7e?uCWPOR!WC z1J8`n6HhD|u_)o#;I3aSl0DNv6JI?dm&hU>IHEdyj1I$(p8-1cr&1WK=J^x(T?KYP zAeZ#gs+w>qMWQ#cnQhUn$|YP7I8@&AsE>4%A9M~&z3dWchOss8 ziBgS91MJ|FSWref`qo7mr7O2EL@RaP(N|Xk!)nv~z5IDv43u9(cRZOtLjXO)-m@Xo z6`j%l2(+vO=_BCC!ZX{#P|O>8NrTcLb)&8{6>o zQbRGbf%Ax|Y&%dHx;Yx|TyOA{iOW0bAXr#p{i@8LzbS9LOY*Nvg0sDIp2vb6iSoPkPn49 z4k`u03#CYgZS_MHWnFB6#)YpkW^>LfAhXyLdJX!TwouLO^Q>l3ZYU(x8Y_>ZTkb2^sm5FqkcX3Xs-~=@Na%hJt;juqH z#9xsC9dWbrWu)Qi=Dy=VJ_T|SN6qEF|6H^~I(@OKgb)dMBLcTR+ijS<&V2NC`VO*5 zg3JU6+yc|~f!(M+2f?HMmp{R`|CVa_51m7KtW`jO=!u>DK?;WcQ3Be3ewnwR@wkQ% z)LOLCS=a$`i~4ReF+^5q?HtHw^v^(8>Ph}LLlw%9pQEl+?%mTNMfRCE+Qi?0*oPqR z$_q)fI1rh`JeQpT@j`AdXLaW?GrIUt?~>rbN-)8G#h)x(uZ<1q)6^#ob&6Y*TSkTk zHpFs5PaZ;j27zrbMfKq0re{9*-~GO|dWB;N^US1D(GDfqOZ4I(4cH@M)KNcT^IbU} z$%5~p(oHNx5S>0<)w;|6Qrln-bDVvxCr){TJZf$8xM^7YL@L47ml-r(c?iN<6PHIq zvaEVp2HGp*0z%wSJkzRJr^9;d?|+^554lB3S8jqLOOQ=uu}HD%5-DFUsUM^c(oU>) zBRS~9S1(D)z~WLA7(YwlxvS<_2q~vU_WYY{CVM$8t2da2xAsQ(()AiIj4X}?e5-lz zi8Mn072}cD>?DL@rrZ(uoA&XM7Kjmmxq4s!G^BL4`k!-*0wNT?(0xW25Jzfw6DM42 zdrq(xVWYesqB*Q1>4;}ZSNcyu)1(52#pzl`nXf^)*1J?OMF11a=av78Gwoalb)}-a zT$zWNPr>~sTQhcIV&gcW|3XNudlGXbZ#RN?%zeSMS^8InOI8idQKgP?#s6TE^|}+- zVv(Ts%`kl$i7HR(Bmes$2M1K=BbQ(k`&@V`H}G?>&*>lvI#{;Rx#^^d$T6Z5xU-_S zn;hE#je=>|TCs9?Z5a7(uQK9Nibjq~@mfrsFsBtP_n6iG_E@QeP_kHAu&=dK2)-&f z(u`_s#bV(#MxLoMJZA!KvD`!`I%C7TWuOOtzpWVsWbKLk#4u&Ak$5& zYOs!%`0Hw@MD{@4*qs1Md$;%1nejOfW?oEJ4=b5|frvzCj49UJ7iCNX(dlurBobH# zXm`U&uOItWO$`Wva#(4Q6im!yh%+>-TV+dz!@{t95R^Lbq3;I*8K4UZkh{Zqcw{oG zb@V5fD!p(SLv<3C)6BXBTgN!ka=UH2PV{7S2^mq_5E2th_YM|9QY`Z`0h&2$Ic^)I zljzQoYw+u4{pIUK^`p&Aha!>ex z%24YVFy8s}4|LiY9jxt`8KaH4iL~qCi&iZX62u&g9wU4QwnOQ)t&3KFxTx_T2VAic zZfRLL!oEKjXG0SDlB3WTY+!XB6w!qtlXR?oG|Xdf*kJ!mZ!EDTAT1YeKZ}SCFlm)^vP3(_DEN?_E`Gjer0fJK~VnwZ~a73;2@^(j|;#9raOPFc* zrR=>XB=A7mmIyqU$iNi{nZ{}dDH`leS>!go$L2!_^9Aya4V3DOh9QhIssF&9UNp&L?od`9Wyr@kZqNAy%7pi1e z#}<_H+Qg}b902)#Gjc9l5Gg$N>W;gQ3ZK);{7l{e4^^bXrYf>*u~^Iq(&)lR7P_DC zTzxBpudy6Tq)y{7t>SJ?1{-e0l3vi7Onl^?@tVm~&4xV7ysit?!z1j7eGf~lozk(JLCP0-%?f8exNPD#-50B(Lp^Kn7-=&FD z4H8caW{fK&w^cF-hZx#SLOeaRk~K=sxngqa=Ow6C?+qUS_(sTP8`^U_T_$M-)k%TJ zSmng5V4VxRv%Vx_d;bzKzat-XT@R?jf@om^ z8(QbV*+M{`*p}5)h*Gx9QQdl)<^dBccu|rS?5naXeC(zspI+UU_&#?1O2H*iz~xJ+ z7Ag%!*kH2gi|_r{T1)-Is52MiOQLUTuC2D#0-LeY#&TcmJxF$dL))$Yy#NcAOs zM^377=S}mtsU14#)3luZy=x|s$Fl|D(fDedfbeVT)Wka+z<>lj>Cai36HiK1R`vVm zZnS?jX#Y;auOZ1*Cb?Oi3X^T=a|;6G2&+LFCN5oCOc~M#+rjNKx8+|Pkkw) z?wEuG1y3fL28*R;`VKguN2kX?8pk2N8JtjA#~+DXay`|stCy6Qsu|xOEMc*0M9g6e4(2bq&?&~RMhdb-0sq+NA>$RABS^>d~f^h9f)t z6RJ&by}a=cg;M!2v}fF82X@6b{mM!{B;P!Ec7e7@?I2aL=HIj-p-UIDCve^DEbl-# zlY|ey1Mf0Q*UYC%l$WUHdX*sylv7+j^~{p^IJ9(i*Q5gAId?QtW62$f-<3neQ*OFZ zl>#F7t{zIc;rt=CpULqw^Qi28#w6Pr@mu6Gcms5V0>tU>LLHjbgV_LzPM}`4V!RX+ zh+2xh&}uMEf#{{}51O$Ec~1sL#O4J#dd?=w8FHZtSbTxy>Fk-TKW8BDJ>!avjU2Co z&K@^`rU9U3*bsKtzMvP9&@88=-5Q1p)L9fksEOX(E58+PDn&`|Y&~hi12vDlq4mgWGjB6#Kq6Of_{F}DM5`*jk$!!H{(qb$I^zG|NPG!J<1 ze!j5arjOZ{duF@EfU|gzR28W(`H1SqK>;u-fgDs7gQ?l8A$W1QDW5}tfBgso`7~#2 zKuPbOD>8dzdr!=-ydBaC@uw-AA7zt;W?JQEQB8)ChkMGIY63Z&!~I7UJC5Vq{<}aR zuW84;O9+Z<=Hxcz5w@}f%hKB(I|FIe{vaI&#JJ4deu6 zo!MW7St+raQNw_{O^VT7LUO)s*tE6{60y2}`$iQ$O+sjLc#|2JIA8Rk0-&OeP25eD*sA!~rY9Y<^{ha_UR$|v?4H5eW_1c~e^ z2^fBnB4fIW6+B8o)|{O+^u~-%_sQgkq`*t|YSGF0_pX3Yq=(cjKQ%l)2KG#h*i=-k z{Z_5PBWZ1hNL?i=_P0eJJ%(HIp{(ht3cvL%M0URzU+h zJ;|@js@ezwr$9|Sc)Sp@D}r6V)Js74$?h{Ftce^ChJ)lAuJwh=1eIaddF6Ng%K2EX zs+lc}zeZ(#m`xWXuI=s&;2Kq)a`Y=+;3(2MS)p@k5DshK;-Pr?#QVDd7sX-Ivx9z` z?C1NYpq%E%665J4VQp>3zDKJVg%qtrw!Dt}r#p5JzCF%vO@$b1na}12R!0K37eM6u zm}|$dm_Vs6TaXYqxJiqsWBChVcxyZ?3YJPKV_YAd8k&(`DW+$iyBr?0U=fXc<-0#$ z5!D%IXvB>ktw{>CxTP!O-zlP$}S-JsjedUEL{d$-z}fptD@liYMY&R zv^jmU87_SDHsg0WKo|cRPjzwfM*UxXJ=4U04FRL#`j}jPn_V6ytUUsIU%ZXXw$reK zg&qpZQw4}NF957>!uO9|a!q#Y*ze66N?L$4Unn^tL-6KD@R$R-;LDOt@s}JOtX-N9 z_ZXWVN4|m}?oiFB|3g7{2dHbF67QlxdechmUol~X#I{6#EwkhRP7|fMrkZjXUJAlT(D0n4icg~@$3cz&sqxcd^zp| zuCIu!lw>~QNMEgTz})A)vY2d8zk@IJzF7xbV6eUmK;ZF0ax)-sY4ZX;SFcVyHmsBH z2!uH){@NmRAKPCAUQT1tDO^OgDm-R2Qi#RF^zIR3U)z~+7{-?}dqQt6)Zx;gN`9yYgoowc!?d+YP^9%HE1by#(CFcVH1Y&5 z*Jw@>&SJwPdy_sT9zHOktc-CGkRbj<(NC@MSIsOfaxs>Ydg)+)x6(f zC0|Twu;u12$optI!hPj;ltqd&-H+M6!L$c;9o|txfK%Yxew)Ry@o%Sk%DtgC&OJl& zLR)4`>16bS0zif(GR-GX3+b>X3*zXn=Hh?Q0Ftnlo8?j_s;#!}3XNadbx|!xV%Q0F zi5afqK6r_-HlcfAb|T!!2pF-<{w z&rA)|x2bGFS)R1*ecbh{RgsBaTC!9OZWf2xSMAS5EaC5`FwyJgJPJWV5(Sc<*Ur)<|Ck*s#wz1-d+bU}QfdKTpGRuUmfd7@cm@smH% ziorkWKYf~{hN=h^h=~IX)++Yot1>CR)-zfD0f&9(*F3NhDhD#)jouK9laKGnOaOtu z4-!|}l0qwh|K3a~(fAQAF~va|zL$Cs)Fl1NjN|P$pee8ZGLK{sf7-0}Kw)p1QzJHm zaYLs6K$(_J+)A*)dZ`J~Lpx_NP(dFU*+yS^>-CI4Jtq?-P$V9-#)08o5bh`rG*;ZD za-Uqgj^G|P!W#45Y5N=R6rB#B_xFwpyMUu~PnC;TYjUIsIMPSWQ)%Zvn`2U;g}0Ea zRlbX^;-gUI8Cj%@s%anm{+oeUu|0aZi(At!tynM!FZqwK_WdNW zUfjk}om#E&pP=f%R|rkWJ8qIaEWE&Gq2Zw1|IvOV(!E@cj={C2tnw(mvZCR8bN=x# zo*B;GbN!Clwr*H`u~PIaZecSCn?l$84Qm+3*f4cNJRZbMQrB_S^{W~Xax^LVi;t7* zbGD)WaGVI-Jg-7V@Hr#CY9nLY(O~(v1ui-!a&W{foM|~N&I_r zXrRMJCQD}X*T7AJRFqcR)#X1!Y^Fnuje>n)NQ2QycyEy!n^%;Psh%dA-!L*o$+o-` zuI!}JtC!@Z`$TbkA8Vr)=8T2CwZ>If7eqN>rlR&uJ&qR-!w7w4uP-S^SVlIl*c^@f zPWOGZx+#I*sM4g}COZ#bdERIk-laysqzfX`E;Pu$qvWN+WPw583+Tuptd z%PGB~1B}1B0SXBAIODwc2HkEGb_5EfOX>e^ma54sH^v29|CO=Yj`N<3*fBf=&~CuV z=`f#-i0|BG9~Ja3;o*;IW?g3p2bjjFW96DbbsY}{6lJJiaFRzVjW2GQ&w?GMR}6QX zIy$kqd{RJxok&D}QFt7XbhzAoB+Dc=jo9~#S?^0@cm*Hm<}$G$?M6rIFZR2skBE-?2_IEtHWUE%CaKxNAE{RM&NT$EqPNu3@RFp zWLL|MX7221${b*khcCkD4HHya>)|@FV$Cza`X0)@$Mem=$S)7Ui-0Eni+jZ$zB=*~ zHQCo9Q(-Rz0wDeOi@giP-JT^Fl?aWjZ6Ujn)KZ4jzw@;@wj^s}Wq@X1BV4VYEj=V1 zA6`}X?-Xo)KQV%I84e;`ZdV zD1L~^xq^5U5)ZzqKxv+oemw(g80zP=X;`kYfL|iKA)XP%Y-68UuCYa#00!-)LwWCbi7)8Ai|K z+KMG@jz(B> zI2Olb3$HJ{j7%azQ$uNF-SJz~ zUQe4@5mBO|$!H9Kf(AnEg_n>f$Xhoim!lZueXVu3RD;wOc}Vf=Y~55@H-OMO9Z^q$ z=Gs-zcDLWJP~4Er0>6??tBp_$+^rPRwrsi0Qq?7EZ zqaf4*lu0pCtBpaqgvQ6eb&qGN6{*Ycb;%8*Xu(!@cz>0tsByKH2#-Y8@djjmimmnB z+Z-ED4+sI9qL%P%y|{f@+08@xCJlfIQ7)~?j_r>FRZfItts*?$cb1mun{yYFT|6ux zu5XlQ>jYXi*sVU8+3XIuq~E~|7VWl$&Q?^56lK&a&ZzbbuR{5oVq?#S8pHkwK&luL*bCbqA+Y^g~*Q`1SD+QfI3<$vKJ&VGzTmnvXAcx&{@XLly`O;a+IsO_XSAyA88~(XA?DPP&?pQ!zwW>1~xg^+U1a;_U#%ACjPF=j= z*8(7^n^8ErSWJ>R@D}qQa_VU;SSx4ns?yR*Ja8zF1IMuJ;ApVukI*0)mg5ECG3=@6 zp9M`HYr;}!H?e(bsWQ_RjxV5Sme)}*^WutmB|}xE`xiK$OQFeCoUDBhBz%}(Zgwn$rX-d^LGBS_WyBoS@jY34~O+iTv1CM%9Wb8Djy=H z?bk&pe?@707D&s1MgKqWBn+ksFuJd8i^?dJsPd4l18?0=X`wN$hI}%YCT0IjK2G5L z_W}&=31sXXz4qt-4`1^lURnTF`7_^Cr}2x_J8%7^3nY=_lB+YUjy+@2Km{;3qK<$0 ztjM_{MderHK%I1n@HFZCGKeTp2`gUZejf4O6|SO+K5%Q<^a+%_QEb-`e#)_-UydJH zL+NtI%u4kOP(L>YFW#7dB3KD0ZE+ahw`0ov=6NgTz@a*ZvN=^SF5~=5n0FlT08wFF zl<8;!gXY54IkOjH_3rU(cZ<2>XP(fOYkcIg;cr`P(sM;aaN8|ZJcekqAe5P@aBrm~ z+zW$~&Gkn$1FO4jbi#MSJZKzXRBDV>?PryZl+FHl`>pD2puNU<3I7-%V3{qPs@v5< z)%BPZt&%&Q7nu~$jc=&~&qrBDrZ_{2`74PrBx?oEU&{Bj^7L1+yC7up<1?J6-O>Pk z#f~*)xX1t!g5GQkSdr0ax83U~`#$HXQcbhIUb<}a89Cn>Pys-CQ}Hi3aEGW@TzpSa z^dmcwLng)SiveRp>rLsT0rF?Sw$^HQFZvByr4k{7_`a#56G%;o+s?lBGjnrSX4~b4 zW<%oUl9h^KpVVXA?UX~SI2zaG4;`oRo<7~(cgMQx@qT?-iUPNPXZ4q%B6Ov{k1EH( zCRfMtYLd6~Rd@o**8Lq?09Kk}5umVdAIhZx5ppJTRC_F-DEG_X!PRalr5(WHXk{yo z-(W!u#t_ce%&zaB&m}qMmwj)Z>JjfAMmMQae5&K@y+*&kEUJ)bte-ZwLsez6JXq@y zGp_ne=^z#Av$#9=00xwiUFqlgK60H%v*qh0pBwjn63_!#JKFNzc&08Is~Hequ*7vc z(azmmCwD8wP03N8n;E!!Af;4MTi&$aL2e^xg_wGv#dB1mhcuMWWc|*eoM>i5{ao@f z4;+>R0rb@iX^S4N-~hi~WESJDI5S(uESewDna5HqfADYlH>C&!;9U7yWYk6rGAf2VVnt)-=WFRA4>G$3 z79~NIJVs+3x7eQRz)8EHKOGUuSP67QMS%jO0w=3QQc9rex3B;Ml0ZC|IZg_PQ6g+U zfIk1opV2a5zg7i_t#0|Dg02t$ZenfcMVc{>+WoD9)cF^=>SyldrZ?K)VQNLz+w+PI z1t#2V>Xvlhx;2F<&^`9ZDny^|C-FAwO94ps@6vhKKt;5*6L~%CkLBEW|IvlU^AQlF zK6{4#x@c$}1==*jfL7s}5^)pt|W4!B!I;gxHfG&VPuo0Hw`|VCppwDgLd2qSl zJ#t3osu}_h$b}RE>?-7#ym;mHg(|^cU+8tWA1h>~etAxAfWsg(go)#h5KIVrOfP4y zZh0h;vs#T@j3{A>!RVSbaYe8U?+n0t~FrJ6dxu&tcT%HJE4p6{zDPLzwdVUtS4`uDo znz$;8`Hxo0wEL_lx(T+ zulL|v)xUwDX*OLxrFMUTW|EWvF0ysnwIDvVtfY|DCo?&|B<7A&muD(MxrU#N9%pas zbWS0l=v#gVu}McDtk!M41lhhSO}nVSuObf$ygOnXM~9X)(j)+29)M_Bis21puknWg z>2fFPKxl*!o8eSyzwM(UD5co?LeXvdm?_yDi@H*qUvp_VCiqRIN}8K0n%~IpRv?D- zDuA)3*;>TcnbGxmiv~dS{;iWsxDzX}nogoWObeC z%n4?x%L5Pvk3Cso+p#&j6`|#O@ehrcn#GtbVhiyHx}J2FyMPiO{JgbfN;M_f93dJa zQ?1Bwz7Aa7FToQK;dYZ3c1?bv=y{cXxti~=Gic~GRv1yu$R;!q1Ese1(<3_U#??~p zB6g1$P~J(c{lCzcm4EoA%MTpe^4paxkTmc-mR)8xW1}CzkbwG|R6QteOs{5Ln%u&+ zbSew_gW=BBp>1X^(^e5lm{v0SF#!8kw(pyjMRP?677VWjk#u@O70LUy zo9tza8gc6uVpuv*5H3L7Pu_-g|2Ohlj)vm6p@dcYrjvHI4GylRegoe8$j533J>A7` z>8j6H7-pN_UrikbjvXSqG17Ob_-@9y=M-dQjqC3K=$I9<6z5oF98qx+X&HxzEX!x< z)MkL(YBoQKSxJj3u(l~v;`TCwM$X3c|L8wxv84(o-b_6w{Fo4WY8#H zJ68iq!g}yr5pxB(=RKI!8*!&BRj2RP>#Q1Uu|2e0OigHB+#~97g|wv@F=TPI+QZUP z6Xmoeerb-OjAjVMkxp6j3C- z{f(*%OW<~ABXeYmt+2XHCpoX6U0c8ygqEweg&*8}i$7v7T)yR(&a)?l^eq7jo*gBL z=?!^j;AIi^zfD=goaev-qb>_qJYBkWaggt~RnFD08&ycgfC9 ze#E?3ZLOgE4)iFln>7T-u`~@Y*NhL27vfh;QJW2MF-cDjX^ocEpl2-YkOS!+2emi0 za@TE2?S-^(K)E^(4>b%Koh0O+NTjPY*3C(*gl+rMO(PA^3Q8UyQZkS2#u>E73Gknd z!ac)n1NLloIuU5eq}To=p%mhm%rkFw7d;uC!V%AH+SmuvJ9!CFZudo^&Aop+7p+#f zhqBA@l6_#uRM@o1! zQcVeN&2>-IHM7FtI_l*uTMz(n@FV<}L_-*vFWtCU-?)+*6cBv5?U2QPkv0H@h*`^r z5XV)CGr%#l)qyZ^lf8sQd8a5^&_#=u0iT8~y5e+I`=jr*0qO{NnN@^G3K-@(N2FA%wmK2>YCuo6n5r&JxE@7f2|vMgj3koy{NeB| zv0zZ+M%GEkB#K_xCO!v^&=gi$1L0>?QW%LO^h8*3FC(^GiaBCi@Ph(*Hv9PpK$KK5 z*2zi-?f0E|?vrAwhWa|Bl^76BQ}5bCvF^py*~O{(=k0z^othd!y4q?#{zqP|$Q?ox zG<-a92f16LVVN@v{9|*xfIN&`K-QY29Ye5cxNB*obQ;y4)4i}=Xw2jAr^Me&Xr#t@Ty?2x8cLMa`Y=~Nc3#fkZ z8(WIiH3PM|Gbncla*xp+XCwS(y7$A|O>Q1KL_0A~0DJMgDA9zU2a$W;aU2rJri+Tn zAbyYyJ&5MGeo~Kqg{;;2OMsNq5(Fo1DjU6Mdk!vOG-uk8bE)n@1Sgc?v!`$|6Oi?i z*fWfu6tALL>RJ2`^7ZPFRnm{TbM0wMZP-X=q^kLpFOy>bhua$9@qZkISbZHVEGm6e zn)r*}AAi>6^#T)e4gPtM%mHg!1NA#^W=V=K%pV0tx+X!4TS6&^<=yTR9fad4Nn@xE zZD^bKdmuSN*y74wX3DXHkW=}Ey~3)A?z zo1aT1VaTDpc**jpzt-EO(VHlD&GJV8;((qKd`$|BeB|O=?a-xI>&Ovc_TS4m%G-w5 ze0u9EtFg{c10yE|^+@13(UTs@0Ewn!^o)uUaN;numQwFmOxGM(@_i>no7kAl>B+`f zcWz~eaUDeqd$_L%j-&%nw@lOT19>af0x?5Ys7~uT?xFoC*=3T z6i9SW9hDrHUAAFfLR+Q6gI8DQxrUt|;>CO44B1?#tjQ<6p}TGlsBBQfs2r88!xrcK z$?4&eT~(O727~#mmisk`x0VQg>9vWP)kpl{Lv*ofd?I( z-v#oKDnZa14cf<;_Oiv@=r&(JHG*dBrJ_B>RWhJyz*M`Mq|b{PyB*q5Q-)?2>7uWZ zE&%H_oNe&)yKv_F{*L**W5%HDZu+t(RrU!vt0LGFNZ+>enn^-flg-KG#mhh5NMGDS z_R5?r0Uae*yI!brv9)_K?_H$!20A%-M@gmc@Yu7K&ezS@>BdbEyXNrdMdSxNs+Gi4&;1*h>QDO1oKMpUa*}6)R{`Y1iJ&_p zK0ThS#@V;dw2r=2axCJPl;V|Rxu8q0TeGKZK`>wVE+&6w21@#o((71ynC=r%a4E*x zB+i+9+oLJ`yqS+U#pQZ!3m-_URh<9}U#qv4TJ@RV3oHgYGA3{h`(U_D#?b3nnw-Mk zM4ajpIizGB3mBVg2myb6k)GU0JUmin)n`nBh}P`QTGTocL9zt6f?Pj!vD@O>t+iUc zIT8x)kwz_E@Ad+ddpf*{vOgZlojjU9;5J3pko~ zRyJJ`^5?WFx;ekm%#^|4JeKz^60i!c5^Zp@RuTal4 z>>sa_dp|OlV_8wuIB+tHuM75+iro;CsJj;vp2>#NV+ygsO_CJ#l_Vdhd zi@>Tj!vNXM=Qc~=hpoQKS9t&Uzw91Lv?;gF&FCg zFwU0gS=@v~^_hRQKo3#7T!l?Yf8s~sC@jxz5Aokofxon#^86JIM2c+$07*n~qDk+t zJ_;}(*NDbw%f?QrWnAFBz^_DAP)Ao+(Dh|}?}>$HJH-@W5iPQUj!cwH@~)Dvh@40% z(^(hw$H{6TRpJ?^R!gv{;E#yz-A_jMbWVn;T~EGfG2Yj)=mPU((0+-vslR%jP9xs; z3xGpmmV_K4U_t;^*V(KU-c|<}ch1#G+Pw_N*#!d{PjT}K!@R3sAS-KCW0G-F(bmgw z8U@$<)Y{eoUl$OLL_h^%ng|GqBq=iyz zej$F|!AwFndrxF4yjVO3A+?|`?T$8-d~Wa{QmFMNGYL%@xx`{9Wq$vDdtH(w5fk=b zLS}R3?Uxl@b4`4~bK{mdWw{TM8oh;+uGV8~86%04$TZgkJIBAi%~0HqA$n4svvR?p zI9O0oxLn1%=%%xa9K5T31SG4h))gWzh=r&tLu1u7Pno=J<7S?G`CY|eR9S6)KQWn( z{M(xkdT2&NLp6roj6>Y!CAsNp6<6{g0j^Q za{W!&5Hj7FC2MKq^{DsjbeqD`(wXB$;Ni0UjpQ~7^t#%5cD#O`x5QkYa{|ThFQni7 z4ADbeEjejY1aqcu2nvzxIT^*OIqUaJ1Am68?&ehCoAz|R{_ejNCh*X_p(?eq=YNpS zUv&qy$>*xlGXbXSa!4*eL|Afmm6)Yqc!#7SC;>T)q(Hv7M{vUqfLOAyZQiBEw>kF2 z-zg>3bota@u2eiVNum_0Epu4|=sgAEpO9^8mu$E;#@GDvp|y}Lw>>O{Rq~fcIM0cR z9rNTXr=C(o*)Li>WRW%<)+DZXc=;Cer?!(TP_lMuNAfFF^od`i*OJl5DINdxhG3K^%qC$h8H=~(8*Z}b zA8Ch48PpsAFZ@CYN^h=VY?>uQipUsBf2BGT+zPVpCHk$+w(|>eYzbM41)~M)w4vs@ zYiF42?FF^CmX!HKR>{J3!U+Lj(q2cH8+G|?VF1UX1p3dVNZ^_-!jR(xj{b4|2Oz({ zo27p90Tpcte$B`t`P*2LSb6|{@+01?y$Y|#I15;9q?+Q`>A;YXe%Otb22S7w*daSwQa1uJTVVSA6^oGEQo=t+QS+8R4{V55*iP}hppwB5KChT!a z+qK!W=yWDZlUr)GbiO-)f`fFAqWxZ>U1zJC zesg{9?D0tKWbQYq3%c=Hjh-F6?=zNu#aw}M2GM5F$l8GGDkW+5 z-bU(VKDIlHKL6a4)0&y4EykXXpow`#Ridj{8V?-`8jFUK(;7NUhV%wF$3jhWh(|4C zfhU>5C48cGTi+7-YvouOTow`%6XP;WZzfOfH}kj)-g(pEu}7*j2apTjKKo(xTF6?J z&rlH^QE0&C_9r=^cIt$#=*@AG_EwZ-XHEDNZODz@OaW;Qo9M)RQh45+-Aa?{!jYY| zW|;stK*+yC+Ovg45-_E4F~x~D9)LzZ>kzz36$|DOi8*$yPcU=2OGo5bk%QCaTE?%7 zWqrr=l0Ydi#;j@#dlb4WRAh=yIEw=}Y#yOg2R<(Rj5C#32!xvyOqX>O>HA7E1Nop{ zbAGT2hDhnIu-(^6Sw5$;!rmD`IJvvO&YR?UTz>HYgxi@jfwr(t98#Kc_X%kaO7@w) z5pu406{r?)fj~A8o#~1}JNRfqmOIe-{cg*ozUMNm{92EGsv7bl&M({ulf?mTXSsJsTw2F*05?F$zxs8scWgq_wm6=RVBq6iBDcNO+r?WO8l(}; zh@48BwDe5DUin3nU8HMKuAaSebZU_jqXHJGXo|^qzLq1^5L9bBAe&ZI=Ail69(aw23#|0 z7-+Ij*#%UfSzY5-PnmFbkv%z4!;I2pr#Q3Y!Wfx3?_nxoq4!+%=7Nj32}i+H-@j^- zD8VNy$*@qWZQnyQC{4zdLFSqD2nzpF-8DRZsRs-D+enxf?Vy*X;6Hj6!|})9_8-! z4zT44^2Ks?EQq6<8sJ=VT}6=b1OAs~kgoMBgS0wviihq=DDjNJp^Xe!x(mz11tblT zPcAZ^d|5dod*{(UH}m-s3VnG?T+ORm?p`l@4p;@_fe^~KGl#k;-5Vh0%PVu1qEb$y zj%4^zD9AE^QD$Qri?M5I;$@4Bm)(m+J-^I<%OLB-3G~}~3cj@ImO!K$Wp z%NuABT~bfEG^+|L^IjwAgUvpjV$8c@Dxmpv%+sC)rHZ#j|0(FWFybQ&WO>i~{#4iR zCyE_!?)1=qq(ic=5Ss&n3UxyNZ9TPqP)W%B3Ta>+A7WmI^BpcRf7? zxbI-^GzwiPzWxPY#0JMv2jja=TBHuhfP=ut%@akZY<#e^(uv>R$YMIpyniveC_G`| zh*w>Uz2*Dnp=e!HWy-PMk}w98MuWCKT%x1Qgr)(jY~hutqcxVgo^}MzeKsX`ivn3L z0jie{{%8M2FzY{@S;i_d^-YNr4<{>+y5TR-SnUqu%Rkub%gJ)#BhG+We)kmrjhw_h zXzbov;Cn*SIkB@fStjj|o)L&WbQNb)rXfKHvtuZ>Xl$yFM{R_pPrflo(yUX+d3ePy zn0x|Cf3-QgU=d#qv8lR`Ga6Wjm=_q0R>)5=GL87+g_S$s=yiEp5*pb3|E1%Po9ST{ zy(0$r=R9$*WAa_cYE6F$q#RDzLTGOqCCMXnv0kJVN|VK%JvdlY44GeJ@7Oy@ zrTQZ#-|&eSXhqe)=@Iv`JvyA&eh0D7vfU^$~*CP+-qdaSz_ zIWVGceT#J*A?Y|0ZpdramIZoP0!gqcAe=mT;{(&}jj-M4pfMwgxIPSNM90^m1>AzU z$+RhNX=%2RZ~%-wdG@}X=NqcIPi_Z%?_gM|`+LqL;ULAH+RF?GnDw_SpB{q3UEDe! zoz|M@cv-<&S=Z!Y!38evx9bBKmPp}AV;wzag)Vz*qi6S|Z@Kis2!l{l^E_geV%cst zZopVQE)%W*lh9(BEE;>E9-Ciywj(kq5FS}rTN6anc72w7!%QsP?;}JuAc5*w9O|-M zaWO8aAd|~*5*PZ?SLk8X^~##xc?I22a5H;!gI`12B*<*!&$yNURD$ue5{4#e^c>rO3Nqg5IQyR@!7#E(9Q zGPclv{Ro9npdxEhZ7YZu*p%}6^{h{`?H&`7qw`uXm^}N;8!O0T41 z;2;mMO+n!VDzzs$_-q@8(LyQDhU;g~|%(zjM2i4sU1U9i(oOf&BoHrFhs1rVp zv*Lbj1qJ;rtho*s~y*A_l*&))jHoJ9SB?0yhXTLCcicM5}5|Gw!Ev1!Pi;B6I{Uxya@!IlLe zorebhm=N420gp`D}nE7((^@641NM$AbtWTXxv)hnSd zLM>5^Hqi7xgntXT1fQ)E1pHwX3jm0%O7w&J!-tBE+DlJvJ)@7bRC*U{oU(VXVsfLb z*54{9t0>MX|rf0}hJ8s+!dn zu=(%d%WYx*(+7jQfmw~pSBl@I8a##7F?HjwjJHPj^vL;vTPixf4Vy_Ibn0tA^2ptX zso=X#fE8Z#g0A_)Db(-g}rPMq|nTY^BC0)LZ8>pmColv ziSnnmg1tZ$TBkr3r&hA?25ssAQ&gnr$u3Nv>0upyUgJYX=9x`=AAcT8BDW&t!bD2djihW@gB z#K?7(Evi%pO#_1!rOx$60K#BCwik=aDoL|IfmhR&BfOuIb~;pEQwh%LsIvHF)OyCQ zN^GA>w&(%lMV#$^O4OS`u%mV))Zb4bd}~2)C6l_7bQ(N#XE4rhPKoCijdLNEGDzfR ziwWzj7hfvGMR5-bZxBK2csqCr#C{ctfD6uZ! zLR3|KW*fd#Hpoo*#%85Dxg45!F>8 zdmO4RYs~L*pr>00R8@OCC3$z@@{YHFW`K*+$o1+#nK#gCh@r|N(l0|vdh<-|YJoTw zZ`|lS5Ky8Npd$m{{clLJ<9dnDuHxeM_}kd=R~wJ7#~of7@IU@|cpDz4r$wF_O=%u) zglji^BI%f^hnMxKl+pVgxG}}}Ke_{1pZ_qU4ThpU`ti4arbJArJ0f5rep`TMNRVpc zRy+!C5|ffMXDRwN!G*cFVk(|w^jP{4 zo!?#`5FX#yRoeCr!7$>_z&HE68wJ$$0=>OTr@vO3xKJw9>{ew(?E^-00o<)W^_O*d_#lq4@=Vg zf2h-iIn@-KNx*C*SN%uW^3j~Te3q&W@=Ww&wsb4fC*Dain=>=h#;3>{&d)&cY3dSF zW?}kOuryfvvWI=mmcsg)ct(B;_~`i)bHX|f$pJ3}-4xN&28=vM4BOoUa4>5Wh3-Wd z5f1~S{y4+FQ`}Ix->+g1AVe5IN}Cx*?G}D?L-LpB8M^~uq*C8TdNH6*!rHJagiiTO zjDWzm7Vj!ZT=;9Hun>xogeej_xfPcO>22Y@E+#Z+!+h~D|e?1CIyn-Oo0jGKW6&1=_(UtX3PWS z^b;jHZxK834l~pRE=Os7*QK_90G-c|y;2!I&` zvaqyNPg9TZ#6>d#A;i~8f8Td~olsCQ(WhyEmmht*S0b5Vfdmu?uO?IV06Mxxx$GX) zH!a;sfB@1)$|^aHl0&}vV!x?2^GIzg@-ITa2pZP)eL0po*vmGV?h^=nhe7n~GTH*I zZ6?XngZ}-*ze2fz<6MSLq{9#qQ*&L829SFBTHhK$pshYFBP*D6K+U*-B|Hk|`bAP) zW$f2%{6ZU<4#$L7bNpr|V>wFPOT?mffkD2Q@4R5kwB?Qy){{%Gzt5FWtV}2`Yv$d z4|j^>J0sNb{4cvY1=Up*7WZUZjL3@@f88`))A1d{RR>4nJJs|=8Iqrb<9wP?hA4RQ&1c!a<8Qcb@6s(B20 zeo>OqLV~pO{XKZ0$VjEScx^1c{6$5W)qM`TZG{Ss*q`fQ*MD0tHN_6JI|JQusMHN) z>%cE{Zdk%`4;^5>I#~$$+D#RVI2Say=!ZUVasa)j_XIUMcp^ONPEuc=gSa7HM3^BF z5t~zKv*aTe2*a(NQL27WfIdf3zUn{2%FOYfK-_wWx89dwrFoPQ%BEt6 zz@Eo|GEL4yQ`Ahj-o;5)e&#yCn*|Yr;oeDY8QF2r`9V@+;U(jdI{7CQ$OXPA2ZM9o z6}0mO6>vOqzXT9z?3+9Em95C!Q{>J!w}CBtkP$UmGG7L<$)7+HJnVVyj?K{?P;jd% z7RImHGijZtmu+|~(uX?;C&#+}(sQM%BKl)>b+@2AZ%UQFTEh7FK>NRpJ!rx_v2YG} z+xn=lQz70c{bm2jLM&%gNUjCY$bF6bAv=l2hdzqbia-GFv)h|_Yi&Cr5r=)+5) z+x@1!99ja%_#7fTBb-wSr)acPvLqwF3e}!d4 zdcS>%!lVa6+spz`POezzv%hJO5bVmOIuKCuzu~vOnxa~%+ytGG{R?RYcKEWG`z3{Z zvq`KmLKyB~|Bs%?Jm9mHk%bc0gLrul>MV>3pKN}*SnsdK627-E?v1v}ek_w%1D} zilD#C$>uZ9mnNz?N@Dc!E8D>H`^hIkfp8gW()`|ybj)LuDsh|7buW$wbX4NZ-bLI~ zk0#+HCBJQB*RkI&g#Z%py+RRe_X4^_=8mu>!0yESC6z1fPsczv($tqyF=)587Q#@LsG-fq<s#wZ%)>65e3noAG+`lkcfN`U1E_7G*zKEz_l)| zl)EIyxFm*&@5&$cWF~Wt;raQg!3P`fEkz9ZyON-<|4FlxB6kAyvtS0T;`r!hq7`D5 zC%M59uh84=rW1y!NA7r!-=VA~Mq z%czp?9dLmuVOYd$Dr0b8(h<`oZl;`!O1u!AqRp?OfOX8};X1`Rd<0%2x9+v*!Bkv< z!l7uc!G;y4ofZwuoyf0Z-U5|B4xQCGsyjLvIT_x!Os?^|5p(M$^%8lzD9@D@Dr+U@ zl7aof)mk=$LXvLf)B$3sFcH*(;6_OXS80N41n)oWFr(LT`SESoH3o27yu|6OE>O0Q zOB+yCyn+uW)QH(sz4-|W9EHl^gd{mU`LcqdY+?EY1BZV<&OV&XV}t&BtB6YT=R8c1 z>*tc2ihcsZ4jPj+CNZNAgTk8DzyOl&i+W#mTflyi7W{z~h=A)r615BWQ#K5$Bn1B@ z%5KwvaoR29eaMbiX+aGvrJv4>e_a`8M(@H3;tAN?NN|TZ_nOrN&~tS#3{eZ!Mcz#H zq_FWSC7t$Ah5<9Qn)}_@*B`UgdSx*QED$)MDzsY4xANF-gdzrn8Dw2rmc~+aN&rDB z7(Rblh%cpslC-7M8vfrjo%@ZR5|OXlFosFl$zP;+3oDch@fPx9b$1gz$jVO0aFN)? zJ__vonG#iJNooN$YHyY`LY!#KC7Po8_%aRKPzqANNqZCYXxR!gv6KzjN>tA?pEAZge46AE&r#s5YgM;HuENoO zSkMHDnYO%C^zE6x7i5i;$hcj;RCY(CJ4L-fckY|BD`93_ z+Zq!%wcje9JC4H~u-iatmz&+t7*N3vb8Z;_)7MOdPkIEUU9#Xgrwl#@18$=d@{j0lQDtR&k8 z;jf`HP7K}kM_&}bfIJEga-%xAzOCttqSm(c&l@ZMuak()v|ac47Vk6gqskRBWyS?x zj_Z>+DGls;PG=3!2YflfWd;GOjNgML$Peuji=nM|=E@erhsH#0xaWR<0vKJw5JhA` z^78i;vIU`Zw+syyj3s&_O^htvm-SP{m&;c6dTkkzu&b7+kr}z{tI8@hzZ!}Tzx*&dM5G;l{e&BDr9>b znANFPZ_0lNxoHG^`Tl{KOhPoz@By46=9@!#rqn%=)G`@;31Y2l8dT2*@N>{G{4-I3 z#qM|=uIhmdDP{ex9(9haD)C4iT8YHHdE;Y5bY>8zgrFW(Y9)u8I8J^y4%+s*^klI6 zr<2JuTwCr7CBTi!k>Mzk7IQZeC2yCXr%fI|I%+SOo5$cKgAf?yDRd@S%B;AvW5Xsn zn1vp`!7;rt#OfZ?R6$FW6?azit$i!eBs2axDn=TY(8c(XhHNPM);c;ZHUU9y33YYg3(Ry5)dcPLV-QIxfGd#8wTb#@ z{VTg=LW2LvIy@aP9x{6AFv6CRv{e&DDov*-Yp0o4)w0?GX=q-Xo6ildNv@Wu1dcaP z6ZJ9HIm091Ifd~V4)0^Ol-dUxY13A-RYU*~X9k-RJOb}f3Y;Q zD)NLZaeWVBI4g8SX)wALszBWV?7YGe7tclkswtLSA`}ng*gSOlq4RsNe>j~(fLy(T zC#ka2Ey-c6#p^}Q-cQJ)WFJnQ*1U$g6RVwVj8>k5GsOgZQ@LNOqEJw z)hTpo`Cq@Q+ zEkinnvSg68ywL*H;plX@uuHP*#$DMrA(G82IYCPvEkoPi#e2u2Je^58)tfS?qbaw{ z8?CcSUIACe1B<3#jyMz$7xSGFDlgp$5ljkI2?05%D5C;ZDT~5F9lI{h>(6ck3;#`G zqP$Z^!UaSy{$kpI==F-LuTl$FBy8+eo$K6l0>QCXvF zjHY)8=8f1Q~6!0zBKg9_(EkVdC7VsZO%K8GZ|v4!XSZcctV36&%sgbL`CeMC z?M|*IwEIAHIN`PBEZ!8qpXy`~kRhbbz)S1ss*I_;1nT)lt;YvpgaH0Df9}?v--)0;xZNU)Y%W6h2+G>nWLkTvX_(Mop@pV zj$74cnmA!HXd~3Va1{@Q8E7ctZ}nTQNoAlu?!*fS)R^gAxO{=Y zKV{0m>>aCo_+mubmezJV)Mi}hb#4!19aWunbyCBcFABJ$-vM`C zNSUXO**mnUJNy+oG!H4l_WP?y4l2EU*^AK)V!X_VsIULtT+4~vZ2=#@%r|^IPWK!q zxL^wYKv%a}6QyL58uPZ?ct>TF>Qy+^@y(3axoBaoHq>8zQ<+g>5Z|*sc3=RMW zYpVffKjr+phB#`j;%$fcu7!>IXPry5lG~)GljH;|uh8M4RJ{E(Hf4u{aYE1gwX;qh z4vwq0R=wjBZP!Fr$MfFUp5lj$lj&2fZi8U5xzz5h*OxsB!#piC{WB?v2+bEB@mMwL z;2?<9vwWK9IAtbk4jeQX5^C(oJH9IWUUu2RZg*9#K5Al`R^2tJ&kT=neTK4+iuipn zg=bH2v%)ddC{vh?f#~~v@USL$u zHj!rvm|Ta5961P^!3zB46Oqt^AMa&kLW*k zImllf+~l{_!|f~m-l;89xSAj*$EPzh4qVtSjMHcT6tW~KjhT5BTbF$YbB6AxkG%JU zKh2y3p}=i~Zm+P4!x>*;r2(mo(?UI2di70u;_2;00PF#`M=3O3*Cu{_p&!h~kPLiwty0Ec~?3j)1v#zwmB*|&TTAenR0t$nc;}u`49TMIgM4AveUv4G|s-8tHXxE`M<7!jxE$Q#cl6;WJ3{(YmS8a%k2`=t^yjd(^P|$XP51XRR|2vT{S~ zlE5_-ET~+%NjaLOzow6>V0#tVGt(iA`8horQD1#`r{c$z4zpcFA~iSacV%kj8+h)U zg?U{?u_hpVKj(Qm5OFZm1!!xmm=v-Q`74XnDWF+?{%REC*3 zYcV~7fZX)aQ=ldK@p-QnN*i^S)ZN6Q;~%OD*_sl6{^1hY!I;HwAQQM1_#y3Jurlig zOCN)2&es)SOiWIS-KPp4)q9QYsR+m5?%+$#VMb#TqF&o5a=mQbkuV)k;y8miEzLV* z=uTb9w?|rd3742s4y7}@H3*KpO7!hiT2pZn_UeSN8Urw~!>efMBFn*YiL+cVVPNtF ztmqS8MX~{RANCZv$SLONd$1-f13~ZplD)atJXJc|f^d$64$9s458Q8s^29YDLbvMf} zPws^Us&edJ@xr9``_R;uq1d85h49)bt;uyc;OyUmZ6cb(@C6C62Z*guZQVgA6v-q0 zVNl&jv>h6=^T$y~Z#4p#Cq@gr;3Z6;?7wamLG9rFbM0pfF87GRQp6HooOtli%^C!2 zyv35ju%&SG*8vmJS0S8>xO(8rBizmOucwe?5g5w9X?N5lHdZ!LjJ|df{|q1oojMkG z)Bd@&ZN;eC02QuW`vUUQ^BG75p1x6yo+`3z`sr6!mjP5gUY&ryMq8L^HJ7cG0vZh~`!SB{=|YdKfAf zBHUPiJP|FMja(gLf?3(?Bs|}Mm+udKTn>v{n`({ns%>@PmFPohbX#C6*jlm8;cS!S zi;F-CeEJ%da0SLj0PRuy^ut4|-k$Zmcmu8cNZB;wKx(IJ{CsbPbi)x90$?+`@!l# zJ*oLO;sLz4f{zEWRV&Q6WoJ-*!4lUFW5K_Z+xjGfTtuh~v4O0fS=9x# zq=fwxr5U`&Qm?=1CggcSkRyoT=kVyr!-vy*8@x41yz5+TGlje|Y&ZT(&i_SP>S+xh zgl3~A{?9d|3t;q2TJ!G5cz@VAEhFkTz|S_vc6Sg8<(CTeXP)tK*EvEXW*WfWXCHj`V+s>=gvTMjx4X5!crNl~e+ zS3BzozT}A0(a58PNY{7=c+i)DgyFEps0Ra6``4C;%0IO41yq?t`(N0-HW3Po-?$~1 zY@UWQ=j%CGsj76b_!g@X(4Fxy?Pj0$&^iwNt8{)>hQehfA3-KVIUP-=(R(^~=^g>H z4IgU@AZwD84CbZw3HP0dxq@^>$?snv*Zliz9cw$5p{H1veDvF_O4dK8JpTP)#KX~I zvx6N=MCziqKDh>v6OK6tLTe-RwCD;oTMw{#)#2gosK7Vs4Z(jS|7-wyqp+_MUKxnm zdF-=d>+bK6+=;=gN}Km3;p!vDs_=RJ3ekd4UfuiV9KH(Ul_0`NosI<-iqz2A+;C9w zI~|Fa;EC&Hrk>3|CN;G7(Mjw@q*+V~M}gN*k_g)QniE=_ezDyvFlSo_9sY_NuG#;8 zv3!VrmEH8~3UH+==o*Fp8LLvSr2}GE9SkFx9_SAh&i6Nq&F&i0Osah?Oyo0;F{;U4 zOIOi+M?xRzL`cHaUdN<7=6R`FX;@r2nW4?a08ORsLZ!kJD^@#T8e;TD?*Bhtzf4$4 zCgk}@x#lF%MN1<*Ud-p$d7_k=VcgkVtIugB*Iv?dKLhkUCeXg0kq1~$P|aR!#S}Pi z3M!8%!J|}lDI0vhm|Txj&-IRSQg(!_kTnGf;(&Lwc7upWj#O<|CVLc>dB;_B&knK> z6jBRK-~~L0G*KLxiR9V$p`g)rMX~K;k|$+MihH-DZykpWJ(rMmE7IC}m;)qSW4I>l z74>ol-SlyrA$`JbF3lPWZs`&0h+#0behWYTq)|nu97K~`aOtz{;JxD0D~M@LtEs^x z=V?;}P~@?Qbn6&M5!#?=bYi$Xg;p3z?w+hMSW5ssMbK8%idNz0?XRBM`bxEl;I zt`e+9ZEOMclISy?=`84G1Sqx9lyAs+kQPE!Sk6|hC(7wsJR|^v%S~TrXDcv(^22Zk zDv)zYkVX#8yU=Jp3`-s1`2JAeAT$W7uvFD3If{p(0y}}J`I-OgZjxlXTJ2*H&{!7Z zRnxlH+%JZDA;V63`I!oCdXY&p%TGG;ER<+dTRZNRbP1k7R)NkCu~gL>C9R z@SN#R8lg<;lGY}mieg7RS-%<#MF%qqhf$y_?b79s4Mu2L!p2m;|K~(_(-pHaORX(?sr(9Fn^@a8khP_fco?v5h%lr z5~vs|$#<>Em^UkAslE#*vYVh5 zu$a^zIz6n@J4-#M)qz#FE+z%wum0C!F}35nG5thJ8Wq%gQ&lXKoR*JHRafDL=31=p&HByY(^%RT9HFe++bt$1+N;8P z-n$-EONL-hFb43;c#~yV$_|;zh)Ukze++O+z&+vdo}LHOwi;rFAeJW6xZeY@ZwP#mN+>}roDRs+De-YBGTW@~7s*a*ywuZ+@Ajo~ z>W979R~irqKv?y|J20J2=WSzGeU9aqk6G7p7SLs*&{S^agZTHGJvWJP>LI8G<%0bh zVH4dE0!mIgys%X4M93?(m1B_PSU%CzP#x9h$Jx=I{ORF!o=!L&a2Ovy6sIw1G z1^KsjCH%M7y8pvpkv&U#bcT*|OA91(OJW5nbO@Nmnr#BEF^wo^FEzA%=ugifxiJdqw!S#ixR32$uW zkwpTw*$N~v7I{>xv^I6Q*T8tM=GT0GisLm^1o4wJ5ksnDv@q(C1e{VC0s?0JJ>9LS zC?ldO4bk4@>0c>>Rz@~&zshFbW)-3wuO%!<(KJ5nxL8MwF-6QK^8+C{B5NT~C<9hZ zoD}ItB&)>#8xv~pa1@xDD2JMq!G1Uol21OH(62%>&!iO$ZdWWJ;i1 zgvY+yaW7Qci{~!XtAcH;Urqq}0r7zK5+@437`8y8TEzNeukrT*G&(sZ`aizmsO_z6 zudtVR35v*z|6FEW%@052BOMD74IR^+h{}LTQa1Jj&I6%D&e$FerZe9FtzecEaJp} z?%)R6eJby$6(wFEdgY2pJ0lZL*jTKospEM%dE=BN*kdgS#+}0XneL;3R){8{Ev_a6 zueP_hIhsoaIEKG97#q88iZ)Yh!)FedGb8V{rnRq6h1-@k{;^5G8&E?i{I2w->a+~& z2s2zI^4OaWmBSR_B~2)TYH#na*Za!D`(V-C7Pm=sP)YJPSL&Q zE0kPW`H9o{v9U>nnJe)kw!WvXWLDZACmA&o^T9L6vPaT@gc00U zgI#OWd(EA+!jK8`6;UA0l=o!;!s2ydsaCv*jzGM(USHn`vL8%wvwRse^Q zK-R=BK`Sv|9;dTEN&0PF#f!_{Ea-hwLyu;gO}fsZ$>{#cP%5a0M^5<0%mu{+Ta8QO z1E=bfGfv9s?TFUzEvM^#NaA4GtS`> zC=tUX>eJ@roR(^dsh2tp9){L|&wmlv_v3MF#(5A=-0ZFV15)LT3`n&%(>dQ4a80us>RfVNgRvYdE1|Au3 zba|Wy#7-Kv-dntK=v2hnKj1#F;10mx(OYk<^eu?Q4%TRP4mk5h2LF%e1GZpAHJdv; z*U0XXE`hKcMe&FN8_2Cisg}t~nlXqPu$;_hY-{rKRkdDr3jR2?5;0>$gENWjDf?p7 zXT=Owo8cDu;eNC6$YjRsWIP2nmK4Y)BhXbC2qf+YKp|xH=1ri83BlD=&Gg(a$^Q2r z9fJCf9AV$Yp|J0)%?+T)Gu^F7dtguGBZx6>AGy8SX(=T)R3N5S+|{uVx=eY zU&lZ>-`KB{dF&|=kO@w6kIsVs&->qj9kDf*hU(CwulG;fikfv&54sFsblH?4wVjNq z87Ye-2k*^GSf0>|dca_+9?I~=bFw34l!Xmb#=H}o`goZI8)cVF+h8xlY*eWb7a)Dq z`J`J3X*1mwM6Gx+r@*kKPhjby}?#cd4IhfEujQW?{ zG;!2fQ(MJ@umef$4IM9q)3-p>&s8BM>mtNW`^%1nZW#wkB*?2*!7nVL->QI#J9Bg6 z70s3XihPZW-B~ij^lw{9R~El(E*O9mb^tRuSiuHXsf4h&)kgZdVpu^ULzy#GCAU#d zZ>9t)xT)j-FD?0&>rJc=0@nbJm}X z=1iLc>XT1MlPdJx6_!%#bB1oF|8_>omVw&vuS^4!2eeAug;ffjjx@G&FI(xkIvb%D zT(B1bhNM64Knjd0D2(+bgbbh#deh6!dj+(-i9gNqg#~qX+V(X^U}=L7HX1`#&t`*n zN=Py$3>!r-S%R|F9V$FhU+1FpLR{1(4TAl+=hq7_uuWIF7LF!UXVF72Y6$){(_`5u zT-g(iJh7!5&c)m;wOw6M)(muzSBJ6*tR-eCiX>->DU!pCKleFid8v|T3$c1xy*%XHx;6}o{4*oa1ujC;~lc}LnYelOx0$EbZ-3xxGY!Z}+P z*DX$$E%H5oPD%~+m>v)$hq&w}HEW(yMOC>ye9#-x9ceG&k6e1Russiyf?wEsWB&=D zWxL}>;ZtU1EnPQ=gX@!}zX7wL3xet1)f9n&0wCo_fsj5x8)l z3X3QNY&H@a@o@Em`R5upk58KT?G5V!AHDrII5d-&`G=yqZ89dUJ40*Sxshi29ps=k zJtAq@TPIs^T2z{n_e73ryVc$xr%OY$=HU$ERKir;mR0l?nAnjYJUOHoSo9ML#)^GK zW0U|sd3sFZ4ok?iDqiJmS&g^tOsoIWZiC2zkteZKYWy<~q0W_V7U|A{d&5|CWlv8D z(l~URU;(xVC3@|zr3gm#s15yEWDRL`;zFVwKa1K}$wG0N;M*X8XfS?|uP$g{Ky5ng zKr(zr;nWGhstPXvd$L=Dv!qRJ@y~G~V~0x&Vp<$MAH>%->&PY9I~C1=2VubOjL;im zPJQRLn9Z6${m)L6VvhL`&!gWCe<*N+Gdk~HUfX!u6gpX_KnRH3T+YeRoHZ9{qH}ev zX+)$OH!I)o>b!KDRB_nCS+(YX&${@~N;R-EX|IE6;f?8V!pAYb_EQ&GMAv8d4ttd! z+SZIVv6G`qaZDv7K|g4X>Z1sXQor6q&ZcUJO~P?``tW8dNHflV`^(0@`6M3@6P{ev zvi8s_NnLer=nC;+NbmquK&!t*#2bj3V7ew+?y_}yfPkv+Wr0j9tw6UsT|ycb&S#OZ zNgTVkX8Ne$j(QePmv9v)5*p|Fldu5gcE@?r2fk1{M(5~E#8`F9je~R{XiHa70l0rk z57`X&p~4B;psWN)L*euoJ40AW|1bg4H$6?;dW1#Ho<+31pqAJTG{@W|5Z~KvWwS(f zD5tDNQGnG(d3R_^y3lU8ydB_woI1)VLcP}jz<_Ir4hnkj{I#$1?yZ?EF(sQHu0G!T z&rGCNe=QIw4ir;DouuD%o<_mG_loeWIBIcSLaJ47EFc{AXB&SMmuyAZkmA9OYHZwP< z);Vm>-k+BIL8FCNyJn7TABD^){pP}j*13w=$+0hqaiKrRD}@dLH735-g~=0-kw8Ei z^t3_vv*zY?)CwsLWJLJ8J#t+&`_IA2Kf}1>^>U4+-)C^(wzjT|Eht@27#}yxeaNcR zhG#{vT6n~U>FsAf?wYvNyMgn3?QrGwk2|A98^70WWbpuLy>Lf@DIqMCJlD`zNeeoH z8Xc5AW(E$x1mJPB8nlkm-{{zB5tEku9m5P9#ik!9A_8F#N3sg-s#)?c$J^gD>+698 zm|-Rn--Wzj_xbV6ae-@fvcud_UK+d$Vqj1&5vp8+GVpC-ha#v(NugWv#Aqv{xzw2D$_6j-EWzpk+p zC4k8-B$TdCQJB)0et9VlmWA=J8#rX(w`MCy5N%%h%;{w3BoFhn@KLAECDP2A!Zc%% z4mF`tKOH-gdMVr&$v6||n(~p^E}SEZeG}N77uJ)DY#(lR}bnD#%mA4GSD3Wgi`*HUuf{F_UJ&kH1e~&Y?|_}Jy$rrKh4O-I^dT?yVWa; z@&UHwJoY@pTu>hfL1>zjC+>8LXjo`G5QQtHZk?D%{84OLSIl}S9PT>fZk622Wc+S} zpBW!S3ndO@SHuFtyJXqrWP&Oz_MUTQ`n4N~p(?({v0@I3!o#n&@JxoKz>y2`+DZrc zN1-?F0bDQaBt>&!`ob)_^Rk?2@RiRChhSu@PA#s)XvE8yM4%pb+uuaNtaO zdg1gXN=5BTuJT35)V}tA7ypaQ44Y`;bd)gD6ff!#+_D@52O(Gp#X)cPmHDW^UdUqU zF!ReuN-H{pe5K%Fzx>zlxuYm!gagJX>VTsqHP`I85OzI(K(dt~kPu4G4T!`W}XsB>2=ck}D=O_hh-ppe(9o9@C)AK=v6T$e*N?gCN#ChC; zOyfxFbgFJSN_%z%_N?WrFHbZ*X)p>qA2btkJ1RiL1BMykA2TCEq*q`6YB=wou0yk_ zln`tj15j6NAf!*ryM3ngkOuYi^8oLl7ISt2l+#A$sV)J=n10MFtN>F&e)8= zn0aoRM|%(3(}Eqb#=qe-o?sojgN!aG#@FcuRSPdK9;1)06CNdbgcFcH=x%nJRQA(+ z7Es{Jz=U(j5M#6*nv?!X$c)zjDqOp(j^1~8q)g_?3OjlmxQB@)YEx`u7 zi~JoAT~J9s!`uA3jK=!kF}|LzO;){>@FF-!L8l+H5lY(J zsEkEfSVd_cGk(vQ<)>r1qgRp&pr|H-p1*>Vc?;|Q`t?cDQpzZH%MW949x{uZ138P5 z%5E2}OG{brWGDja={6`f_)#qE9d}bzvNLr>_KBE&b+4xc69RAkX=mnf(MJz%l(cWs zF$e2F`lkw5mrB_zQw{rx8E@qSO-jd2)k_~|j{r+r!eF_77uAIL0hsx8YgVV69$sFH zOcuBblN{PfkJ)@f;4;}44%JEZQaH=pRGJV7(o&mTQB8@u&#dYT%xEOk{+txpIH5!b z6#XFT!i8gq;;8Ghs`!b8CVS7ST2rP7)3+VTNzqmK)BFHPs ztPPc*B8QHr*4@hbOuYAG2#32*@M{Keyww&#ZI{%`;hQtP8?60E%IA9|l42$BU%rg7 zWOELtVuV?`39ai^1`dbQVs}uq;&DHh5#sO*b_?UMuD*eVjICNkOrxX)h0RB!u1tA5 z%Xp0}aR#ebo~}p-V-A6K03J4E`}S@NSaWQAK(}I$eyj>Tw^eGY**5;Lv;*0}p%?|w zRfzX%Q+sk;?Z2PEXka}x&gGC(>JgAA39}l`U{NvKdZVC#g8o5LJ64^-Y%MJv^f7PP zeS+>yt^y_36%cj3n;HgBgXBF(HC6Y&9`?;f!f8H_H~!=9YfL6R?nXtR9v)}A5P0v; z%v*^6bJ{DU>^jE_&lP+K^xfcdrJO5b7bkkak{=xc+Mc|5cQCh=0G#G`R)Rm?b~4dG zXUuE`e7|Az@99=}1j|RuJf_H^rT~{5RMm>qkom1?HsLa0oH%?f1Vd6*|<3x=vTJp+=Rb>P!y};Gvlq~CitsCyTC?ndpkucK4HuV3@|r~YZ_=KSE&{%{ zW+HORgT88S8Et4r2Ed^j+zY#yK96br#OqvYFW*?FTh-Edo2~*F3letl3-{E-npV19 zO0ysd*=l7Si^><*dM#l<5UE--nWsPa)H!a|fx8HLrIv{$O8eIei5l>wZIPBB4A^A` zBQ5YVk9;OtW6x6x0ozN9MizyHP;M?FOQ~Gc>g5g7KteROr!Xx1I%Nv!Q%x)MV3lCf zilY}3#Rh0S1gKbtq$ZrJcryy_S5Jzp?io_{rRvxcwUJa}9`rBYDSlTZ44G|{xJ_e&JEXhY6tQPI6^_pXQ5TXT%=_UP%wd=VxOWs!K? zFw(Zct?a_nQTTPei$R=*n8lGCr0hRP2YBBHwWUtIS%!~JX)nS=;VG*28c302-S6UK z9~&;Grt7vl1^-T5cVWf2>tU=>6L@-b53^I(tg$>}3=IM+@rSZqy+1_)Yik3~l&&jEdu=0ek)~Nuk&;PW@|0UuN+#=tumc_lfiq6H`DlCN;q` zmV=^eLi)y;+jEpC2JtsHdRp_Ky>jUb2&Ssi#Xleh@qkWVj}&_^GW4_8YM@DqL-2(w z!u0r88$?#~Lq$|IrxZs&gh8Vnq7OlE=pMjFzur5BtFJ39u|jor9H?`rirj0q|~UPv4qmvZ*gL{M=R&!4@LJ0FHNEfb|= z*RkMPyGP6>e%1s^rrv^VaCMDF@QfJD|C)};7iMiZHAdYxFVQGsr&N~oQ^w!DlpkXP zs~lTa1xHOk6dWibeodV6M9jnNJmZ7rU@nl)zv-^9npgZy^QGL&XCb|lnJb5J9}5p4 zUpOPWRqh#RCC5E81s=o-Sa3#UaG$~VT|M$jw4MeBnOw5qsIhyrjrD>@F4Ft6BC;rg z{PxpC%*-fT<{PaL!Wa7fobI?T;;tfS&GLBj1jLTCInk708DRR5!es{ z1+AJ3wabeUkG*H~KI4m3+ zbLIs{sLIHgm3lxAi^c1KunPQO`*2>ajB1xI&>-|8m*GW;P4Re+QOoJ3rV`O)aCQ|O zrM3&07iXmf;$4%f*ZFhsL{F}TS-q6o|&W7fPV_niVQ-Jd} z3AmiRH4IXKTxtM7(ic4Q$q1V`RM6Sr6HUx1ENyp|IKwtf4WBgf;YvI01->2&7?(9p zj+o-hfk#Pn!of#IG_I`ZZg(KQVh4px+zepuk3+Qv^1ZeqC+Da=$xL|HYttontKF27 z`ktyfj!E8xp{-LOr+@@D?!UJUi|HqmzY1)J zbp^QfX3Yi~=8Mh#2!T8s#?AcIW*S<<>V%;#TPVLn>LV1fi!n0cLw|=`)Y=VP6D#Z` z#t8}8EEw++wX41>)wa%K9wS8b;7N1@u+j>G2n?(u% zxQZtZR#;pWbZgxEX1Nd*kD^IhEW_wvzFOR55LMPFjgQ;&3GL|DkxT*SIQlGLC!W3< zq=pVAeLkn6XX6+Kv zNKROy(!_EWOwz0Z-pGEhG#6e$VE9}+GK&!+HSc?8|E&oIJM1lLAaXv8|J97WBBT}H z-dt+EbQflEg%I1<6GK;H<_l}5`Fk&ZcnW0;e{)QMPZ}^s0?P=+5?wl2xAsE zH0@^shJXB6BDpyyPHoDq1RoTD-tjyR^5iFe8>MM3gmRN^)f->N4Rs}lGoW#IG2sIj zm02xh%Y4sb=)hFUFZI-YlJ$oqgh?NkHNcM`JBprvsWKe@1`_v{Vm1&2a!eXHc4;y& z8HO)iH_2eXi9M`!2+@B2fGOP{=O^U@d2?D>_sRvkwPYo!^&-+$2W6R-Y75W$M1Yfk z(6f_0W#Tj9d7c$%CIhe*{M@T%WZ$q{Ja&$eCDkK=!v>Mn#uKtLLXA+$c7N7rpHJ}V zwY~v-1zuzRaaW^F1O@A>F?qx=5EcMm5}(N2DSA#Cd54$ydaNAFc*yw#CTpr*pX}T1 zfy53TuKz<@^C44k0(cDvV1T{I-yLV;yfOhn!bqVj=LOgTNOrgg< zDebnsdnQ|`-225!A@i(@)5&K~iPnEItarDSwpEFzn0^|?XXizdjqWU^Y`*JPxA7x3 zij)?1sl!!p0m7^qO?&?~|L~liWnD>w;j=1)1j&)3l(*>Kem8=wvn8Y!e$U!^OZzHJ zvv3XVieNaQ#_zrO2iYucXfRlGRhB;o9MuZmj2C<~OXd`W&ZX^%8SkX@HMp8Rrs^6m zn)2-N;Q^81X>z+D4oTG;Hnt?%ArgR|9O z8^i$r7+2tg?l`d%0Hzwb!eh5$dagGm-Z!MQ&Y{k|!K-}@nLJU)(WBxH0QCn4C(bD^ zyU$A3)@0;)e{5Q@?p;t&+Wtx@=bx?~FybdcOyKnl;PZM;bAojC#^-yc?8}O+7BZ_d z*cT5GvT&<(rM945^RlPF_o_Dzp+LYn+S9f>YrE39dqW?C7xl*71U9IAo=h1;f+XcT zlRB0SZ{!SGLR(b65#k_##Zz>7W@22L$$jP=CWI{`q@nt3<8>Uz$l(uM@ozZ1-T*qf zpBp$6j~QaaBV!cy9?UvF5%D<|I`epK^~l%@?20|qx#&a%!H#&;zu ztc;6JBo|R!?xsHe4J2rw$3}%5G;B|01*%vc(T-H`S=# z%NK3)`>q^`JDDEy^+o;Sq4S4fQit>Np(*B<8Gub$6r1N3a>yfHuc8h;SvOjnFphbiHpIKO0C=T&il}>Q+kwn;fRljY zYE!lc$KR@$Mg`ndpXA;2v_%7Nhsk}?bLq2>J9eeY&78?Fr~W|0AwEyBmh{#b&ebqW zXRn2#gDXtPVsmCfULguBc7v&jFt-8irP#P?avuTFbfPQB$;7KB`N7frYU{RzPHVoy z^Oz7{Xi}^mobrS6Rp~|-$%I$yf0&6A-d=nRA1=jkqat?7Ts^6&8->6&AiLl<^)Bdi zggWAm@xy1nyf+hlN$O40OeiFHgBW_>y8{2q&9L56h+2~|kVLfafL(6KGai@JJRR`T zLb7)BqMQP$7u#n?&V=PX>d*WKt&{-rrB5^#gCf&XdzO6iz40uXO)_&|DQPI297uh{ zSsY$C+P6TJU1#J><2izt(S_|P8u6j~y74+%Ae71ne0UDkl%jB*syEP_m@_erPI>Uh zch-G#zUB{m1fbxRy@m8o7?q|hR^-E-Ub%vXCYI=;qro(Ndf4i9O1?D;zf) zG2Ptpa|C@2DaUyKGG9$IcDPKv?-#o5j8h2xYU%ob^7k3c1dIJVcX`}gLg7Q0))lQb z6Fc-KJ4tX2RTRR?GC`3|`&o83YI z07&(3)43spW!pl!#Kfq;neF6z=(N9GrLAkOQi!q&T|!xM7H}X_Gp81c=P3P#sLX^& z6Txj=#jv=Nw)rjGyJNcUmPgv9llBy^OV9NQb?uY?W#!>k6evG8k{U0p!8i|(#ve@w z)I^)$pb-7Ee2xi6%uWHI!@Xqu-Hx4|x=8M5ds1 z65`f3ZSUm?(&D~xvr>tkQ*gt!phIo}o!0m&7(ENv8}=v0SLb-X5SghgclW-;4R_}c zXKXYd>cS$0Gi{F3@y z83>~Q5OpC|B4m6@I{H-l9=;Jn7%k_4vvlirh+f=vKC=+rIP&CgqiX6ptlgA#s()$9 zK9NW5LOaJ!CK;t57W}#G)V)KMy#z4w_!lOttDDRVk$#DDam^H2?Lu-=}`XLK0 zZ^S)c2-DJ-pT}9_@6hXr^nG+^ttBua}T` z$dY_y_W{P_&6@J92-)}CCGyOpf5VfGL$!dYgoSd8yg;3^zB3R9{e);{1J8eYJRxgJ zT<*ueU$todc4;x#`QipN9Bf$2|I7lGAt0zDd7oDp0m~^d)o8Wam*?0H*SvYH;K@E_V zrUxUq(?zjN-E+MZ>rIAA0I+^gWLg+@cnpG#3?eyOnY9r#f}EYbM6O?K!V^QO@qZg1 z7k=W6pr3@Irk8L>FXZ-F%z_T+A20rhxrkkbi?-O&)+u9e7?X_R>!^PQ88@0TJ6>9~ zo-LT=>CMP6gIXzQ$-@g3(1I`2Y+uY?%badc!&mp|?yos5;$DCQH)Pn<@kzbAJ1gD9 zHHj@G0aa+G?)tSa;{Lc%{~eSXXWhKDA@Q<0HZTPhog^Pcs0A19Oy#)lniIERZ>fAxB1ZHq?jXFiF${7q1ZGhQIM--T$7@LME|h^^TV0=m)naXbEI)o;u>j~ynxpg zM$)5?X{pfowg%Pq5t>8U7J$!HFC|P|*cGbuLr?|(uOUe?@HIa={E~7>)aQKPqc@D7 z{91`Ob>Ob$;;;5b$4^NmD1zU5U|>1ja>WW9PauNA%YGp_#JHxFuqID#%{}*SpB0p5 z-?V$kG*!YZlE$ldv5v4$VF%j(UD=BWyf5f6z5Dq3>+&Cw3~~<9y#9)FeeSr(89gLd zE1rZ!L*pEEFZJetN9dkSj1(D+x^txIDf5baoa zi>F?YI%l=9sqegLw0hAir9o$a?n;bP!E6BdD>Nek!S@-tow(#Sx*Rq%(K%|r>Y?bS z%PY_~;}_X6ZBltG=(dtd>)wk6{3{gMjId-J+UZTn7##yjLb-cMRlLSABHJD1lD6!B zT(dOI4sDy#ZI6d)U>w0H62+|+a%%Q(38IJAi^R$Kv+Zy#^V=bXB(+Zp5<~^fX0+Q6 zt6l7%^UTl2l*JQQH$Bl`Z$2+dmXCqcvSC-1<2(+5Rfo_Vt3G8a9W=bFO2$8z7-ss` zlv{jk)mK9igI4dY(jE5nr%mWI#*V1@VUc)!vqt4vi*`goJia43v7VeJ3=g)@HL3W4 zwjDo zupLLFWLc_u*clgPcU2INi2|foD8eK_PXon~KgpQGNx+w62dD|Bu$k4OU7?Y*4_&i5 z^A??TmZEto3M|`9h{2*fwF+UuA=>y~HS?RzMdYSeTL#e8f&%zTLq%G4V50&^rz!Cz z5D0fD)`!lreMT$aDC$y*^CvVrx0=piD`kO|Gu^3Q*N`Q1s#nX;nH665eA6Twmkg9u z64gMR)c}#z36QMS!4CU zwCI4 zLBZm@(044rS(V19|Akckz|1J}V;_Wt+|!_~K)|mfIcrj1tQw;AC9dj?bh_@2(?9Sd zf1dnyGXEZ)BwQP#6YZB#o+meXhG27$srhTSHaH9wT#$9%CCVGERywTd^HI_JrJGFy z7yf@r*k)VGoF=pMp#2SDl^Bk1cVHyGdJbeHdBT(5S$B5+1}wW#I!|)s)H6grHC0qL zq`C51zD^1l&X0qeUv0Sr7X9V=+%f-mt=XG%wkC*5%R9apOi3AG%J;i^K>SJ@toEJs z+xvUyG^|vZC;=#bY|6`Q(0xDP{cnG}9p|?l47-`=HiU@j2>g?+SfVX=XyzBlXXpJ8 z?M~VI|Hfr6ul+4g3){&l?$vM{!m;GwSp0?atM0H6#$K@DHpq#eJ&*PqPn+cRsJM+H z&srs-UUc`xYiK_DV?}X4ScI(q*5XaEPBa(O(T#L^i$s<4fML+B7vI1Gp%U9+VK|TQ zQQ-sGjJhuDhy?R(T%8+eWPfH~Nk{%$+|vMzHGqZqswH+1zP?`!iODj|s!$Vb+M@2+zAbQ58 zd62_6XP7-z^4JhHae10m9?$4VuWd7T%_5hc;MPgKJL3LX=ORLIvc6o}SzNCmu*?A{ z(yHy`nYwLOsEQh1jj5vjdR!OiIhF)%RV%ftLE3;(B#PYcwBoC@KH!&o>%{#VXMPj|M~cf{9&u>!p@j1 z@?Z8ZZ`g0H`|`-QzTU~0NHXGl*Imqu&6k;j6uRb0nA2<=o3z?s>5=*7-^UIVE`P&n zmj}^hYVqJDlbFlby9Jh@pNAqH0W^lphU6o?gsEqIocrSZ!MUH41@w-76?ZtF7U-L+ z(?gcBSS-k(Q}l$?>R?E2aaeYN7sjWffHiItpSc&vKEl(&)9gk3^{aYv^VM-oz?!bj zp-71N2EO@gK)=wu2lx8HQbT`nxT z9k5IecOyce&5da^4aZ+#d=BXvqu`eGc_bV=@cbh<6g;ATGVX1+J06eep^UC(O4Ydr zjkag80r|hra^Hsl1M4vR?mt2)ncdkGT|@l1Z~5IKr@`O3mCWYDixKq~-=9adzMb%3 zR-D#vTv8MAtba;^D?}=!l3@!j{1KDYLEVqfRqjT(N-1J6{l`@r8;T;u#;Xy7jKv2k zxRi3Gz@YZiWxqElL0s?xyF2F_6jL=b21}Lg&7EFwCn?^3iUgD@oV36MDbE|EfK^oV zUx`c7zX*V?GIM57*k=Vw<46$w#6c~b{(QB}AXx>bT6*dp;4}mYvKNBFTD6s&AKCpx z>lrMRVV*S4LsLcRMGtAs9q46IdEh%bb$05Xdc(<>4GOwDW#4zGmeUcDHrAzLNmw;> zFTg`A_a|?7k8;Nz*ZgBgS}nIdXv&n1>_EPm3u-(Kq){ieqIE6Tsrg2zal{NE#WJf+ zA-{NkPP%W-tT&2%{m%5Y=31Vg7; ztvbagio37?SV}>mq)bt1tdx9CA3Gh_5WhT|)pG9`v<>4*Zpy8vF)iK3MkAl86r|_dF?>382-h{A`^gee+%;o#4!-wa3e)XSS~n>! z2iWG?R77ljj>`p>GZtT%`n4 zMT(x~;;93aT$ZIMs(uvPv#g}%U#0;87@*_v*fDo=PQJ{s5~SEZwUziju1r>lZ`c#b zc{!j>`wFcClW^kumAs}qud0ubc}O$~`Iy6fDdFpj1egaz*1n?F1)^KLMUfA^M-?J4 zjBESxC`f?`u@UD&-^zsLiw+w(8gZNSSe-8rmi`?V=bXCT<$)!qRAc7w@Tyo2lU2yw zAO7AznV@sj+ua)`PV_Mql)W7ZZ2Bn8a~i6?x28WdAa}qFX9u}CTQhP8xfjFA2WGwa zesQv`|GK@|JJAU)fB0;q#2=BTIykCn08CpmMV29TJut8tD$YYmJshAB(yTZlHW;!o z*0*wjt!b+1o3$@=d1eYx;t}jFPe7BjlvIOz&Eo~zI^lgGGOd8Ts!`dX5_2a{Q~}vz zA&2OP%J`}f83Pa5@&QUqJiKqr_t%AZwCi?TAgL9(;ET3OP2jZ%3SlQV`=Gri zT}k}jUbtH0sb=^)&x8BOeX8<8H$P_TJ9oFnjtQJW1Zhk?UPx+pbbjacg^WF}9uei^ zluGe8!(*#w5=X1>ndLy9RZHWOO(a|dB@M)dH=L;IBNK3|abGc;9IZ8eV>xdE=2zjI ztn$7K@rxbPlujdz(RnP>Fk(e5&!*MXRhN;?IdpE^xX`BlNK{;R$<_SZmkCv#k7!Ae zn~xH`;{tLKG<~i3neS8Ie&(rRl{wRi{L{tnZ!L``NfXr^9sQdJ+=d7CK*Fr6T~zJO z>%;%>fs5o4PYV*8-~j(vQ#ZxH7~1A#&gk%|)`Ue4>}t#+uV-rUDsDwY=Ii zq8m67e%=LysP_R6sVvsnoo-K-l#|Ix8D5*=I?-UmAkEJE72aA!%r`hw-G(C*>|aED z0^fM^^|LJAAk}8PQx!|p7Z}b~Azw1J3V?kx^cqB&vlTNo77DJtn>^1FD;Bhs&Rp~s z@Vui%bqg7Dnx3js%Z1!Q;6+&2&QCK1z*0y#3#=J4SC5NAi=||w?BMe55_UUJ{UO`b z&jAn6GmCJr!cHJh^Zpo4FpBrXWmhQ%%5Ml*9SRvdLYtPyX=5K=qKECVK2iFSI;fiD zT5{z*R=}I0l9BeT%hmAY3PRym-3SWXI-$d7ECiaZvwAEUmN;I=19W}6VYeJqxtotY_}sZb zf8GA2ulhNzE0LBjw`6k2Q67F3leYwr0mUXHzz89M3Oe!x@P$~d-!*~vGWI(TgzlE9 zhMre!+ym_T@i&f*Q));uj4=JniRaQ*GOaZdKZyCQ5ppXI+LRh>vzM-pP#BUM7#!M) zcQkC)qSezYo^n*^izsGEEMPnbJ#7o5>gf@f4biT(Fg5SI#;XkIg8||+lV?vdfyXB` z@zuZ#Ac46Yio7a``1E)ktIL^=l2iOitjIIuRu@^nq;C1{q&*t(D4rAZ4#yVJ_437q zWkHbh14s`eIV4uXbC9DAbl~}IcsCpHC_Z-;umdmd8pz5GGK|og=MA9_ty!;!KRL7G z)`ij949P#f>iqd7Xe*8xat7@D7Rt(!)#MTFY4Z~9iW08Ta_1J;J?iKP5h%*m4@SS8MOkl|Qfg9*k2|v;lK&VWc$5rjs-AyiQJ} ze~dVedzD>nV51f5f}v0%)J`vI#ptxkAk8R$B{OKz#FWSVJm*zK0@5J4r%n+l141DphZa+y@mQj0i%!y{FmuZ-!-jGAK^6;Xzi>URWS9iO>11*zQfs*rNCoDpH2 zeKxo{YDJ@V#_WBwMYb${?o<^$cK3qh;$wI*v;-p5G9k=%y2=CF0vl z59npF`;G$*H$RF8EgiUDUwk-amgbvu1#QIIJJJL-Sm7_k zF$pnf33#>)5#VUrOFt5wfH{zi_p^4~PzqSid zi-xN5TyjLF;5jV_q1u1YL&JU_u#;3GbOo&LL4XC&3T06CEPt9;t!t*{c?TL>nFpg_ zv_OX1%z$r^R+dIKSZb43EBd$|iX}0-zCi#!Y%GiAijeG^XFD=-S6aD@@!p5O6C27vrD=?d}F8`({^KLv? z%`hZWeaA2$eaFCKyvtBdM4zElH`p5X)eJ*8iA;xa;xrs3t{H7y%KeUUyy)-QQm+50 zpDFgQ86<8yR{Vm+RnnVQ?E!L!f^fyMk2sOnJ5*}TvzMvOJENG73har;9Puq9{f*b| zDk?;l3z5niLm!oHLeq6)%lsX~Y)3YXhq(U=mB()aitA|nGJUqw>Y(~ry*MRgIOnO@ zB5atu9WzUd;j;-oXYwoFBdNQ65{-i`9d$2c77m{S*#&Mb-R#Orr7k)l0eQ)nhBteU z4kLD)sh}sGb1^iR0aVxJsoDh!e45o%SD=zgmF}`ew?<*E$z$5?H9S)plw6Od_}aYA z33z%@-4ONPKfWM2w2#MmKBPi!HLE|3kTRsiweiiAQZ)c_QbV+>3>G&}7&Bo-iR@~) zdpEc!EH98-fQ^KhtCTNLsl85*YBo&Tn-@RZP^{}6APW_eiS7dI_>RYAVB4<^QX#2T zKZ1Hx32SM?@uAvnMs1J#D>b-wL`&UnVZTZtggd%{#Pyi=i1(F@DCnf=*Rx#?6b()1 zQ1B^nD1k-720D(blg(VKfnOlw zga8MGs}0$*%dIDpg{Jo_ZNv}&!tdv9ye+)qH<7{1NnAvdp_Cc|ImW7bKi?t^Qu5vm z8`%O5=U51?S?&(DWms>IJFCNRecXWmt>-62K6j8fL-j>WoQzo z5bwG+*V;-@1kkzij7WbF9|Cg5kRKW2ZdW~@Lr%(KxfO-`O?Zr{O0z<`s)R(3?E2UZQ|8Xa)$` zsvJcITy6k22p#YO8VfBvF6XBR0WwmcEBoMY_|$^Vu)U!ahkDd;F@{BKLT7+P|Ac`Y zvmLL6*%$8I)nAM>LzlnncHYb3-?T(#RIyn~%$)Ygr{Wxa;+8u$ti==GH}alNfYsmA z!r|rY$+Y;OB&i2sqU#v8So4Glg8%3>Ii!5&K!td12?n}q3b=-G35}act z2XiTU1i=?;7GuRIG$1$Tv=x;vgY=(#INl;_D4vVAeq<`V#EF%I;B!a5;H{|n)Kgf?F%VC>%l z)vKx;+N|p7^9*G`WuHCKjdyMIV?|3~NTLu;$N7+la<%v4>C9T=&D-(yVX-Dih6ugF z2>WaG6P616?%kiF}y8kGh7P3)n~Up=fl1ieA&?Ee9_c#21i`Sm$`x<6kZqf z7yqXf825)6ij*_Q-Fk%3XaN07$qGr{F&APb+|0N?{Oy(PaMYD;j3viiHB*p=)t13~ zmJD9n#wQaMwG=`{H$M$2@9}2?S>lkLa|oU}vuI9FYGdTV=6sxaN!*ax0%VBN?-^(; zIS7(l*FoKb(9WzU;78KLl(k-Q2~DNd1p<>?%3Tm$CM3O z;WC^?Iff!Y^7@x0uEw;QrE!J$Csp~et664-V4*$J2k4EKL!NQ}>XfXAHN|A2)9qHc zM5d-VKw>UVQZ|;Uz9`bHXAWSINT95|OjXq-Y^|OsXG?=cJ6xZbq1KTcw2hwr{_oDO zWFTp3bEv?D7Ul%Wh}!X9G*`6B*PZTbdlGKi*yp&G+mGD^?cwDww1z!K_Dtlh&sK?vzU zvy<%eUB^J`87X7FQv337Iao_`C7Zp95 zlLvb^+Z!Ud`9AO;b0{oKPLYW&Wcv+l5kn^n7-P$gz4OIb#w(Nqh9ttN5sZ}}5 zUh%(!Gn8Kbg4ke`Kt<$*(q({sU(8viJM z*6UfAMx6&m@fYpgfdPYc z{1e%yBWj4emWJwX)hiM72qCHzth#GbE0oMd<$@~0y`RXO(6<(ps71bTOB zPT<8|Kt8yC3QhVaXg^0OT;|ik4}$OmKdsg2g?t+uN$7)`OJu8UFo&_z6J?hO9`pO* zYrdqsC0N1Qk6E~&CEDCDpNM-DDwq(Bn7>sT%6M|vTsIr7MA{EAvXSq| z2rLlGywxd>%SYRYM;i}$EU;tB7$qqE%<)g~@J!ymj~o+QKVW{^weUe}t@TX-wFFDS zr}d7|fyJH31A4?(I|!x&8vQeP@1gfliW$MAjHx7D29wWsV#B$rhRrt*@23ceQk`n& zDzFF0DAEVQ*Y>jcAH*lke0Vo9^X_C!R^oWjfcDWz>`%g6J6Ky3T+$7EOjN`X#MQoYJ}Ta#9*|^gokr9<%W+x5 zDY}zy2ro@4fR9#VS$1e|@DR}Q+W|f#PY80EVNNo>MM2#`Y{PQ`5e05tf%#C?n}WpF zrxkoT16m_{)A*pqq_H`ei+Zk|tLXoZXY_US3x17Cl8(>t;zMGSVR{|(bQ9F^Dt*zb}3RnfCktj_HRMd<<_P}>lF zvq!~rq|H)3oNVdqFTbw#OqL@k>B3wvzs?1RD?E-j-Gjs00 z#9mm3t2bCEpl1V`@e%q&!*n$fzkRmW?4eY9WD_T`{bZi@Hr*kU`2-7WNL;88oIfrO z8sO;3G=jC|_shQwe?;B*TGXTJ3M+@siT6SsgF(-0pjX=Oo(!Xoa5LuUwo7J7bOrD9 zvic>ros3TO+Drdl_W`8pd}cG7GxS*>z0X&G1B9>EMt-xJu6By+{11>OCa^;jyNzF0nm zu^I-(;xSP|ZEPsiBavIF=z1YNd6=*bz;ca#AUqRKipqT1E6uEH{6TT4o1=H{-oex) ztFl28LWZ_wThJcz&z90wQw2YiN-AYB49t`I_U-8>m`r+yh1qol8gGgEz5_lWES8+h0aEpV}nNhP>hoV7m}EYsUF9#)8- zc{sDwCa29@pTOQW#!=lp1}%Bo@WA;VB3!p~h2h!=Oc47TSxd#Q2=SZD{H1|Q5tYuY z?G#=5I8G4YXYlC%G?scc)|?vI+SG2lq$f(`P{p+!p{yO4ao3LwKffOp6? zshRVHB==~+{4W8SW?qs1>Pu*St6p-32vghF5lrherk93b`1=2A1(xIr_Rq~08MN9E zX(5Ap?m1kV5H5Q-LV?pPL7q5RXuc6-rkCB}~O&yj3r!#drEI@vW3gdrdKQMc^l|7daZ)!oG{ z(-kl?#<1HU0(OhjZN4OTe2jO%B3E2cGV)4@olPrOVqZp1#wS3bdXA=@jbRgxBpr@hPYhY1WD0Pi%0?=GxKYQt3**q# zP<%4}IGFtRMJ~|>#GxUG+at9DcWmq0vl5Jdon28PYMl1Z!6We~uELMSmz*x4j0}if z+feLHg&%2RJpdsZ1^cq|y{@mpJLQ;g2bh|$W`Djlc0KOiS|VkGYYN<#q#Z4Up6+k;K#hIY7q0Y?XTynnul)g)PRu2^BE1 z=Y}m_-L)kp+G#jz0YJf;u&LLi(Wq{Hr-jg6T^&6^8G}38__+n+uei`M+!Gp|GuA3!$Go8|Z3vs!Kr;*HCy48zJ8(fd zvT@|@&uY{eGK7KGT?9&;mPJjf0ndSam7Ah8dJVg@MCk-`KxaNY)g42FM|3$kiuP!` znB;pVgLz(|s3_ID#0hUzXaYv{cWXGZY*N#yS2x&}H#a2%>^`Qz5t%1x@_n6vkMP zIu1d zaw_IMEo4z{MA(<^hn>C6vHXr0t(EPXr3DtVTK+y2*QkPf-{FfuyQ9Rcz)$T4aHGUG z@R2sOk$Vh}iA@XMj^qs%28}@(#FKn2Q+LIc6@-R!7VU0|mz3<=Y75374IjC1Vcp{u_B`MU{(O!MWt7^vjejNzF% zG6)F*P~xRG_CA5(a~Hr$T9r4X<83d^ zZXYiOUo&tvKMC##Y(FhYEq+0B0x4Asm8c}eL&LWar10ICA-rC{+QA#RO{Elq6q;jN(6ffx*;CCfWgC7rKc&zEMa$go|&GR zUlks4o}!N152BKi3}6`g?3k8rc!?Pw`13yUiAM<)^m)Q*MMpU=?&H>&D+aB;W%iNX z@PISi@;KclL-%DcrX!S3v;63{F){`sI6IU>d(|fOweau}v?sZ;c8M6-cVd%#`?Q!2 zFL;w`R7H;GQ{U=D$g9tbAo>av(oY+?G?{ukH<2~&5GadS@1#w7>!8hV3!JStqIhu4 zOv5Flcnrl^|Lv+^5yCSum38i);(?WJ_tusVedt-RlMbJ;kRDtO&b!_@4-?6JmQ=xr zb`$TI!mc2=%mcu|Gb8xZU~Zvt0ok+?F0{9f(Nvh!)%zP9OHsBeJLWp(6x$2l1H&WF0B$DIBaFlwCJfc2ja!>)QNtTgi+qjUFD2B*j zVClD{o`ng3#w*=`*wQ2n;g*4b2FS`~F1J?om5|KXI?8o^(Aivl2@#&o{yn=PM_o0M z(@`%*Y)+tU_oe|9cJQI?0O10o2h-<)zD08WFxpK!APTUd3e4Bvl?QN-I_TzH;>NdKRmw!(k4j>ekf3py+SAct$e-e^;n|eB9PXGu*dEG=x|@ z)Kt3|J}~<9I5PF?$1u4d$3gQo;i&5M!p)M`-j~mf?HFjio}O^0h5tWC*)ui@I{e@s z>*k-F!@C;UJ8eU73(bzeFng69SeW`D|*#enSax*mBwX3wxhc^i{ILowo zEHLtI$a}J=ZiaQ?ypUFDUi6BNB%_)$d9W$R8< zDyS{(8o&Nq7aT}Qu6vb^yjtRtsm7fC(?Tu9%f-w?k{q&C^VrNc{9LfCnS_b79CDx=T^ZbOzFw!tXyxG&@u#NRg2O_FM;Av@Hn4&JQa zZf42yk-Eo+y|BiZuC?cA`)iODv2u{UQPBh5*Oa-dHi;06v&>F64==`r8pYQ!_9uW< zip%CS$(Nz~5?0GZH~#9w^tZ=ll_b{& z6I-moe^i3>tnx=(Hv&^P*v*ON5=y(U_yHwHT!-cVh#7t#^SNMu0{Vqx9G3~P&U;>f zYzro0ZA0%Cq5Oa-XdviH0`Yx-gj z(da@98+nXFw>>e{(x3`N1!s4Az|pL|E!X>-Z;zOnYVJ1OsY`5%Y7DS!HfeeZ^xoC1 z64_Rtg>C6TcT9m>v{L|Zq`2*RQv2O)_gSwD`Ap<%>_)ye|MGjb4|<2+W#O}a-5htu zibBU$y^Uu(i%AwdwJLUTc7GR6n%JeLquWpNyOw~gt+QH!J^qDBu?y`VxPK;FF7t2l zm(TX|W~&2T{&|?DDxFoSeD`4)AvDwf3@jz>;?cxSewgDTG9FLhUgoJq9<~H48ga8Q zEhOu(*6@R!`g!NAi;`6rWva=Wf2$7SVfY>mT(|`>8HMpCzJ!x31q2X;U^1Yt+}PGx z|N5m)ZdD&SMZ)Mxm<+!p^o7dgYJvGG-4#V}EbtbDPAyq^2AVktGmt0xqsx6JA=pIp z0OC={)kln^zt5rhidxIEuokfB1Jw)RI%|I%xQ@?v+=D+pFnnEDtF2jwt_fRfNhJkI z@5&M-f$p%11+yqswZJ2e3>9QHc3a<|`iT*HoDUjsf(zsy`AL!Yk&?udT7GKlGby}i zM8y2od&6SGydE>{FxLo(#ase@+{a$rf@1IO&G`{L`!V!YqHB@rz1SOj%Z0z|yUn+6HdSdQA`4%~yNAAeDS$6pN^u?qyj`svzdBjb|Nn#$u~KKNqd43m z)-Fi+>KR$|a<+8>EL=qnW;LSeo=E*PzYi}?X1fBv4QLtb6Sd%dsG53;t6q%ST^MMP z8kddLEb_`H>QR+?&8HB@(_Xz(H>|?)Wq**x@r(u&)ey+eQC*%td0 zD(SG~&+DqV%@k{)jb0V>gJP;z*(Af7DD9JtceD0W9VrvF@N_^ud)XU;qR|=M! zc@7ih5bpw)Ahbgx)utcVNJ(Zs+@F1TD#yCdE3YFH7diyKfYU7F(m)!bS z4vZYzfF#u`8OygdbAq=dg8$BsJ@4xUVxE#)6N|))O)+yKonxR_qFUEhMl%fvenjJV5R!oKH{}*F(J}X!ZW!AMIxaxOgIS!B35_xov+uV}5_*%}D}*{h0{Z@Bpxj z5(Fw!+0gHxoNi;y|9X`%Cf&7v-VC?nnBy)IUFD>eGwJ!W7NH08OZG7nkaL?=_gSq8 zc;l+DjrxKd&y!wJ8b%bPrcL{{&KPjyn83JE05gd9+cdOh;6VLfG16eSmTEd*=aBXN z-97UPr{xki&8GKJsfgT4OtbzkFRd3L!~!o>QApsMgXZ}gjsVI zRZ$}8KX=k78-4LuL^_ANTg>uV00X1m4(uHdygy6~WE14EYA;mEJ{IxdXZSl%(7{IY z2ePVNxci?!3GW?6UO;Lwz?FLH4;#>ZOtDf|l`O)T81$rjy^$bH?$aLDFG3h0pVCm2 zCCvp7!oeK}GPd`~=E@=otG?84p8vi%WG-MtX7rO1N9IBo9bkUU|98oWXLBh378oJS+qVp zzUaM?MlkF><+U7a#+M!2dqK}1lfM3n6J{#?0akrDbcQL;1R>CqjDsL7DKe`zd0m%q z?w;&px-lYojVz@c+#Tz!k{Qa!D;eoPSCoO6rC!E<3mpvnI1gyYH@o)}K6E43Y(P&} zcQ4G>WlCbi4fjKQ@H>8WFQPRXiSJRv z$9bK{>&qOw!0+~l-BV3 z4^AZ8Z0lP%$H-3)3>`OF{SQ?J`79wdr|^cSg!OX8ECfEOew0ea2bIsB zgg|RmP$@!d%=22`sY`ThvOD{jY2I4;Y8ql2ZyQC#)2X_BM~nF>8%!cw!^gM~zr_18 zf4^Kex6a@>k$Yu-T|MkRjHeEm zFwW4^FbupUL`Kd9yVdp&5tsJ7=1-y3fft~(f>&CtnL{Hr&kCCVjwsEn-3Y)_5i($4 zlEMGj+eI2>Z0|?&XX9ny`g?Hi`LAhuN?W6Xm`Mln5v8_wvr?m~#E26-SFwt~cctHD z^nxDl0*@jfDhQ_5eQ8`Opc$_hsDjo#sd`b7avOmepkfjvAcYyp$-U6xATIz2X!Oi z)0qV{GUu&xrSSjock`ZF>)i*;cOrxdc_oP+KSp+4L!ALBoegrMS@!V}xd3&2 zt+vgcIZ{*(r!fEES~}pnGt3k2yv&rT7x}k!!S);bl;|>ffRZo8dyLC^BK=R0h_yva z7MhvLze|(_O1Z_#jM7|f^SR64PdV)Xhy+xA_-avs)`1cTqcM6KZZ^?R#yt3ksgSeo z#MAt}6_&YUz%CX*%ua7DIevS6vSoMNqY50BMn~2W0BRdrk084k@IDF@0ABEm56t|o z_lG*;Y4*NUO3z6GSRXXPo5P&*$EN)leyvHjz^e>Ny5x?40*aEr4VXm6YaiM`aGF(` zOw!tg{JCFZYfdk!+c$m|&57J1o}=n%m>fjYkO{Yz;#F7LjzA+07| zXI0Hngm8Rb9*rA#5syY$k@IgZH;on+_!5A?-`z6rJpaTLAM44~5;wT=<8-?NSZ)5Spa*6HuR4G4>K02YSu4oWvvWOAxr& zEls$>u1wzD2An(A(N+{vOMsI{=SM|tX0_U~3Fc6SCSHfXf7rHRWL4Rh6ho}W!&(kS zk0+0Q2J~I>-UQ;Q7-`>H=sO94HB%W1<)6Cg6Ia?vLhi$DM#`YeADXkx6|TROXZ@3V zNEjKGtkk5(0vw&07BJ}T{2rD9%?da?d9=d1Hrasa_9Pu()cTRhK#^QQ%GN z+fbA|kjL7fJx!3$XMpEeFnDw{aCe9q)P@3&W&<(Zl;KtjxRU?SOq70Ddy3&}3*x3R z2pC(T0`PBnnxZ;@I_daW3FmA255gXx=)vHx_p^(*UTHadg}M2LyC0~hFui0x>cxz` zy&p;9FH(fYMV)%o1EUWl+Eg!G;Gu|o-+dYfZ?@>9F?*`k;_2z?>D3P#p3|{DT*m0( z0s}q%m1mw?=iS&_xSyHfY-D?5*8>U*4e}oON{lwH!5t_=LFxdk;RIDWYvIbLOrGDz zscNx5@;-lgq%D$2U)*o9na{Z=jCaeu%Z_-^Jgh!ar31duu`&FTtKI>S@zDp8=*>?B z{xF>~2$x=3;iBH`!XfDx3WNU&viPmo#QyP2Y~$2mUpt8>s=?4)iz0Rgh|rr4%5f_I%kVxSFBv|*<3zw&Q{~le$cC0#$;i!XDw{yyLNV@ zr3-wr7~!c0>H0oYS`8b3DJZ&%sYuB$8sSt#A7|@p$yg}_CdU_bT5Rh_Ml=@XfV3=c zU#ufhLQ6p+QRe}3I`w{%jo#iVNfhpnuBp-gp4zhF9q=@F8ecw-zIk}_viSYS)H8_~ zKP?@zDBUd<{!AwYRWq7^(AgdpwKPtE1Ng{F=9`kY!eKmhfIgueILoSeJ?$5{KyA+( z|L;Kfw=z&abEN(I0Od+P)(v#4X;fX84yxiDn67FZZ$i12K5<%iP&F z?&koQ$&|yTE2mi;3hUt}#VbBomo+&DJIX)Rtlv^ZdsubkX1Q8yZs*YSzC!x3qjP++ zmpwAHZGP09;%C%kNUb+qI}&u&1N`V2>_>rfMZNO{WJrYwI*(Tr(^FsChoKAJp~w0| z7upmp+X$Sz&DxRxnkEP~SvE3UEI(8Qj`cOBZX;IXhkNi*mEpG4!s%3oOp!19CWc_( zL{PFEoar+XrQMD8ceSe;4>#}0)?7JIv@~!ufMVf;bHt^Uf}PX>$#MEi!~i!Wt8GQ` z`)iB;u8nZiS7S*n4R<$5&5)Le%ceoA@{i#Hi$>`~HXR|}Nyp-^2u>UydT0(u=y%VA z2|Q*KAy4wYvy?m$eY*ylU7$WY0=A+)+fcZ6l(8SRi%@E-LEFYOK4ae6-t~x|i z8`~S;>w!{(HRIsYLU6zWL@B6!dc3h|x?-Q0%2f9%oV6wG&XblK0BOvp{9p*)Lap7f zE14uxb7ckRaO8xk7IWJ@XH* zwM-P=I-Fz^Ms{O|@X!+ovg$&6bI7!N$=&sRAUDeecxtZZ=MRXD}SD&}Hpb+WGqKJ^BXBv*Xdci1V!0qHJGdb^F(^d$? zM8(!Zlg)zDON{IHL#v2^dR_1iw!m8(Cl(2Lxhl^{z7p$9q9m54ex5}TAjM%ZX{5K|*3WTUye;>I2N4r|t z+pSGL!$|JtWLdqjfj!xn!y&qIKi1Pi_#G^mXK^X>K)V%*J-&DNmFRujXy^!rel!{x zX+tFv5w_nh(ob<5*>nYQnX)~>FfL)IL&8|8z-z&i#HP zce+wkI=mEjK)f)JGGYB3k4iP1TL`@c@3Iv2sEi($$FLd z4VK`2b&xSI1kGG}7>a=E*KvfHMXg?TErX7Ze|N4RjZqxyMHjGITPSPA0A;RX1=enN zt+u?8dY*9$7c~W>H`T;>WL{%7Mf?QuhVfn)0e~=JLY$n{6Gl4qi$<|kx-w{TlGN#5DmySILn zM)GL;1=A+m3GrYt?_zJmq?5abeuOsFVH{)*4bYKxnySc3}f6hLGxkIB@kNt$P#)`<)7xdNU3wP!Png9I* z=ELO;2?XfJZ8m>OF7_qH*30dmtRtHkw2^T%W8&mPkLTlNZH(F~eN8XU0si-t$5~{G zwKY>@qK#1#zJwH6NC69G85#vl%TxSU9`XZAI9<-R=M0oH zvGQZ*-GaN!LqD<2y|6S}IVVLiYm>K?2kB?ZluoRkj~LIZj2z?Y*~VVuw8&gJr((lE!b!h3PYfcAA{RMCFu`GZYXat= z;bHg%x#>qmtQk+IrDz$X%j=wfbyNpuHlWPiL9w4f;2CE6FLI(g)}bE!N_3cadAVm z)^P>6;TX6ru*fmHhx|liBT^9`deIJ?qA`)fb|M%DPH>^ZF3{S@ zRk1GK$@p2jl#pm4)fgwqMFsTNfZYSUwO={1)vO}5-dT5c$@!^hA(avh9=TkXAqKI# zL3JMeRLn-O4Cbp*iFc$$9qHgm3kN;BQQXh2_>iJDcCV2%m0VbFno@m8TFsb;XM?HXKF1sfw z{7**e-jJwDSDv>FyPGI>#Q(5p^_4nqsRB*Xo-9ievkRH^cRZ*=j-lqW1ehZm7TYK= z6%pq>(g=)1J{4(M`G#~R$u=tPgEF&O*K`?=s0rNg<%U|_q9QF=(|y~zE&{0z9TRg# zdeMp}6~=Od(;;TQOp3#n=g=ZV_c*XESl(r6j~E(zbdC=Vrb+W#uz$AH^{0vk26?8d5>Wv_`8^r zp;d0OxC?zyLk-~qcSJyc-Fp1Qnr*>{Qrnv{&SbPdRSrs=C_rui8b=~pzW)vNur|@r zKN{8svSkf@lyYGt8^?rJ4u4qv8NMpr8oAx5$KHZ)O>CQd>4FCKeS;x)oxHC|&*1Qq za8zYW(aSd7vkr9rt{9)-tYH;x*YaqadZ)J6uRGfAt{SHkVWs&nMJ0nVBq_)~;));` z2k}43JDidk&QnGalsLU$m#49nYz?81^8Pr@Wl5DB-n#6EFXZOFWSfOuQ8>dkh)Ru0 z+Xy%q+74A7q_Gy^Yyi;AVDG9sTzHD)=oCpPj~DKO=Elf=U48LI$n$Ca$zXeYt{m9E zVm!pN-A%_r;jOJ<&x^jIVA4%5TBaR4+a5ZB`V@S^*8bLwXJ8y;BPco-%ED(=#L1evPFV@_6ns7Pi@&Kh^ zy27UbM8yxg;Nm@d0nx?IHf8>J3{Is^VOhol-DzFs zvH^21$$XGE2?H!m^t-@`?s7khx2W_-h(xb@a%Ho_5gxy%yd6hM?u9P~A=4&xBLL(z z3gbc4){yIgB0UIAO598Yzslw1#ESMH)qW9iU{PwUTf#ntwiZJ3od{t{&2t+RhacmSc@>BHp zq&k}!yl2iH`Vp~<;^1l{kUiFNc624J)Gy1=)z3_=JkCJxI8#;+jFnby6niHW;mAY2 zmfR2y*L1KGr|%j1fQ7FL?I>JXzmsm^%XbZrOb%ZOk^*TaP76l^24({oE+^cKh4fCL zA*{gG0coxOgj+Gj^7S*A^w- zq@I3jV>XhKPl<7!bNla~aNV@3p&osF6Jat-BgIJk?#_;e`?f=&45@oMOjBkOjX@Tn zLfqxWIt)A_m)(&0C|8x$Qi>1_#43IMLn<|0U=mBhg5w z<(s6NFcNqqFf`nK8rv#Q6wKr<`kY?1{Me}g!W)0@c?S2QPtuZ9#z#@BYRb@VZpm( zNHvPDvGD3Ew)m?V)GyPPCg$GPOLKCRB0>&B;P0-D`=O(_rY0o4e;>HL3I*i6g+#Z3 zxH-hpv2OIk62UDv*3NPk($#>Ce48%0QUbyo7&;vXkml5&<^fls#QZ|s#vSzCVH=sK zC?g~jfiEK$sg;dw1X~LNCNP_G1O;g;cq?LI|CKv zH$5xqti)M!uA71Y!DCIHT;XBT@n673gS(E11m!z?~2&gioEJcv`2cwXmOjU zmaQTH&9lK-8Xpl^thc^87?ft-I4oXBDy8oLCm~K9>%)LvZ;_m?zUQ8AFjF@X`OsUq z(WT*-?}9nl7;n&;)0Z(6O6gyn#=h$=InT6dpFOwrfRb>uVB1G)?RyvT-R!$b6BjVydu(*#{@rikGPY3&i;-Wkp9 z(>GP;64}XNr8~0E*KBokalaGhxM1+GD+V2r2@(J&+wt~R*aflMPkZYKT*#`_=78`z zaOhHkxfY{ngjlhgFv12Iw?A2y{7)L zZw%S%#i=RW6qNu=Vc*~;8n}_KqEo~WYIBtz%FA;)+;+ns8d|KcFnnO8E zzrWEKlr{7wy{3y4(+BS0jSAR$iJ_J;B$xCDWA2ax{GB;YZbUX5~0Ffm@pAbT+DoIU+>!B8!gH48b$ zk6mUjd5RN@GwS)G0~zD-^ObyZdeG=-l!ELPx4bf6S}|6@OTQ`xURsZ3El|bSh&o6d zq6n@r#g8*l{<9GsLIm{J4ZYixUL#MqDjqY#2>V*TD;SO)-%YQ0o((+a&v zAGaqe^7fQy=h-6HGcQwn6Uk<(1$*sNsY<_qA?M;1a~iKm==P6=4Z)uMp`6j#=cw)M z-r1M^Slv~;8=~_D-(-s_sv~=X|EmH|!+g^*jmUd40zF2HPI^0%2-w5FvDu#Nsr4wv z2vHuPD>|$uVS(^W{|uq<};zVZGji!YqoC}LhT zJX>1V#(VYe0Z5ZLJt~LzBatiU0I|c1ca&g%yQ)R7~{%r2IpU0MD}ylCkk3MCj;vA)O4K!ZT%=D>-C zRu>#~4S!8!|7$W>F&jJ=*iR#&k1#F78asd9ul_%i`nxNP2VZwJUf2X#_Hf3A4zN{! zZ8ME`liHTKTp9;n_G-0N)RLt25+ zS=Eq#pxr$Z%y}ronh*XL?rF(ru>IEyc}s6s$+uhon`CzS$GXw$$-k5Gja`e(s8#o% z+3^N2ti9E1K-obJ;m6?$C`n^i(ck_%+J>rx_?JrpR!7|d!w=J!OY2^Ol)iRjZ>jRBjR2yC6mDBu&gSzym3;5Xt$ z#&nOExXUYi-|&oTNv#?h9Y|_td^o_U(hduLUr(9BlZ0N&)#Rc))M_1nM3gccFHwyZ zLIq2PV2O%SzY;|9Cr@fTO`^koynxces&Yj;SBbvt z0TG@JD}z6EB-uDKF^8#rzWHv~lId<(QaGxpHeG@#@D&-0j=-ogWuj8Q#aUtRcW8Be z8k<@q$HG->`$_#Zw3#WdB!UrQtZY}E_~kRFxCS-Ie#7cnj{Xm#c{8p}fUQ?xArCX# z6Xlc}PBLb2lEQ$pbTY>-uS-De7J=ce{@x=%zJ|E281e2_%cVIm$|M9soV|V~ySyqo zLHqC&+P?#t75R?)WE8>={lYjxZw4n0YX-|~+oLZ%@GnM%6zKRZB`dJvXA6rUy@otT zPXxj#F}<#$1}-wH-YIIWdehL2*w3TnL%v!PHCu3+JUYpNfI^r_%S zCd)(FKWsNrRBIn50_EZ_hjTH&9W8s+@w&DaM#?+;$VM2aH&tXyFNV!XVver!&Cz5@_lX!S9g;NrPfSDDrJkpj^v$35tVgEYFvBhm{sFQEyvsS=?Lyu5Up+0 zMe$3xf8&KAAHj0-H*=fU#Vf6ikDFUTk^)y$cbXFnO&A+mD;ehMtOHuhcVWjx>{!$0 zK9&ZkS9vNMI}^hkvTxofy(ZaE)?1P7xqC`T2ltwE*E6<_yn=cg>@4&5xW`Bg_`Hux zu*kS*+2!1(;G-|Kx{lEe%MjR8_L#KwiM*LAWlvkaR#sQ&?p(&D0S_Qa0o{T__d;B{e?6H0>N`&}hZ@`naR4vHru@p)P^ zpE{X*23i6%J@59`U7`sHOTc5H4eH7qi9p>YolcUdfgaq<*#w%K>qS0I;81Q{g2H>Q zQiy#1M1vn3lu=&C{KK{#i)3SiSllj9_EaR7YRtHInCb0QggIb>-Yu<&$qOH7f-gZA z`>?zdgPjD-AC#;&Kcd&2+Vs$<#xk-7F^BT+*jPThJuiNEx*^bZz-mPvnB`;0_g~jX zx+Me!C5TBcefl9lDCLC$(&@r0KqR|>~>6|a+|n-M4c&`*fb$La|sBiG@YZB+2hn;l07O+)isUS8iM zD(&y|qtOno5X?6wns1G~IkhBALGJ*>J_YK(#@#-4>h6KT&_5l zVObUg*L`Fl`a;F>juj?Mxv*cYmc@F!6>$E8V{si;AdDpcSj3y2@~?o@+4$cy+Flz? zZVj>{@>M9632lm?aY$W!9BG!M#)Z96i%}BhB#u43I=NKc#^o5l3@UsksEK?lbfMb+ zD>FHpO;Cr?ux-}pdk+OFt{#>O0YUdNVJgjQm^%a~#s_BFKds|Icinre#NJ(#o#1#| z2RY&9v4j56zw39n?{5u^61xX7WIqF=y~9Q4ydec4>G01bqpu zXEH>G*J`L>#!7mv?I-RqvnvZ7z^|YPyEq}C^)&R3OPd)_yp(+UB9_tobmRDa9+23A z)r1JMtCUJ^x6+P=n>r)?}5kq|8zf);JPN4+9_Wl5{dZN(|wT>jtG|;{o2J z8ppqS%OVBH=GArj4)|Mz4($^ehuR6$sVv0_)W|So#p_e`;5`NO`=#rCbPkd(xBv5J zq5Ix2|Hw}18$y=2)&fc}MvKctnV`M!7` zUhNkT`y$gJUg78Mgv7}Mi!huCqMK>K0Da&@s-J1_^9q3qCJ!J?!hA(q9egl?cLDWq zzThu8{TNR_yzi1&=Hp@F>7ufz9!>piu-Hc$vs~39)0fT_+KVA^osZa9)e`9N&K(yj zZvL7GT=Y^vy+pk|CB<)#Bs}e%3D6)c@AB@WD^-_e0MkLg1bf}1X|DrUZny&1kB1ZF zTA!U+9Ke-sodc36$eud}6&dq$l}Vz#xpbVyTfgv16PQ(Bp9Q4r9*J1Cw_c$0D;HSA zcd7dDaVg(&F7L$Zu`U^6>lz_MziqT9z7jgj2tYqp)XnuX1*zG#7y8O zv1f-oPK9eTazsWmr?h_Im)A-L*BDe%ZqX3XRxf%uFZOl_R`N0_TsHtVNftRN78kOw z)&TVYJAkW=%+sz2eN;8vMYeD=o8Lu2=~vY92zH+Rb$?(1P%%)|7l4ky=!fb(>uoX6 zTsU$XHaQpA^sP`guO9F8rO``xAY}S(KsD6dd^5>7k@%=(it)vnL>fM7M^_)cDcR4D z?nrW1_}m*`?~+n7F=>poxg6w$uRC=(Q%}7kdee`^rn&xiXlTuML&Of>9tkV9phfK~Wu3Y2V7`OY{6zH-ZyzVDb z-n_~vyzv*l65-|5%r8*UATJP1xAWqTUK2Ueo~iEkMB47cG2Q(pD%Bk{Ka^ag^VKvVfFs z8cG~NlF}0n|7sVlU=P#1jn~r%vT6c9;2Mb8ofhbYJQ1<5b9G#fk5*sG3IjgrF6+f8 z$$QDv;*?4x0VHmOwsCf2?flO4c#jv3!$2-dcJ9O!SR=k|kJkcyb1ZjQSUw$)Xc&qn z+}wc7F#Z6XQwT7y=CJel>NoDNv$Pn=ge75t#I^DcjLHTOA_n!$hzUN(=Mz?wpq4BQ zTxYqMf^5Ve*}*@>PxqLr_4^D301E}0H<~Q`Ddd>xn8{x24VNirO;m*OTCcI#dP5Y7D*E|lS_c=%h1d}R}Fv{+{ z=zUgx*ZtCehi2Jp4$Rf>^0DK8&PFL+C{HVuO{;Reaj?}(LIi9ST8oBJy3wl79H?TR zn5H{&z31{sKa{8|QkUd9?1ns&-Y5K}p<994@e<_=v9<%ahk2NRX#fqmw>YKDAdxB} z9BDKN;q=`+svp8|rHc{-qa5;uIjrz!)5Bn)hnv)OD*4o=mNnuv#?xs?oVzAG6~6_Q&;!M;!vMJw|V`5HOXkv5+mkfJ+}Mls}aRahbC!Fkk`OpvVFPvZ7K0 z&KnvOCqZVl_ZvPY9;Ko6adfv96yf2AHf|YOJgnUoQ~7wuEQ`@DQs_mSe84=A)y+U+ zEP?D7M7IczCS61LBu`yPxkilY1G!C0?i;V29+qPnc)Ducq5SBF^#}yUl|7X>;+YFg zWOY=3n#eUJ;>z3@H_3&yK6y*$BE3QLmp5@qg2PQG!2FRf1RRk7a_v|0d7 zK(fEjcf>krZA%l|b<^+mms|8mStyqpN^ugP(K|yJK=w@NhQbebYKDCa3FC46nkueo__*LAK$3+g4_4Y1j2L)iX@c*3y|rRYNe115zzj!? zM<$_nuQIvP5P<`OR4FTrpLI;hab(j#kSMM0`{=6MI50PmS#g2Nw6#Q7pTdLiil1WA zHE`Sj{c6}#VFPrs2kZv4`^U!>S@!+22J6U)is>T=phCcVxA)ANO< zE^IgOR3Yf$ZZ2lX_=B`*4j2rlvM!>KMM6uQ1BHS?IE;>g;Mxq036}ifftT~zeqSRR`>CF$5y)V$c# z^X%Y(BlHr1AwWk7%`kN$9mRjme>B@B(`ICc=M%bPXG2;JyWq%PFQXF;N|-v^ZEvvz zd^)p?%)BQEWRI2A_4*SKVhw}w2HR`^HLnE9jdII&!WVoKBxPg}euOoSYkV1#1wmi9 z!lL?l_7UN)vGq~BNA~AFnd)v%^hm+m@MZ$nM=K0HYOcEoI5nosqQHmbr`LBN;G=|9 z3sRf!9kzz-e`BEG3qDR)*--3wQJ2`~dS<}zfHG?ccO>ruim;lk1*|h40~WN9ic%45 zw9T~E@;Uy$Upl(tJM5Kgm80zR(I7q#D@Tk@7!-z>F6~U?xa4m(Qy0*Ao=9L&dClC$ zoG$(6`s5a%m>ko^^Wi3*?TMRw{r64B%zBYblBc*tIiVH2NZ--C&sUI!5yQMVg9$$jrgHB(Dirj$Dt*R< zCbUbH4;){h;$-eA{Qg0$dFgSgV>^}9=SN1cde9x}9a0vK#u)ml^&z3fA49)UqDD6y zVjAuS1}WWP!JTQNF{H7hDh}yTrY7r(2;PM0$!BMkSbiw8o^&VDPqG3(v^ShE9lRfO2={WS5;T-} zR&-?u286_4$IT(1w603k?W`$d1)&*U28yo*~p; zO-hX07xx$e*hSfNgL?nBeinHU>guG(KGvl~{0ab6cZcfVv)crPnLkQDt8~xvNvEm% zJZz@^(O~(fhRKt$4!WePDGK`L&P5aM>oQb{nDXtVIUOWUPDMQu3Cf7Lvzqo;rTwI zv>n?$0oq4h2@rEBYmXrl$yj(|B?X^qmau1d#hgm8Pr99SCIHJ8q4b^J8u0+7!kxm8)Imy8d!HJ&}F-E$%sx4m97Ucel-a1Yd(l zvA{(1+!>w<38`|zsgdiT)3c4oCx&~U2}L)^(+E!RQ`+14gOF$mQMwO`c#X|DdZN#V z#mWoqzFY`VA343DLYy`hG#tXXHuVLx**@qjy1zBKeO8^pxRvi>BAgjD8_L}Rt`>#j zY7f8eC_mpp`)LqAr<_!X8oD|E-~hCLDsaxt z^F_3@ub~NXW@DQsm|F%FCw zo9|6ysl)r#6a*lK^V0!Ux`|)-Rblcr62R^PJ3X~MUvuK2;(vOGyOHu!)o^B1xji!H z2w^6}y@@mDnyF8MG2Ue8x zp!z^>88JZv-@q zfS|ib5u#liryPh;J66r~KANH998ElKN*%3KJKMnb5>)z+|G||wO_$@Uy##^tjiJvmET7I1pavHT z(ge=u!4vw>m;O?kVNRgPDSBRACZe#Ke$(IE%o$7wvJ9i3M|=TWI}1N6 z>;PyYX}!I$KcQh$0ejTeWgw3)YIr{?@Vk72Xjh(tWj2-aF|ou<@widSSMJ5!N$3ax zuECVjGBW$o+}7eLkhe+04oQ-j5ua)kV~{>o1;SP5v+S)&;9_hZns#mbcMQqR zIxjJuS}z=t8{4d>|0^Bn|RT8{%|R|)$Ua~1m@Z?31k zMlCYQx2jN`vD%P;ndr{=1$~ai45%~n9MCjSi6Ck#=ZJAM%=n_0?3Zc!Vw*J+NbE9v5G zh&bI))Px1+uOnZSwopJsigrJcP&6zYscLw_g>NCBg7B!aA znPee>Ng!DKinA@HGAakN-O+%$O9L0;`DQz73A6EW@s2}il5Zk9$M70E??V+*cghxA zEUi!s`5UL`ac!WoDRa1q&-0?@z+TTmCH;Eum%!MqOWN`VQG+dOYLwSA=55e&4 zv1nu9uxO0UYoth`KM!D>w`zo%xK!>YrBt13!%Z+@lVylM>W&8FM`EUlIEbjO=8W8Z zqWn}9;`Uqi4kd!!^8D&^+%{yeRh^t7)d;B~lWSWCr9c8Wv?0ZI*d;6PgRwZryG^!+ zuRke(Y{Q{mljsprn4Y^TotF-dHb}|8No!M)X9M z2$bEW21s+L4&Ny?Jgr=o|LKE5U!U(-V}z1GXj_Z#IL;*L0#C}{BY}cAjEO=7Z*4i; zQ4V{2yGRte4P1Zd8URoGCHz?Fa+o;C0Gg9XY3ivqIdYudF?tMT4d0@zE`cclkRywk zkJg&sS%|g-CjBF`vBhS{V)hbIR_ADEHX544WZS-4 zqTjnTP92JS{Q<7AnxVSWTSgXEW57kgex|SE>Z-F&d~8_nV81pEEp4@CJxgbBqwu^D z9EfK%h!@hPPnx6Mr4ikFQMBbm)GVG4`ZduF7EJgcu9J){bbp{s`~!|pN{$jCvCANy z$c%YkTSt7m7&S(%3wS1!-42a_{R7hWXM2|eguEUMVSu-V>aYb%%7|@E<-&)Qfrbx7 zepqu*x@UKoxq-BnIt6oquirxX6e$rdK`I4B7o72#)EDQq0ihZj631y>B@!(~JNyxP z3Q3Pv%q*gJKIXk>r(o6K8Lb5c>HY?4-s`7dEvn+z=AVdrVt*|7tZdZ@D$N%#Ovv_}vXAmz_mQunHL7Fh0BzdEgOxC4-nz=LA0GntforY(BvGA7 zX-uE$*hBz`9!guFdkE^691Y*sP2HXx05I zj~&l2uOaem%9cw%e8UfLdFjRz{!?|vk|I=lh~Z&iq^r6SmBr%Ye`{KC$xQDu-=Lk%Baw5m1iqo37dX8pdXh(+^R zIiGuyvfb)tnGNyVOr@hlYZ1mJI}SD>8%+vj4(%1^6mm`7UtG>`p@&No=tN~ZWQqk) zVBJT+%_T)x77;FBEh@m2>fyOoglvN6(Qv)#qR|9ew0hXDB#Cz-m^i1<{ za@Phh2k#x{z7r&EBI!2sMCV_aZTzaxLB2n8kvh|E*cBPzF5S13@at>$BjRwz=!tZ^ zXjE9&uW8Ywjj<00Vb#BniVbb0J>UeO`MH*ZyhMo`1X}{iUue zZ|e%^GPj!%7E#-uQb>_JbE3F)r`TZNs*h3LV#PF%cXa6H$pmc&a`DitKVRj-39sqp z%qW;1mz58>8W|!0GDEpCdJvP508P^k%f&~CfzRHEJ&R`Xp zZ#eaN82;p>aI{DBZ?eiFh$IFq{x1AflGk3wJ;2FYbhI_m4K0Ls(j*FrXM2so&(%&*744xln=FdW~qnKIcGCC3```Ib+eu5k3;ODtd93hvbDrt zRZ$q=0Qb}~c9WI|mWw5JKZq-3WxVY3mvDGI4^&@+l`MwaLzZ{0-eHgcq6NMQFV8Lh zT_qhvC6ui6xMN%fP z$qsOxLPe@-3(fsr(Xhdhd;xwqv6vjfBSr$9mN80{Yj+?;o*@h65RKT0d$*z=LKkV&!+j%JS6V_>^tQ^+|VJYr@m*=jNxnI%n)1u#sH8#V<_>TtI0{KgA#B6^@F+6>afbwz|5=(LE=cvL>|UG?mqgf< zZ{+__eO-eNlJ!^&DuXX(#pFQsbq@Fi!LbADvY9l*YH*aw+c=T^$sUj~siHPuLOtJ;g3pW&M_Mk)q?5x+reF^WGVqFbtqE53dJ$ zP#kNBIi$-1`eD;{>o*(W5OFv(n*h&d6B;-YO;gCKlun5IB&K>NAobFC!5k3@uBYc``n82vIh z5TRYviE3n?_0M(PU}yt08>u~1^pCoNf@l}tB5oBk$z#MV*V2HF{|w$BadPe zknUu3W2{aB@t#}k%_eN6ELFmD+e9y8tAuWs*p0KcUDbq+ zaKFgYg9|@H{~2|Ab&a(T_<(oR?bFJKwef9Opeml8JkLMeHl6s*Whd13Bk(cY9Tc0Ujx} z-#BYu+%lMT*ioCQqp0`SGV$U7wt-&vo}ZX4v13OI=C+`z8v*8L`t1&=hU$1beCwD^X7$ zktVV`EE%(>7HeT4rh^1LC#Xp3ZIE^<3Z#LyiLS8kHW6E8jLG27b@|D_O&jtmD0}-5 z0iBD2#J5tR8Yvoq-_k5gL{FXc-w&Ov<{8H6an*URVrc8Xa|=?yLsRgzv~&tVUJp%J zryd(%^})NR94fu;*D4jR+jY~21D~iBQPWgZq_zk`qkCX%-t0t%x>D()B4&FuhlISx z6Nl}YrgOHPS_fa?VD-QK!UG$y9lvNV`h$3Uj7g7dYG@e537(uiC}D*vb;qEK*nO zho-_sG~nhrk^c-I_^YPW1yb7LiIERT35(=5gfQFg^uVz@kvZwpGsjuXSme;F(P%ZZ z)z`uRK3nw6cuT!*`)0derV}D}fhtSq^o?wmJjq9!v=5O|`)2JASbRo#MHDI7P9VxN z5s0ZQ4npyPm6=>=V<5+n3 zL7S+;N|js6+>{BdI(lV5_r1vbnIqDM`IWyemVldoByiv_ajdCKSL&1qqLcQhu)wWdc-^Xe6sWsp;#7kYDSM^M0Heay>xI?xE3O~Bh>}2(=0=@W zP-tV9+b5)JQYK$qL!^5g-?`hoHMqF$b=2sS1_Oxb4vlq6LSbia5@9Y$=1eL(FV;2p zdj#F69LBdy1|7z1PV!;$YW3d~hNn8)eBWt}I7L!%pd2{4-9ZQKRj4wzI|zlVb9cI? z9fV_2-IZl;hF8zo%-3@PEoSe0Y7{z@_t?TVZ<7MQv`H-HFfL`93o*o#RYmCKYKi+d zC}7g?GFcMbGUZj-zsY>8oMDEg+f)w!x38HOm@Z4B>halY9r5W{cbt6TDQiQiI-0Xt zlteS(I%LX}+LlsNGw493c5Wfog$^`(6{9Az?w>gkdna#PWXD_1sU1Dp3%Tj^LhSw~ zmPIfR?BvwIJFhQ0@dT8-AxQ^u`*nZK-|B(aQo7z34k4R7=09Tjyr@*G2i!U3*f$)} z)CI+UO6qOi`>ldvP8j5E?431#C&jgW)k&#awwoW5Ebh7N%UT?2@J@}%wSE^nv|i9F z3DOQFhbU0IU4N=Twmc?E@R3F)y-ioJ<95AxprqmQ&ENku)WTWVvdeZPanpya-Jb9g zD(@_{nxDpuc0CfYSJZRj=3^d`1scFHW0k3&Z&cB-BH%UV+ikroH_mIYT~p$D`dUf* za$GRFeN3mtA(!l_GTkxgFTg|ZLfEJYd34$@?8u1bP*hCYYjL|s8KFctyrBEF76@?w zyw`Qg#T6t;4*$T)N1&!y4pXL7p3rg$#(RTrWzvfusJ2qrWI2V=@-)h}5*KWn7PA?q z0>zkkHI8x*k#E*WEeB(|{;iFS(u3* zGhP0ek^Zqk2&&C^z4czS7@*0>C^J%7fq~`uU~vDWP`2ooxI3$xA0HhxvzfLuTf;ko zj_yt_J)kRw^V(#~b*Ilw>mzOkWcv5D}cs=qB+&nd9 zt2DUKE~xpAylc8mdCHnCpG?9)PPF^C`CP4z2F=&6`{WlJig*w7HiPRA_L+Tv^N{(b|8rwdlnQv4W8r-MG<#N zdP&t_J;?Z%$O34(4L(p%);TK04!JbUzquG2p4Z{QioQyB9ytpp`XH5ZD){NgG@GE3b=LL0LyO z$(kZPoAeI5`{0Cp!S9J?qfp7v&x4=r6~m)fF&Ig`6BA>jx0C?O1hpIc^91ac%cs!L zm<|Ud@2E&CMEBK$CAe@!(ZH|c%SSedU%{|;5^(Q7y7mdT@bAq(6bBD#)2o>7dT7y2 zg{8%C@O!nxB_dd46FlZc2gcb-4e-Vd@6m2_qon8=8g`?~%$)^B9W+ul5tl;~zO`ru*t;7#M8(RTFxiej0kn+B* zL~6W>2KxkhA6kc^k4?oxhQ}$b9hb(t3@w3cUHRxwpWkl+SxKaB)BE2Vc6IccBziJ-t2J|XQDhajze?9uI01X}09826OeV44B5EdZcRgF_kn!r}WxrJ= z)MKY}PjL^I=1egj6XY&m+bYN2;2(qb&N0F2P&{Dp08lVc5tx(Jan!vKswUeb6_Xob zcXacdQDb&b-@DJFMT^nN+hG>{R<+#b7C9Eo_2;te@lR^mRnvCY#kNOuAR0+YE8=H$ zuo)}{dRPJp6mlC7(FfiaGC>Qd<>5r{lhJ$<`0ApE2(Lt%)8t_@9mZ4Zcb`<6Df<&U zJZ0K5APu#9DI7~+-PY0y9LsvFa+4&LEmFmjeYCu zg;&Lf7B}C3Dr&H&zXxrKHZ=ex2Saw1!sy~VT_d>PMZQ%}O=^QmL(Iev$v zslV~+{wxExQlI%3ZR|1uz1-S4srE)kLcqj+AI&UHTzkOC)tK!2#>or4!2h<{Ay!zK z6++BAlo~gw@?qfXhJAD!B|ZFfKkgOak{fgZLvE^7^zUSBjfL#cR>Hj2Kc{e@&}2m; zl00*^tSxerg4MZC?Mi(~P0;Jg(r?Fr$XBjuFt7GflQ$gb7>6c!u-^gKN$3 zek}K05kIpSOpZax&l+Ycv_w$)S~0ZUxdn?3+vy0h-J>}{@URkoj!1w|c6?#S?9uVx zI!ps`rWNKnX@_l}-Qr&~w<0Edt?*-#M zXcZq)XvTzvM{bA`t}}|1<1?}YYo&*LSi?r;h*?I4=bHD71)x2&7^v(#L&}-orzR4% z+T|z+O~yJ7Qc-tQ8o_3Mho{bjrvGRW-O6g(2q3Gt$owxfuP!KA{uB5%c{4o@;&Ga* z_J>ECV&Kl@o9hM|p&hOkA}6Q4VZVD?zMP#XXVV;tym2jJ;%;c*Dc%yxk-w5%y~rhz z)e3xA$vnvdFv7BAcxHt&eH z$Ei0?mLM#-<`G$dpBvFxwuajz$Y=TS_YGv_7zsdG9ncEpxsorQNCcA>-&%Q+t3ue0t3ZlAH7}BMutmdI475Sh?!Ko)5xO7ue5k!;aRQ6*&f7IqZcn-@e&2BY4_b~tUxPVS9P&_fdvpQkI{-ffFaXu#$3_umZ9;Zmql=`U3b!->q7 zxp|Ina&;MOr|0(a0-mP#oj&fV4yS~}>yB8KS zxJJ=&fQoz7n_H{z9Wv4Bju4QMUxvx}$+mAj8jvs*SmL?HYHXT=FpnOMoV@=->6W zDfSj2#aDYtRm~=KxABJn^^74=P>}JLu82`!QXJEcaN|r5qRO@6C}ME+;!jNm?3u$u zq%DGa&)sV!0}3sl{B{}-wopr^)F zLNaI7Df8lK@Cid5*I+GF00dcJbeq2jTh8f`xsA`V_l6uiafQr{IPe-zqyW*nL&lR~ zt73H?jbj4O#SP9|w9ssl2XM!J*hL$2X+$?RmF{5#@o?MqgL^@pl`uX|SKcHhNk`Qg zM#vD2!&gP3KY;r?BW{8&o3HNUzBim#=lupZ9Da>ffY%*&Sn#U)RVeUR|8_dSwj_Mk zV^Z+onUp6%&HvHrW2l9Fx)U&dq)%1#LtkPZpAN0!0QyhF&=!QpnAm&jQcEX%QpKuC zr#;XkPf%*3=58hfTlsSxS(kwv;_*oq;^KPB{w2YE%%OW?^k?j2%}R}y2rr} zup*8v=(D>|h`etU`m37d_@Dh^hXcgCC|)iPj@QBh36}cJ3sBc-x$WJD)HH2$VeR#O zfs<&-l%a(Dpze9vbMuTVl>nH)7@GC*G@{8v&1~xiRJj5A0TYU*Vd2OT`$vJnI34N86okB%xtXYdBTyV{tU{1J^@TicQ`u=cNRj zd+o0JH?gxiPPhZfNFKI@J|UXQyjD!iPUw~u(Pp7-U7MxWH}EIscg;pv$Dz{a{~<^F zw&g8sL6GFgda+M2wno;{p180Ej?#t(k?SEmOgC2gGAf% zuEV53aiGb1EX%g}2p8YMhmo zhf^3Y*mTH|%3e{-3M_c-2CdZtHXNPtZ-b--;a<6#a#8|>~a|myYa79zG_zI z#l__jM2vQlDe=)owYkSATJlmFffHjXwn3Mnq_`KgizinFS8H`#LF zeGaTD;u%GFjypYqqb50{)FDDUx1-;f*zgUoSY1J6CoJg;vkhJGq9*!E6=yFR+Jg)) zG2#9qZe2lUHt}bzJx2P7zcvp8x86`tL`K&iDPLv%woL#Jr@!0uP+%QSr#rtnLwHQ1 z`Pt+Fld4lNbFFa(&f+}aQ=Gw^=Uj?AezU4fjV1rKys{xHmuG$CSIL9fkE~o-)0RC- z>c}j~gIEc(|vr1ycn*GGbYN908al&{xaRxE86K| zju~1ITQDtl<1-Oj=J#_uwI3M=Q=zj!?cN@bUvqq11t7~|Iz@|JlhYuzJ>eZo| zBNqf5bp*pBlkkNxFbkZ=_^BsFXYXX7Jj|>;lQ}ioy#{c&C__g8Zzr#DQ*V!20&rrp z7RG8qb_7OD&Rn4ZG?|;odHhE~{{e5UI@GzgY~y{~0b90h7FE$c{1QaX0+&;`thRwr<(^bV`TB7c_SsI3zrIzQ6Cs5q z0_Q-f7b7QVJ{VOMeq!Ikr+V(O?IqWfyXq+>d_zhVXb|lh@@Xw*24!NlmU&!bd+P-Y zT@9B#9$0Tj&lda@M4?`rVB+cWh?phI+X8P;e@eQXst|97kc21Z12T&1mE3nd|Hib2 zh!7=^hEb{}XV3_zl8i<%AyosOh}CT^ZoYoJe;MxE{?rGV&1$xjc1kV^31sDbkDJj4 zv1$_gAT5~YtAa|&qQTwKV) z!gWBL+njXfl)y_Z~FxlUigcKsO6CfqO;tQ3cprnII9vAFT^&Hi@7(4c+Yg(u#XZ+P{^qEt=_y0k+badl9sSNg(_@7ht>mazwA@mtUMSy|0DSkf#b^}^rMxbqUYCcG5LOu=>{k?^}s@A(vlD9jd^O40C z*0x-=G=sn)o&OT`eLQfS0x~L}gi}cDTj_y7rmYXD1`b*O_7(&;mX!26_8wFV+y@C- z?>s4TECi0U$!INLT?%k(`XYLj^eg>7mssePCfBBjxSt?1f-s&h6kNlbtN!VB z@G8uH-HU6}6L{k?FR?bIJe*an(?5o+UNb{a&}xc-EPW1ab)0=s$8!k>PUL}l{dE=N z5^Pe6UW^DM-&T&b@2l;W+<&bu@PbAQa^vNX;^U#cn1;7iLhycbZc?}>O_$5VdvlQd zWUXu##Nli*`6&b>^o2}pxf!J?s>*fm15Zx~SCqpfsl40wS{7*OVw7r6Ue;<6t#qE4 zMDn3CXhSXgg4K1V80#8-*RVSP+bBf`%6)4(JPleBQ1y534V&`1ido))fB84S%QDq@ zN`DM>el%(Ktn9GjJwOtY1NPEuz7efJBMd};5GfV4+nPeK=pN||TAo*AQJ=Xr%UiGz z0ysLagT%voXWf}@o05>h#(L#><-l^3;uYT^jw5N7EX=t?NIZE4MjcF#DgkyG5cd76 zdtkFgQf%x0pcU#Oor~PtC~5e%L~ZKySInIp3e%zdTC*tc5O)rNq0R6RC3M2=@5{e; zCX5my%9kneTl*LU0icV+b8#yr%q@@-JW814UJ3!GpD$V3^oKlHJl%!V#^}gsI(>jG z$ux_@ObXC;lD#YR4b=_3mM4z$C1bHpT==er?d7?usI|fH{`3ud5!_i0!TYaOmkI^1 zoNXEl4D~%M_wz&aQK2mUY@;#)ns(Zk(j4X%o%F6$aV}qWaUgX5gnml$=!dlSckgDx zupR{%SWF&JXsi)3a|W4#o{=N+-zSIKs?1HZOam2;K5b~y_}>@O=S`KV>fm1GSA|W6 zYd?pe+@XjtwKb>wgB8*p%&>cU;<*8WK|R@@Uc;KKSF1W#yN~!&I-MN z#q|-dLT}%@q?jd@0V+@(Nb3X1UIgc>P=g!15vN}ET49#%pUZvjU{;27vrbr{fVW}l z5K}dz%q}}($sk2M7UdReFOq5g3>zZZ@~v}VpV}+4dbP3PPmI}C0-B*;-FjyI zRVwciP2wCs*k$m7Qh2hjwaALecqoaCs?%8zY`+a&@tnv*#oWOu^LRq}kw_aas2+UL z%kVKDa`Sk~KNe&l6cwQHs_i{keN`9rUNl$4@J53=TPQRjC%uMf(fmP8Gt&LXy6IkkV`p?+aexXz;hpnbNoMI2+&aB>=dE!%w7LJyzvW&h{u5GB6Ah6`DXFl60eN4Aw_%;LI8zkTR zFFk;Qr;{)BD%utv2}{EOf=Jm(xDEM`&uh#3O4Yxl9IFF^3TPVA4I>4Ta&Mo*{*2?z zdb>%ngOzRGM&Z(aCgYLX+&3#2Ew>$(FTWnq1F89?iL2`cYF;bT-aykpKtWT zAs%@(UMn?1Sels&)lJ~N0aHN53?0ox`rh>{A|Htap^rjrKZ(`HK#g} z&`}n26gzWVVvyo93e*bG*Z@P0-jbtfShmQL}A43S6l?_bF_+8*@)(1jXM#yuz` zCA z@2ox0@#Qy+QXmJwj}SH1dc(&A>tPlwY;#JQ)y9M23cO^F^1M|%5oAbZ)kvnEE&MvY z(E#EG3a7$9avC{Lb(ZOj{OB2t-6bKnzD6IP*b6M5mZ?sv;C<@%XtSbv2bpHh>`5)i z6eSpE_5Pq%_>(Q32m4?*Il}4JY*CQT{KxJ#5L!u8C%dpMi;wKSbk7$wq#-7URa%#< z)Q`_9*|w?_HWYJ1bX0nGg|mye4SR}ntW>T{aQ%PoMpySVeA#$1ggSJSJDLapcNi&$ zGPPJ^%<0p%j>WV2q)3KgVL*TG{27HJkCaNaXJbdofoVK3l?cI`D{b8*Fx}gCqEdZ} z5ibJKC`OHy0#96~`;%L20KBK-^*#tz+-KSUCeF!X`G1KT13PH;lA>9^NF<8hpmDjD z6H_4QI_W0hzWo%*f&qF<&Vu(I^4;wnaea%f$K5IW>{ zdA`Q_blNZITXo_`9QGF3#hnDmOdMHg*M3wriZrL3H=W6zxGrdLex8k{OSvoAlz;oG z(=Tb5?cV%Jdf%jPoxY_1N7rSM?V}2$RM|Rk7KW-a!2%!_)V4$YHUxU6sXF!Bs3Wg0 z72=<5CVbNqGPfboqP>P^qCD&~ZZ``4&3jJlFQXlc5b^6nyTI4$N0X|}V4}yBi_>A! z&5GJyTE-8(zmZbbaqiS5wbVQ2pfJkQL$&M`BNCMtK&R+!bdO{~@L|0wr7z)1`q@HQ z{(4?0xe_1b=DUDsX70udZ*cx%ftJ*3(ma@1Dx>mO#K zm^|6^aRE6Shqv7xt!TtUBN@iTr-^zlGf}sVD47nt(@V+UXIhvA#z#)E@O;b z7DB+l>{@rKh-(%mo7}v14palHd^U~Wn&M%DNtd0vQQA}~aj$pWKX|9vC*&Hbp1+bJ zypA5nZzx@yoMb0!zAUu{RG0@~_T8(SH5Rk=x0j8geJ5ThLg+b(Ksi4zyBw-=@SH&z zWoR$|!V>?VVDMD4`oZ@6m5!7Ik$L>LH!ym>{sws0j?hqIyCzrZEs|AKu(C=i&mP&7jQ;NUu%{3p4Y)KvTW|JZQ+=fQ!%}42oHz zvr83;2K#LYz{oyilIvkA*k%HhSA3Um%QAI3lr(86|$170s{ZvpCzWG2F#f(BL zE0@gX>UIsJY}X9aK?ZcNkGyDXGHAl}f=_1anOu}cnMbX}oNWIZ=SI@TAjTOCBr`MD zyi6!7mQ-k+fpCiTxsPEnF(B?vdQ$2P&*6VkpHn9g}s4Qo@!GwTrEvREv>AXi*(dfMVF2A6;)$gd5?K^9KgWel zbI8!d_+f6JFb%d%m}NT7J9e!~bp(^7LBKhsvuBC4M-%&8)|=u=Ruz;i7p@|auzqUe zXn+1=dOdm@p*&b;bBP^dhx2k4i!!A;tqohufA?h>57YG-IrGq9WqWHCP>FA31z507 z9V!~bEn_-1`ry#hw+|7)j=hrcLx*hG(yK3jJO(AK)T<^l-Ofs|U^0D-3;}hm5Qc9K z|G(JikDNSYrm#GfZt)}iR~$#1%nUR82f7-G+n16vJ1V0L0nH1}vI8ebwFjR#VFZ|3 zl-zI+V*@Mm6KU+_xtM_p#{&KGonWewkRP_{V$x|~ognA?FLK@H|L`H#@{S%~zl}FO zB6hSMBkRTs8J0x*-bmFDQME4{HNrTnyKJPjZAS;~L1qfIAuo0u_on8T{*-loG zviXnmLFwPdmS2}fjvy#1a-G=^|3pi~b)qhCy0`<8jtDo16=DpwP+-NRV&PKUCp)AQ z{Z^{86M~O(AD%EAiSlq_VfDlK?pd&}Zr@7wd=%=9#YY|m4ErEtP97lgem8(@dfBvK zEB>Z=A_RQXcQ?&WrvS!@|DI=m`ZCnRX=U#F1aE{^_onx%VZJ~dFYRk$$XlYvEk@G{ z6YWj$oKO@Jm1MbxVA_qR_XIDdw3t;r5Y-za)W89Wa7@4GZ(EYo7Blbr_z;UUWyW z_}ae=EZD%pu36*U=(n5xppFt_)MAMd+PxY;uyvGD;3crKP%2yP-x?CPB;kGoMHSpS z%dmEysh}i_;yS$<^*@oPm0OPWRQ9<(VNyQb?jKt-DaQVtXW!{e_=49ff#(JG*mmt{ z%?23$svUhS9T%PB4g7kAera@z4w$gnN;l%u4N|yml%Nn4&%%m_miIi=>6>Dx;bVAH zrBZ`TjRlMZqBk}`6U?&9gd+>LO8`RY++m9;M9vgia7zNPclpqe=3i9i>18n2Vh(PX zfIwPX0my27-fzKlxoHLCSPeHF-$0dVkv@2%ETVVyP-Od8XMhS}xN8%O!@CES z-ZX;U6_-eM`tq!8n{a^_3cwWJEs*2J#=w_1wg5bYrmH_m@Iu~6|w8vW?Wwu!<%?rJDI>KC?Ve1cg<)jqM9Tz`eJVsTQ&!Q!HO73;{tQ)H3xBK zVbvUo0$yoLZMzhkXFpL+NJI2 zVWLCI`3g3|q|EnqQc9d29mfDT)#01bO;7{*lbXa!OvYpdE2B0ee~X8KF%jb0O7}1U zWDT40TSs#rC+%inO5T@t`{2n{ean9tw0&AK)&9`Aeod~`?5{%uHvksUSW&HkiWD^Ej9=R`;nRXIa&3G*#;5+fOqr9f^2`>h z`iw%8X;eQ?aB2bZ~t>dF5tF)ADQq=5Jc) zZS1I0U*szW;QLL!#0AsY))bTG*}nJgew(E8Ha0REB}nWmd;w+*ne#Dv)La8xN3LHb z&+wF^s7)Qn>~w9atWNY6Ij96C1mIJ3xJqZVRSKUec5l+5$t|&Fjptt)D9{oGav_<- zh=E9A5%M|itR4aBb~y!)aXG7)>w9zbREdF#P2&q(1>(T^Sl3o|ELO!4tsNIv45%b>++|w=W1ah}sI7$Nqm|3=m(Smjk$STJ0Ca&9ro=gA){$D%N557(v*qRZR$z}ot9!`vR zeG-W}&3^*SALnNV%InT zt79Z^%}GeTwjWy9H&Sgw+(kkvTuv@27fI&=tESKyfMn#$)E%p2-(u&+E5Jgp%j|;> z1;AkTwa#)RQ5A1KnEjuGCN-yKTQ$;A;*3~p=V#h>D-f`*Re>$bfQcix@rwQ; z`V{DQ-J1w5Z)9lB9HojIRnqJ&9ERzKgkA6Vc_<>cN@BQtG{oLhw1=%3K7xzcTQ$eb zr$7kOQkig)Y0kB{knZ&6%l%=HtmZt#FHKUf0!cQTkwq#2N-KbFYo03O?LQa~DYtLex-6X-$zfxRX<8{HiLuB5l>|oaEm6VVjQoZdxAmW0V)x z)n)G@c>%XIY_v3dX9rTOJ=IDD%#O_2+u}~W*Oq@n_NIGm0lS(e*gR?JTZczc zBC0edj`HbP7%;L87u78n>^hWM&MJ7c2l*$Y^WfzVrH zo~Pnr^cDIRQl;0LraN!dUpz|U^s2rfn85)MfSEDy>hzgG6wnGOms<6;28Ot>>w_RV7)=UWnPrcQ@Yj7f;FJjECte7vNhULsY*79i1z@z@>*Sd z6j+pWMWU=Cm!%;sxigemUjEw?H?-42FkWBcl~x{_vDt=t&hE|>Grc{11sJrio^AXFFaH>f^%@q4&`h{J;ZrvZyg@0O3{Ku9OCuOfJi~q4SAOIMQM?%z?sR^w1yuUXn;XrRoMDJrz}(>C#m z^b>3@Gl?vJ5|PoR_%sYU_n`2ra)Hf=cu<*Tc%iNXPXg^oanan|?#WcxtA_r#zLvEx?Nq8@5@ZD&j83*-<<4wFcS=pr;d=vh2ArivXAHkw;);yNaHa>m;Q9U(G?W@1X2XDe-iWSp zjg}-F7{#ukM+^K=BwFNFZX-q377fa);o(uikcX# z+95Ex5IWd!{@l&#;HkJnLJ((2xw0!u0l5#7tcFhUbU=+isQ`2t6N*vpmlyll#F> zJYR8Q7+FQ!^e8el74+COs+y>ndJtve-fkraj)4)Fv>6Vl65HB^-ql5xt+Ct0L_q+ zquN4`=;(m_Mx#Dt&q5LN13VHg;+4Y)a-20PId22_+6&Um@(jHuD!k0nL8&aVh=;k5 zaH5gp+$Z1YXVjaefHpj@ZTd+N#b}tnm>=@@$1RYop;`Imkv#`K+J-DI>-$_eLKmms zAGNRqXBabjB|qOz3xmCCFu_8S6#UKKh|r?)6aNxV=Oc3auJFsLDuEqtb?p7$r zF5hYGg(&URwXL6Fm?pWjuYC=*TEnR({BJK;?*=chg`PIvjQC9eQoh+x0_!(uLE73J z<@Qs?fOd2ebs?Hyznhr&+hbiIE!8uJEa(5l$!2C!Xmjsi%C7V*8QUiodG8$YMrW53 zPpQAEhTlHZeDD$#bP{dZhi;oV6;95gp!bI(cqwAX?3IO}@qa?_Oc9<;kjjV(98rcO zu2<+>I}b;{u!H&rC$PLOLJ)HxK=@;W4jrg5vyR&AWnRR_bOo0+q<8pnENUM2b?TFgPdql z41k@_29z*!&@PvBHFWGJ9e3Pr^AwJrQoD6;64>a;>KffO&fhtHqwy+%UQHyR?1&yO zuB6a9KRK;Osl^5MDh%|S5ICCHWH>+PEjisNZhZrEhG&iNM}oDnnx0*Bu-}YwR(U?k zB`Yc})_o>pX41Fm*HQOfKW_h=J;q5+(%~+t8%#ytF=sU;^4y}{Yzu_ut+OI&{(YuN zvFjLx(I%w~4{KHfJBq%VCdbg2YN%_EZqjAzU0xxc7*))C2N&Cdn{gPTxD%ugL$IDs zNTRM-{>`TcBlYN*LNMK1yUo)ts%)CGC*T&Yh1Nt4p#|kRa?3iUl_m?0tKT3f5D)J+ zF59`u3QgN%7H<>>2B=-QtyB}%6S|7gG~!Z>qaGRV1j&4+l-q3Dxl->BwuLAr$`CvO z(RLWEb3Gb0(136;!i5Jkf>w(9!fu^av_n zAbIn*lx?{AY1%j)RG1#RI&LXcF}K}Lc}G*a-?{yCe~b85fC@3{^9VNmi@}y~7i^dd zi6(sbr{{C+m3lMJDjIkAQPK>vpX08S)fO0@!pKVyK&iancJ{$#cAD)51C=Nay4S34 zS1|YUT=)KLd=p2gPL>Dp_rq*;1h2(Hfc)fYbGp5(WPU3hWyQM)?mb!K4Av{J90%mR z8b^nl$-L|@vmtc_L3Y#0o~osNBV8cI)Wi)Ld@4>cR+FT40Eb|m`>_12FQD%{1Quoe z!MndISJ%U;|DIUz*D)(|TM!(qO4nM~@U@q3b; zqV=lE9Mz}5T8HXFoQxHcjQSf_`Zr96gP19t6+N|QEh`{`nPE^}*@y9Vz3(}g!VEK_ zCS?5-bpQu?@rf!NGmlWhg>QCZik55cew?8{epGI z=COX>hj@&haXv8)=eu5{`fJ){B7jvwzsPY}ODPC0q_iXwXgZ!KW7&~gcc zrz1mj`};oWa@sNyL`8}(SxKeV^EK0{1lngd*ACehhqjS3FMp1-vRvgAR~XXh;~ z7*lu0orcc{*Q{>P4&7~b7*cUlF>AL_n;zSB-Iz6eK09XtF D?*{dP literal 0 HcmV?d00001 diff --git a/x/wasm/keeper/wasmtesting/gas_register.go b/x/wasm/keeper/wasmtesting/gas_register.go index 1c1a319ba0..d1975f7638 100644 --- a/x/wasm/keeper/wasmtesting/gas_register.go +++ b/x/wasm/keeper/wasmtesting/gas_register.go @@ -14,6 +14,7 @@ type MockGasRegister struct { EventCostsFn func(evts []wasmvmtypes.EventAttribute) sdk.Gas ToWasmVMGasFn func(source sdk.Gas) uint64 FromWasmVMGasFn func(source uint64) sdk.Gas + UncompressCostsFn func(byteLength int) sdk.Gas } func (m MockGasRegister) NewContractInstanceCosts(pinned bool, msgLen int) sdk.Gas { @@ -30,6 +31,13 @@ func (m MockGasRegister) CompileCosts(byteLength int) sdk.Gas { return m.CompileCostFn(byteLength) } +func (m MockGasRegister) UncompressCosts(byteLength int) sdk.Gas { + if m.UncompressCostsFn == nil { + panic("not expected to be called") + } + return m.UncompressCostsFn(byteLength) +} + func (m MockGasRegister) InstantiateContractCosts(pinned bool, msgLen int) sdk.Gas { if m.InstantiateContractCostFn == nil { panic("not expected to be called") From dda8cbb84ee718fa78e7d535d980a1068c25efe8 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 31 Aug 2022 17:27:26 +0200 Subject: [PATCH 41/94] Remove obsolete cli gov params --- x/wasm/client/cli/gov_tx.go | 30 ------------------------------ x/wasm/client/cli/tx.go | 1 - 2 files changed, 31 deletions(-) diff --git a/x/wasm/client/cli/gov_tx.go b/x/wasm/client/cli/gov_tx.go index 15a3ae6f25..d544480795 100644 --- a/x/wasm/client/cli/gov_tx.go +++ b/x/wasm/client/cli/gov_tx.go @@ -85,9 +85,6 @@ func ProposalStoreCodeCmd() *cobra.Command { cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } @@ -163,9 +160,6 @@ func ProposalInstantiateContractCmd() *cobra.Command { cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } @@ -226,9 +220,6 @@ func ProposalMigrateContractCmd() *cobra.Command { cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } @@ -305,9 +296,6 @@ func ProposalExecuteContractCmd() *cobra.Command { cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } @@ -365,9 +353,6 @@ func ProposalSudoContractCmd() *cobra.Command { cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } @@ -426,9 +411,6 @@ func ProposalUpdateContractAdminCmd() *cobra.Command { cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } @@ -481,9 +463,6 @@ func ProposalClearContractAdminCmd() *cobra.Command { cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } @@ -540,9 +519,6 @@ func ProposalPinCodesCmd() *cobra.Command { cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } @@ -611,9 +587,6 @@ func ProposalUnpinCodesCmd() *cobra.Command { cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } @@ -718,8 +691,5 @@ $ %s tx gov submit-proposal update-instantiate-config 1,nobody 2,everybody 3,%s1 cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } diff --git a/x/wasm/client/cli/tx.go b/x/wasm/client/cli/tx.go index 662758abcc..5325347298 100644 --- a/x/wasm/client/cli/tx.go +++ b/x/wasm/client/cli/tx.go @@ -27,7 +27,6 @@ const ( flagInstantiateByEverybody = "instantiate-everybody" flagInstantiateNobody = "instantiate-nobody" flagInstantiateByAddress = "instantiate-only-address" - flagProposalType = "type" ) // GetTxCmd returns the transaction commands for this module From e54d56e95f8c9a329e1901d982cee21ac2d24469 Mon Sep 17 00:00:00 2001 From: jhernandezb Date: Wed, 31 Aug 2022 10:58:42 -0600 Subject: [PATCH 42/94] add params query --- docs/proto/proto-docs.md | 28 ++ proto/cosmwasm/wasm/v1/query.proto | 14 + x/wasm/client/cli/query.go | 30 ++ x/wasm/keeper/querier.go | 7 + x/wasm/keeper/querier_test.go | 28 ++ x/wasm/types/exported_keepers.go | 1 + x/wasm/types/query.pb.go | 492 ++++++++++++++++++++++++----- x/wasm/types/query.pb.gw.go | 58 ++++ 8 files changed, 582 insertions(+), 76 deletions(-) diff --git a/docs/proto/proto-docs.md b/docs/proto/proto-docs.md index f6c0182b6d..b1fd26e3f0 100644 --- a/docs/proto/proto-docs.md +++ b/docs/proto/proto-docs.md @@ -71,6 +71,8 @@ - [QueryContractInfoResponse](#cosmwasm.wasm.v1.QueryContractInfoResponse) - [QueryContractsByCodeRequest](#cosmwasm.wasm.v1.QueryContractsByCodeRequest) - [QueryContractsByCodeResponse](#cosmwasm.wasm.v1.QueryContractsByCodeResponse) + - [QueryParamsRequest](#cosmwasm.wasm.v1.QueryParamsRequest) + - [QueryParamsResponse](#cosmwasm.wasm.v1.QueryParamsResponse) - [QueryPinnedCodesRequest](#cosmwasm.wasm.v1.QueryPinnedCodesRequest) - [QueryPinnedCodesResponse](#cosmwasm.wasm.v1.QueryPinnedCodesResponse) - [QueryRawContractStateRequest](#cosmwasm.wasm.v1.QueryRawContractStateRequest) @@ -1083,6 +1085,31 @@ Query/ContractsByCode RPC method +
+ +### QueryParamsRequest +QueryParamsRequest is the request type for the Query/Params RPC method. + + + + + + + + +### QueryParamsResponse +QueryParamsResponse is the response type for the Query/Params RPC method. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `params` | [Params](#cosmwasm.wasm.v1.Params) | | params defines the parameters of the module. | + + + + + + ### QueryPinnedCodesRequest @@ -1204,6 +1231,7 @@ Query provides defines the gRPC querier service | `Code` | [QueryCodeRequest](#cosmwasm.wasm.v1.QueryCodeRequest) | [QueryCodeResponse](#cosmwasm.wasm.v1.QueryCodeResponse) | Code gets the binary code and metadata for a singe wasm code | GET|/cosmwasm/wasm/v1/code/{code_id}| | `Codes` | [QueryCodesRequest](#cosmwasm.wasm.v1.QueryCodesRequest) | [QueryCodesResponse](#cosmwasm.wasm.v1.QueryCodesResponse) | Codes gets the metadata for all stored wasm codes | GET|/cosmwasm/wasm/v1/code| | `PinnedCodes` | [QueryPinnedCodesRequest](#cosmwasm.wasm.v1.QueryPinnedCodesRequest) | [QueryPinnedCodesResponse](#cosmwasm.wasm.v1.QueryPinnedCodesResponse) | PinnedCodes gets the pinned code ids | GET|/cosmwasm/wasm/v1/codes/pinned| +| `Params` | [QueryParamsRequest](#cosmwasm.wasm.v1.QueryParamsRequest) | [QueryParamsResponse](#cosmwasm.wasm.v1.QueryParamsResponse) | Params gets the module params | GET|/cosmwasm/wasm/v1/codes/params| diff --git a/proto/cosmwasm/wasm/v1/query.proto b/proto/cosmwasm/wasm/v1/query.proto index b7f7a0627f..41d959d800 100644 --- a/proto/cosmwasm/wasm/v1/query.proto +++ b/proto/cosmwasm/wasm/v1/query.proto @@ -58,6 +58,11 @@ service Query { rpc PinnedCodes(QueryPinnedCodesRequest) returns (QueryPinnedCodesResponse) { option (google.api.http).get = "/cosmwasm/wasm/v1/codes/pinned"; } + + // Params gets the module params + rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { + option (google.api.http).get = "/cosmwasm/wasm/v1/codes/params"; + } } // QueryContractInfoRequest is the request type for the Query/ContractInfo RPC @@ -222,3 +227,12 @@ message QueryPinnedCodesResponse { // pagination defines the pagination in the response. cosmos.base.query.v1beta1.PageResponse pagination = 2; } + +// QueryParamsRequest is the request type for the Query/Params RPC method. +message QueryParamsRequest {} + +// QueryParamsResponse is the response type for the Query/Params RPC method. +message QueryParamsResponse { + // params defines the parameters of the module. + Params params = 1 [ (gogoproto.nullable) = false ]; +} diff --git a/x/wasm/client/cli/query.go b/x/wasm/client/cli/query.go index e7a21167af..5114d56832 100644 --- a/x/wasm/client/cli/query.go +++ b/x/wasm/client/cli/query.go @@ -38,6 +38,7 @@ func GetQueryCmd() *cobra.Command { GetCmdGetContractState(), GetCmdListPinnedCode(), GetCmdLibVersion(), + GetCmdQueryParams(), ) return queryCmd } @@ -540,3 +541,32 @@ func withPageKeyDecoded(flagSet *flag.FlagSet) *flag.FlagSet { } return flagSet } + +// GetCmdQueryParams implements a command to return the current wasm +// parameters. +func GetCmdQueryParams() *cobra.Command { + cmd := &cobra.Command{ + Use: "params", + Short: "Query the current wasm parameters", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryParamsRequest{} + res, err := queryClient.Params(cmd.Context(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(&res.Params) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/wasm/keeper/querier.go b/x/wasm/keeper/querier.go index 6c4e45430c..8cd882c7a8 100644 --- a/x/wasm/keeper/querier.go +++ b/x/wasm/keeper/querier.go @@ -311,3 +311,10 @@ func (q grpcQuerier) PinnedCodes(c context.Context, req *types.QueryPinnedCodesR Pagination: pageRes, }, nil } + +// Params returns params of the module. +func (q grpcQuerier) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + params := q.keeper.GetParams(ctx) + return &types.QueryParamsResponse{Params: params}, nil +} diff --git a/x/wasm/keeper/querier_test.go b/x/wasm/keeper/querier_test.go index d9721f91b4..88ee6d3aa4 100644 --- a/x/wasm/keeper/querier_test.go +++ b/x/wasm/keeper/querier_test.go @@ -655,6 +655,34 @@ func TestQueryPinnedCodes(t *testing.T) { } } +func TestQueryParams(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + keeper := keepers.WasmKeeper + + q := Querier(keeper) + + paramsResponse, err := q.Params(sdk.WrapSDKContext(ctx), &types.QueryParamsRequest{}) + require.NoError(t, err) + require.NotNil(t, paramsResponse) + + defaultParams := types.DefaultParams() + + require.Equal(t, paramsResponse.Params.CodeUploadAccess, defaultParams.CodeUploadAccess) + require.Equal(t, paramsResponse.Params.InstantiateDefaultPermission, defaultParams.InstantiateDefaultPermission) + + keeper.SetParams(ctx, types.Params{ + CodeUploadAccess: types.AllowNobody, + InstantiateDefaultPermission: types.AccessTypeNobody, + }) + + paramsResponse, err = q.Params(sdk.WrapSDKContext(ctx), &types.QueryParamsRequest{}) + require.NoError(t, err) + require.NotNil(t, paramsResponse) + + require.Equal(t, paramsResponse.Params.CodeUploadAccess, types.AllowNobody) + require.Equal(t, paramsResponse.Params.InstantiateDefaultPermission, types.AccessTypeNobody) +} + func TestQueryCodeInfo(t *testing.T) { wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) diff --git a/x/wasm/types/exported_keepers.go b/x/wasm/types/exported_keepers.go index cb08488386..88f9d980b3 100644 --- a/x/wasm/types/exported_keepers.go +++ b/x/wasm/types/exported_keepers.go @@ -20,6 +20,7 @@ type ViewKeeper interface { IterateCodeInfos(ctx sdk.Context, cb func(uint64, CodeInfo) bool) GetByteCode(ctx sdk.Context, codeID uint64) ([]byte, error) IsPinnedCode(ctx sdk.Context, codeID uint64) bool + GetParams(ctx sdk.Context) Params } // ContractOpsKeeper contains mutable operations on a contract. diff --git a/x/wasm/types/query.pb.go b/x/wasm/types/query.pb.go index 51aead5aa1..0a45c5de82 100644 --- a/x/wasm/types/query.pb.go +++ b/x/wasm/types/query.pb.go @@ -902,6 +902,91 @@ func (m *QueryPinnedCodesResponse) XXX_DiscardUnknown() { var xxx_messageInfo_QueryPinnedCodesResponse proto.InternalMessageInfo +// QueryParamsRequest is the request type for the Query/Params RPC method. +type QueryParamsRequest struct{} + +func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } +func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryParamsRequest) ProtoMessage() {} +func (*QueryParamsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9677c207036b9f2b, []int{19} +} + +func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryParamsRequest.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 *QueryParamsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryParamsRequest.Merge(m, src) +} + +func (m *QueryParamsRequest) XXX_Size() int { + return m.Size() +} + +func (m *QueryParamsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo + +// QueryParamsResponse is the response type for the Query/Params RPC method. +type QueryParamsResponse struct { + // params defines the parameters of the module. + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` +} + +func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } +func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryParamsResponse) ProtoMessage() {} +func (*QueryParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9677c207036b9f2b, []int{20} +} + +func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryParamsResponse.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 *QueryParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryParamsResponse.Merge(m, src) +} + +func (m *QueryParamsResponse) XXX_Size() int { + return m.Size() +} + +func (m *QueryParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*QueryContractInfoRequest)(nil), "cosmwasm.wasm.v1.QueryContractInfoRequest") proto.RegisterType((*QueryContractInfoResponse)(nil), "cosmwasm.wasm.v1.QueryContractInfoResponse") @@ -922,87 +1007,92 @@ func init() { proto.RegisterType((*QueryCodesResponse)(nil), "cosmwasm.wasm.v1.QueryCodesResponse") proto.RegisterType((*QueryPinnedCodesRequest)(nil), "cosmwasm.wasm.v1.QueryPinnedCodesRequest") proto.RegisterType((*QueryPinnedCodesResponse)(nil), "cosmwasm.wasm.v1.QueryPinnedCodesResponse") + proto.RegisterType((*QueryParamsRequest)(nil), "cosmwasm.wasm.v1.QueryParamsRequest") + proto.RegisterType((*QueryParamsResponse)(nil), "cosmwasm.wasm.v1.QueryParamsResponse") } func init() { proto.RegisterFile("cosmwasm/wasm/v1/query.proto", fileDescriptor_9677c207036b9f2b) } var fileDescriptor_9677c207036b9f2b = []byte{ - // 1191 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x97, 0xcf, 0x4f, 0x24, 0x45, - 0x14, 0xc7, 0xa7, 0xd8, 0x61, 0x7e, 0x14, 0x98, 0x1d, 0x2b, 0x0a, 0xe3, 0xc8, 0x76, 0x93, 0x76, - 0x83, 0x2c, 0x8b, 0xdd, 0xc2, 0x42, 0x56, 0x4d, 0x8c, 0xd9, 0x61, 0x75, 0x81, 0x84, 0x84, 0xed, - 0x8d, 0xd9, 0xc4, 0x3d, 0x90, 0x9a, 0xe9, 0x62, 0xe8, 0x84, 0xe9, 0x1a, 0xba, 0x0a, 0xd8, 0x09, - 0x41, 0xcd, 0x26, 0x1e, 0x4c, 0x8c, 0x9a, 0x18, 0x8f, 0x46, 0x0f, 0x66, 0xf5, 0xac, 0x37, 0xff, - 0x02, 0x8e, 0x24, 0x5e, 0x3c, 0x4d, 0x74, 0xf0, 0x60, 0xf8, 0x13, 0xf6, 0x64, 0xaa, 0xba, 0x7a, - 0xe8, 0xf9, 0xd1, 0xcc, 0xb0, 0x21, 0x7b, 0x21, 0xdd, 0xd4, 0xab, 0x57, 0x9f, 0xf7, 0xed, 0x57, - 0xef, 0xbd, 0x81, 0x13, 0x65, 0xca, 0xaa, 0xfb, 0x98, 0x55, 0x2d, 0xf9, 0x67, 0x6f, 0xce, 0xda, - 0xd9, 0x25, 0x7e, 0xdd, 0xac, 0xf9, 0x94, 0x53, 0x94, 0x0b, 0x57, 0x4d, 0xf9, 0x67, 0x6f, 0xae, - 0xf0, 0x4a, 0x85, 0x56, 0xa8, 0x5c, 0xb4, 0xc4, 0x53, 0x60, 0x57, 0xe8, 0xf6, 0xc2, 0xeb, 0x35, - 0xc2, 0xc2, 0xd5, 0x0a, 0xa5, 0x95, 0x6d, 0x62, 0xe1, 0x9a, 0x6b, 0x61, 0xcf, 0xa3, 0x1c, 0x73, - 0x97, 0x7a, 0xe1, 0xea, 0x8c, 0xd8, 0x4b, 0x99, 0x55, 0xc2, 0x8c, 0x04, 0x87, 0x5b, 0x7b, 0x73, - 0x25, 0xc2, 0xf1, 0x9c, 0x55, 0xc3, 0x15, 0xd7, 0x93, 0xc6, 0x81, 0xad, 0xb1, 0x00, 0xf3, 0xf7, - 0x85, 0xc5, 0x12, 0xf5, 0xb8, 0x8f, 0xcb, 0x7c, 0xc5, 0xdb, 0xa4, 0x36, 0xd9, 0xd9, 0x25, 0x8c, - 0xa3, 0x3c, 0x4c, 0x63, 0xc7, 0xf1, 0x09, 0x63, 0x79, 0x30, 0x09, 0xa6, 0xb3, 0x76, 0xf8, 0x6a, - 0x7c, 0x0d, 0xe0, 0x6b, 0x3d, 0xb6, 0xb1, 0x1a, 0xf5, 0x18, 0x89, 0xdf, 0x87, 0xee, 0xc3, 0x97, - 0xca, 0x6a, 0xc7, 0x86, 0xeb, 0x6d, 0xd2, 0xfc, 0xd0, 0x24, 0x98, 0x1e, 0x99, 0xd7, 0xcc, 0x4e, - 0x55, 0xcc, 0xa8, 0xe3, 0xe2, 0xe8, 0x51, 0x43, 0x4f, 0x1c, 0x37, 0x74, 0x70, 0xda, 0xd0, 0x13, - 0xf6, 0x68, 0x39, 0xb2, 0xf6, 0x5e, 0xf2, 0xbf, 0x9f, 0x74, 0x60, 0x7c, 0x06, 0x5f, 0x6f, 0xe3, - 0x59, 0x76, 0x19, 0xa7, 0x7e, 0xbd, 0x6f, 0x24, 0xe8, 0x23, 0x08, 0xcf, 0x34, 0x51, 0x38, 0x53, - 0x66, 0x20, 0xa0, 0x29, 0x04, 0x34, 0x83, 0xaf, 0xa7, 0x04, 0x34, 0xd7, 0x71, 0x85, 0x28, 0xaf, - 0x76, 0x64, 0xa7, 0xf1, 0x3b, 0x80, 0x13, 0xbd, 0x09, 0x94, 0x28, 0xab, 0x30, 0x4d, 0x3c, 0xee, - 0xbb, 0x44, 0x20, 0x5c, 0x99, 0x1e, 0x99, 0x9f, 0x89, 0x0f, 0x7a, 0x89, 0x3a, 0x44, 0xed, 0xff, - 0xd0, 0xe3, 0x7e, 0xbd, 0x98, 0x14, 0x02, 0xd8, 0xa1, 0x03, 0x74, 0xaf, 0x07, 0xf4, 0x9b, 0x7d, - 0xa1, 0x03, 0x90, 0x36, 0xea, 0x4f, 0x3b, 0x64, 0x63, 0xc5, 0xba, 0x38, 0x3b, 0x94, 0x6d, 0x1c, - 0xa6, 0xcb, 0xd4, 0x21, 0x1b, 0xae, 0x23, 0x65, 0x4b, 0xda, 0x29, 0xf1, 0xba, 0xe2, 0x5c, 0x9a, - 0x6a, 0x5f, 0x74, 0xaa, 0xd6, 0x02, 0x50, 0xaa, 0x4d, 0xc0, 0x6c, 0xf8, 0xb5, 0x03, 0xdd, 0xb2, - 0xf6, 0xd9, 0x3f, 0x2e, 0x4f, 0x87, 0xcf, 0x43, 0x8e, 0x3b, 0xdb, 0xdb, 0x21, 0xca, 0x03, 0x8e, - 0x39, 0x79, 0x71, 0x09, 0xf4, 0x23, 0x80, 0xd7, 0x62, 0x10, 0x94, 0x16, 0x8b, 0x30, 0x55, 0xa5, - 0x0e, 0xd9, 0x0e, 0x13, 0x68, 0xbc, 0x3b, 0x81, 0xd6, 0xc4, 0xba, 0xca, 0x16, 0x65, 0x7c, 0x79, - 0x22, 0x3d, 0x54, 0x1a, 0xd9, 0x78, 0xff, 0x82, 0x1a, 0x5d, 0x83, 0x50, 0x9e, 0xb1, 0xe1, 0x60, - 0x8e, 0x25, 0xc2, 0xa8, 0x9d, 0x95, 0xff, 0xb9, 0x8b, 0x39, 0x36, 0x6e, 0xa9, 0xc8, 0xbb, 0x1d, - 0xab, 0xc8, 0x11, 0x4c, 0xca, 0x9d, 0x40, 0xee, 0x94, 0xcf, 0xc6, 0x0e, 0xd4, 0xe4, 0xa6, 0x07, - 0x55, 0xec, 0xf3, 0x0b, 0xf2, 0x2c, 0x76, 0xf3, 0x14, 0xc7, 0x9e, 0x35, 0x74, 0x14, 0x21, 0x58, - 0x23, 0x8c, 0x09, 0x25, 0x22, 0x9c, 0x6b, 0x50, 0x8f, 0x3d, 0x52, 0x91, 0xce, 0x44, 0x49, 0x63, - 0x7d, 0x06, 0x11, 0xdc, 0x84, 0x39, 0x95, 0xfb, 0xfd, 0x6f, 0x9c, 0xf1, 0xc3, 0x10, 0xcc, 0x09, - 0xc3, 0xb6, 0x42, 0x7b, 0xa3, 0xc3, 0xba, 0x98, 0x6b, 0x36, 0xf4, 0x94, 0x34, 0xbb, 0x7b, 0xda, - 0xd0, 0x87, 0x5c, 0xa7, 0x75, 0x63, 0xf3, 0x30, 0x5d, 0xf6, 0x09, 0xe6, 0xd4, 0x97, 0xf1, 0x66, - 0xed, 0xf0, 0x15, 0x7d, 0x0c, 0xb3, 0x02, 0x67, 0x63, 0x0b, 0xb3, 0xad, 0xfc, 0x15, 0xc9, 0xfd, - 0xce, 0xb3, 0x86, 0xbe, 0x50, 0x71, 0xf9, 0xd6, 0x6e, 0xc9, 0x2c, 0xd3, 0xaa, 0xc5, 0x89, 0xe7, - 0x10, 0xbf, 0xea, 0x7a, 0x3c, 0xfa, 0xb8, 0xed, 0x96, 0x98, 0x55, 0xaa, 0x73, 0xc2, 0xcc, 0x65, - 0xf2, 0xb8, 0x28, 0x1e, 0xec, 0x8c, 0x70, 0xb5, 0x8c, 0xd9, 0x16, 0x7a, 0x04, 0xc7, 0x5c, 0x8f, - 0x71, 0xec, 0x71, 0x17, 0x73, 0xb2, 0x51, 0x13, 0x9b, 0x18, 0x13, 0x29, 0x98, 0x8a, 0xab, 0xf9, - 0x77, 0xca, 0x65, 0xc2, 0xd8, 0x12, 0xf5, 0x36, 0xdd, 0x8a, 0x4a, 0xe2, 0x57, 0x23, 0x3e, 0xd6, - 0x5b, 0x2e, 0x82, 0xa2, 0xbf, 0x9a, 0xcc, 0x24, 0x73, 0xc3, 0xab, 0xc9, 0xcc, 0x70, 0x2e, 0x65, - 0x3c, 0x01, 0xf0, 0xe5, 0x88, 0x9a, 0x4a, 0xa0, 0x15, 0x51, 0x3e, 0x84, 0x40, 0xa2, 0xd7, 0x00, - 0x79, 0xae, 0xd1, 0xab, 0xec, 0xb6, 0xeb, 0x5a, 0xcc, 0xb4, 0x7a, 0x4d, 0xa6, 0xac, 0xd6, 0xd0, - 0x84, 0xfa, 0xb2, 0x41, 0xb6, 0x64, 0x4e, 0x1b, 0xba, 0x7c, 0x0f, 0xbe, 0xa5, 0xea, 0x42, 0x8f, - 0x22, 0x0c, 0x2c, 0xfc, 0xa4, 0xed, 0x05, 0x02, 0x3c, 0x77, 0x81, 0x78, 0x0a, 0x20, 0x8a, 0x7a, - 0x57, 0x21, 0xde, 0x83, 0xb0, 0x15, 0x62, 0x58, 0x19, 0x06, 0x89, 0x31, 0xd0, 0x37, 0x1b, 0xc6, - 0x77, 0x89, 0x75, 0x02, 0xc3, 0x71, 0xc9, 0xb9, 0xee, 0x7a, 0x1e, 0x71, 0xce, 0xd1, 0xe2, 0xf9, - 0x8b, 0xe5, 0x37, 0x40, 0x8d, 0x2d, 0x6d, 0x67, 0xb4, 0xee, 0x60, 0x46, 0xdd, 0x8a, 0x40, 0x8f, - 0x64, 0xf1, 0xaa, 0x88, 0xb5, 0xd9, 0xd0, 0xd3, 0xc1, 0xd5, 0x60, 0x76, 0x3a, 0xb8, 0x15, 0x97, - 0x17, 0xf4, 0xfc, 0x97, 0x23, 0x70, 0x58, 0x12, 0xa1, 0xef, 0x01, 0x1c, 0x8d, 0x4e, 0x2f, 0xa8, - 0x47, 0xa3, 0x8f, 0x1b, 0xb9, 0x0a, 0x37, 0x07, 0xb2, 0x0d, 0xce, 0x37, 0x66, 0x9f, 0xfc, 0xf9, - 0xef, 0x77, 0x43, 0x53, 0xe8, 0xba, 0xd5, 0x35, 0x2c, 0x86, 0x3d, 0xd2, 0x3a, 0x50, 0x35, 0xef, - 0x10, 0x3d, 0x05, 0xf0, 0x6a, 0xc7, 0x70, 0x82, 0xde, 0xea, 0x73, 0x5c, 0xfb, 0x18, 0x55, 0x30, - 0x07, 0x35, 0x57, 0x80, 0x0b, 0x12, 0xd0, 0x44, 0xb3, 0x83, 0x00, 0x5a, 0x5b, 0x0a, 0xea, 0xe7, - 0x08, 0xa8, 0x9a, 0x07, 0xfa, 0x82, 0xb6, 0x0f, 0x2e, 0x7d, 0x41, 0x3b, 0xc6, 0x0c, 0x63, 0x5e, - 0x82, 0xce, 0xa2, 0x99, 0x5e, 0xa0, 0x0e, 0xb1, 0x0e, 0x54, 0x42, 0x1d, 0x5a, 0x67, 0xc3, 0xc7, - 0x2f, 0x00, 0xe6, 0x3a, 0x7b, 0x35, 0x8a, 0x3b, 0x38, 0x66, 0xae, 0x28, 0x58, 0x03, 0xdb, 0x0f, - 0x42, 0xda, 0x25, 0x29, 0x93, 0x50, 0xbf, 0x01, 0x98, 0xeb, 0xec, 0xad, 0xb1, 0xa4, 0x31, 0xdd, - 0x3d, 0x96, 0x34, 0xae, 0x69, 0x1b, 0xef, 0x4b, 0xd2, 0xdb, 0x68, 0x71, 0x20, 0x52, 0x1f, 0xef, - 0x5b, 0x07, 0x67, 0x4d, 0xf9, 0x10, 0xfd, 0x01, 0x20, 0xea, 0x6e, 0xb4, 0xe8, 0xed, 0x18, 0x8c, - 0xd8, 0x31, 0xa0, 0x30, 0x77, 0x81, 0x1d, 0x0a, 0xfd, 0x03, 0x89, 0xfe, 0x2e, 0xba, 0x3d, 0x98, - 0xc8, 0xc2, 0x51, 0x3b, 0x7c, 0x1d, 0x26, 0x65, 0xda, 0x1a, 0xb1, 0x79, 0x78, 0x96, 0xab, 0x6f, - 0x9c, 0x6b, 0xa3, 0x88, 0xa6, 0x25, 0x91, 0x81, 0x26, 0xfb, 0x25, 0x28, 0xf2, 0xe1, 0xb0, 0x2c, - 0x87, 0xe8, 0x3c, 0xbf, 0x61, 0x41, 0x2e, 0x5c, 0x3f, 0xdf, 0x48, 0x9d, 0xae, 0xc9, 0xd3, 0xf3, - 0x68, 0xac, 0xf7, 0xe9, 0xe8, 0x2b, 0x00, 0x47, 0x22, 0x95, 0x18, 0xdd, 0x88, 0xf1, 0xda, 0xdd, - 0x11, 0x0a, 0x33, 0x83, 0x98, 0x2a, 0x8c, 0x29, 0x89, 0x31, 0x89, 0xb4, 0xde, 0x18, 0xcc, 0xaa, - 0xc9, 0x4d, 0xc5, 0xe5, 0xa3, 0x7f, 0xb4, 0xc4, 0xaf, 0x4d, 0x2d, 0x71, 0xd4, 0xd4, 0xc0, 0x71, - 0x53, 0x03, 0x7f, 0x37, 0x35, 0xf0, 0xed, 0x89, 0x96, 0x38, 0x3e, 0xd1, 0x12, 0x7f, 0x9d, 0x68, - 0x89, 0x4f, 0xa6, 0x22, 0xc3, 0xcd, 0x12, 0x65, 0xd5, 0x87, 0xa1, 0x2f, 0xc7, 0x7a, 0x1c, 0xf8, - 0x94, 0xbf, 0xb6, 0x4b, 0x29, 0xf9, 0x23, 0xf9, 0xd6, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe8, - 0x7b, 0x25, 0x05, 0xd4, 0x0f, 0x00, 0x00, + // 1245 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x98, 0xcf, 0x6f, 0x1b, 0x45, + 0x14, 0xc7, 0x3d, 0xa9, 0xe3, 0x1f, 0x93, 0xa0, 0x9a, 0xa1, 0x24, 0xc6, 0xa4, 0xbb, 0xd1, 0x52, + 0x42, 0x9a, 0x86, 0x5d, 0x92, 0x26, 0x14, 0x90, 0x10, 0xaa, 0x53, 0x68, 0x12, 0x29, 0x52, 0xba, + 0x15, 0xaa, 0x44, 0x0f, 0xd1, 0xd8, 0x3b, 0x71, 0x56, 0x8a, 0x77, 0x9c, 0x9d, 0x49, 0x52, 0x2b, + 0x0a, 0xa0, 0x4a, 0x48, 0x1c, 0x10, 0x20, 0x21, 0x8e, 0x08, 0x0e, 0xa8, 0x70, 0x86, 0x1b, 0x7f, + 0x41, 0x8e, 0x91, 0xb8, 0x70, 0xb2, 0xc0, 0xe1, 0x80, 0xf2, 0x27, 0xf4, 0x84, 0x76, 0x76, 0xd6, + 0xd9, 0xb5, 0xbd, 0xb1, 0x53, 0x59, 0xbd, 0x58, 0xfb, 0xe3, 0xbd, 0x37, 0x9f, 0xf7, 0x9d, 0xb7, + 0x6f, 0x9e, 0x0c, 0x27, 0xca, 0x94, 0x55, 0xf7, 0x31, 0xab, 0x1a, 0xe2, 0x67, 0x6f, 0xce, 0xd8, + 0xd9, 0x25, 0x6e, 0x5d, 0xaf, 0xb9, 0x94, 0x53, 0x94, 0x0b, 0xde, 0xea, 0xe2, 0x67, 0x6f, 0xae, + 0x70, 0xa5, 0x42, 0x2b, 0x54, 0xbc, 0x34, 0xbc, 0x2b, 0xdf, 0xae, 0xd0, 0x19, 0x85, 0xd7, 0x6b, + 0x84, 0x05, 0x6f, 0x2b, 0x94, 0x56, 0xb6, 0x89, 0x81, 0x6b, 0xb6, 0x81, 0x1d, 0x87, 0x72, 0xcc, + 0x6d, 0xea, 0x04, 0x6f, 0x67, 0x3c, 0x5f, 0xca, 0x8c, 0x12, 0x66, 0xc4, 0x5f, 0xdc, 0xd8, 0x9b, + 0x2b, 0x11, 0x8e, 0xe7, 0x8c, 0x1a, 0xae, 0xd8, 0x8e, 0x30, 0xf6, 0x6d, 0xb5, 0x05, 0x98, 0xbf, + 0xe7, 0x59, 0x2c, 0x51, 0x87, 0xbb, 0xb8, 0xcc, 0x57, 0x9c, 0x4d, 0x6a, 0x92, 0x9d, 0x5d, 0xc2, + 0x38, 0xca, 0xc3, 0x34, 0xb6, 0x2c, 0x97, 0x30, 0x96, 0x07, 0x93, 0x60, 0x3a, 0x6b, 0x06, 0xb7, + 0xda, 0xd7, 0x00, 0xbe, 0xd2, 0xc5, 0x8d, 0xd5, 0xa8, 0xc3, 0x48, 0xbc, 0x1f, 0xba, 0x07, 0x5f, + 0x28, 0x4b, 0x8f, 0x0d, 0xdb, 0xd9, 0xa4, 0xf9, 0xa1, 0x49, 0x30, 0x3d, 0x32, 0xaf, 0xe8, 0xed, + 0xaa, 0xe8, 0xe1, 0xc0, 0xc5, 0xd1, 0xa3, 0x86, 0x9a, 0x38, 0x6e, 0xa8, 0xe0, 0xb4, 0xa1, 0x26, + 0xcc, 0xd1, 0x72, 0xe8, 0xdd, 0x7b, 0xc9, 0xff, 0x7e, 0x52, 0x81, 0xf6, 0x19, 0x7c, 0x35, 0xc2, + 0xb3, 0x6c, 0x33, 0x4e, 0xdd, 0x7a, 0xcf, 0x4c, 0xd0, 0x47, 0x10, 0x9e, 0x69, 0x22, 0x71, 0xa6, + 0x74, 0x5f, 0x40, 0xdd, 0x13, 0x50, 0xf7, 0x77, 0x4f, 0x0a, 0xa8, 0xaf, 0xe3, 0x0a, 0x91, 0x51, + 0xcd, 0x90, 0xa7, 0xf6, 0x3b, 0x80, 0x13, 0xdd, 0x09, 0xa4, 0x28, 0xab, 0x30, 0x4d, 0x1c, 0xee, + 0xda, 0xc4, 0x43, 0xb8, 0x34, 0x3d, 0x32, 0x3f, 0x13, 0x9f, 0xf4, 0x12, 0xb5, 0x88, 0xf4, 0xff, + 0xd0, 0xe1, 0x6e, 0xbd, 0x98, 0xf4, 0x04, 0x30, 0x83, 0x00, 0xe8, 0x6e, 0x17, 0xe8, 0x37, 0x7a, + 0x42, 0xfb, 0x20, 0x11, 0xea, 0x4f, 0xdb, 0x64, 0x63, 0xc5, 0xba, 0xb7, 0x76, 0x20, 0xdb, 0x38, + 0x4c, 0x97, 0xa9, 0x45, 0x36, 0x6c, 0x4b, 0xc8, 0x96, 0x34, 0x53, 0xde, 0xed, 0x8a, 0x35, 0x30, + 0xd5, 0xbe, 0x68, 0x57, 0xad, 0x05, 0x20, 0x55, 0x9b, 0x80, 0xd9, 0x60, 0xb7, 0x7d, 0xdd, 0xb2, + 0xe6, 0xd9, 0x83, 0xc1, 0xe9, 0xf0, 0x79, 0xc0, 0x71, 0x7b, 0x7b, 0x3b, 0x40, 0xb9, 0xcf, 0x31, + 0x27, 0xcf, 0xaf, 0x80, 0x7e, 0x04, 0xf0, 0x6a, 0x0c, 0x82, 0xd4, 0x62, 0x11, 0xa6, 0xaa, 0xd4, + 0x22, 0xdb, 0x41, 0x01, 0x8d, 0x77, 0x16, 0xd0, 0x9a, 0xf7, 0x5e, 0x56, 0x8b, 0x34, 0x1e, 0x9c, + 0x48, 0x0f, 0xa4, 0x46, 0x26, 0xde, 0xbf, 0xa0, 0x46, 0x57, 0x21, 0x14, 0x6b, 0x6c, 0x58, 0x98, + 0x63, 0x81, 0x30, 0x6a, 0x66, 0xc5, 0x93, 0x3b, 0x98, 0x63, 0xed, 0xa6, 0xcc, 0xbc, 0x33, 0xb0, + 0xcc, 0x1c, 0xc1, 0xa4, 0xf0, 0x04, 0xc2, 0x53, 0x5c, 0x6b, 0x3b, 0x50, 0x11, 0x4e, 0xf7, 0xab, + 0xd8, 0xe5, 0x17, 0xe4, 0x59, 0xec, 0xe4, 0x29, 0x8e, 0x3d, 0x6d, 0xa8, 0x28, 0x44, 0xb0, 0x46, + 0x18, 0xf3, 0x94, 0x08, 0x71, 0xae, 0x41, 0x35, 0x76, 0x49, 0x49, 0x3a, 0x13, 0x26, 0x8d, 0x8d, + 0xe9, 0x67, 0x70, 0x03, 0xe6, 0x64, 0xed, 0xf7, 0xfe, 0xe2, 0xb4, 0x1f, 0x86, 0x60, 0xce, 0x33, + 0x8c, 0x34, 0xda, 0xeb, 0x6d, 0xd6, 0xc5, 0x5c, 0xb3, 0xa1, 0xa6, 0x84, 0xd9, 0x9d, 0xd3, 0x86, + 0x3a, 0x64, 0x5b, 0xad, 0x2f, 0x36, 0x0f, 0xd3, 0x65, 0x97, 0x60, 0x4e, 0x5d, 0x91, 0x6f, 0xd6, + 0x0c, 0x6e, 0xd1, 0xc7, 0x30, 0xeb, 0xe1, 0x6c, 0x6c, 0x61, 0xb6, 0x95, 0xbf, 0x24, 0xb8, 0xdf, + 0x79, 0xda, 0x50, 0x17, 0x2a, 0x36, 0xdf, 0xda, 0x2d, 0xe9, 0x65, 0x5a, 0x35, 0x38, 0x71, 0x2c, + 0xe2, 0x56, 0x6d, 0x87, 0x87, 0x2f, 0xb7, 0xed, 0x12, 0x33, 0x4a, 0x75, 0x4e, 0x98, 0xbe, 0x4c, + 0x1e, 0x15, 0xbd, 0x0b, 0x33, 0xe3, 0x85, 0x5a, 0xc6, 0x6c, 0x0b, 0x3d, 0x84, 0x63, 0xb6, 0xc3, + 0x38, 0x76, 0xb8, 0x8d, 0x39, 0xd9, 0xa8, 0x79, 0x4e, 0x8c, 0x79, 0x25, 0x98, 0x8a, 0xeb, 0xf9, + 0xb7, 0xcb, 0x65, 0xc2, 0xd8, 0x12, 0x75, 0x36, 0xed, 0x8a, 0x2c, 0xe2, 0x97, 0x43, 0x31, 0xd6, + 0x5b, 0x21, 0xfc, 0xa6, 0xbf, 0x9a, 0xcc, 0x24, 0x73, 0xc3, 0xab, 0xc9, 0xcc, 0x70, 0x2e, 0xa5, + 0x3d, 0x06, 0xf0, 0xc5, 0x90, 0x9a, 0x52, 0xa0, 0x15, 0xaf, 0x7d, 0x78, 0x02, 0x79, 0x67, 0x0d, + 0x10, 0xeb, 0x6a, 0xdd, 0xda, 0x6e, 0x54, 0xd7, 0x62, 0xa6, 0x75, 0xd6, 0x64, 0xca, 0xf2, 0x1d, + 0x9a, 0x90, 0x3b, 0xeb, 0x57, 0x4b, 0xe6, 0xb4, 0xa1, 0x8a, 0x7b, 0x7f, 0x2f, 0xe5, 0x29, 0xf4, + 0x30, 0xc4, 0xc0, 0x82, 0x2d, 0x8d, 0x36, 0x08, 0xf0, 0xcc, 0x0d, 0xe2, 0x09, 0x80, 0x28, 0x1c, + 0x5d, 0xa6, 0x78, 0x17, 0xc2, 0x56, 0x8a, 0x41, 0x67, 0xe8, 0x27, 0x47, 0x5f, 0xdf, 0x6c, 0x90, + 0xdf, 0x00, 0xfb, 0x04, 0x86, 0xe3, 0x82, 0x73, 0xdd, 0x76, 0x1c, 0x62, 0x9d, 0xa3, 0xc5, 0xb3, + 0x37, 0xcb, 0x6f, 0x80, 0x1c, 0x5b, 0x22, 0x6b, 0xb4, 0xbe, 0xc1, 0x8c, 0xfc, 0x2a, 0x7c, 0x3d, + 0x92, 0xc5, 0xcb, 0x5e, 0xae, 0xcd, 0x86, 0x9a, 0xf6, 0x3f, 0x0d, 0x66, 0xa6, 0xfd, 0xaf, 0x62, + 0x80, 0x49, 0x5f, 0x91, 0x9b, 0xb3, 0x8e, 0x5d, 0x5c, 0x0d, 0xf2, 0xd5, 0xd6, 0xe0, 0x4b, 0x91, + 0xa7, 0x92, 0xf0, 0x6d, 0x98, 0xaa, 0x89, 0x27, 0xb2, 0x1c, 0xf2, 0x9d, 0xfb, 0xe5, 0x7b, 0x04, + 0xad, 0xdc, 0xb7, 0x9e, 0xff, 0x72, 0x14, 0x0e, 0x8b, 0x78, 0xe8, 0x7b, 0x00, 0x47, 0xc3, 0x23, + 0x12, 0xea, 0x32, 0x4d, 0xc4, 0xcd, 0x75, 0x85, 0x1b, 0x7d, 0xd9, 0xfa, 0xac, 0xda, 0xec, 0xe3, + 0x3f, 0xff, 0xfd, 0x6e, 0x68, 0x0a, 0x5d, 0x33, 0x3a, 0x26, 0xd2, 0xe0, 0x20, 0x36, 0x0e, 0x64, + 0x63, 0x3d, 0x44, 0x4f, 0x00, 0xbc, 0xdc, 0x36, 0x01, 0xa1, 0x37, 0x7b, 0x2c, 0x17, 0x9d, 0xd5, + 0x0a, 0x7a, 0xbf, 0xe6, 0x12, 0x70, 0x41, 0x00, 0xea, 0x68, 0xb6, 0x1f, 0x40, 0x63, 0x4b, 0x42, + 0xfd, 0x1c, 0x02, 0x95, 0x43, 0x47, 0x4f, 0xd0, 0xe8, 0x74, 0xd4, 0x13, 0xb4, 0x6d, 0x96, 0xd1, + 0xe6, 0x05, 0xe8, 0x2c, 0x9a, 0xe9, 0x06, 0x6a, 0x11, 0xe3, 0x40, 0x56, 0xed, 0xa1, 0x71, 0x36, + 0xe1, 0xfc, 0x02, 0x60, 0xae, 0x7d, 0x20, 0x40, 0x71, 0x0b, 0xc7, 0x0c, 0x2f, 0x05, 0xa3, 0x6f, + 0xfb, 0x7e, 0x48, 0x3b, 0x24, 0x65, 0x02, 0xea, 0x37, 0x00, 0x73, 0xed, 0x07, 0x78, 0x2c, 0x69, + 0xcc, 0x08, 0x11, 0x4b, 0x1a, 0x37, 0x19, 0x68, 0xef, 0x0b, 0xd2, 0x5b, 0x68, 0xb1, 0x2f, 0x52, + 0x17, 0xef, 0x1b, 0x07, 0x67, 0x27, 0xff, 0x21, 0xfa, 0x03, 0x40, 0xd4, 0x79, 0x9a, 0xa3, 0xb7, + 0x62, 0x30, 0x62, 0x67, 0x8d, 0xc2, 0xdc, 0x05, 0x3c, 0x24, 0xfa, 0x07, 0x02, 0xfd, 0x5d, 0x74, + 0xab, 0x3f, 0x91, 0xbd, 0x40, 0x51, 0xf8, 0x3a, 0x4c, 0x8a, 0xb2, 0xd5, 0x62, 0xeb, 0xf0, 0xac, + 0x56, 0x5f, 0x3b, 0xd7, 0x46, 0x12, 0x4d, 0x0b, 0x22, 0x0d, 0x4d, 0xf6, 0x2a, 0x50, 0xe4, 0xc2, + 0x61, 0xd1, 0x73, 0xd1, 0x79, 0x71, 0x83, 0x2e, 0x58, 0xb8, 0x76, 0xbe, 0x91, 0x5c, 0x5d, 0x11, + 0xab, 0xe7, 0xd1, 0x58, 0xf7, 0xd5, 0xd1, 0x57, 0x00, 0x8e, 0x84, 0xda, 0x3d, 0xba, 0x1e, 0x13, + 0xb5, 0xf3, 0xd8, 0x29, 0xcc, 0xf4, 0x63, 0x2a, 0x31, 0xa6, 0x04, 0xc6, 0x24, 0x52, 0xba, 0x63, + 0x30, 0xa3, 0x26, 0x9c, 0xd0, 0x21, 0x4c, 0xf9, 0x3d, 0x1a, 0xc5, 0xa5, 0x17, 0x39, 0x0a, 0x0a, + 0xaf, 0xf7, 0xb0, 0xea, 0x7b, 0x79, 0xff, 0x60, 0x58, 0x3e, 0xfa, 0x47, 0x49, 0xfc, 0xda, 0x54, + 0x12, 0x47, 0x4d, 0x05, 0x1c, 0x37, 0x15, 0xf0, 0x77, 0x53, 0x01, 0xdf, 0x9e, 0x28, 0x89, 0xe3, + 0x13, 0x25, 0xf1, 0xd7, 0x89, 0x92, 0xf8, 0x64, 0x2a, 0x34, 0xc0, 0x2d, 0x51, 0x56, 0x7d, 0x10, + 0xc4, 0xb2, 0x8c, 0x47, 0x7e, 0x4c, 0xf1, 0x8f, 0x42, 0x29, 0x25, 0xfe, 0x08, 0xb8, 0xf9, 0x7f, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa4, 0x0e, 0x41, 0xb8, 0x10, 0x00, 0x00, } func (this *QueryContractInfoResponse) Equal(that interface{}) bool { @@ -1125,6 +1215,8 @@ type QueryClient interface { Codes(ctx context.Context, in *QueryCodesRequest, opts ...grpc.CallOption) (*QueryCodesResponse, error) // PinnedCodes gets the pinned code ids PinnedCodes(ctx context.Context, in *QueryPinnedCodesRequest, opts ...grpc.CallOption) (*QueryPinnedCodesResponse, error) + // Params gets the module params + Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) } type queryClient struct { @@ -1216,6 +1308,15 @@ func (c *queryClient) PinnedCodes(ctx context.Context, in *QueryPinnedCodesReque return out, nil } +func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { + out := new(QueryParamsResponse) + err := c.cc.Invoke(ctx, "/cosmwasm.wasm.v1.Query/Params", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // ContractInfo gets the contract meta data @@ -1236,6 +1337,8 @@ type QueryServer interface { Codes(context.Context, *QueryCodesRequest) (*QueryCodesResponse, error) // PinnedCodes gets the pinned code ids PinnedCodes(context.Context, *QueryPinnedCodesRequest) (*QueryPinnedCodesResponse, error) + // Params gets the module params + Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -1277,6 +1380,10 @@ func (*UnimplementedQueryServer) PinnedCodes(ctx context.Context, req *QueryPinn return nil, status.Errorf(codes.Unimplemented, "method PinnedCodes not implemented") } +func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") +} + func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) } @@ -1443,6 +1550,24 @@ func _Query_PinnedCodes_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryParamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Params(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosmwasm.wasm.v1.Query/Params", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "cosmwasm.wasm.v1.Query", HandlerType: (*QueryServer)(nil), @@ -1483,6 +1608,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "PinnedCodes", Handler: _Query_PinnedCodes_Handler, }, + { + MethodName: "Params", + Handler: _Query_Params_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "cosmwasm/wasm/v1/query.proto", @@ -2252,6 +2381,62 @@ func (m *QueryPinnedCodesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } +func (m *QueryParamsRequest) 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 *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryParamsResponse) 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 *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -2575,6 +2760,26 @@ func (m *QueryPinnedCodesResponse) Size() (n int) { return n } +func (m *QueryParamsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Params.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -4709,6 +4914,141 @@ func (m *QueryPinnedCodesResponse) Unmarshal(dAtA []byte) error { return nil } +func (m *QueryParamsRequest) 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: QueryParamsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + 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 *QueryParamsResponse) 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: QueryParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", 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 + } + if err := m.Params.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 skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/wasm/types/query.pb.gw.go b/x/wasm/types/query.pb.gw.go index b382baf774..d50c1a5d8e 100644 --- a/x/wasm/types/query.pb.gw.go +++ b/x/wasm/types/query.pb.gw.go @@ -554,6 +554,22 @@ func local_request_Query_PinnedCodes_0(ctx context.Context, marshaler runtime.Ma return msg, metadata, err } +func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(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. @@ -730,6 +746,25 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv forward_Query_PinnedCodes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle("GET", pattern_Query_Params_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.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil } @@ -941,6 +976,25 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie forward_Query_PinnedCodes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle("GET", pattern_Query_Params_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_Params_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_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil } @@ -962,6 +1016,8 @@ var ( pattern_Query_Codes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"cosmwasm", "wasm", "v1", "code"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Query_PinnedCodes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"cosmwasm", "wasm", "v1", "codes", "pinned"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"cosmwasm", "wasm", "v1", "codes", "params"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -982,4 +1038,6 @@ var ( forward_Query_Codes_0 = runtime.ForwardResponseMessage forward_Query_PinnedCodes_0 = runtime.ForwardResponseMessage + + forward_Query_Params_0 = runtime.ForwardResponseMessage ) From 1fdd37816fe9810c9b71e3a82f2b6a00c8df424e Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Mon, 5 Sep 2022 14:20:55 +0200 Subject: [PATCH 43/94] Upgrade thirdparty protos (#977) * Bump tendermint protos * Bump cosmos protos * Format only --- .../proto/cosmos/authz/v1beta1/authz.proto | 12 + .../proto/cosmos/authz/v1beta1/genesis.proto | 13 +- .../proto/cosmos/authz/v1beta1/query.proto | 48 +- .../proto/cosmos/bank/v1beta1/query.proto | 40 +- .../base/snapshots/v1beta1/snapshot.proto | 39 +- .../cosmos/base/store/v1beta1/snapshot.proto | 28 - .../base/tendermint/v1beta1/query.proto | 16 +- .../proto/cosmos/feegrant/v1beta1/query.proto | 23 + .../proto/cosmos/gov/v1beta1/gov.proto | 2 +- .../cosmos/tx/signing/v1beta1/signing.proto | 12 + .../proto/cosmos/tx/v1beta1/service.proto | 35 +- third_party/proto/tendermint/abci/types.proto | 34 +- .../proto/tendermint/consensus/types.proto | 2 +- .../proto/tendermint/rpc/grpc/types.pb.go | 953 ++++++++++++++++++ .../proto/tendermint/state/types.pb.go | 335 +++++- .../proto/tendermint/state/types.proto | 5 + .../proto/tendermint/types/evidence.proto | 18 +- .../proto/tendermint/types/types.proto | 8 +- 18 files changed, 1481 insertions(+), 142 deletions(-) delete mode 100644 third_party/proto/cosmos/base/store/v1beta1/snapshot.proto create mode 100644 third_party/proto/tendermint/rpc/grpc/types.pb.go diff --git a/third_party/proto/cosmos/authz/v1beta1/authz.proto b/third_party/proto/cosmos/authz/v1beta1/authz.proto index 2c376905eb..05b1feefa4 100644 --- a/third_party/proto/cosmos/authz/v1beta1/authz.proto +++ b/third_party/proto/cosmos/authz/v1beta1/authz.proto @@ -25,3 +25,15 @@ message Grant { google.protobuf.Any authorization = 1 [(cosmos_proto.accepts_interface) = "Authorization"]; google.protobuf.Timestamp expiration = 2 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; } + +// GrantAuthorization extends a grant with both the addresses of the grantee and granter. +// It is used in genesis.proto and query.proto +// +// Since: cosmos-sdk 0.45.2 +message GrantAuthorization { + string granter = 1; + string grantee = 2; + + google.protobuf.Any authorization = 3 [(cosmos_proto.accepts_interface) = "Authorization"]; + google.protobuf.Timestamp expiration = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; +} diff --git a/third_party/proto/cosmos/authz/v1beta1/genesis.proto b/third_party/proto/cosmos/authz/v1beta1/genesis.proto index ea89869445..310f62656f 100644 --- a/third_party/proto/cosmos/authz/v1beta1/genesis.proto +++ b/third_party/proto/cosmos/authz/v1beta1/genesis.proto @@ -2,10 +2,8 @@ syntax = "proto3"; package cosmos.authz.v1beta1; -import "google/protobuf/timestamp.proto"; -import "google/protobuf/any.proto"; import "gogoproto/gogo.proto"; -import "cosmos_proto/cosmos.proto"; +import "cosmos/authz/v1beta1/authz.proto"; option go_package = "github.com/cosmos/cosmos-sdk/x/authz"; @@ -13,12 +11,3 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/authz"; message GenesisState { repeated GrantAuthorization authorization = 1 [(gogoproto.nullable) = false]; } - -// GrantAuthorization defines the GenesisState/GrantAuthorization type. -message GrantAuthorization { - string granter = 1; - string grantee = 2; - - google.protobuf.Any authorization = 3 [(cosmos_proto.accepts_interface) = "Authorization"]; - google.protobuf.Timestamp expiration = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; -} diff --git a/third_party/proto/cosmos/authz/v1beta1/query.proto b/third_party/proto/cosmos/authz/v1beta1/query.proto index 428210de01..f668309bed 100644 --- a/third_party/proto/cosmos/authz/v1beta1/query.proto +++ b/third_party/proto/cosmos/authz/v1beta1/query.proto @@ -14,6 +14,20 @@ service Query { rpc Grants(QueryGrantsRequest) returns (QueryGrantsResponse) { option (google.api.http).get = "/cosmos/authz/v1beta1/grants"; } + + // GranterGrants returns list of `GrantAuthorization`, granted by granter. + // + // Since: cosmos-sdk 0.45.2 + rpc GranterGrants(QueryGranterGrantsRequest) returns (QueryGranterGrantsResponse) { + option (google.api.http).get = "/cosmos/authz/v1beta1/grants/granter/{granter}"; + } + + // GranteeGrants returns a list of `GrantAuthorization` by grantee. + // + // Since: cosmos-sdk 0.45.2 + rpc GranteeGrants(QueryGranteeGrantsRequest) returns (QueryGranteeGrantsResponse) { + option (google.api.http).get = "/cosmos/authz/v1beta1/grants/grantee/{grantee}"; + } } // QueryGrantsRequest is the request type for the Query/Grants RPC method. @@ -29,7 +43,39 @@ message QueryGrantsRequest { // QueryGrantsResponse is the response type for the Query/Authorizations RPC method. message QueryGrantsResponse { // authorizations is a list of grants granted for grantee by granter. - repeated cosmos.authz.v1beta1.Grant grants = 1; + repeated Grant grants = 1; + // pagination defines an pagination for the response. + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +// QueryGranterGrantsRequest is the request type for the Query/GranterGrants RPC method. +message QueryGranterGrantsRequest { + string granter = 1; + + // pagination defines an pagination for the request. + cosmos.base.query.v1beta1.PageRequest pagination = 2; +} + +// QueryGranterGrantsResponse is the response type for the Query/GranterGrants RPC method. +message QueryGranterGrantsResponse { + // grants is a list of grants granted by the granter. + repeated GrantAuthorization grants = 1; + // pagination defines an pagination for the response. + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +// QueryGranteeGrantsRequest is the request type for the Query/IssuedGrants RPC method. +message QueryGranteeGrantsRequest { + string grantee = 1; + + // pagination defines an pagination for the request. + cosmos.base.query.v1beta1.PageRequest pagination = 2; +} + +// QueryGranteeGrantsResponse is the response type for the Query/GranteeGrants RPC method. +message QueryGranteeGrantsResponse { + // grants is a list of grants granted to the grantee. + repeated GrantAuthorization grants = 1; // pagination defines an pagination for the response. cosmos.base.query.v1beta1.PageResponse pagination = 2; } diff --git a/third_party/proto/cosmos/bank/v1beta1/query.proto b/third_party/proto/cosmos/bank/v1beta1/query.proto index 520ba06964..a567e073f3 100644 --- a/third_party/proto/cosmos/bank/v1beta1/query.proto +++ b/third_party/proto/cosmos/bank/v1beta1/query.proto @@ -21,6 +21,12 @@ service Query { option (google.api.http).get = "/cosmos/bank/v1beta1/balances/{address}"; } + // SpendableBalances queries the spenable balance of all coins for a single + // account. + rpc SpendableBalances(QuerySpendableBalancesRequest) returns (QuerySpendableBalancesResponse) { + option (google.api.http).get = "/cosmos/bank/v1beta1/spendable_balances/{address}"; + } + // TotalSupply queries the total supply of all coins. rpc TotalSupply(QueryTotalSupplyRequest) returns (QueryTotalSupplyResponse) { option (google.api.http).get = "/cosmos/bank/v1beta1/supply"; @@ -49,7 +55,7 @@ service Query { // QueryBalanceRequest is the request type for the Query/Balance RPC method. message QueryBalanceRequest { - option (gogoproto.equal) = false; + option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; // address is the address to query balances for. @@ -67,7 +73,7 @@ message QueryBalanceResponse { // QueryBalanceRequest is the request type for the Query/AllBalances RPC method. message QueryAllBalancesRequest { - option (gogoproto.equal) = false; + option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; // address is the address to query balances for. @@ -82,7 +88,31 @@ message QueryAllBalancesRequest { message QueryAllBalancesResponse { // balances is the balances of all the coins. repeated cosmos.base.v1beta1.Coin balances = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; + + // pagination defines the pagination in the response. + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +// QuerySpendableBalancesRequest defines the gRPC request structure for querying +// an account's spendable balances. +message QuerySpendableBalancesRequest { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + // address is the address to query spendable balances for. + string address = 1; + + // pagination defines an optional pagination for the request. + cosmos.base.query.v1beta1.PageRequest pagination = 2; +} + +// QuerySpendableBalancesResponse defines the gRPC response structure for querying +// an account's spendable balances. +message QuerySpendableBalancesResponse { + // balances is the spendable balances of all the coins. + repeated cosmos.base.v1beta1.Coin balances = 1 + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; // pagination defines the pagination in the response. cosmos.base.query.v1beta1.PageResponse pagination = 2; @@ -91,7 +121,7 @@ message QueryAllBalancesResponse { // QueryTotalSupplyRequest is the request type for the Query/TotalSupply RPC // method. message QueryTotalSupplyRequest { - option (gogoproto.equal) = false; + option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; // pagination defines an optional pagination for the request. @@ -105,7 +135,7 @@ message QueryTotalSupplyRequest { message QueryTotalSupplyResponse { // supply is the supply of the coins repeated cosmos.base.v1beta1.Coin supply = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; // pagination defines the pagination in the response. // diff --git a/third_party/proto/cosmos/base/snapshots/v1beta1/snapshot.proto b/third_party/proto/cosmos/base/snapshots/v1beta1/snapshot.proto index 9ac5a7c31b..6dcc4a933a 100644 --- a/third_party/proto/cosmos/base/snapshots/v1beta1/snapshot.proto +++ b/third_party/proto/cosmos/base/snapshots/v1beta1/snapshot.proto @@ -17,4 +17,41 @@ message Snapshot { // Metadata contains SDK-specific snapshot metadata. message Metadata { repeated bytes chunk_hashes = 1; // SHA-256 chunk hashes -} \ No newline at end of file +} + +// SnapshotItem is an item contained in a rootmulti.Store snapshot. +message SnapshotItem { + // item is the specific type of snapshot item. + oneof item { + SnapshotStoreItem store = 1; + SnapshotIAVLItem iavl = 2 [(gogoproto.customname) = "IAVL"]; + SnapshotExtensionMeta extension = 3; + SnapshotExtensionPayload extension_payload = 4; + } +} + +// SnapshotStoreItem contains metadata about a snapshotted store. +message SnapshotStoreItem { + string name = 1; +} + +// SnapshotIAVLItem is an exported IAVL node. +message SnapshotIAVLItem { + bytes key = 1; + bytes value = 2; + // version is block height + int64 version = 3; + // height is depth of the tree. + int32 height = 4; +} + +// SnapshotExtensionMeta contains metadata about an external snapshotter. +message SnapshotExtensionMeta { + string name = 1; + uint32 format = 2; +} + +// SnapshotExtensionPayload contains payloads of an external snapshotter. +message SnapshotExtensionPayload { + bytes payload = 1; +} diff --git a/third_party/proto/cosmos/base/store/v1beta1/snapshot.proto b/third_party/proto/cosmos/base/store/v1beta1/snapshot.proto deleted file mode 100644 index 834855093b..0000000000 --- a/third_party/proto/cosmos/base/store/v1beta1/snapshot.proto +++ /dev/null @@ -1,28 +0,0 @@ -syntax = "proto3"; -package cosmos.base.store.v1beta1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/store/types"; - -// SnapshotItem is an item contained in a rootmulti.Store snapshot. -message SnapshotItem { - // item is the specific type of snapshot item. - oneof item { - SnapshotStoreItem store = 1; - SnapshotIAVLItem iavl = 2 [(gogoproto.customname) = "IAVL"]; - } -} - -// SnapshotStoreItem contains metadata about a snapshotted store. -message SnapshotStoreItem { - string name = 1; -} - -// SnapshotIAVLItem is an exported IAVL node. -message SnapshotIAVLItem { - bytes key = 1; - bytes value = 2; - int64 version = 3; - int32 height = 4; -} \ No newline at end of file diff --git a/third_party/proto/cosmos/base/tendermint/v1beta1/query.proto b/third_party/proto/cosmos/base/tendermint/v1beta1/query.proto index 3c31877aa0..98542d23db 100644 --- a/third_party/proto/cosmos/base/tendermint/v1beta1/query.proto +++ b/third_party/proto/cosmos/base/tendermint/v1beta1/query.proto @@ -116,15 +116,15 @@ message GetNodeInfoResponse { // VersionInfo is the type for the GetNodeInfoResponse message. message VersionInfo { - string name = 1; - string app_name = 2; - string version = 3; - string git_commit = 4; - string build_tags = 5; - string go_version = 6; - repeated Module build_deps = 7; + string name = 1; + string app_name = 2; + string version = 3; + string git_commit = 4; + string build_tags = 5; + string go_version = 6; + repeated Module build_deps = 7; // Since: cosmos-sdk 0.43 - string cosmos_sdk_version = 8; + string cosmos_sdk_version = 8; } // Module is the type for VersionInfo diff --git a/third_party/proto/cosmos/feegrant/v1beta1/query.proto b/third_party/proto/cosmos/feegrant/v1beta1/query.proto index 9cf2a4987d..42d7a842de 100644 --- a/third_party/proto/cosmos/feegrant/v1beta1/query.proto +++ b/third_party/proto/cosmos/feegrant/v1beta1/query.proto @@ -20,6 +20,12 @@ service Query { rpc Allowances(QueryAllowancesRequest) returns (QueryAllowancesResponse) { option (google.api.http).get = "/cosmos/feegrant/v1beta1/allowances/{grantee}"; } + + // AllowancesByGranter returns all the grants given by an address + // Since v0.46 + rpc AllowancesByGranter(QueryAllowancesByGranterRequest) returns (QueryAllowancesByGranterResponse) { + option (google.api.http).get = "/cosmos/feegrant/v1beta1/issued/{granter}"; + } } // QueryAllowanceRequest is the request type for the Query/Allowance RPC method. @@ -53,3 +59,20 @@ message QueryAllowancesResponse { // pagination defines an pagination for the response. cosmos.base.query.v1beta1.PageResponse pagination = 2; } + +// QueryAllowancesByGranterRequest is the request type for the Query/AllowancesByGranter RPC method. +message QueryAllowancesByGranterRequest { + string granter = 1; + + // pagination defines an pagination for the request. + cosmos.base.query.v1beta1.PageRequest pagination = 2; +} + +// QueryAllowancesByGranterResponse is the response type for the Query/AllowancesByGranter RPC method. +message QueryAllowancesByGranterResponse { + // allowances that have been issued by the granter. + repeated cosmos.feegrant.v1beta1.Grant allowances = 1; + + // pagination defines an pagination for the response. + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} diff --git a/third_party/proto/cosmos/gov/v1beta1/gov.proto b/third_party/proto/cosmos/gov/v1beta1/gov.proto index 344b5ada19..01aebf950c 100644 --- a/third_party/proto/cosmos/gov/v1beta1/gov.proto +++ b/third_party/proto/cosmos/gov/v1beta1/gov.proto @@ -136,7 +136,7 @@ message Vote { // Deprecated: Prefer to use `options` instead. This field is set in queries // if and only if `len(options) == 1` and that option has weight 1. In all // other cases, this field will default to VOTE_OPTION_UNSPECIFIED. - VoteOption option = 3 [deprecated = true]; + VoteOption option = 3 [deprecated = true]; // Since: cosmos-sdk 0.43 repeated WeightedVoteOption options = 4 [(gogoproto.nullable) = false]; } diff --git a/third_party/proto/cosmos/tx/signing/v1beta1/signing.proto b/third_party/proto/cosmos/tx/signing/v1beta1/signing.proto index 4c1be40594..50de89c8fc 100644 --- a/third_party/proto/cosmos/tx/signing/v1beta1/signing.proto +++ b/third_party/proto/cosmos/tx/signing/v1beta1/signing.proto @@ -24,6 +24,18 @@ enum SignMode { // SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses // Amino JSON and will be removed in the future SIGN_MODE_LEGACY_AMINO_JSON = 127; + + // SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos + // SDK. Ref: https://eips.ethereum.org/EIPS/eip-191 + // + // Currently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant, + // but is not implemented on the SDK by default. To enable EIP-191, you need + // to pass a custom `TxConfig` that has an implementation of + // `SignModeHandler` for EIP-191. The SDK may decide to fully support + // EIP-191 in the future. + // + // Since: cosmos-sdk 0.45.2 + SIGN_MODE_EIP_191 = 191; } // SignatureDescriptors wraps multiple SignatureDescriptor's. diff --git a/third_party/proto/cosmos/tx/v1beta1/service.proto b/third_party/proto/cosmos/tx/v1beta1/service.proto index acfbf15b36..d9f828f763 100644 --- a/third_party/proto/cosmos/tx/v1beta1/service.proto +++ b/third_party/proto/cosmos/tx/v1beta1/service.proto @@ -6,6 +6,8 @@ import "cosmos/base/abci/v1beta1/abci.proto"; import "cosmos/tx/v1beta1/tx.proto"; import "gogoproto/gogo.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; +import "tendermint/types/block.proto"; +import "tendermint/types/types.proto"; option (gogoproto.goproto_registration) = true; option go_package = "github.com/cosmos/cosmos-sdk/types/tx"; @@ -34,6 +36,12 @@ service Service { rpc GetTxsEvent(GetTxsEventRequest) returns (GetTxsEventResponse) { option (google.api.http).get = "/cosmos/tx/v1beta1/txs"; } + // GetBlockWithTxs fetches a block with decoded txs. + // + // Since: cosmos-sdk 0.45.2 + rpc GetBlockWithTxs(GetBlockWithTxsRequest) returns (GetBlockWithTxsResponse) { + option (google.api.http).get = "/cosmos/tx/v1beta1/txs/block/{height}"; + } } // GetTxsEventRequest is the request type for the Service.TxsByEvents @@ -41,7 +49,7 @@ service Service { message GetTxsEventRequest { // events is the list of transaction event type. repeated string events = 1; - // pagination defines an pagination for the request. + // pagination defines a pagination for the request. cosmos.base.query.v1beta1.PageRequest pagination = 2; OrderBy order_by = 3; } @@ -63,7 +71,7 @@ message GetTxsEventResponse { repeated cosmos.tx.v1beta1.Tx txs = 1; // tx_responses is the list of queried TxResponses. repeated cosmos.base.abci.v1beta1.TxResponse tx_responses = 2; - // pagination defines an pagination for the response. + // pagination defines a pagination for the response. cosmos.base.query.v1beta1.PageResponse pagination = 3; } @@ -131,4 +139,27 @@ message GetTxResponse { cosmos.tx.v1beta1.Tx tx = 1; // tx_response is the queried TxResponses. cosmos.base.abci.v1beta1.TxResponse tx_response = 2; +} + +// GetBlockWithTxsRequest is the request type for the Service.GetBlockWithTxs +// RPC method. +// +// Since: cosmos-sdk 0.45.2 +message GetBlockWithTxsRequest { + // height is the height of the block to query. + int64 height = 1; + // pagination defines a pagination for the request. + cosmos.base.query.v1beta1.PageRequest pagination = 2; +} + +// GetBlockWithTxsResponse is the response type for the Service.GetBlockWithTxs method. +// +// Since: cosmos-sdk 0.45.2 +message GetBlockWithTxsResponse { + // txs are the transactions in the block. + repeated cosmos.tx.v1beta1.Tx txs = 1; + .tendermint.types.BlockID block_id = 2; + .tendermint.types.Block block = 3; + // pagination defines a pagination for the response. + cosmos.base.query.v1beta1.PageResponse pagination = 4; } \ No newline at end of file diff --git a/third_party/proto/tendermint/abci/types.proto b/third_party/proto/tendermint/abci/types.proto index 8e3a909363..340800f46b 100644 --- a/third_party/proto/tendermint/abci/types.proto +++ b/third_party/proto/tendermint/abci/types.proto @@ -102,8 +102,7 @@ message RequestEndBlock { message RequestCommit {} // lists available snapshots -message RequestListSnapshots { -} +message RequestListSnapshots {} // offers a snapshot to the application message RequestOfferSnapshot { @@ -212,6 +211,12 @@ message ResponseCheckTx { repeated Event events = 7 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; string codespace = 8; + string sender = 9; + int64 priority = 10; + + // mempool_error is set by Tendermint. + // ABCI applictions creating a ResponseCheckTX should not set mempool_error. + string mempool_error = 11; } message ResponseDeliverTx { @@ -221,16 +226,17 @@ message ResponseDeliverTx { string info = 4; // nondeterministic int64 gas_wanted = 5 [json_name = "gas_wanted"]; int64 gas_used = 6 [json_name = "gas_used"]; - repeated Event events = 7 - [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; // nondeterministic + repeated Event events = 7 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "events,omitempty" + ]; // nondeterministic string codespace = 8; } message ResponseEndBlock { - repeated ValidatorUpdate validator_updates = 1 - [(gogoproto.nullable) = false]; - ConsensusParams consensus_param_updates = 2; - repeated Event events = 3 + repeated ValidatorUpdate validator_updates = 1 [(gogoproto.nullable) = false]; + ConsensusParams consensus_param_updates = 2; + repeated Event events = 3 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; } @@ -364,10 +370,8 @@ message Evidence { // The height when the offense occurred int64 height = 3; // The corresponding time where the offense occurred - google.protobuf.Timestamp time = 4 [ - (gogoproto.nullable) = false, - (gogoproto.stdtime) = true - ]; + google.protobuf.Timestamp time = 4 + [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; // Total voting power of the validator set in case the ABCI application does // not store historical validators. // https://github.com/tendermint/tendermint/issues/4581 @@ -402,6 +406,8 @@ service ABCIApplication { rpc EndBlock(RequestEndBlock) returns (ResponseEndBlock); rpc ListSnapshots(RequestListSnapshots) returns (ResponseListSnapshots); rpc OfferSnapshot(RequestOfferSnapshot) returns (ResponseOfferSnapshot); - rpc LoadSnapshotChunk(RequestLoadSnapshotChunk) returns (ResponseLoadSnapshotChunk); - rpc ApplySnapshotChunk(RequestApplySnapshotChunk) returns (ResponseApplySnapshotChunk); + rpc LoadSnapshotChunk(RequestLoadSnapshotChunk) + returns (ResponseLoadSnapshotChunk); + rpc ApplySnapshotChunk(RequestApplySnapshotChunk) + returns (ResponseApplySnapshotChunk); } diff --git a/third_party/proto/tendermint/consensus/types.proto b/third_party/proto/tendermint/consensus/types.proto index 6e1f413711..5048f85452 100644 --- a/third_party/proto/tendermint/consensus/types.proto +++ b/third_party/proto/tendermint/consensus/types.proto @@ -18,7 +18,7 @@ message NewRoundStep { } // NewValidBlock is sent when a validator observes a valid block B in some round r, -//i.e., there is a Proposal for block B and 2/3+ prevotes for the block B in the round r. +// i.e., there is a Proposal for block B and 2/3+ prevotes for the block B in the round r. // In case the block is also committed, then IsCommit flag is set to true. message NewValidBlock { int64 height = 1; diff --git a/third_party/proto/tendermint/rpc/grpc/types.pb.go b/third_party/proto/tendermint/rpc/grpc/types.pb.go new file mode 100644 index 0000000000..de580d2a66 --- /dev/null +++ b/third_party/proto/tendermint/rpc/grpc/types.pb.go @@ -0,0 +1,953 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: tendermint/rpc/grpc/types.proto + +package coregrpc + +import ( + context "context" + fmt "fmt" + io "io" + math "math" + math_bits "math/bits" + + proto "github.com/gogo/protobuf/proto" + types "github.com/tendermint/tendermint/abci/types" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal + +var ( + _ = fmt.Errorf + _ = 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 RequestPing struct{} + +func (m *RequestPing) Reset() { *m = RequestPing{} } +func (m *RequestPing) String() string { return proto.CompactTextString(m) } +func (*RequestPing) ProtoMessage() {} +func (*RequestPing) Descriptor() ([]byte, []int) { + return fileDescriptor_0ffff5682c662b95, []int{0} +} + +func (m *RequestPing) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *RequestPing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestPing.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 *RequestPing) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestPing.Merge(m, src) +} + +func (m *RequestPing) XXX_Size() int { + return m.Size() +} + +func (m *RequestPing) XXX_DiscardUnknown() { + xxx_messageInfo_RequestPing.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestPing proto.InternalMessageInfo + +type RequestBroadcastTx struct { + Tx []byte `protobuf:"bytes,1,opt,name=tx,proto3" json:"tx,omitempty"` +} + +func (m *RequestBroadcastTx) Reset() { *m = RequestBroadcastTx{} } +func (m *RequestBroadcastTx) String() string { return proto.CompactTextString(m) } +func (*RequestBroadcastTx) ProtoMessage() {} +func (*RequestBroadcastTx) Descriptor() ([]byte, []int) { + return fileDescriptor_0ffff5682c662b95, []int{1} +} + +func (m *RequestBroadcastTx) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *RequestBroadcastTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestBroadcastTx.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 *RequestBroadcastTx) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestBroadcastTx.Merge(m, src) +} + +func (m *RequestBroadcastTx) XXX_Size() int { + return m.Size() +} + +func (m *RequestBroadcastTx) XXX_DiscardUnknown() { + xxx_messageInfo_RequestBroadcastTx.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestBroadcastTx proto.InternalMessageInfo + +func (m *RequestBroadcastTx) GetTx() []byte { + if m != nil { + return m.Tx + } + return nil +} + +type ResponsePing struct{} + +func (m *ResponsePing) Reset() { *m = ResponsePing{} } +func (m *ResponsePing) String() string { return proto.CompactTextString(m) } +func (*ResponsePing) ProtoMessage() {} +func (*ResponsePing) Descriptor() ([]byte, []int) { + return fileDescriptor_0ffff5682c662b95, []int{2} +} + +func (m *ResponsePing) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *ResponsePing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponsePing.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 *ResponsePing) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponsePing.Merge(m, src) +} + +func (m *ResponsePing) XXX_Size() int { + return m.Size() +} + +func (m *ResponsePing) XXX_DiscardUnknown() { + xxx_messageInfo_ResponsePing.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponsePing proto.InternalMessageInfo + +type ResponseBroadcastTx struct { + CheckTx *types.ResponseCheckTx `protobuf:"bytes,1,opt,name=check_tx,json=checkTx,proto3" json:"check_tx,omitempty"` + DeliverTx *types.ResponseDeliverTx `protobuf:"bytes,2,opt,name=deliver_tx,json=deliverTx,proto3" json:"deliver_tx,omitempty"` +} + +func (m *ResponseBroadcastTx) Reset() { *m = ResponseBroadcastTx{} } +func (m *ResponseBroadcastTx) String() string { return proto.CompactTextString(m) } +func (*ResponseBroadcastTx) ProtoMessage() {} +func (*ResponseBroadcastTx) Descriptor() ([]byte, []int) { + return fileDescriptor_0ffff5682c662b95, []int{3} +} + +func (m *ResponseBroadcastTx) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *ResponseBroadcastTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseBroadcastTx.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 *ResponseBroadcastTx) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseBroadcastTx.Merge(m, src) +} + +func (m *ResponseBroadcastTx) XXX_Size() int { + return m.Size() +} + +func (m *ResponseBroadcastTx) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseBroadcastTx.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseBroadcastTx proto.InternalMessageInfo + +func (m *ResponseBroadcastTx) GetCheckTx() *types.ResponseCheckTx { + if m != nil { + return m.CheckTx + } + return nil +} + +func (m *ResponseBroadcastTx) GetDeliverTx() *types.ResponseDeliverTx { + if m != nil { + return m.DeliverTx + } + return nil +} + +func init() { + proto.RegisterType((*RequestPing)(nil), "tendermint.rpc.grpc.RequestPing") + proto.RegisterType((*RequestBroadcastTx)(nil), "tendermint.rpc.grpc.RequestBroadcastTx") + proto.RegisterType((*ResponsePing)(nil), "tendermint.rpc.grpc.ResponsePing") + proto.RegisterType((*ResponseBroadcastTx)(nil), "tendermint.rpc.grpc.ResponseBroadcastTx") +} + +func init() { proto.RegisterFile("tendermint/rpc/grpc/types.proto", fileDescriptor_0ffff5682c662b95) } + +var fileDescriptor_0ffff5682c662b95 = []byte{ + // 316 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2f, 0x49, 0xcd, 0x4b, + 0x49, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0x2f, 0x2a, 0x48, 0xd6, 0x4f, 0x07, 0x11, 0x25, 0x95, + 0x05, 0xa9, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0xc2, 0x08, 0x05, 0x7a, 0x45, 0x05, + 0xc9, 0x7a, 0x20, 0x05, 0x52, 0xd2, 0x48, 0xba, 0x12, 0x93, 0x92, 0x33, 0x91, 0x75, 0x28, 0xf1, + 0x72, 0x71, 0x07, 0xa5, 0x16, 0x96, 0xa6, 0x16, 0x97, 0x04, 0x64, 0xe6, 0xa5, 0x2b, 0xa9, 0x70, + 0x09, 0x41, 0xb9, 0x4e, 0x45, 0xf9, 0x89, 0x29, 0xc9, 0x89, 0xc5, 0x25, 0x21, 0x15, 0x42, 0x7c, + 0x5c, 0x4c, 0x25, 0x15, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x3c, 0x41, 0x4c, 0x25, 0x15, 0x4a, 0x7c, + 0x5c, 0x3c, 0x41, 0xa9, 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x60, 0x5d, 0x53, 0x19, 0xb9, 0x84, + 0x61, 0x02, 0xc8, 0xfa, 0xac, 0xb9, 0x38, 0x92, 0x33, 0x52, 0x93, 0xb3, 0xe3, 0xa1, 0xba, 0xb9, + 0x8d, 0x14, 0xf4, 0x90, 0x5c, 0x08, 0x72, 0x8c, 0x1e, 0x4c, 0x9f, 0x33, 0x48, 0x61, 0x48, 0x45, + 0x10, 0x7b, 0x32, 0x84, 0x21, 0xe4, 0xc8, 0xc5, 0x95, 0x92, 0x9a, 0x93, 0x59, 0x96, 0x5a, 0x04, + 0xd2, 0xce, 0x04, 0xd6, 0xae, 0x84, 0x53, 0xbb, 0x0b, 0x44, 0x69, 0x48, 0x45, 0x10, 0x67, 0x0a, + 0x8c, 0x69, 0xb4, 0x97, 0x91, 0x8b, 0x07, 0xee, 0x1e, 0xc7, 0x00, 0x4f, 0x21, 0x6f, 0x2e, 0x16, + 0x90, 0x83, 0x85, 0x50, 0x9c, 0x01, 0x0b, 0x28, 0x3d, 0xa4, 0x80, 0x90, 0x52, 0xc4, 0xa1, 0x02, + 0xe1, 0x6b, 0xa1, 0x04, 0x2e, 0x6e, 0x64, 0xcf, 0xaa, 0xe3, 0x33, 0x13, 0x49, 0xa1, 0x94, 0x06, + 0x5e, 0xa3, 0x91, 0x54, 0x3a, 0xf9, 0x9c, 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, 0x51, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0x52, 0xf4, 0x62, + 0x49, 0x1f, 0xd6, 0xc9, 0xf9, 0x45, 0xa9, 0x20, 0x46, 0x12, 0x1b, 0x38, 0xc6, 0x8d, 0x01, 0x01, + 0x00, 0x00, 0xff, 0xff, 0xf6, 0x4b, 0x02, 0xd8, 0x46, 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 + +// BroadcastAPIClient is the client API for BroadcastAPI service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type BroadcastAPIClient interface { + Ping(ctx context.Context, in *RequestPing, opts ...grpc.CallOption) (*ResponsePing, error) + BroadcastTx(ctx context.Context, in *RequestBroadcastTx, opts ...grpc.CallOption) (*ResponseBroadcastTx, error) +} + +type broadcastAPIClient struct { + cc *grpc.ClientConn +} + +func NewBroadcastAPIClient(cc *grpc.ClientConn) BroadcastAPIClient { + return &broadcastAPIClient{cc} +} + +func (c *broadcastAPIClient) Ping(ctx context.Context, in *RequestPing, opts ...grpc.CallOption) (*ResponsePing, error) { + out := new(ResponsePing) + err := c.cc.Invoke(ctx, "/tendermint.rpc.grpc.BroadcastAPI/Ping", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *broadcastAPIClient) BroadcastTx(ctx context.Context, in *RequestBroadcastTx, opts ...grpc.CallOption) (*ResponseBroadcastTx, error) { + out := new(ResponseBroadcastTx) + err := c.cc.Invoke(ctx, "/tendermint.rpc.grpc.BroadcastAPI/BroadcastTx", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// BroadcastAPIServer is the server API for BroadcastAPI service. +type BroadcastAPIServer interface { + Ping(context.Context, *RequestPing) (*ResponsePing, error) + BroadcastTx(context.Context, *RequestBroadcastTx) (*ResponseBroadcastTx, error) +} + +// UnimplementedBroadcastAPIServer can be embedded to have forward compatible implementations. +type UnimplementedBroadcastAPIServer struct{} + +func (*UnimplementedBroadcastAPIServer) Ping(ctx context.Context, req *RequestPing) (*ResponsePing, error) { + return nil, status.Errorf(codes.Unimplemented, "method Ping not implemented") +} + +func (*UnimplementedBroadcastAPIServer) BroadcastTx(ctx context.Context, req *RequestBroadcastTx) (*ResponseBroadcastTx, error) { + return nil, status.Errorf(codes.Unimplemented, "method BroadcastTx not implemented") +} + +func RegisterBroadcastAPIServer(s *grpc.Server, srv BroadcastAPIServer) { + s.RegisterService(&_BroadcastAPI_serviceDesc, srv) +} + +func _BroadcastAPI_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestPing) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BroadcastAPIServer).Ping(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.rpc.grpc.BroadcastAPI/Ping", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BroadcastAPIServer).Ping(ctx, req.(*RequestPing)) + } + return interceptor(ctx, in, info, handler) +} + +func _BroadcastAPI_BroadcastTx_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestBroadcastTx) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BroadcastAPIServer).BroadcastTx(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.rpc.grpc.BroadcastAPI/BroadcastTx", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BroadcastAPIServer).BroadcastTx(ctx, req.(*RequestBroadcastTx)) + } + return interceptor(ctx, in, info, handler) +} + +var _BroadcastAPI_serviceDesc = grpc.ServiceDesc{ + ServiceName: "tendermint.rpc.grpc.BroadcastAPI", + HandlerType: (*BroadcastAPIServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Ping", + Handler: _BroadcastAPI_Ping_Handler, + }, + { + MethodName: "BroadcastTx", + Handler: _BroadcastAPI_BroadcastTx_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "tendermint/rpc/grpc/types.proto", +} + +func (m *RequestPing) 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 *RequestPing) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestPing) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RequestBroadcastTx) 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 *RequestBroadcastTx) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestBroadcastTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Tx) > 0 { + i -= len(m.Tx) + copy(dAtA[i:], m.Tx) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Tx))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ResponsePing) 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 *ResponsePing) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponsePing) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *ResponseBroadcastTx) 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 *ResponseBroadcastTx) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseBroadcastTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.DeliverTx != nil { + { + size, err := m.DeliverTx.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.CheckTx != nil { + { + size, err := m.CheckTx.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { + offset -= sovTypes(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} + +func (m *RequestPing) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RequestBroadcastTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Tx) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ResponsePing) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *ResponseBroadcastTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CheckTx != nil { + l = m.CheckTx.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.DeliverTx != nil { + l = m.DeliverTx.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func sovTypes(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} + +func sozTypes(x uint64) (n int) { + return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + +func (m *RequestPing) 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 ErrIntOverflowTypes + } + 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: RequestPing: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestPing: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} + +func (m *RequestBroadcastTx) 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 ErrIntOverflowTypes + } + 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: RequestBroadcastTx: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestBroadcastTx: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tx = append(m.Tx[:0], dAtA[iNdEx:postIndex]...) + if m.Tx == nil { + m.Tx = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} + +func (m *ResponsePing) 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 ErrIntOverflowTypes + } + 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: ResponsePing: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponsePing: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} + +func (m *ResponseBroadcastTx) 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 ErrIntOverflowTypes + } + 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: ResponseBroadcastTx: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseBroadcastTx: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CheckTx", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CheckTx == nil { + m.CheckTx = &types.ResponseCheckTx{} + } + if err := m.CheckTx.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeliverTx", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DeliverTx == nil { + m.DeliverTx = &types.ResponseDeliverTx{} + } + if err := m.DeliverTx.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} + +func skipTypes(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, ErrIntOverflowTypes + } + 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, ErrIntOverflowTypes + } + 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, ErrIntOverflowTypes + } + 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, ErrInvalidLengthTypes + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTypes + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTypes + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") +) diff --git a/third_party/proto/tendermint/state/types.pb.go b/third_party/proto/tendermint/state/types.pb.go index b9e4b6d127..6f56294825 100644 --- a/third_party/proto/tendermint/state/types.pb.go +++ b/third_party/proto/tendermint/state/types.pb.go @@ -218,6 +218,63 @@ func (m *ConsensusParamsInfo) GetLastHeightChanged() int64 { return 0 } +type ABCIResponsesInfo struct { + AbciResponses *ABCIResponses `protobuf:"bytes,1,opt,name=abci_responses,json=abciResponses,proto3" json:"abci_responses,omitempty"` + Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` +} + +func (m *ABCIResponsesInfo) Reset() { *m = ABCIResponsesInfo{} } +func (m *ABCIResponsesInfo) String() string { return proto.CompactTextString(m) } +func (*ABCIResponsesInfo) ProtoMessage() {} +func (*ABCIResponsesInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_ccfacf933f22bf93, []int{3} +} + +func (m *ABCIResponsesInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *ABCIResponsesInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ABCIResponsesInfo.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 *ABCIResponsesInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ABCIResponsesInfo.Merge(m, src) +} + +func (m *ABCIResponsesInfo) XXX_Size() int { + return m.Size() +} + +func (m *ABCIResponsesInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ABCIResponsesInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_ABCIResponsesInfo proto.InternalMessageInfo + +func (m *ABCIResponsesInfo) GetAbciResponses() *ABCIResponses { + if m != nil { + return m.AbciResponses + } + return nil +} + +func (m *ABCIResponsesInfo) GetHeight() int64 { + if m != nil { + return m.Height + } + return 0 +} + type Version struct { Consensus version.Consensus `protobuf:"bytes,1,opt,name=consensus,proto3" json:"consensus"` Software string `protobuf:"bytes,2,opt,name=software,proto3" json:"software,omitempty"` @@ -227,7 +284,7 @@ func (m *Version) Reset() { *m = Version{} } func (m *Version) String() string { return proto.CompactTextString(m) } func (*Version) ProtoMessage() {} func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_ccfacf933f22bf93, []int{3} + return fileDescriptor_ccfacf933f22bf93, []int{4} } func (m *Version) XXX_Unmarshal(b []byte) error { @@ -308,7 +365,7 @@ func (m *State) Reset() { *m = State{} } func (m *State) String() string { return proto.CompactTextString(m) } func (*State) ProtoMessage() {} func (*State) Descriptor() ([]byte, []int) { - return fileDescriptor_ccfacf933f22bf93, []int{4} + return fileDescriptor_ccfacf933f22bf93, []int{5} } func (m *State) XXX_Unmarshal(b []byte) error { @@ -444,6 +501,7 @@ func init() { proto.RegisterType((*ABCIResponses)(nil), "tendermint.state.ABCIResponses") proto.RegisterType((*ValidatorsInfo)(nil), "tendermint.state.ValidatorsInfo") proto.RegisterType((*ConsensusParamsInfo)(nil), "tendermint.state.ConsensusParamsInfo") + proto.RegisterType((*ABCIResponsesInfo)(nil), "tendermint.state.ABCIResponsesInfo") proto.RegisterType((*Version)(nil), "tendermint.state.Version") proto.RegisterType((*State)(nil), "tendermint.state.State") } @@ -451,55 +509,58 @@ func init() { func init() { proto.RegisterFile("tendermint/state/types.proto", fileDescriptor_ccfacf933f22bf93) } var fileDescriptor_ccfacf933f22bf93 = []byte{ - // 763 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcf, 0x6f, 0xd3, 0x30, - 0x14, 0x6e, 0xe8, 0xb6, 0xb6, 0xce, 0xda, 0x0e, 0x8f, 0x43, 0xd6, 0xb1, 0xb4, 0x2b, 0x3f, 0x34, - 0x71, 0x48, 0xa5, 0x71, 0x40, 0x5c, 0x26, 0x2d, 0x2d, 0x62, 0x95, 0x26, 0x04, 0xd9, 0xb4, 0x03, - 0x97, 0xc8, 0x6d, 0xbc, 0x24, 0xa2, 0x4d, 0xa2, 0xd8, 0x2d, 0xe3, 0x0f, 0xe0, 0xbe, 0x2b, 0xff, - 0xd1, 0x8e, 0x3b, 0x22, 0x0e, 0x03, 0xba, 0x7f, 0x04, 0xd9, 0xce, 0x0f, 0xb7, 0x65, 0xd2, 0x10, - 0x37, 0xfb, 0x7d, 0xdf, 0xfb, 0xfc, 0xf9, 0xf9, 0x3d, 0x19, 0x3c, 0xa6, 0x38, 0x70, 0x70, 0x3c, - 0xf6, 0x03, 0xda, 0x21, 0x14, 0x51, 0xdc, 0xa1, 0x5f, 0x22, 0x4c, 0x8c, 0x28, 0x0e, 0x69, 0x08, - 0x37, 0x72, 0xd4, 0xe0, 0x68, 0xe3, 0x91, 0x1b, 0xba, 0x21, 0x07, 0x3b, 0x6c, 0x25, 0x78, 0x8d, - 0x6d, 0x49, 0x05, 0x0d, 0x86, 0xbe, 0x2c, 0xd2, 0x90, 0x8f, 0xe0, 0xf1, 0x39, 0xb4, 0xb5, 0x84, - 0x4e, 0xd1, 0xc8, 0x77, 0x10, 0x0d, 0xe3, 0x84, 0xb1, 0xb3, 0xc4, 0x88, 0x50, 0x8c, 0xc6, 0xa9, - 0x80, 0x2e, 0xc1, 0x53, 0x1c, 0x13, 0x3f, 0x0c, 0xe6, 0x0e, 0x68, 0xba, 0x61, 0xe8, 0x8e, 0x70, - 0x87, 0xef, 0x06, 0x93, 0xf3, 0x0e, 0xf5, 0xc7, 0x98, 0x50, 0x34, 0x8e, 0x04, 0xa1, 0xfd, 0x43, - 0x01, 0xd5, 0x43, 0xb3, 0xdb, 0xb7, 0x30, 0x89, 0xc2, 0x80, 0x60, 0x02, 0xbb, 0x40, 0x75, 0xf0, - 0xc8, 0x9f, 0xe2, 0xd8, 0xa6, 0x17, 0x44, 0x53, 0x5a, 0xc5, 0x3d, 0x75, 0xbf, 0x6d, 0x48, 0xc5, - 0x60, 0x97, 0x34, 0xd2, 0x84, 0x9e, 0xe0, 0x9e, 0x5e, 0x58, 0xc0, 0x49, 0x97, 0x04, 0x1e, 0x80, - 0x0a, 0x0e, 0x1c, 0x7b, 0x30, 0x0a, 0x87, 0x9f, 0xb4, 0x07, 0x2d, 0x65, 0x4f, 0xdd, 0xdf, 0xbd, - 0x53, 0xe2, 0x4d, 0xe0, 0x98, 0x8c, 0x68, 0x95, 0x71, 0xb2, 0x82, 0x3d, 0xa0, 0x0e, 0xb0, 0xeb, - 0x07, 0x89, 0x42, 0x91, 0x2b, 0x3c, 0xb9, 0x53, 0xc1, 0x64, 0x5c, 0xa1, 0x01, 0x06, 0xd9, 0xba, - 0xfd, 0x55, 0x01, 0xb5, 0xb3, 0xb4, 0xa0, 0xa4, 0x1f, 0x9c, 0x87, 0xb0, 0x0b, 0xaa, 0x59, 0x89, - 0x6d, 0x82, 0xa9, 0xa6, 0x70, 0x69, 0x5d, 0x96, 0x16, 0x05, 0xcc, 0x12, 0x4f, 0x30, 0xb5, 0xd6, - 0xa7, 0xd2, 0x0e, 0x1a, 0x60, 0x73, 0x84, 0x08, 0xb5, 0x3d, 0xec, 0xbb, 0x1e, 0xb5, 0x87, 0x1e, - 0x0a, 0x5c, 0xec, 0xf0, 0x7b, 0x16, 0xad, 0x87, 0x0c, 0x3a, 0xe2, 0x48, 0x57, 0x00, 0xed, 0x6f, - 0x0a, 0xd8, 0xec, 0x32, 0x9f, 0x01, 0x99, 0x90, 0xf7, 0xfc, 0xfd, 0xb8, 0x19, 0x0b, 0x6c, 0x0c, - 0xd3, 0xb0, 0x2d, 0xde, 0x35, 0xf1, 0xb3, 0xbb, 0xec, 0x67, 0x41, 0xc0, 0x5c, 0xb9, 0xba, 0x69, - 0x16, 0xac, 0xfa, 0x70, 0x3e, 0xfc, 0xcf, 0xde, 0x3c, 0x50, 0x3a, 0x13, 0x8d, 0x03, 0x0f, 0x41, - 0x25, 0x53, 0x4b, 0x7c, 0xec, 0xc8, 0x3e, 0x92, 0x06, 0xcb, 0x9d, 0x24, 0x1e, 0xf2, 0x2c, 0xd8, - 0x00, 0x65, 0x12, 0x9e, 0xd3, 0xcf, 0x28, 0xc6, 0xfc, 0xc8, 0x8a, 0x95, 0xed, 0xdb, 0xbf, 0xd7, - 0xc0, 0xea, 0x09, 0x9b, 0x23, 0xf8, 0x1a, 0x94, 0x12, 0xad, 0xe4, 0x98, 0x2d, 0x63, 0x71, 0xd6, - 0x8c, 0xc4, 0x54, 0x72, 0x44, 0xca, 0x87, 0xcf, 0x41, 0x79, 0xe8, 0x21, 0x3f, 0xb0, 0x7d, 0x71, - 0xa7, 0x8a, 0xa9, 0xce, 0x6e, 0x9a, 0xa5, 0x2e, 0x8b, 0xf5, 0x7b, 0x56, 0x89, 0x83, 0x7d, 0x07, - 0x3e, 0x03, 0x35, 0x3f, 0xf0, 0xa9, 0x8f, 0x46, 0x49, 0x25, 0xb4, 0x1a, 0xaf, 0x40, 0x35, 0x89, - 0x8a, 0x22, 0xc0, 0x17, 0x80, 0x97, 0x44, 0xb4, 0x59, 0xca, 0x2c, 0x72, 0x66, 0x9d, 0x01, 0xbc, - 0x8f, 0x12, 0xae, 0x05, 0xaa, 0x12, 0xd7, 0x77, 0xb4, 0x95, 0x65, 0xef, 0xe2, 0xa9, 0x78, 0x56, - 0xbf, 0x67, 0x6e, 0x32, 0xef, 0xb3, 0x9b, 0xa6, 0x7a, 0x9c, 0x4a, 0xf5, 0x7b, 0x96, 0x9a, 0xe9, - 0xf6, 0x1d, 0x78, 0x0c, 0xea, 0x92, 0x26, 0x1b, 0x4e, 0x6d, 0x95, 0xab, 0x36, 0x0c, 0x31, 0xb9, - 0x46, 0x3a, 0xb9, 0xc6, 0x69, 0x3a, 0xb9, 0x66, 0x99, 0xc9, 0x5e, 0xfe, 0x6c, 0x2a, 0x56, 0x35, - 0xd3, 0x62, 0x28, 0x7c, 0x0b, 0xea, 0x01, 0xbe, 0xa0, 0x76, 0xd6, 0xac, 0x44, 0x5b, 0xbb, 0x57, - 0x7b, 0xd7, 0x58, 0x5a, 0x3e, 0x29, 0xf0, 0x00, 0x00, 0x49, 0xa3, 0x74, 0x2f, 0x0d, 0x29, 0x83, - 0x19, 0xe1, 0xd7, 0x92, 0x44, 0xca, 0xf7, 0x33, 0xc2, 0xd2, 0x24, 0x23, 0x5d, 0xa0, 0xcb, 0xdd, - 0x9c, 0xeb, 0x65, 0x8d, 0x5d, 0xe1, 0x8f, 0xb5, 0x9d, 0x37, 0x76, 0x9e, 0x9d, 0xb4, 0xf8, 0x5f, - 0xc7, 0x0c, 0xfc, 0xe7, 0x98, 0xbd, 0x03, 0x4f, 0xe7, 0xc6, 0x6c, 0x41, 0x3f, 0xb3, 0xa7, 0x72, - 0x7b, 0x2d, 0x69, 0xee, 0xe6, 0x85, 0x52, 0x8f, 0x69, 0x23, 0xc6, 0x98, 0x4c, 0x46, 0x94, 0xd8, - 0x1e, 0x22, 0x9e, 0xb6, 0xde, 0x52, 0xf6, 0xd6, 0x45, 0x23, 0x5a, 0x22, 0x7e, 0x84, 0x88, 0x07, - 0xb7, 0x40, 0x19, 0x45, 0x91, 0xa0, 0x54, 0x39, 0xa5, 0x84, 0xa2, 0x88, 0x41, 0xe6, 0x87, 0xab, - 0x99, 0xae, 0x5c, 0xcf, 0x74, 0xe5, 0xd7, 0x4c, 0x57, 0x2e, 0x6f, 0xf5, 0xc2, 0xf5, 0xad, 0x5e, - 0xf8, 0x7e, 0xab, 0x17, 0x3e, 0xbe, 0x72, 0x7d, 0xea, 0x4d, 0x06, 0xc6, 0x30, 0x1c, 0x77, 0xe4, - 0x3f, 0x25, 0x5f, 0x8a, 0x8f, 0x6d, 0xf1, 0x4b, 0x1c, 0xac, 0xf1, 0xf8, 0xcb, 0x3f, 0x01, 0x00, - 0x00, 0xff, 0xff, 0xa5, 0x17, 0xac, 0x23, 0x2d, 0x07, 0x00, 0x00, + // 805 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcd, 0x8e, 0xe3, 0x44, + 0x10, 0x8e, 0xc9, 0x6e, 0x7e, 0xca, 0x93, 0x64, 0xb7, 0x07, 0x21, 0x6f, 0x96, 0x75, 0xb2, 0xe1, + 0x47, 0x23, 0x0e, 0x8e, 0xb4, 0x1c, 0x10, 0x97, 0x95, 0xd6, 0x09, 0xb0, 0x91, 0x56, 0x08, 0x3c, + 0xa3, 0x39, 0x70, 0xb1, 0x3a, 0x71, 0x8f, 0x6d, 0x91, 0xd8, 0x96, 0xbb, 0x13, 0x86, 0x07, 0xe0, + 0x3e, 0x57, 0xde, 0x68, 0x8e, 0x73, 0x44, 0x1c, 0x06, 0xc8, 0xbc, 0x08, 0xea, 0x1f, 0xdb, 0x9d, + 0x84, 0x91, 0x06, 0xed, 0xad, 0x5d, 0xf5, 0xd5, 0x57, 0x5f, 0x55, 0x57, 0xb5, 0xe1, 0x63, 0x46, + 0x92, 0x80, 0xe4, 0xab, 0x38, 0x61, 0x63, 0xca, 0x30, 0x23, 0x63, 0xf6, 0x6b, 0x46, 0xa8, 0x93, + 0xe5, 0x29, 0x4b, 0xd1, 0x93, 0xca, 0xeb, 0x08, 0x6f, 0xff, 0xc3, 0x30, 0x0d, 0x53, 0xe1, 0x1c, + 0xf3, 0x93, 0xc4, 0xf5, 0x9f, 0x6b, 0x2c, 0x78, 0xbe, 0x88, 0x75, 0x92, 0xbe, 0x9e, 0x42, 0xd8, + 0x77, 0xbc, 0xc3, 0x03, 0xef, 0x06, 0x2f, 0xe3, 0x00, 0xb3, 0x34, 0x57, 0x88, 0x17, 0x07, 0x88, + 0x0c, 0xe7, 0x78, 0x55, 0x10, 0xd8, 0x9a, 0x7b, 0x43, 0x72, 0x1a, 0xa7, 0xc9, 0x4e, 0x82, 0x41, + 0x98, 0xa6, 0xe1, 0x92, 0x8c, 0xc5, 0xd7, 0x7c, 0x7d, 0x31, 0x66, 0xf1, 0x8a, 0x50, 0x86, 0x57, + 0x99, 0x04, 0x8c, 0xfe, 0x34, 0xa0, 0xf3, 0xc6, 0x9d, 0xcc, 0x3c, 0x42, 0xb3, 0x34, 0xa1, 0x84, + 0xa2, 0x09, 0x98, 0x01, 0x59, 0xc6, 0x1b, 0x92, 0xfb, 0xec, 0x92, 0x5a, 0xc6, 0xb0, 0x7e, 0x62, + 0xbe, 0x1a, 0x39, 0x5a, 0x33, 0x78, 0x91, 0x4e, 0x11, 0x30, 0x95, 0xd8, 0xb3, 0x4b, 0x0f, 0x82, + 0xe2, 0x48, 0xd1, 0x6b, 0x68, 0x93, 0x24, 0xf0, 0xe7, 0xcb, 0x74, 0xf1, 0xb3, 0xf5, 0xc1, 0xd0, + 0x38, 0x31, 0x5f, 0xbd, 0xbc, 0x97, 0xe2, 0x9b, 0x24, 0x70, 0x39, 0xd0, 0x6b, 0x11, 0x75, 0x42, + 0x53, 0x30, 0xe7, 0x24, 0x8c, 0x13, 0xc5, 0x50, 0x17, 0x0c, 0x9f, 0xdc, 0xcb, 0xe0, 0x72, 0xac, + 0xe4, 0x80, 0x79, 0x79, 0x1e, 0xfd, 0x66, 0x40, 0xf7, 0xbc, 0x68, 0x28, 0x9d, 0x25, 0x17, 0x29, + 0x9a, 0x40, 0xa7, 0x6c, 0xb1, 0x4f, 0x09, 0xb3, 0x0c, 0x41, 0x6d, 0xeb, 0xd4, 0xb2, 0x81, 0x65, + 0xe0, 0x29, 0x61, 0xde, 0xd1, 0x46, 0xfb, 0x42, 0x0e, 0x1c, 0x2f, 0x31, 0x65, 0x7e, 0x44, 0xe2, + 0x30, 0x62, 0xfe, 0x22, 0xc2, 0x49, 0x48, 0x02, 0x51, 0x67, 0xdd, 0x7b, 0xca, 0x5d, 0x6f, 0x85, + 0x67, 0x22, 0x1d, 0xa3, 0xdf, 0x0d, 0x38, 0x9e, 0x70, 0x9d, 0x09, 0x5d, 0xd3, 0x1f, 0xc4, 0xfd, + 0x09, 0x31, 0x1e, 0x3c, 0x59, 0x14, 0x66, 0x5f, 0xde, 0xab, 0xd2, 0xf3, 0xf2, 0x50, 0xcf, 0x1e, + 0x81, 0xfb, 0xe8, 0xfa, 0x76, 0x50, 0xf3, 0x7a, 0x8b, 0x5d, 0xf3, 0xff, 0xd6, 0x46, 0xe1, 0xe9, + 0xce, 0xfd, 0x0b, 0x61, 0xdf, 0x42, 0x97, 0xf7, 0xd7, 0xcf, 0x0b, 0xab, 0x92, 0x35, 0x70, 0xf6, + 0x77, 0xc2, 0xd9, 0x09, 0xf6, 0x3a, 0x3c, 0xac, 0x9a, 0xa5, 0x8f, 0xa0, 0x21, 0x75, 0xa8, 0xfc, + 0xea, 0x6b, 0x14, 0x41, 0xf3, 0x5c, 0x4e, 0x2b, 0x7a, 0x03, 0xed, 0xb2, 0x04, 0x95, 0xe5, 0x85, + 0x9e, 0x45, 0x4d, 0x75, 0x55, 0xbe, 0x2a, 0xbc, 0x8a, 0x42, 0x7d, 0x68, 0xd1, 0xf4, 0x82, 0xfd, + 0x82, 0x73, 0x22, 0xf2, 0xb4, 0xbd, 0xf2, 0x7b, 0xf4, 0x4f, 0x03, 0x1e, 0x9f, 0x72, 0xa1, 0xe8, + 0x6b, 0x68, 0x2a, 0x2e, 0x95, 0xe6, 0xd9, 0x61, 0x31, 0x4a, 0x94, 0x4a, 0x51, 0xe0, 0xd1, 0xe7, + 0xd0, 0x5a, 0x44, 0x38, 0x4e, 0xfc, 0x58, 0x36, 0xb2, 0xed, 0x9a, 0xdb, 0xdb, 0x41, 0x73, 0xc2, + 0x6d, 0xb3, 0xa9, 0xd7, 0x14, 0xce, 0x59, 0x80, 0x3e, 0x83, 0x6e, 0x9c, 0xc4, 0x2c, 0xc6, 0x4b, + 0xd5, 0x7e, 0xab, 0x2b, 0xca, 0xee, 0x28, 0xab, 0xec, 0x3c, 0xfa, 0x02, 0xc4, 0x3d, 0xc8, 0xd9, + 0x2e, 0x90, 0x75, 0x81, 0xec, 0x71, 0x87, 0x18, 0x5e, 0x85, 0xf5, 0xa0, 0xa3, 0x61, 0xe3, 0xc0, + 0x7a, 0x74, 0xa8, 0x5d, 0xce, 0x87, 0x88, 0x9a, 0x4d, 0xdd, 0x63, 0xae, 0x7d, 0x7b, 0x3b, 0x30, + 0xdf, 0x15, 0x54, 0xb3, 0xa9, 0x67, 0x96, 0xbc, 0xb3, 0x00, 0xbd, 0x83, 0x9e, 0xc6, 0xc9, 0x5f, + 0x04, 0xeb, 0xb1, 0x60, 0xed, 0x3b, 0xf2, 0xb9, 0x70, 0x8a, 0xe7, 0xc2, 0x39, 0x2b, 0x9e, 0x0b, + 0xb7, 0xc5, 0x69, 0xaf, 0xfe, 0x1a, 0x18, 0x5e, 0xa7, 0xe4, 0xe2, 0x5e, 0xf4, 0x1d, 0xf4, 0x12, + 0x72, 0xc9, 0xfc, 0x72, 0x43, 0xa8, 0xd5, 0x78, 0xd0, 0x4e, 0x75, 0x79, 0x58, 0xb5, 0x9e, 0xe8, + 0x35, 0x80, 0xc6, 0xd1, 0x7c, 0x10, 0x87, 0x16, 0xc1, 0x85, 0x88, 0xb2, 0x34, 0x92, 0xd6, 0xc3, + 0x84, 0xf0, 0x30, 0x4d, 0xc8, 0x04, 0x6c, 0x7d, 0x85, 0x2a, 0xbe, 0x72, 0x9b, 0xda, 0xe2, 0xb2, + 0x9e, 0x57, 0xdb, 0x54, 0x45, 0xab, 0xbd, 0xfa, 0xcf, 0xdd, 0x86, 0xf7, 0xdc, 0xed, 0xef, 0xe1, + 0xd3, 0x9d, 0xdd, 0xde, 0xe3, 0x2f, 0xe5, 0x99, 0x42, 0xde, 0x50, 0x5b, 0xf6, 0x5d, 0xa2, 0x42, + 0x63, 0x31, 0x88, 0x39, 0xa1, 0xeb, 0x25, 0xa3, 0x7e, 0x84, 0x69, 0x64, 0x1d, 0x0d, 0x8d, 0x93, + 0x23, 0x39, 0x88, 0x9e, 0xb4, 0xbf, 0xc5, 0x34, 0x42, 0xcf, 0xa0, 0x85, 0xb3, 0x4c, 0x42, 0x3a, + 0x02, 0xd2, 0xc4, 0x59, 0xc6, 0x5d, 0xee, 0x8f, 0xd7, 0x5b, 0xdb, 0xb8, 0xd9, 0xda, 0xc6, 0xdf, + 0x5b, 0xdb, 0xb8, 0xba, 0xb3, 0x6b, 0x37, 0x77, 0x76, 0xed, 0x8f, 0x3b, 0xbb, 0xf6, 0xd3, 0x57, + 0x61, 0xcc, 0xa2, 0xf5, 0xdc, 0x59, 0xa4, 0xab, 0xb1, 0xfe, 0x23, 0xab, 0x8e, 0xf2, 0x6f, 0xba, + 0xff, 0x1f, 0x9e, 0x37, 0x84, 0xfd, 0xcb, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x1a, 0xb9, + 0x2e, 0xa2, 0x07, 0x00, 0x00, } func (m *ABCIResponses) Marshal() (dAtA []byte, err error) { @@ -641,6 +702,46 @@ func (m *ConsensusParamsInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ABCIResponsesInfo) 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 *ABCIResponsesInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ABCIResponsesInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Height != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x10 + } + if m.AbciResponses != nil { + { + size, err := m.AbciResponses.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -776,12 +877,12 @@ func (m *State) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n10, err10 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastBlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastBlockTime):]) - if err10 != nil { - return 0, err10 + n11, err11 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastBlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastBlockTime):]) + if err11 != nil { + return 0, err11 } - i -= n10 - i = encodeVarintTypes(dAtA, i, uint64(n10)) + i -= n11 + i = encodeVarintTypes(dAtA, i, uint64(n11)) i-- dAtA[i] = 0x2a { @@ -884,6 +985,22 @@ func (m *ConsensusParamsInfo) Size() (n int) { return n } +func (m *ABCIResponsesInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AbciResponses != nil { + l = m.AbciResponses.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovTypes(uint64(m.Height)) + } + return n +} + func (m *Version) Size() (n int) { if m == nil { return 0 @@ -1326,6 +1443,112 @@ func (m *ConsensusParamsInfo) Unmarshal(dAtA []byte) error { return nil } +func (m *ABCIResponsesInfo) 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 ErrIntOverflowTypes + } + 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: ABCIResponsesInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ABCIResponsesInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AbciResponses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AbciResponses == nil { + m.AbciResponses = &ABCIResponses{} + } + if err := m.AbciResponses.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + 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 ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Height |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} + func (m *Version) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/third_party/proto/tendermint/state/types.proto b/third_party/proto/tendermint/state/types.proto index 919da91e52..f3fdc0ef39 100644 --- a/third_party/proto/tendermint/state/types.proto +++ b/third_party/proto/tendermint/state/types.proto @@ -32,6 +32,11 @@ message ConsensusParamsInfo { int64 last_height_changed = 2; } +message ABCIResponsesInfo { + ABCIResponses abci_responses = 1; + int64 height = 2; +} + message Version { tendermint.version.Consensus consensus = 1 [(gogoproto.nullable) = false]; string software = 2; diff --git a/third_party/proto/tendermint/types/evidence.proto b/third_party/proto/tendermint/types/evidence.proto index 3b234571ba..451b8dca3c 100644 --- a/third_party/proto/tendermint/types/evidence.proto +++ b/third_party/proto/tendermint/types/evidence.proto @@ -17,20 +17,20 @@ message Evidence { // DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes. message DuplicateVoteEvidence { - tendermint.types.Vote vote_a = 1; - tendermint.types.Vote vote_b = 2; - int64 total_voting_power = 3; - int64 validator_power = 4; - google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + tendermint.types.Vote vote_a = 1; + tendermint.types.Vote vote_b = 2; + int64 total_voting_power = 3; + int64 validator_power = 4; + google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; } // LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client. message LightClientAttackEvidence { - tendermint.types.LightBlock conflicting_block = 1; - int64 common_height = 2; + tendermint.types.LightBlock conflicting_block = 1; + int64 common_height = 2; repeated tendermint.types.Validator byzantine_validators = 3; - int64 total_voting_power = 4; - google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + int64 total_voting_power = 4; + google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; } message EvidenceList { diff --git a/third_party/proto/tendermint/types/types.proto b/third_party/proto/tendermint/types/types.proto index 7f7ea74cac..8d4f009729 100644 --- a/third_party/proto/tendermint/types/types.proto +++ b/third_party/proto/tendermint/types/types.proto @@ -106,10 +106,10 @@ message Vote { // Commit contains the evidence that a block was committed by a set of validators. message Commit { - int64 height = 1; - int32 round = 2; - BlockID block_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "BlockID"]; - repeated CommitSig signatures = 4 [(gogoproto.nullable) = false]; + int64 height = 1; + int32 round = 2; + BlockID block_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "BlockID"]; + repeated CommitSig signatures = 4 [(gogoproto.nullable) = false]; } // CommitSig is a part of the Vote included in a Commit. From 881d0aca94fd99bbfa3eb3e3bdbfa114f54501fb Mon Sep 17 00:00:00 2001 From: jhernandezb Date: Mon, 5 Sep 2022 09:41:45 -0600 Subject: [PATCH 44/94] add pin code flag to store code proposal --- docs/proto/proto-docs.md | 1 + proto/cosmwasm/wasm/v1/proposal.proto | 2 + x/wasm/client/cli/gov_tx.go | 7 + x/wasm/client/cli/tx.go | 1 + x/wasm/client/rest/gov.go | 4 + x/wasm/keeper/proposal_handler.go | 5 +- x/wasm/keeper/proposal_integration_test.go | 62 +++++---- x/wasm/types/proposal.pb.go | 141 +++++++++++++-------- 8 files changed, 149 insertions(+), 74 deletions(-) diff --git a/docs/proto/proto-docs.md b/docs/proto/proto-docs.md index b1fd26e3f0..c32542db3f 100644 --- a/docs/proto/proto-docs.md +++ b/docs/proto/proto-docs.md @@ -776,6 +776,7 @@ StoreCodeProposal gov proposal content type to submit WASM code to the system | `run_as` | [string](#string) | | RunAs is the address that is passed to the contract's environment as sender | | `wasm_byte_code` | [bytes](#bytes) | | WASMByteCode can be raw or gzip compressed | | `instantiate_permission` | [AccessConfig](#cosmwasm.wasm.v1.AccessConfig) | | InstantiatePermission to apply on contract creation, optional | +| `pin_code` | [bool](#bool) | | Pin code on upload, optional | diff --git a/proto/cosmwasm/wasm/v1/proposal.proto b/proto/cosmwasm/wasm/v1/proposal.proto index 68eae73a12..677f5d2566 100644 --- a/proto/cosmwasm/wasm/v1/proposal.proto +++ b/proto/cosmwasm/wasm/v1/proposal.proto @@ -24,6 +24,8 @@ message StoreCodeProposal { reserved 5, 6; // InstantiatePermission to apply on contract creation, optional AccessConfig instantiate_permission = 7; + // Pin code on upload, optional + bool pin_code = 8; } // InstantiateContractProposal gov proposal content type to instantiate a diff --git a/x/wasm/client/cli/gov_tx.go b/x/wasm/client/cli/gov_tx.go index d544480795..ec1b20a2d8 100644 --- a/x/wasm/client/cli/gov_tx.go +++ b/x/wasm/client/cli/gov_tx.go @@ -56,12 +56,18 @@ func ProposalStoreCodeCmd() *cobra.Command { return err } + pinCode, err := cmd.Flags().GetBool(flagPinCode) + if err != nil { + return err + } + content := types.StoreCodeProposal{ Title: proposalTitle, Description: proposalDescr, RunAs: runAs, WASMByteCode: src.WASMByteCode, InstantiatePermission: src.InstantiatePermission, + PinCode: pinCode, } msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress()) @@ -80,6 +86,7 @@ func ProposalStoreCodeCmd() *cobra.Command { cmd.Flags().String(flagInstantiateByEverybody, "", "Everybody can instantiate a contract from the code, optional") cmd.Flags().String(flagInstantiateNobody, "", "Nobody except the governance process can instantiate a contract from the code, optional") cmd.Flags().String(flagInstantiateByAddress, "", "Only this address can instantiate a contract instance from the code, optional") + cmd.Flags().Bool(flagPinCode, false, "Pin code on upload, optional") // proposal flags cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") diff --git a/x/wasm/client/cli/tx.go b/x/wasm/client/cli/tx.go index 5325347298..dedbd18d06 100644 --- a/x/wasm/client/cli/tx.go +++ b/x/wasm/client/cli/tx.go @@ -27,6 +27,7 @@ const ( flagInstantiateByEverybody = "instantiate-everybody" flagInstantiateNobody = "instantiate-nobody" flagInstantiateByAddress = "instantiate-only-address" + flagPinCode = "pin-code" ) // GetTxCmd returns the transaction commands for this module diff --git a/x/wasm/client/rest/gov.go b/x/wasm/client/rest/gov.go index 3ba2b8f088..34047db4ce 100644 --- a/x/wasm/client/rest/gov.go +++ b/x/wasm/client/rest/gov.go @@ -27,6 +27,9 @@ type StoreCodeProposalJSONReq struct { WASMByteCode []byte `json:"wasm_byte_code" yaml:"wasm_byte_code"` // InstantiatePermission to apply on contract creation, optional InstantiatePermission *types.AccessConfig `json:"instantiate_permission" yaml:"instantiate_permission"` + + // PinCode indicates if the code should be pinned as part of the proposal. + PinCode bool `json:"pin_code" yaml:"pin_code"` } func (s StoreCodeProposalJSONReq) Content() govtypes.Content { @@ -36,6 +39,7 @@ func (s StoreCodeProposalJSONReq) Content() govtypes.Content { RunAs: s.RunAs, WASMByteCode: s.WASMByteCode, InstantiatePermission: s.InstantiatePermission, + PinCode: s.PinCode, } } diff --git a/x/wasm/keeper/proposal_handler.go b/x/wasm/keeper/proposal_handler.go index 95cca8a102..8525677f53 100644 --- a/x/wasm/keeper/proposal_handler.go +++ b/x/wasm/keeper/proposal_handler.go @@ -68,7 +68,10 @@ func handleStoreCodeProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types if err != nil { return err } - return k.PinCode(ctx, codeID) + if p.PinCode { + return k.PinCode(ctx, codeID) + } + return nil } func handleInstantiateProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.InstantiateContractProposal) error { diff --git a/x/wasm/keeper/proposal_integration_test.go b/x/wasm/keeper/proposal_integration_test.go index 6d9b765295..6e772f14ac 100644 --- a/x/wasm/keeper/proposal_integration_test.go +++ b/x/wasm/keeper/proposal_integration_test.go @@ -24,40 +24,58 @@ import ( ) func TestStoreCodeProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + parentCtx, keepers := CreateTestInput(t, false, "staking") govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper - wasmKeeper.SetParams(ctx, types.Params{ + wasmKeeper.SetParams(parentCtx, types.Params{ CodeUploadAccess: types.AllowNobody, InstantiateDefaultPermission: types.AccessTypeNobody, }) wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - myActorAddress := RandomBech32AccountAddress(t) + specs := map[string]struct { + codeID int64 + pinCode bool + }{ + "upload without pinning": { + pinCode: false, + }, + "upload with code pinning": { + pinCode: true, + }, + } - src := types.StoreCodeProposalFixture(func(p *types.StoreCodeProposal) { - p.RunAs = myActorAddress - p.WASMByteCode = wasmCode - }) + for msg, spec := range specs { + t.Run(msg, func(t *testing.T) { + ctx, _ := parentCtx.CacheContext() + myActorAddress := RandomBech32AccountAddress(t) - // when stored - storedProposal, err := govKeeper.SubmitProposal(ctx, src) - require.NoError(t, err) + src := types.StoreCodeProposalFixture(func(p *types.StoreCodeProposal) { + p.RunAs = myActorAddress + p.WASMByteCode = wasmCode + p.PinCode = spec.pinCode + }) - // and proposal execute - handler := govKeeper.Router().GetRoute(storedProposal.ProposalRoute()) - err = handler(ctx, storedProposal.GetContent()) - require.NoError(t, err) + // when stored + storedProposal, err := govKeeper.SubmitProposal(ctx, src) + require.NoError(t, err) - // then - cInfo := wasmKeeper.GetCodeInfo(ctx, 1) - require.NotNil(t, cInfo) - assert.Equal(t, myActorAddress, cInfo.Creator) - assert.True(t, wasmKeeper.IsPinnedCode(ctx, 1)) + // and proposal execute + handler := govKeeper.Router().GetRoute(storedProposal.ProposalRoute()) + err = handler(ctx, storedProposal.GetContent()) + require.NoError(t, err) - storedCode, err := wasmKeeper.GetByteCode(ctx, 1) - require.NoError(t, err) - assert.Equal(t, wasmCode, storedCode) + // then + cInfo := wasmKeeper.GetCodeInfo(ctx, 1) + require.NotNil(t, cInfo) + assert.Equal(t, myActorAddress, cInfo.Creator) + assert.Equal(t, spec.pinCode, wasmKeeper.IsPinnedCode(ctx, 1)) + + storedCode, err := wasmKeeper.GetByteCode(ctx, 1) + require.NoError(t, err) + assert.Equal(t, wasmCode, storedCode) + }) + } } func TestInstantiateProposal(t *testing.T) { diff --git a/x/wasm/types/proposal.pb.go b/x/wasm/types/proposal.pb.go index c4b1d977a8..96eaa5f285 100644 --- a/x/wasm/types/proposal.pb.go +++ b/x/wasm/types/proposal.pb.go @@ -42,6 +42,8 @@ type StoreCodeProposal struct { WASMByteCode []byte `protobuf:"bytes,4,opt,name=wasm_byte_code,json=wasmByteCode,proto3" json:"wasm_byte_code,omitempty"` // InstantiatePermission to apply on contract creation, optional InstantiatePermission *AccessConfig `protobuf:"bytes,7,opt,name=instantiate_permission,json=instantiatePermission,proto3" json:"instantiate_permission,omitempty"` + // Pin code on upload, optional + PinCode bool `protobuf:"varint,8,opt,name=pin_code,json=pinCode,proto3" json:"pin_code,omitempty"` } func (m *StoreCodeProposal) Reset() { *m = StoreCodeProposal{} } @@ -598,58 +600,59 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/proposal.proto", fileDescriptor_be6422d717c730cb) } var fileDescriptor_be6422d717c730cb = []byte{ - // 817 bytes of a gzipped FileDescriptorProto + // 833 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4f, 0x6f, 0xe3, 0x44, - 0x14, 0xcf, 0xe4, 0x8f, 0x93, 0x4e, 0x22, 0x08, 0xde, 0xb4, 0x1b, 0x0a, 0xb2, 0x23, 0x83, 0x56, - 0xbe, 0x60, 0x93, 0x22, 0x21, 0xe0, 0x16, 0x07, 0x0e, 0x5d, 0x51, 0xa9, 0x72, 0x55, 0xad, 0x04, - 0x12, 0xd6, 0xc4, 0x9e, 0x7a, 0x2d, 0x62, 0x8f, 0xe5, 0x99, 0x34, 0x9b, 0x6f, 0x01, 0x12, 0xe2, - 0xc4, 0x07, 0x40, 0x5c, 0x10, 0x77, 0x3e, 0x40, 0xc5, 0x69, 0x8f, 0x7b, 0x32, 0x6c, 0xf2, 0x0d, - 0x72, 0x44, 0x42, 0x42, 0x33, 0xe3, 0x84, 0x74, 0x97, 0x66, 0x17, 0xd1, 0x20, 0x71, 0x71, 0xf2, - 0xe6, 0xbd, 0x37, 0xef, 0x37, 0x3f, 0xfd, 0xde, 0xbc, 0x81, 0xba, 0x4f, 0x68, 0x3c, 0x45, 0x34, - 0xb6, 0xc5, 0xe7, 0xb2, 0x6f, 0xa7, 0x19, 0x49, 0x09, 0x45, 0x63, 0x2b, 0xcd, 0x08, 0x23, 0x6a, - 0x7b, 0x15, 0x60, 0x89, 0xcf, 0x65, 0xff, 0xb0, 0x13, 0x92, 0x90, 0x08, 0xa7, 0xcd, 0xff, 0xc9, - 0xb8, 0x43, 0x8d, 0xc7, 0x11, 0x6a, 0x8f, 0x10, 0xc5, 0xf6, 0x65, 0x7f, 0x84, 0x19, 0xea, 0xdb, - 0x3e, 0x89, 0x92, 0xc2, 0xff, 0xe6, 0x73, 0x85, 0xd8, 0x2c, 0xc5, 0x54, 0x7a, 0x8d, 0x3f, 0x00, - 0x7c, 0xed, 0x8c, 0x91, 0x0c, 0x0f, 0x49, 0x80, 0x4f, 0x0b, 0x04, 0x6a, 0x07, 0xd6, 0x58, 0xc4, - 0xc6, 0xb8, 0x0b, 0x7a, 0xc0, 0xdc, 0x73, 0xa5, 0xa1, 0xf6, 0x60, 0x33, 0xc0, 0xd4, 0xcf, 0xa2, - 0x94, 0x45, 0x24, 0xe9, 0x96, 0x85, 0x6f, 0x73, 0x49, 0xdd, 0x87, 0x4a, 0x36, 0x49, 0x3c, 0x44, - 0xbb, 0x15, 0x99, 0x98, 0x4d, 0x92, 0x01, 0x55, 0xdf, 0x87, 0xaf, 0xf0, 0xda, 0xde, 0x68, 0xc6, - 0xb0, 0xe7, 0x93, 0x00, 0x77, 0xab, 0x3d, 0x60, 0xb6, 0x9c, 0xf6, 0x3c, 0xd7, 0x5b, 0x0f, 0x06, - 0x67, 0x27, 0xce, 0x8c, 0x09, 0x00, 0x6e, 0x8b, 0xc7, 0xad, 0x2c, 0xf5, 0x1c, 0x1e, 0x44, 0x09, - 0x65, 0x28, 0x61, 0x11, 0x62, 0xd8, 0x4b, 0x71, 0x16, 0x47, 0x94, 0xf2, 0xda, 0xf5, 0x1e, 0x30, - 0x9b, 0x47, 0x9a, 0xf5, 0x2c, 0x47, 0xd6, 0xc0, 0xf7, 0x31, 0xa5, 0x43, 0x92, 0x5c, 0x44, 0xa1, - 0xbb, 0xbf, 0x91, 0x7d, 0xba, 0x4e, 0xbe, 0x5f, 0x6d, 0xd4, 0xda, 0xca, 0xfd, 0x6a, 0x43, 0x69, - 0xd7, 0x8d, 0x5f, 0xca, 0xf0, 0x8d, 0xe3, 0xbf, 0xa2, 0x86, 0x24, 0x61, 0x19, 0xf2, 0xd9, 0xae, - 0x98, 0xe8, 0xc0, 0x1a, 0x0a, 0xe2, 0x28, 0x11, 0x04, 0xec, 0xb9, 0xd2, 0x50, 0xdf, 0x82, 0x75, - 0xce, 0x8a, 0x17, 0x05, 0xdd, 0x5a, 0x0f, 0x98, 0x55, 0x07, 0xce, 0x73, 0x5d, 0xe1, 0x14, 0x1c, - 0x7f, 0xec, 0x2a, 0xdc, 0x75, 0x1c, 0xf0, 0xd4, 0x31, 0x1a, 0xe1, 0x71, 0x57, 0x91, 0xa9, 0xc2, - 0x50, 0x4d, 0x58, 0x89, 0x69, 0x28, 0xf8, 0x68, 0x39, 0x07, 0xbf, 0xe7, 0xba, 0xea, 0xa2, 0xe9, - 0xea, 0x14, 0x27, 0x98, 0x52, 0x14, 0x62, 0x97, 0x87, 0xa8, 0x08, 0xd6, 0x2e, 0x26, 0x49, 0x40, - 0xbb, 0x8d, 0x5e, 0xc5, 0x6c, 0x1e, 0xbd, 0x6e, 0x49, 0xdd, 0x58, 0x5c, 0x37, 0x56, 0xa1, 0x1b, - 0x6b, 0x48, 0xa2, 0xc4, 0x79, 0xf7, 0x2a, 0xd7, 0x4b, 0x3f, 0xfc, 0xaa, 0x9b, 0x61, 0xc4, 0x1e, - 0x4e, 0x46, 0x96, 0x4f, 0x62, 0xbb, 0x10, 0x99, 0xfc, 0x79, 0x87, 0x06, 0x5f, 0x16, 0x2a, 0xe2, - 0x09, 0xd4, 0x95, 0x3b, 0x1b, 0x3f, 0x03, 0x78, 0xf7, 0x24, 0x0a, 0xb3, 0xdb, 0x24, 0xf2, 0x10, - 0x36, 0xfc, 0x62, 0xaf, 0x82, 0xb4, 0xb5, 0xfd, 0x72, 0xbc, 0x15, 0x0c, 0x29, 0x2f, 0x64, 0xc8, - 0xf8, 0x06, 0xc0, 0xce, 0xd9, 0x24, 0x20, 0x3b, 0xc1, 0x5e, 0x79, 0x06, 0x7b, 0x01, 0xab, 0xfa, - 0x62, 0x58, 0x5f, 0x97, 0xe1, 0xdd, 0x4f, 0x1e, 0x61, 0x7f, 0xb2, 0x7b, 0x79, 0x6e, 0x23, 0xbb, - 0x00, 0x5c, 0xfb, 0x07, 0x4a, 0x53, 0x76, 0xa6, 0xb4, 0xef, 0x00, 0xbc, 0x73, 0x9e, 0x06, 0x88, - 0xe1, 0x01, 0xef, 0xa0, 0x7f, 0xcd, 0x47, 0x1f, 0xee, 0x25, 0x78, 0xea, 0xc9, 0xde, 0x14, 0x94, - 0x38, 0x9d, 0x65, 0xae, 0xb7, 0x67, 0x28, 0x1e, 0x7f, 0x64, 0xac, 0x5d, 0x86, 0xdb, 0x48, 0xf0, - 0x54, 0x94, 0xdc, 0xc6, 0x95, 0xf1, 0x10, 0xaa, 0xc3, 0x31, 0x46, 0xd9, 0xed, 0x80, 0xdb, 0x22, - 0x23, 0xe3, 0x47, 0x00, 0xdb, 0xa7, 0x51, 0xc2, 0x35, 0x4f, 0xd7, 0x85, 0xee, 0x5d, 0x2b, 0xe4, - 0xb4, 0x97, 0xb9, 0xde, 0x92, 0x27, 0x11, 0xcb, 0xc6, 0xaa, 0xf4, 0x07, 0x7f, 0x53, 0xda, 0x39, - 0x58, 0xe6, 0xba, 0x2a, 0xa3, 0x37, 0x9c, 0xc6, 0x75, 0x48, 0x1f, 0x72, 0x48, 0xa2, 0xf3, 0xb8, - 0x82, 0x2a, 0x66, 0xd5, 0xd1, 0xe6, 0xb9, 0x5e, 0x97, 0xad, 0x47, 0x97, 0xb9, 0xfe, 0xaa, 0xdc, - 0x61, 0x15, 0x64, 0xb8, 0x75, 0xd9, 0x8e, 0xd4, 0xf8, 0x09, 0x40, 0xf5, 0x3c, 0x49, 0xff, 0x57, - 0x98, 0xbf, 0x05, 0x50, 0xdd, 0x9c, 0x2c, 0x52, 0x7a, 0x9b, 0xf7, 0x0f, 0xb8, 0xf1, 0xfe, 0xf9, - 0xfc, 0xc6, 0x21, 0x56, 0x7e, 0x99, 0x21, 0xe6, 0x54, 0x79, 0x8f, 0xdc, 0x30, 0xca, 0x8c, 0x05, - 0x80, 0xba, 0x04, 0x73, 0x7d, 0x88, 0x5d, 0x44, 0xe1, 0x7f, 0xc8, 0xec, 0x17, 0x70, 0x1f, 0x09, - 0xc8, 0x9e, 0x2f, 0x4a, 0x7b, 0x13, 0x01, 0x49, 0xd2, 0xdc, 0x3c, 0x7a, 0x7b, 0xfb, 0x09, 0x25, - 0xfe, 0xe2, 0x9c, 0x77, 0xd0, 0x73, 0x1e, 0xea, 0x7c, 0x7a, 0xf5, 0x54, 0x2b, 0x3d, 0x79, 0xaa, - 0x95, 0xbe, 0x9f, 0x6b, 0xe0, 0x6a, 0xae, 0x81, 0xc7, 0x73, 0x0d, 0xfc, 0x36, 0xd7, 0xc0, 0x57, - 0x0b, 0xad, 0xf4, 0x78, 0xa1, 0x95, 0x9e, 0x2c, 0xb4, 0xd2, 0x67, 0xf7, 0x36, 0x2e, 0x91, 0x21, - 0xa1, 0xf1, 0x83, 0xd5, 0x9b, 0x27, 0xb0, 0x1f, 0xc9, 0xb7, 0x8f, 0xb8, 0x48, 0x46, 0x8a, 0x78, - 0xf9, 0xbc, 0xf7, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x70, 0x3f, 0xe6, 0xf2, 0x82, 0x09, 0x00, + 0x14, 0xcf, 0xe4, 0x8f, 0x93, 0x4e, 0x23, 0x08, 0xde, 0xb4, 0x9b, 0x2d, 0xc8, 0x8e, 0x0c, 0x5a, + 0xf9, 0x82, 0x4d, 0x8a, 0x84, 0x80, 0x5b, 0x1d, 0x38, 0x74, 0x45, 0xa5, 0xca, 0x55, 0xb5, 0x12, + 0x48, 0x58, 0x13, 0x7b, 0xea, 0x1d, 0x11, 0xcf, 0x58, 0x9e, 0x49, 0xbb, 0xfd, 0x16, 0x20, 0x21, + 0xc4, 0x81, 0x0f, 0x80, 0xb8, 0x20, 0xee, 0x7c, 0x80, 0x8a, 0xd3, 0x1e, 0xf7, 0x64, 0xd8, 0xf4, + 0x1b, 0xf4, 0xc8, 0x09, 0xcd, 0x8c, 0x53, 0xd2, 0x5d, 0xda, 0x5d, 0xc4, 0x06, 0x69, 0x2f, 0x4e, + 0xc6, 0xef, 0xbd, 0xf9, 0xfd, 0xe6, 0xa7, 0xdf, 0x9b, 0x67, 0x68, 0xc7, 0x8c, 0x67, 0x27, 0x88, + 0x67, 0xbe, 0x7a, 0x1c, 0x8f, 0xfc, 0xbc, 0x60, 0x39, 0xe3, 0x68, 0xea, 0xe5, 0x05, 0x13, 0xcc, + 0xec, 0x2d, 0x12, 0x3c, 0xf5, 0x38, 0x1e, 0x6d, 0xf5, 0x53, 0x96, 0x32, 0x15, 0xf4, 0xe5, 0x3f, + 0x9d, 0xb7, 0x65, 0xc9, 0x3c, 0xc6, 0xfd, 0x09, 0xe2, 0xd8, 0x3f, 0x1e, 0x4d, 0xb0, 0x40, 0x23, + 0x3f, 0x66, 0x84, 0x56, 0xf1, 0xb7, 0x9e, 0x01, 0x12, 0xa7, 0x39, 0xe6, 0x3a, 0xea, 0x7c, 0x5f, + 0x87, 0x6f, 0x1c, 0x08, 0x56, 0xe0, 0x31, 0x4b, 0xf0, 0x7e, 0xc5, 0xc0, 0xec, 0xc3, 0x96, 0x20, + 0x62, 0x8a, 0x07, 0x60, 0x08, 0xdc, 0xb5, 0x50, 0x2f, 0xcc, 0x21, 0x5c, 0x4f, 0x30, 0x8f, 0x0b, + 0x92, 0x0b, 0xc2, 0xe8, 0xa0, 0xae, 0x62, 0xcb, 0xaf, 0xcc, 0x0d, 0x68, 0x14, 0x33, 0x1a, 0x21, + 0x3e, 0x68, 0xe8, 0xc2, 0x62, 0x46, 0x77, 0xb8, 0xf9, 0x01, 0x7c, 0x4d, 0x62, 0x47, 0x93, 0x53, + 0x81, 0xa3, 0x98, 0x25, 0x78, 0xd0, 0x1c, 0x02, 0xb7, 0x1b, 0xf4, 0xe6, 0xa5, 0xdd, 0xbd, 0xbf, + 0x73, 0xb0, 0x17, 0x9c, 0x0a, 0x45, 0x20, 0xec, 0xca, 0xbc, 0xc5, 0xca, 0x3c, 0x84, 0x9b, 0x84, + 0x72, 0x81, 0xa8, 0x20, 0x48, 0xe0, 0x28, 0xc7, 0x45, 0x46, 0x38, 0x97, 0xd8, 0xed, 0x21, 0x70, + 0xd7, 0xb7, 0x2d, 0xef, 0x69, 0x8d, 0xbc, 0x9d, 0x38, 0xc6, 0x9c, 0x8f, 0x19, 0x3d, 0x22, 0x69, + 0xb8, 0xb1, 0x54, 0xbd, 0x7f, 0x59, 0x6c, 0xde, 0x81, 0x9d, 0x9c, 0x50, 0x4d, 0xa4, 0x33, 0x04, + 0x6e, 0x27, 0x6c, 0xe7, 0x84, 0x4a, 0xc4, 0x7b, 0xcd, 0x4e, 0xab, 0x67, 0xdc, 0x6b, 0x76, 0x8c, + 0x5e, 0xdb, 0xf9, 0xad, 0x0e, 0xdf, 0xdc, 0xfd, 0x7b, 0x83, 0x31, 0xa3, 0xa2, 0x40, 0xb1, 0x58, + 0x95, 0x48, 0x7d, 0xd8, 0x42, 0x49, 0x46, 0xa8, 0xd2, 0x66, 0x2d, 0xd4, 0x0b, 0xf3, 0x6d, 0xd8, + 0x96, 0x3c, 0x23, 0x92, 0x0c, 0x5a, 0x43, 0xe0, 0x36, 0x03, 0x38, 0x2f, 0x6d, 0x43, 0x72, 0xdd, + 0xfd, 0x24, 0x34, 0x64, 0x68, 0x37, 0x91, 0xa5, 0x53, 0x34, 0xc1, 0xd3, 0x81, 0xa1, 0x4b, 0xd5, + 0xc2, 0x74, 0x61, 0x23, 0xe3, 0xa9, 0x92, 0xaa, 0x1b, 0x6c, 0xfe, 0x59, 0xda, 0x66, 0x88, 0x4e, + 0x16, 0xa7, 0xd8, 0xc3, 0x9c, 0xa3, 0x14, 0x87, 0x32, 0xc5, 0x44, 0xb0, 0x75, 0x34, 0xa3, 0x09, + 0x1f, 0x74, 0x86, 0x0d, 0x77, 0x7d, 0xfb, 0x8e, 0xa7, 0x2d, 0xe5, 0x49, 0x4b, 0x79, 0x95, 0xa5, + 0xbc, 0x31, 0x23, 0x34, 0x78, 0xef, 0xac, 0xb4, 0x6b, 0x3f, 0xfd, 0x6e, 0xbb, 0x29, 0x11, 0x0f, + 0x66, 0x13, 0x2f, 0x66, 0x99, 0x5f, 0xf9, 0x4f, 0xff, 0xbc, 0xcb, 0x93, 0xaf, 0x2a, 0x83, 0xc9, + 0x02, 0x1e, 0xea, 0x9d, 0x9d, 0x5f, 0x01, 0xbc, 0xbd, 0x47, 0xd2, 0xe2, 0x65, 0x0a, 0xb9, 0x05, + 0x3b, 0x71, 0xb5, 0x57, 0x25, 0xda, 0xe5, 0xfa, 0xc5, 0x74, 0xab, 0x14, 0x32, 0x9e, 0xab, 0x90, + 0xf3, 0x2d, 0x80, 0xfd, 0x83, 0x59, 0xc2, 0x56, 0xc2, 0xbd, 0xf1, 0x14, 0xf7, 0x8a, 0x56, 0xf3, + 0xf9, 0xb4, 0xbe, 0xa9, 0xc3, 0xdb, 0x9f, 0x3e, 0xc4, 0xf1, 0x6c, 0xf5, 0xf6, 0xbc, 0x49, 0xec, + 0x8a, 0x70, 0xeb, 0x5f, 0x38, 0xcd, 0x58, 0x99, 0xd3, 0x7e, 0x00, 0xf0, 0xd6, 0x61, 0x9e, 0x20, + 0x81, 0x77, 0x64, 0x07, 0xfd, 0x67, 0x3d, 0x46, 0x70, 0x8d, 0xe2, 0x93, 0x48, 0xf7, 0xa6, 0x92, + 0x24, 0xe8, 0x5f, 0x94, 0x76, 0xef, 0x14, 0x65, 0xd3, 0x8f, 0x9d, 0xcb, 0x90, 0x13, 0x76, 0x28, + 0x3e, 0x51, 0x90, 0x37, 0x69, 0xe5, 0x3c, 0x80, 0xe6, 0x78, 0x8a, 0x51, 0xf1, 0x72, 0xc8, 0xdd, + 0x60, 0x23, 0xe7, 0x67, 0x00, 0x7b, 0xfb, 0xfa, 0x5e, 0xe3, 0x97, 0x40, 0x77, 0xaf, 0x00, 0x05, + 0xbd, 0x8b, 0xd2, 0xee, 0xea, 0x93, 0xa8, 0xd7, 0xce, 0x02, 0xfa, 0xc3, 0x7f, 0x80, 0x0e, 0x36, + 0x2f, 0x4a, 0xdb, 0xd4, 0xd9, 0x4b, 0x41, 0xe7, 0x2a, 0xa5, 0x8f, 0x24, 0x25, 0xd5, 0x79, 0xd2, + 0x41, 0x0d, 0xb7, 0x19, 0x58, 0xf3, 0xd2, 0x6e, 0xeb, 0xd6, 0xe3, 0x17, 0xa5, 0xfd, 0xba, 0xde, + 0x61, 0x91, 0xe4, 0x84, 0x6d, 0xdd, 0x8e, 0xdc, 0xf9, 0x05, 0x40, 0xf3, 0x90, 0xe6, 0xaf, 0x14, + 0xe7, 0xef, 0x00, 0x34, 0x97, 0x87, 0x8e, 0xb6, 0xde, 0xf2, 0xfd, 0x03, 0xae, 0xbd, 0x7f, 0xbe, + 0xb8, 0x76, 0xbe, 0xd5, 0x5f, 0x64, 0xbe, 0x05, 0x4d, 0xd9, 0x23, 0xd7, 0x4c, 0x39, 0xe7, 0x1c, + 0x40, 0x5b, 0x93, 0xb9, 0x3a, 0xc4, 0x8e, 0x48, 0xfa, 0x3f, 0x2a, 0xfb, 0x25, 0xdc, 0x40, 0x8a, + 0x72, 0x14, 0x2b, 0xe8, 0x68, 0xa6, 0x28, 0x69, 0x99, 0xd7, 0xb7, 0xdf, 0xb9, 0xf9, 0x84, 0x9a, + 0x7f, 0x75, 0xce, 0x5b, 0xe8, 0x99, 0x08, 0x0f, 0x3e, 0x3b, 0x7b, 0x62, 0xd5, 0x1e, 0x3f, 0xb1, + 0x6a, 0x3f, 0xce, 0x2d, 0x70, 0x36, 0xb7, 0xc0, 0xa3, 0xb9, 0x05, 0xfe, 0x98, 0x5b, 0xe0, 0xeb, + 0x73, 0xab, 0xf6, 0xe8, 0xdc, 0xaa, 0x3d, 0x3e, 0xb7, 0x6a, 0x9f, 0xdf, 0x5d, 0xba, 0x44, 0xc6, + 0x8c, 0x67, 0xf7, 0x17, 0x9f, 0x43, 0x89, 0xff, 0x50, 0x7f, 0x16, 0xa9, 0x8b, 0x64, 0x62, 0xa8, + 0x8f, 0xa2, 0xf7, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0xad, 0xbf, 0x95, 0xf9, 0x9d, 0x09, 0x00, 0x00, } @@ -687,6 +690,9 @@ func (this *StoreCodeProposal) Equal(that interface{}) bool { if !this.InstantiatePermission.Equal(that1.InstantiatePermission) { return false } + if this.PinCode != that1.PinCode { + return false + } return true } @@ -1078,6 +1084,16 @@ func (m *StoreCodeProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.PinCode { + i-- + if m.PinCode { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } if m.InstantiatePermission != nil { { size, err := m.InstantiatePermission.MarshalToSizedBuffer(dAtA[:i]) @@ -1716,6 +1732,9 @@ func (m *StoreCodeProposal) Size() (n int) { l = m.InstantiatePermission.Size() n += 1 + l + sovProposal(uint64(l)) } + if m.PinCode { + n += 2 + } return n } @@ -2183,6 +2202,26 @@ func (m *StoreCodeProposal) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PinCode", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProposal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.PinCode = bool(v != 0) default: iNdEx = preIndex skippy, err := skipProposal(dAtA[iNdEx:]) From cc9e74075ccac73221763f5eb172b9644abfe75a Mon Sep 17 00:00:00 2001 From: jhernandezb Date: Tue, 6 Sep 2022 08:13:41 -0600 Subject: [PATCH 45/94] change default behavior to always pin --- docs/proto/proto-docs.md | 2 +- proto/cosmwasm/wasm/v1/proposal.proto | 4 +- x/wasm/client/cli/gov_tx.go | 6 +- x/wasm/client/cli/tx.go | 2 +- x/wasm/client/rest/gov.go | 6 +- x/wasm/keeper/proposal_handler.go | 9 +- x/wasm/keeper/proposal_integration_test.go | 16 +-- x/wasm/types/proposal.pb.go | 124 ++++++++++----------- 8 files changed, 86 insertions(+), 83 deletions(-) diff --git a/docs/proto/proto-docs.md b/docs/proto/proto-docs.md index c32542db3f..e5cd7ec88f 100644 --- a/docs/proto/proto-docs.md +++ b/docs/proto/proto-docs.md @@ -776,7 +776,7 @@ StoreCodeProposal gov proposal content type to submit WASM code to the system | `run_as` | [string](#string) | | RunAs is the address that is passed to the contract's environment as sender | | `wasm_byte_code` | [bytes](#bytes) | | WASMByteCode can be raw or gzip compressed | | `instantiate_permission` | [AccessConfig](#cosmwasm.wasm.v1.AccessConfig) | | InstantiatePermission to apply on contract creation, optional | -| `pin_code` | [bool](#bool) | | Pin code on upload, optional | +| `unpin_code` | [bool](#bool) | | UnpinCode code on upload, optional | diff --git a/proto/cosmwasm/wasm/v1/proposal.proto b/proto/cosmwasm/wasm/v1/proposal.proto index 677f5d2566..25bf2700b1 100644 --- a/proto/cosmwasm/wasm/v1/proposal.proto +++ b/proto/cosmwasm/wasm/v1/proposal.proto @@ -24,8 +24,8 @@ message StoreCodeProposal { reserved 5, 6; // InstantiatePermission to apply on contract creation, optional AccessConfig instantiate_permission = 7; - // Pin code on upload, optional - bool pin_code = 8; + // UnpinCode code on upload, optional + bool unpin_code = 8; } // InstantiateContractProposal gov proposal content type to instantiate a diff --git a/x/wasm/client/cli/gov_tx.go b/x/wasm/client/cli/gov_tx.go index ec1b20a2d8..b619dbb8b1 100644 --- a/x/wasm/client/cli/gov_tx.go +++ b/x/wasm/client/cli/gov_tx.go @@ -56,7 +56,7 @@ func ProposalStoreCodeCmd() *cobra.Command { return err } - pinCode, err := cmd.Flags().GetBool(flagPinCode) + unpinCode, err := cmd.Flags().GetBool(flagUnpinCode) if err != nil { return err } @@ -67,7 +67,7 @@ func ProposalStoreCodeCmd() *cobra.Command { RunAs: runAs, WASMByteCode: src.WASMByteCode, InstantiatePermission: src.InstantiatePermission, - PinCode: pinCode, + UnpinCode: unpinCode, } msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress()) @@ -86,7 +86,7 @@ func ProposalStoreCodeCmd() *cobra.Command { cmd.Flags().String(flagInstantiateByEverybody, "", "Everybody can instantiate a contract from the code, optional") cmd.Flags().String(flagInstantiateNobody, "", "Nobody except the governance process can instantiate a contract from the code, optional") cmd.Flags().String(flagInstantiateByAddress, "", "Only this address can instantiate a contract instance from the code, optional") - cmd.Flags().Bool(flagPinCode, false, "Pin code on upload, optional") + cmd.Flags().Bool(flagUnpinCode, false, "Unpin code on upload, optional") // proposal flags cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") diff --git a/x/wasm/client/cli/tx.go b/x/wasm/client/cli/tx.go index dedbd18d06..28f0a1e2a2 100644 --- a/x/wasm/client/cli/tx.go +++ b/x/wasm/client/cli/tx.go @@ -27,7 +27,7 @@ const ( flagInstantiateByEverybody = "instantiate-everybody" flagInstantiateNobody = "instantiate-nobody" flagInstantiateByAddress = "instantiate-only-address" - flagPinCode = "pin-code" + flagUnpinCode = "unpin-code" ) // GetTxCmd returns the transaction commands for this module diff --git a/x/wasm/client/rest/gov.go b/x/wasm/client/rest/gov.go index 34047db4ce..ef688d9401 100644 --- a/x/wasm/client/rest/gov.go +++ b/x/wasm/client/rest/gov.go @@ -28,8 +28,8 @@ type StoreCodeProposalJSONReq struct { // InstantiatePermission to apply on contract creation, optional InstantiatePermission *types.AccessConfig `json:"instantiate_permission" yaml:"instantiate_permission"` - // PinCode indicates if the code should be pinned as part of the proposal. - PinCode bool `json:"pin_code" yaml:"pin_code"` + // UnpinCode indicates if the code should not be pinned as part of the proposal. + UnpinCode bool `json:"pin_code" yaml:"pin_code"` } func (s StoreCodeProposalJSONReq) Content() govtypes.Content { @@ -39,7 +39,7 @@ func (s StoreCodeProposalJSONReq) Content() govtypes.Content { RunAs: s.RunAs, WASMByteCode: s.WASMByteCode, InstantiatePermission: s.InstantiatePermission, - PinCode: s.PinCode, + UnpinCode: s.UnpinCode, } } diff --git a/x/wasm/keeper/proposal_handler.go b/x/wasm/keeper/proposal_handler.go index 8525677f53..f4cd8a4e1a 100644 --- a/x/wasm/keeper/proposal_handler.go +++ b/x/wasm/keeper/proposal_handler.go @@ -68,10 +68,13 @@ func handleStoreCodeProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types if err != nil { return err } - if p.PinCode { - return k.PinCode(ctx, codeID) + + // if code should not be pinned return earlier + if p.UnpinCode { + return nil } - return nil + return k.PinCode(ctx, codeID) + } func handleInstantiateProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.InstantiateContractProposal) error { diff --git a/x/wasm/keeper/proposal_integration_test.go b/x/wasm/keeper/proposal_integration_test.go index 6e772f14ac..f7034db562 100644 --- a/x/wasm/keeper/proposal_integration_test.go +++ b/x/wasm/keeper/proposal_integration_test.go @@ -34,14 +34,14 @@ func TestStoreCodeProposal(t *testing.T) { require.NoError(t, err) specs := map[string]struct { - codeID int64 - pinCode bool + codeID int64 + unpinCode bool }{ - "upload without pinning": { - pinCode: false, + "upload with pinning (default)": { + unpinCode: false, }, - "upload with code pinning": { - pinCode: true, + "upload with code unpin": { + unpinCode: true, }, } @@ -53,7 +53,7 @@ func TestStoreCodeProposal(t *testing.T) { src := types.StoreCodeProposalFixture(func(p *types.StoreCodeProposal) { p.RunAs = myActorAddress p.WASMByteCode = wasmCode - p.PinCode = spec.pinCode + p.UnpinCode = spec.unpinCode }) // when stored @@ -69,7 +69,7 @@ func TestStoreCodeProposal(t *testing.T) { cInfo := wasmKeeper.GetCodeInfo(ctx, 1) require.NotNil(t, cInfo) assert.Equal(t, myActorAddress, cInfo.Creator) - assert.Equal(t, spec.pinCode, wasmKeeper.IsPinnedCode(ctx, 1)) + assert.Equal(t, !spec.unpinCode, wasmKeeper.IsPinnedCode(ctx, 1)) storedCode, err := wasmKeeper.GetByteCode(ctx, 1) require.NoError(t, err) diff --git a/x/wasm/types/proposal.pb.go b/x/wasm/types/proposal.pb.go index 96eaa5f285..7532a84e70 100644 --- a/x/wasm/types/proposal.pb.go +++ b/x/wasm/types/proposal.pb.go @@ -42,8 +42,8 @@ type StoreCodeProposal struct { WASMByteCode []byte `protobuf:"bytes,4,opt,name=wasm_byte_code,json=wasmByteCode,proto3" json:"wasm_byte_code,omitempty"` // InstantiatePermission to apply on contract creation, optional InstantiatePermission *AccessConfig `protobuf:"bytes,7,opt,name=instantiate_permission,json=instantiatePermission,proto3" json:"instantiate_permission,omitempty"` - // Pin code on upload, optional - PinCode bool `protobuf:"varint,8,opt,name=pin_code,json=pinCode,proto3" json:"pin_code,omitempty"` + // UnpinCode code on upload, optional + UnpinCode bool `protobuf:"varint,8,opt,name=unpin_code,json=unpinCode,proto3" json:"unpin_code,omitempty"` } func (m *StoreCodeProposal) Reset() { *m = StoreCodeProposal{} } @@ -600,60 +600,60 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/proposal.proto", fileDescriptor_be6422d717c730cb) } var fileDescriptor_be6422d717c730cb = []byte{ - // 833 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4f, 0x6f, 0xe3, 0x44, - 0x14, 0xcf, 0xe4, 0x8f, 0x93, 0x4e, 0x23, 0x08, 0xde, 0xb4, 0x9b, 0x2d, 0xc8, 0x8e, 0x0c, 0x5a, - 0xf9, 0x82, 0x4d, 0x8a, 0x84, 0x80, 0x5b, 0x1d, 0x38, 0x74, 0x45, 0xa5, 0xca, 0x55, 0xb5, 0x12, - 0x48, 0x58, 0x13, 0x7b, 0xea, 0x1d, 0x11, 0xcf, 0x58, 0x9e, 0x49, 0xbb, 0xfd, 0x16, 0x20, 0x21, - 0xc4, 0x81, 0x0f, 0x80, 0xb8, 0x20, 0xee, 0x7c, 0x80, 0x8a, 0xd3, 0x1e, 0xf7, 0x64, 0xd8, 0xf4, - 0x1b, 0xf4, 0xc8, 0x09, 0xcd, 0x8c, 0x53, 0xd2, 0x5d, 0xda, 0x5d, 0xc4, 0x06, 0x69, 0x2f, 0x4e, - 0xc6, 0xef, 0xbd, 0xf9, 0xfd, 0xe6, 0xa7, 0xdf, 0x9b, 0x67, 0x68, 0xc7, 0x8c, 0x67, 0x27, 0x88, - 0x67, 0xbe, 0x7a, 0x1c, 0x8f, 0xfc, 0xbc, 0x60, 0x39, 0xe3, 0x68, 0xea, 0xe5, 0x05, 0x13, 0xcc, - 0xec, 0x2d, 0x12, 0x3c, 0xf5, 0x38, 0x1e, 0x6d, 0xf5, 0x53, 0x96, 0x32, 0x15, 0xf4, 0xe5, 0x3f, - 0x9d, 0xb7, 0x65, 0xc9, 0x3c, 0xc6, 0xfd, 0x09, 0xe2, 0xd8, 0x3f, 0x1e, 0x4d, 0xb0, 0x40, 0x23, - 0x3f, 0x66, 0x84, 0x56, 0xf1, 0xb7, 0x9e, 0x01, 0x12, 0xa7, 0x39, 0xe6, 0x3a, 0xea, 0x7c, 0x5f, - 0x87, 0x6f, 0x1c, 0x08, 0x56, 0xe0, 0x31, 0x4b, 0xf0, 0x7e, 0xc5, 0xc0, 0xec, 0xc3, 0x96, 0x20, - 0x62, 0x8a, 0x07, 0x60, 0x08, 0xdc, 0xb5, 0x50, 0x2f, 0xcc, 0x21, 0x5c, 0x4f, 0x30, 0x8f, 0x0b, - 0x92, 0x0b, 0xc2, 0xe8, 0xa0, 0xae, 0x62, 0xcb, 0xaf, 0xcc, 0x0d, 0x68, 0x14, 0x33, 0x1a, 0x21, - 0x3e, 0x68, 0xe8, 0xc2, 0x62, 0x46, 0x77, 0xb8, 0xf9, 0x01, 0x7c, 0x4d, 0x62, 0x47, 0x93, 0x53, - 0x81, 0xa3, 0x98, 0x25, 0x78, 0xd0, 0x1c, 0x02, 0xb7, 0x1b, 0xf4, 0xe6, 0xa5, 0xdd, 0xbd, 0xbf, - 0x73, 0xb0, 0x17, 0x9c, 0x0a, 0x45, 0x20, 0xec, 0xca, 0xbc, 0xc5, 0xca, 0x3c, 0x84, 0x9b, 0x84, - 0x72, 0x81, 0xa8, 0x20, 0x48, 0xe0, 0x28, 0xc7, 0x45, 0x46, 0x38, 0x97, 0xd8, 0xed, 0x21, 0x70, - 0xd7, 0xb7, 0x2d, 0xef, 0x69, 0x8d, 0xbc, 0x9d, 0x38, 0xc6, 0x9c, 0x8f, 0x19, 0x3d, 0x22, 0x69, - 0xb8, 0xb1, 0x54, 0xbd, 0x7f, 0x59, 0x6c, 0xde, 0x81, 0x9d, 0x9c, 0x50, 0x4d, 0xa4, 0x33, 0x04, - 0x6e, 0x27, 0x6c, 0xe7, 0x84, 0x4a, 0xc4, 0x7b, 0xcd, 0x4e, 0xab, 0x67, 0xdc, 0x6b, 0x76, 0x8c, - 0x5e, 0xdb, 0xf9, 0xad, 0x0e, 0xdf, 0xdc, 0xfd, 0x7b, 0x83, 0x31, 0xa3, 0xa2, 0x40, 0xb1, 0x58, - 0x95, 0x48, 0x7d, 0xd8, 0x42, 0x49, 0x46, 0xa8, 0xd2, 0x66, 0x2d, 0xd4, 0x0b, 0xf3, 0x6d, 0xd8, - 0x96, 0x3c, 0x23, 0x92, 0x0c, 0x5a, 0x43, 0xe0, 0x36, 0x03, 0x38, 0x2f, 0x6d, 0x43, 0x72, 0xdd, - 0xfd, 0x24, 0x34, 0x64, 0x68, 0x37, 0x91, 0xa5, 0x53, 0x34, 0xc1, 0xd3, 0x81, 0xa1, 0x4b, 0xd5, - 0xc2, 0x74, 0x61, 0x23, 0xe3, 0xa9, 0x92, 0xaa, 0x1b, 0x6c, 0xfe, 0x59, 0xda, 0x66, 0x88, 0x4e, - 0x16, 0xa7, 0xd8, 0xc3, 0x9c, 0xa3, 0x14, 0x87, 0x32, 0xc5, 0x44, 0xb0, 0x75, 0x34, 0xa3, 0x09, - 0x1f, 0x74, 0x86, 0x0d, 0x77, 0x7d, 0xfb, 0x8e, 0xa7, 0x2d, 0xe5, 0x49, 0x4b, 0x79, 0x95, 0xa5, - 0xbc, 0x31, 0x23, 0x34, 0x78, 0xef, 0xac, 0xb4, 0x6b, 0x3f, 0xfd, 0x6e, 0xbb, 0x29, 0x11, 0x0f, - 0x66, 0x13, 0x2f, 0x66, 0x99, 0x5f, 0xf9, 0x4f, 0xff, 0xbc, 0xcb, 0x93, 0xaf, 0x2a, 0x83, 0xc9, - 0x02, 0x1e, 0xea, 0x9d, 0x9d, 0x5f, 0x01, 0xbc, 0xbd, 0x47, 0xd2, 0xe2, 0x65, 0x0a, 0xb9, 0x05, - 0x3b, 0x71, 0xb5, 0x57, 0x25, 0xda, 0xe5, 0xfa, 0xc5, 0x74, 0xab, 0x14, 0x32, 0x9e, 0xab, 0x90, - 0xf3, 0x2d, 0x80, 0xfd, 0x83, 0x59, 0xc2, 0x56, 0xc2, 0xbd, 0xf1, 0x14, 0xf7, 0x8a, 0x56, 0xf3, - 0xf9, 0xb4, 0xbe, 0xa9, 0xc3, 0xdb, 0x9f, 0x3e, 0xc4, 0xf1, 0x6c, 0xf5, 0xf6, 0xbc, 0x49, 0xec, - 0x8a, 0x70, 0xeb, 0x5f, 0x38, 0xcd, 0x58, 0x99, 0xd3, 0x7e, 0x00, 0xf0, 0xd6, 0x61, 0x9e, 0x20, - 0x81, 0x77, 0x64, 0x07, 0xfd, 0x67, 0x3d, 0x46, 0x70, 0x8d, 0xe2, 0x93, 0x48, 0xf7, 0xa6, 0x92, - 0x24, 0xe8, 0x5f, 0x94, 0x76, 0xef, 0x14, 0x65, 0xd3, 0x8f, 0x9d, 0xcb, 0x90, 0x13, 0x76, 0x28, - 0x3e, 0x51, 0x90, 0x37, 0x69, 0xe5, 0x3c, 0x80, 0xe6, 0x78, 0x8a, 0x51, 0xf1, 0x72, 0xc8, 0xdd, - 0x60, 0x23, 0xe7, 0x67, 0x00, 0x7b, 0xfb, 0xfa, 0x5e, 0xe3, 0x97, 0x40, 0x77, 0xaf, 0x00, 0x05, - 0xbd, 0x8b, 0xd2, 0xee, 0xea, 0x93, 0xa8, 0xd7, 0xce, 0x02, 0xfa, 0xc3, 0x7f, 0x80, 0x0e, 0x36, - 0x2f, 0x4a, 0xdb, 0xd4, 0xd9, 0x4b, 0x41, 0xe7, 0x2a, 0xa5, 0x8f, 0x24, 0x25, 0xd5, 0x79, 0xd2, - 0x41, 0x0d, 0xb7, 0x19, 0x58, 0xf3, 0xd2, 0x6e, 0xeb, 0xd6, 0xe3, 0x17, 0xa5, 0xfd, 0xba, 0xde, - 0x61, 0x91, 0xe4, 0x84, 0x6d, 0xdd, 0x8e, 0xdc, 0xf9, 0x05, 0x40, 0xf3, 0x90, 0xe6, 0xaf, 0x14, - 0xe7, 0xef, 0x00, 0x34, 0x97, 0x87, 0x8e, 0xb6, 0xde, 0xf2, 0xfd, 0x03, 0xae, 0xbd, 0x7f, 0xbe, - 0xb8, 0x76, 0xbe, 0xd5, 0x5f, 0x64, 0xbe, 0x05, 0x4d, 0xd9, 0x23, 0xd7, 0x4c, 0x39, 0xe7, 0x1c, - 0x40, 0x5b, 0x93, 0xb9, 0x3a, 0xc4, 0x8e, 0x48, 0xfa, 0x3f, 0x2a, 0xfb, 0x25, 0xdc, 0x40, 0x8a, - 0x72, 0x14, 0x2b, 0xe8, 0x68, 0xa6, 0x28, 0x69, 0x99, 0xd7, 0xb7, 0xdf, 0xb9, 0xf9, 0x84, 0x9a, - 0x7f, 0x75, 0xce, 0x5b, 0xe8, 0x99, 0x08, 0x0f, 0x3e, 0x3b, 0x7b, 0x62, 0xd5, 0x1e, 0x3f, 0xb1, - 0x6a, 0x3f, 0xce, 0x2d, 0x70, 0x36, 0xb7, 0xc0, 0xa3, 0xb9, 0x05, 0xfe, 0x98, 0x5b, 0xe0, 0xeb, - 0x73, 0xab, 0xf6, 0xe8, 0xdc, 0xaa, 0x3d, 0x3e, 0xb7, 0x6a, 0x9f, 0xdf, 0x5d, 0xba, 0x44, 0xc6, - 0x8c, 0x67, 0xf7, 0x17, 0x9f, 0x43, 0x89, 0xff, 0x50, 0x7f, 0x16, 0xa9, 0x8b, 0x64, 0x62, 0xa8, - 0x8f, 0xa2, 0xf7, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0xad, 0xbf, 0x95, 0xf9, 0x9d, 0x09, 0x00, - 0x00, + // 834 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4f, 0x8f, 0xdb, 0x44, + 0x14, 0xcf, 0xe4, 0x8f, 0x93, 0x9d, 0x8d, 0x20, 0xb8, 0xd9, 0x6d, 0x58, 0xc0, 0x8e, 0x0c, 0xaa, + 0x7c, 0xc1, 0x26, 0x8b, 0x84, 0x80, 0xdb, 0x3a, 0x70, 0xd8, 0x8a, 0x95, 0x56, 0x5e, 0xad, 0x2a, + 0x81, 0x84, 0x35, 0xb1, 0x67, 0x5d, 0x8b, 0xd8, 0x63, 0x79, 0xc6, 0x9b, 0xe6, 0x5b, 0x80, 0x84, + 0x38, 0xf5, 0x03, 0x20, 0x2e, 0x88, 0x3b, 0x1f, 0x60, 0xc5, 0xa9, 0xc7, 0x9e, 0x0c, 0x4d, 0xbe, + 0x41, 0x8e, 0x9c, 0xd0, 0xcc, 0x38, 0x21, 0xdb, 0xb2, 0x69, 0x11, 0x0d, 0x52, 0x2f, 0x4e, 0x66, + 0xde, 0x7b, 0xf3, 0x7e, 0xf3, 0xd3, 0xef, 0xbd, 0x37, 0x50, 0xf7, 0x09, 0x8d, 0x27, 0x88, 0xc6, + 0xb6, 0xf8, 0x5c, 0x0e, 0xec, 0x34, 0x23, 0x29, 0xa1, 0x68, 0x6c, 0xa5, 0x19, 0x61, 0x44, 0xed, + 0x2c, 0x1d, 0x2c, 0xf1, 0xb9, 0x1c, 0x1c, 0x74, 0x43, 0x12, 0x12, 0x61, 0xb4, 0xf9, 0x3f, 0xe9, + 0x77, 0xa0, 0x71, 0x3f, 0x42, 0xed, 0x11, 0xa2, 0xd8, 0xbe, 0x1c, 0x8c, 0x30, 0x43, 0x03, 0xdb, + 0x27, 0x51, 0x52, 0xda, 0xdf, 0x7e, 0x26, 0x11, 0x9b, 0xa6, 0x98, 0x4a, 0xab, 0xf1, 0xb0, 0x0a, + 0xdf, 0x38, 0x63, 0x24, 0xc3, 0x43, 0x12, 0xe0, 0xd3, 0x12, 0x81, 0xda, 0x85, 0x0d, 0x16, 0xb1, + 0x31, 0xee, 0x81, 0x3e, 0x30, 0x77, 0x5c, 0xb9, 0x50, 0xfb, 0x70, 0x37, 0xc0, 0xd4, 0xcf, 0xa2, + 0x94, 0x45, 0x24, 0xe9, 0x55, 0x85, 0x6d, 0x7d, 0x4b, 0xdd, 0x83, 0x4a, 0x96, 0x27, 0x1e, 0xa2, + 0xbd, 0x9a, 0x0c, 0xcc, 0xf2, 0xe4, 0x88, 0xaa, 0x1f, 0xc1, 0xd7, 0x78, 0x6e, 0x6f, 0x34, 0x65, + 0xd8, 0xf3, 0x49, 0x80, 0x7b, 0xf5, 0x3e, 0x30, 0xdb, 0x4e, 0x67, 0x56, 0xe8, 0xed, 0x7b, 0x47, + 0x67, 0x27, 0xce, 0x94, 0x09, 0x00, 0x6e, 0x9b, 0xfb, 0x2d, 0x57, 0xea, 0x39, 0xdc, 0x8f, 0x12, + 0xca, 0x50, 0xc2, 0x22, 0xc4, 0xb0, 0x97, 0xe2, 0x2c, 0x8e, 0x28, 0xe5, 0xb9, 0x9b, 0x7d, 0x60, + 0xee, 0x1e, 0x6a, 0xd6, 0xd3, 0x1c, 0x59, 0x47, 0xbe, 0x8f, 0x29, 0x1d, 0x92, 0xe4, 0x22, 0x0a, + 0xdd, 0xbd, 0xb5, 0xe8, 0xd3, 0x55, 0xb0, 0xfa, 0x0e, 0x84, 0x79, 0x92, 0x46, 0x89, 0x84, 0xd2, + 0xea, 0x03, 0xb3, 0xe5, 0xee, 0x88, 0x1d, 0x9e, 0xf5, 0x6e, 0xbd, 0xd5, 0xe8, 0x28, 0x77, 0xeb, + 0x2d, 0xa5, 0xd3, 0x34, 0x7e, 0xab, 0xc2, 0xb7, 0x8e, 0xff, 0x3e, 0x64, 0x48, 0x12, 0x96, 0x21, + 0x9f, 0x6d, 0x8b, 0xa8, 0x2e, 0x6c, 0xa0, 0x20, 0x8e, 0x12, 0xc1, 0xcf, 0x8e, 0x2b, 0x17, 0xea, + 0xbb, 0xb0, 0xc9, 0x91, 0x7a, 0x51, 0xd0, 0x6b, 0xf4, 0x81, 0x59, 0x77, 0xe0, 0xac, 0xd0, 0x15, + 0x8e, 0xf5, 0xf8, 0x33, 0x57, 0xe1, 0xa6, 0xe3, 0x80, 0x87, 0x8e, 0xd1, 0x08, 0x8f, 0x7b, 0x8a, + 0x0c, 0x15, 0x0b, 0xd5, 0x84, 0xb5, 0x98, 0x86, 0x82, 0xae, 0xb6, 0xb3, 0xff, 0x67, 0xa1, 0xab, + 0x2e, 0x9a, 0x2c, 0x6f, 0x71, 0x82, 0x29, 0x45, 0x21, 0x76, 0xb9, 0x8b, 0x8a, 0x60, 0xe3, 0x22, + 0x4f, 0x02, 0xda, 0x6b, 0xf5, 0x6b, 0xe6, 0xee, 0xe1, 0x9b, 0x96, 0x94, 0x95, 0xc5, 0x65, 0x65, + 0x95, 0xb2, 0xb2, 0x86, 0x24, 0x4a, 0x9c, 0x0f, 0xae, 0x0a, 0xbd, 0xf2, 0xd3, 0xef, 0xba, 0x19, + 0x46, 0xec, 0x7e, 0x3e, 0xb2, 0x7c, 0x12, 0xdb, 0xa5, 0x06, 0xe5, 0xcf, 0xfb, 0x34, 0xf8, 0xa6, + 0x14, 0x19, 0x0f, 0xa0, 0xae, 0x3c, 0xd9, 0xf8, 0x15, 0xc0, 0xdb, 0x27, 0x51, 0x98, 0xbd, 0x4c, + 0x22, 0x0f, 0x60, 0xcb, 0x2f, 0xcf, 0x2a, 0x49, 0x5b, 0xad, 0x5f, 0x8c, 0xb7, 0x92, 0x21, 0xe5, + 0xb9, 0x0c, 0x19, 0xdf, 0x03, 0xd8, 0x3d, 0xcb, 0x03, 0xb2, 0x15, 0xec, 0xb5, 0xa7, 0xb0, 0x97, + 0xb0, 0xea, 0xcf, 0x87, 0xf5, 0x5d, 0x15, 0xde, 0xfe, 0xfc, 0x01, 0xf6, 0xf3, 0xed, 0xcb, 0x73, + 0x13, 0xd9, 0x25, 0xe0, 0xc6, 0xbf, 0x50, 0x9a, 0xb2, 0x35, 0xa5, 0x3d, 0x04, 0xf0, 0xd6, 0x79, + 0x1a, 0x20, 0x86, 0x8f, 0x78, 0x05, 0xfd, 0x67, 0x3e, 0x06, 0x70, 0x27, 0xc1, 0x13, 0x4f, 0xd6, + 0xa6, 0xa0, 0xc4, 0xe9, 0x2e, 0x0a, 0xbd, 0x33, 0x45, 0xf1, 0xf8, 0x53, 0x63, 0x65, 0x32, 0xdc, + 0x56, 0x82, 0x27, 0x22, 0xe5, 0x26, 0xae, 0x8c, 0xfb, 0x50, 0x1d, 0x8e, 0x31, 0xca, 0x5e, 0x0e, + 0xb8, 0x0d, 0x32, 0x32, 0x7e, 0x06, 0xb0, 0x73, 0x2a, 0xfb, 0x1a, 0x5d, 0x25, 0xba, 0x73, 0x2d, + 0x91, 0xd3, 0x59, 0x14, 0x7a, 0x5b, 0xde, 0x44, 0x6c, 0x1b, 0xcb, 0xd4, 0x1f, 0xff, 0x43, 0x6a, + 0x67, 0x7f, 0x51, 0xe8, 0xaa, 0xf4, 0x5e, 0x33, 0x1a, 0xd7, 0x21, 0x7d, 0xc2, 0x21, 0x89, 0xca, + 0xe3, 0x0a, 0xaa, 0x99, 0x75, 0x47, 0x9b, 0x15, 0x7a, 0x53, 0x96, 0x1e, 0x5d, 0x14, 0xfa, 0xeb, + 0xf2, 0x84, 0xa5, 0x93, 0xe1, 0x36, 0x65, 0x39, 0x52, 0xe3, 0x17, 0x00, 0xd5, 0xf3, 0x65, 0x2f, + 0x7e, 0x45, 0x30, 0xff, 0x00, 0xa0, 0xba, 0x3e, 0x78, 0xa4, 0xf4, 0xd6, 0xfb, 0x0f, 0xb8, 0xb1, + 0xff, 0x7c, 0x75, 0xe3, 0x8c, 0xab, 0xbe, 0xc8, 0x8c, 0x73, 0xea, 0xbc, 0x46, 0x6e, 0x98, 0x74, + 0xc6, 0x1c, 0x40, 0x5d, 0x82, 0xb9, 0x3e, 0xc4, 0x2e, 0xa2, 0xf0, 0x7f, 0x64, 0xf6, 0x6b, 0xb8, + 0x87, 0x04, 0x64, 0xcf, 0x17, 0xa9, 0xbd, 0x5c, 0x40, 0x92, 0x34, 0xef, 0x1e, 0xbe, 0xb7, 0xf9, + 0x86, 0x12, 0x7f, 0x79, 0xcf, 0x5b, 0xe8, 0x19, 0x0b, 0x75, 0xbe, 0xb8, 0x7a, 0xa2, 0x55, 0x1e, + 0x3f, 0xd1, 0x2a, 0x3f, 0xce, 0x34, 0x70, 0x35, 0xd3, 0xc0, 0xa3, 0x99, 0x06, 0xfe, 0x98, 0x69, + 0xe0, 0xdb, 0xb9, 0x56, 0x79, 0x34, 0xd7, 0x2a, 0x8f, 0xe7, 0x5a, 0xe5, 0xcb, 0x3b, 0x6b, 0x4d, + 0x64, 0x48, 0x68, 0x7c, 0x6f, 0xf9, 0x24, 0x0a, 0xec, 0x07, 0xf2, 0x69, 0x24, 0x1a, 0xc9, 0x48, + 0x11, 0x0f, 0xa3, 0x0f, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x4f, 0xac, 0x4a, 0xb0, 0xa1, 0x09, + 0x00, 0x00, } func (this *StoreCodeProposal) Equal(that interface{}) bool { @@ -690,7 +690,7 @@ func (this *StoreCodeProposal) Equal(that interface{}) bool { if !this.InstantiatePermission.Equal(that1.InstantiatePermission) { return false } - if this.PinCode != that1.PinCode { + if this.UnpinCode != that1.UnpinCode { return false } return true @@ -1084,9 +1084,9 @@ func (m *StoreCodeProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.PinCode { + if m.UnpinCode { i-- - if m.PinCode { + if m.UnpinCode { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -1732,7 +1732,7 @@ func (m *StoreCodeProposal) Size() (n int) { l = m.InstantiatePermission.Size() n += 1 + l + sovProposal(uint64(l)) } - if m.PinCode { + if m.UnpinCode { n += 2 } return n @@ -2204,7 +2204,7 @@ func (m *StoreCodeProposal) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 8: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PinCode", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UnpinCode", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -2221,7 +2221,7 @@ func (m *StoreCodeProposal) Unmarshal(dAtA []byte) error { break } } - m.PinCode = bool(v != 0) + m.UnpinCode = bool(v != 0) default: iNdEx = preIndex skippy, err := skipProposal(dAtA[iNdEx:]) From 352e408b70bebc6abf107c32c3aae96c2252baac Mon Sep 17 00:00:00 2001 From: jhernandezb Date: Tue, 6 Sep 2022 08:18:45 -0600 Subject: [PATCH 46/94] fix tag --- x/wasm/client/rest/gov.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/wasm/client/rest/gov.go b/x/wasm/client/rest/gov.go index ef688d9401..f730cb4696 100644 --- a/x/wasm/client/rest/gov.go +++ b/x/wasm/client/rest/gov.go @@ -29,7 +29,7 @@ type StoreCodeProposalJSONReq struct { InstantiatePermission *types.AccessConfig `json:"instantiate_permission" yaml:"instantiate_permission"` // UnpinCode indicates if the code should not be pinned as part of the proposal. - UnpinCode bool `json:"pin_code" yaml:"pin_code"` + UnpinCode bool `json:"unpin_code" yaml:"unpin_code"` } func (s StoreCodeProposalJSONReq) Content() govtypes.Content { From 8fbce82f3cdc351907800b08c9e9bef3b9126acf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Sep 2022 08:19:57 +0000 Subject: [PATCH 47/94] Bump github.com/spf13/viper from 1.12.0 to 1.13.0 Bumps [github.com/spf13/viper](https://github.com/spf13/viper) from 1.12.0 to 1.13.0. - [Release notes](https://github.com/spf13/viper/releases) - [Commits](https://github.com/spf13/viper/compare/v1.12.0...v1.13.0) --- updated-dependencies: - dependency-name: github.com/spf13/viper dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 8 ++++---- go.sum | 17 ++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index bbeeeefca6..5ae79705ba 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/spf13/cast v1.5.0 github.com/spf13/cobra v1.5.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.12.0 + github.com/spf13/viper v1.13.0 github.com/stretchr/testify v1.8.0 github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca github.com/tendermint/tendermint v0.34.21 @@ -95,7 +95,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect @@ -107,7 +107,7 @@ require ( github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa // indirect github.com/spf13/afero v1.8.2 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/subosito/gotenv v1.4.0 // indirect + github.com/subosito/gotenv v1.4.1 // indirect github.com/tendermint/btcd v0.1.1 // indirect github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 // indirect github.com/tendermint/go-amino v0.16.0 // indirect @@ -120,7 +120,7 @@ require ( golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/ini.v1 v1.66.6 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect ) diff --git a/go.sum b/go.sum index 2b287c95b0..5cfe6dd202 100644 --- a/go.sum +++ b/go.sum @@ -592,8 +592,8 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= -github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= @@ -714,8 +714,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= @@ -734,11 +734,10 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= -github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= @@ -1176,8 +1175,8 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +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/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= From a40a10643d26c9a29895385a56173bd5903a733e Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 7 Sep 2022 10:25:44 +0200 Subject: [PATCH 48/94] Upgrade to wasmvm v1.1.0 --- Dockerfile | 8 ++++---- README.md | 4 +++- go.mod | 16 ++++++++-------- go.sum | 28 +++++++++++++++++----------- x/wasm/keeper/proposal_handler.go | 1 - x/wasm/keeper/recurse_test.go | 4 ++-- 6 files changed, 34 insertions(+), 27 deletions(-) diff --git a/Dockerfile b/Dockerfile index ea887a4d31..0fac41b100 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,10 +16,10 @@ WORKDIR /code COPY . /code/ # See https://github.com/CosmWasm/wasmvm/releases -ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.0.0/libwasmvm_muslc.aarch64.a /lib/libwasmvm_muslc.aarch64.a -ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.0.0/libwasmvm_muslc.x86_64.a /lib/libwasmvm_muslc.x86_64.a -RUN sha256sum /lib/libwasmvm_muslc.aarch64.a | grep 7d2239e9f25e96d0d4daba982ce92367aacf0cbd95d2facb8442268f2b1cc1fc -RUN sha256sum /lib/libwasmvm_muslc.x86_64.a | grep f6282df732a13dec836cda1f399dd874b1e3163504dbd9607c6af915b2740479 +ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.1.0/libwasmvm_muslc.aarch64.a /lib/libwasmvm_muslc.aarch64.a +ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.1.0/libwasmvm_muslc.x86_64.a /lib/libwasmvm_muslc.x86_64.a +RUN sha256sum /lib/libwasmvm_muslc.aarch64.a | grep 728993b91b35037ae8d9933c3a9ee018e49a7926571ce4109f55d9954efcbe9a +RUN sha256sum /lib/libwasmvm_muslc.x86_64.a | grep d06607db7bda6d3981f0717133584dd5480a6bca7b1e208b4526e68f3ccf3b31 # Copy the library you want to the final location that will be found by the linker flag `-lwasmvm_muslc` RUN cp /lib/libwasmvm_muslc.${arch}.a /lib/libwasmvm_muslc.a diff --git a/README.md b/README.md index 2c4944dd35..8deccd01dc 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,9 @@ version is communicated by the contract via a Wasm export. This is the current compatibility list: | wasmd | wasmvm | cosmwasm-vm | cosmwasm-std | -| ----- | ------------ | ----------- | ------------ | +|-------|--------------|-------------|--------------| +| 0.29 | v1.1.0 | | 1.1 | +| 0.28 | v1.0.0 | | 1.0 | | 0.27 | v1.0.0 | | 1.0 | | 0.26 | 1.0.0-beta10 | | 1.0 | | 0.25 | 1.0.0-beta10 | | 1.0 | diff --git a/go.mod b/go.mod index bbeeeefca6..f93697ccc3 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/CosmWasm/wasmd go 1.18 require ( - github.com/CosmWasm/wasmvm v1.0.0 + github.com/CosmWasm/wasmvm v1.1.0 github.com/cosmos/cosmos-sdk v0.45.8 github.com/cosmos/iavl v0.19.1 github.com/cosmos/ibc-go/v3 v3.0.0 @@ -36,7 +36,6 @@ require ( filippo.io/edwards25519 v1.0.0-beta.2 // indirect github.com/99designs/keyring v1.1.6 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect - github.com/DataDog/zstd v1.4.5 // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect github.com/armon/go-metrics v0.4.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -55,8 +54,8 @@ require ( github.com/danieljoos/wincred v1.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/dgraph-io/badger/v2 v2.2007.2 // indirect - github.com/dgraph-io/ristretto v0.0.3 // indirect + github.com/dgraph-io/badger/v2 v2.2007.4 // indirect + github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect @@ -66,8 +65,9 @@ require ( github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/gateway v1.1.0 // indirect - github.com/golang/snappy v0.0.3 // indirect - github.com/google/btree v1.0.0 // indirect + github.com/golang/glog v1.0.0 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/btree v1.1.2 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -115,8 +115,8 @@ require ( go.etcd.io/bbolt v1.3.6 // indirect golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/net v0.0.0-20220726230323-06994584191e // indirect - golang.org/x/sys v0.0.0-20220727055044-e65921a090b8 // indirect + golang.org/x/net v0.0.0-20220906165146-f3363e06e74c // indirect + golang.org/x/sys v0.0.0-20220907062415-87db552b00fd // indirect golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/go.sum b/go.sum index 2b287c95b0..efc49e6d07 100644 --- a/go.sum +++ b/go.sum @@ -55,11 +55,10 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -github.com/CosmWasm/wasmvm v1.0.0 h1:NRmnHe3xXsKn2uEcB1F5Ha323JVAhON+BI6L177dlKc= -github.com/CosmWasm/wasmvm v1.0.0/go.mod h1:ei0xpvomwSdONsxDuONzV7bL1jSET1M8brEx0FCXc+A= +github.com/CosmWasm/wasmvm v1.1.0 h1:FLd2njaJcZPgq/yLrXtQdndg0oG/QySKpWyVP2tBCnQ= +github.com/CosmWasm/wasmvm v1.1.0/go.mod h1:ei0xpvomwSdONsxDuONzV7bL1jSET1M8brEx0FCXc+A= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= @@ -194,11 +193,13 @@ github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vs github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= 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.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= @@ -286,6 +287,8 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -318,11 +321,13 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/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 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= 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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -468,6 +473,7 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o 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.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -907,8 +913,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220726230323-06994584191e h1:wOQNKh1uuDGRnmgF0jDxh7ctgGy/3P4rYWQRVJD4/Yg= -golang.org/x/net v0.0.0-20220726230323-06994584191e/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= +golang.org/x/net v0.0.0-20220906165146-f3363e06e74c h1:yKufUcDwucU5urd+50/Opbt4AYpqthk7wHpHok8f1lo= +golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= 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= @@ -1001,8 +1007,8 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220727055044-e65921a090b8 h1:dyU22nBWzrmTQxtNrr4dzVOvaw35nUYE279vF9UmsI8= -golang.org/x/sys v0.0.0-20220727055044-e65921a090b8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220907062415-87db552b00fd h1:AZeIEzg+8RCELJYq8w+ODLVxFgLMMigSwO/ffKPEd9U= +golang.org/x/sys v0.0.0-20220907062415-87db552b00fd/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= diff --git a/x/wasm/keeper/proposal_handler.go b/x/wasm/keeper/proposal_handler.go index f4cd8a4e1a..905b073d5e 100644 --- a/x/wasm/keeper/proposal_handler.go +++ b/x/wasm/keeper/proposal_handler.go @@ -74,7 +74,6 @@ func handleStoreCodeProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types return nil } return k.PinCode(ctx, codeID) - } func handleInstantiateProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.InstantiateContractProposal) error { diff --git a/x/wasm/keeper/recurse_test.go b/x/wasm/keeper/recurse_test.go index cfb49e0ac1..18778a52d7 100644 --- a/x/wasm/keeper/recurse_test.go +++ b/x/wasm/keeper/recurse_test.go @@ -91,7 +91,7 @@ func TestGasCostOnQuery(t *testing.T) { Depth: 1, Work: 50, }, - expectedGas: 2*GasWork50 + GasReturnHashed, + expectedGas: 2*GasWork50 + GasReturnHashed + 1, // +1 for rounding }, "recursion 4, some work": { gasLimit: 400_000, @@ -99,7 +99,7 @@ func TestGasCostOnQuery(t *testing.T) { Depth: 4, Work: 50, }, - expectedGas: 5*GasWork50 + 4*GasReturnHashed, + expectedGas: 5*GasWork50 + 4*GasReturnHashed + 1, }, } From 8f7dfb1d27522d1465c49aac138e37428999fe00 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 7 Sep 2022 10:37:16 +0200 Subject: [PATCH 49/94] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a735308f23..3fee812325 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## [Unreleased](https://github.com/CosmWasm/wasmd/tree/HEAD) - Upgrade go to v1.18 [\#866]https://github.com/CosmWasm/wasmd/pull/866/) ([faddat](https://github.com/faddat)) - Upgrade to cosmos-sdk v0.45.8 [\#964](https://github.com/CosmWasm/wasmd/pull/964/) ([faddat](https://github.com/faddat)) - +- Upgrade wasmvm to v1.1.0 [\#984](https://github.com/CosmWasm/wasmd/pull/984), see [wasmvm v1.1.0](https://github.com/CosmWasm/wasmvm/releases/tag/v1.1.0) [Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.28.0...HEAD) From ed308054edd13fc442fe322b4fbb4004a47061da Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Wed, 7 Sep 2022 10:47:02 +0200 Subject: [PATCH 50/94] Update README.md Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8deccd01dc..ca44b55d11 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,8 @@ compatibility list: | wasmd | wasmvm | cosmwasm-vm | cosmwasm-std | |-------|--------------|-------------|--------------| -| 0.29 | v1.1.0 | | 1.1 | -| 0.28 | v1.0.0 | | 1.0 | +| 0.29 | v1.1.0 | | 1.0-1.1 | +| 0.28 | v1.0.0 | | 1.0-1.1 | | 0.27 | v1.0.0 | | 1.0 | | 0.26 | 1.0.0-beta10 | | 1.0 | | 0.25 | 1.0.0-beta10 | | 1.0 | From 2674c53d7b1c06f365a2e30728808d4661d524de Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 2 Sep 2022 10:18:16 +0200 Subject: [PATCH 51/94] Introduce AccessTypeAnyOfAddresses --- docs/proto/proto-docs.md | 6 +- proto/cosmwasm/wasm/v1/types.proto | 10 +- x/wasm/types/params.go | 50 +++++- x/wasm/types/params_test.go | 64 ++++++-- x/wasm/types/types.go | 32 +++- x/wasm/types/types.pb.go | 222 ++++++++++++++++--------- x/wasm/types/types_test.go | 252 ++++++++++++++++++++++++----- 7 files changed, 501 insertions(+), 135 deletions(-) diff --git a/docs/proto/proto-docs.md b/docs/proto/proto-docs.md index e5cd7ec88f..e62564dc73 100644 --- a/docs/proto/proto-docs.md +++ b/docs/proto/proto-docs.md @@ -119,7 +119,8 @@ AccessConfig access control type. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | `permission` | [AccessType](#cosmwasm.wasm.v1.AccessType) | | | -| `address` | [string](#string) | | | +| `address` | [string](#string) | | Address Deprecated: replaced by addresses | +| `addresses` | [string](#string) | repeated | | @@ -240,8 +241,9 @@ AccessType permission types | ---- | ------ | ----------- | | ACCESS_TYPE_UNSPECIFIED | 0 | AccessTypeUnspecified placeholder for empty value | | ACCESS_TYPE_NOBODY | 1 | AccessTypeNobody forbidden | -| ACCESS_TYPE_ONLY_ADDRESS | 2 | AccessTypeOnlyAddress restricted to an address | +| ACCESS_TYPE_ONLY_ADDRESS | 2 | AccessTypeOnlyAddress restricted to a single address Deprecated: use AccessTypeAnyOfAddresses instead | | ACCESS_TYPE_EVERYBODY | 3 | AccessTypeEverybody unrestricted | +| ACCESS_TYPE_ANY_OF_ADDRESSES | 4 | AccessTypeAnyOfAddresses allow any of the addresses | diff --git a/proto/cosmwasm/wasm/v1/types.proto b/proto/cosmwasm/wasm/v1/types.proto index 739aed2af7..8d140248a8 100644 --- a/proto/cosmwasm/wasm/v1/types.proto +++ b/proto/cosmwasm/wasm/v1/types.proto @@ -19,12 +19,16 @@ enum AccessType { // AccessTypeNobody forbidden ACCESS_TYPE_NOBODY = 1 [ (gogoproto.enumvalue_customname) = "AccessTypeNobody" ]; - // AccessTypeOnlyAddress restricted to an address + // AccessTypeOnlyAddress restricted to a single address + // Deprecated: use AccessTypeAnyOfAddresses instead ACCESS_TYPE_ONLY_ADDRESS = 2 [ (gogoproto.enumvalue_customname) = "AccessTypeOnlyAddress" ]; // AccessTypeEverybody unrestricted ACCESS_TYPE_EVERYBODY = 3 [ (gogoproto.enumvalue_customname) = "AccessTypeEverybody" ]; + // AccessTypeAnyOfAddresses allow any of the addresses + ACCESS_TYPE_ANY_OF_ADDRESSES = 4 + [ (gogoproto.enumvalue_customname) = "AccessTypeAnyOfAddresses" ]; } // AccessTypeParam @@ -37,7 +41,11 @@ message AccessTypeParam { message AccessConfig { option (gogoproto.goproto_stringer) = true; AccessType permission = 1 [ (gogoproto.moretags) = "yaml:\"permission\"" ]; + + // Address + // Deprecated: replaced by addresses string address = 2 [ (gogoproto.moretags) = "yaml:\"address\"" ]; + repeated string addresses = 3 [ (gogoproto.moretags) = "yaml:\"addresses\"" ]; } // Params defines the set of wasm parameters. diff --git a/x/wasm/types/params.go b/x/wasm/types/params.go index ea8046cf3d..1fbf3fe605 100644 --- a/x/wasm/types/params.go +++ b/x/wasm/types/params.go @@ -20,20 +20,33 @@ var ( var AllAccessTypes = []AccessType{ AccessTypeNobody, AccessTypeOnlyAddress, + AccessTypeAnyOfAddresses, AccessTypeEverybody, } -func (a AccessType) With(addr sdk.AccAddress) AccessConfig { +func (a AccessType) With(addrs ...sdk.AccAddress) AccessConfig { switch a { case AccessTypeNobody: return AllowNobody case AccessTypeOnlyAddress: - if err := sdk.VerifyAddressFormat(addr); err != nil { + if n := len(addrs); n != 1 { + panic(fmt.Sprintf("expected exactly 1 address but got %d", n)) + } + if err := sdk.VerifyAddressFormat(addrs[0]); err != nil { panic(err) } - return AccessConfig{Permission: AccessTypeOnlyAddress, Address: addr.String()} + return AccessConfig{Permission: AccessTypeOnlyAddress, Address: addrs[0].String()} case AccessTypeEverybody: return AllowEverybody + case AccessTypeAnyOfAddresses: + bech32Addrs := make([]string, len(addrs)) + for i, v := range addrs { + bech32Addrs[i] = v.String() + } + if err := assertValidAddresses(bech32Addrs); err != nil { + panic(err) + } + return AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: bech32Addrs} } panic("unsupported access type") } @@ -46,6 +59,8 @@ func (a AccessType) String() string { return "OnlyAddress" case AccessTypeEverybody: return "Everybody" + case AccessTypeAnyOfAddresses: + return "AnyOfAddresses" } return "Unspecified" } @@ -157,12 +172,34 @@ func (a AccessConfig) ValidateBasic() error { } return nil case AccessTypeOnlyAddress: + if len(a.Addresses) != 0 { + return ErrInvalid.Wrap("addresses field set") + } _, err := sdk.AccAddressFromBech32(a.Address) return err + case AccessTypeAnyOfAddresses: + if a.Address != "" { + return ErrInvalid.Wrap("address field set") + } + return assertValidAddresses(a.Addresses) } return sdkerrors.Wrapf(ErrInvalid, "unknown type: %q", a.Permission) } +func assertValidAddresses(addrs []string) error { + idx := make(map[string]struct{}, len(addrs)) + for _, a := range addrs { + if _, err := sdk.AccAddressFromBech32(a); err != nil { + return sdkerrors.Wrapf(err, "address: %s", a) + } + if _, exists := idx[a]; exists { + return ErrDuplicate.Wrapf("address: %s", a) + } + idx[a] = struct{}{} + } + return nil +} + func (a AccessConfig) Allowed(actor sdk.AccAddress) bool { switch a.Permission { case AccessTypeNobody: @@ -171,6 +208,13 @@ func (a AccessConfig) Allowed(actor sdk.AccAddress) bool { return true case AccessTypeOnlyAddress: return a.Address == actor.String() + case AccessTypeAnyOfAddresses: + for _, v := range a.Addresses { + if v == actor.String() { + return true + } + } + return false default: panic("unknown type") } diff --git a/x/wasm/types/params_test.go b/x/wasm/types/params_test.go index 35799cb48b..d4abcfd7cc 100644 --- a/x/wasm/types/params_test.go +++ b/x/wasm/types/params_test.go @@ -1,6 +1,7 @@ package types import ( + "bytes" "encoding/json" "testing" @@ -14,6 +15,7 @@ import ( func TestValidateParams(t *testing.T) { var ( anyAddress sdk.AccAddress = make([]byte, ContractAddrLen) + otherAddress sdk.AccAddress = bytes.Repeat([]byte{1}, ContractAddrLen) invalidAddress = "invalid address" ) @@ -42,6 +44,18 @@ func TestValidateParams(t *testing.T) { InstantiateDefaultPermission: AccessTypeOnlyAddress, }, }, + "all good with anyOf address": { + src: Params{ + CodeUploadAccess: AccessTypeAnyOfAddresses.With(anyAddress), + InstantiateDefaultPermission: AccessTypeAnyOfAddresses, + }, + }, + "all good with anyOf addresses": { + src: Params{ + CodeUploadAccess: AccessTypeAnyOfAddresses.With(anyAddress, otherAddress), + InstantiateDefaultPermission: AccessTypeAnyOfAddresses, + }, + }, "reject empty type in instantiate permission": { src: Params{ CodeUploadAccess: AllowNobody, @@ -62,6 +76,13 @@ func TestValidateParams(t *testing.T) { }, expErr: true, }, + "reject wrong field addresses in only address": { + src: Params{ + CodeUploadAccess: AccessConfig{Permission: AccessTypeOnlyAddress, Address: anyAddress.String(), Addresses: []string{anyAddress.String()}}, + InstantiateDefaultPermission: AccessTypeOnlyAddress, + }, + expErr: true, + }, "reject CodeUploadAccess Everybody with obsolete address": { src: Params{ CodeUploadAccess: AccessConfig{Permission: AccessTypeEverybody, Address: anyAddress.String()}, @@ -89,6 +110,27 @@ func TestValidateParams(t *testing.T) { }, expErr: true, }, + "reject invalid address in any of addresses": { + src: Params{ + CodeUploadAccess: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{invalidAddress}}, + InstantiateDefaultPermission: AccessTypeAnyOfAddresses, + }, + expErr: true, + }, + "reject duplicate address in any of addresses": { + src: Params{ + CodeUploadAccess: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{anyAddress.String(), anyAddress.String()}}, + InstantiateDefaultPermission: AccessTypeAnyOfAddresses, + }, + expErr: true, + }, + "reject wrong field address in any of addresses": { + src: Params{ + CodeUploadAccess: AccessConfig{Permission: AccessTypeAnyOfAddresses, Address: anyAddress.String(), Addresses: []string{anyAddress.String()}}, + InstantiateDefaultPermission: AccessTypeAnyOfAddresses, + }, + expErr: true, + }, } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { @@ -107,11 +149,12 @@ func TestAccessTypeMarshalJson(t *testing.T) { src AccessType exp string }{ - "Unspecified": {src: AccessTypeUnspecified, exp: `"Unspecified"`}, - "Nobody": {src: AccessTypeNobody, exp: `"Nobody"`}, - "OnlyAddress": {src: AccessTypeOnlyAddress, exp: `"OnlyAddress"`}, - "Everybody": {src: AccessTypeEverybody, exp: `"Everybody"`}, - "unknown": {src: 999, exp: `"Unspecified"`}, + "Unspecified": {src: AccessTypeUnspecified, exp: `"Unspecified"`}, + "Nobody": {src: AccessTypeNobody, exp: `"Nobody"`}, + "OnlyAddress": {src: AccessTypeOnlyAddress, exp: `"OnlyAddress"`}, + "AccessTypeAnyOfAddresses": {src: AccessTypeAnyOfAddresses, exp: `"AnyOfAddresses"`}, + "Everybody": {src: AccessTypeEverybody, exp: `"Everybody"`}, + "unknown": {src: 999, exp: `"Unspecified"`}, } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { @@ -127,11 +170,12 @@ func TestAccessTypeUnmarshalJson(t *testing.T) { src string exp AccessType }{ - "Unspecified": {src: `"Unspecified"`, exp: AccessTypeUnspecified}, - "Nobody": {src: `"Nobody"`, exp: AccessTypeNobody}, - "OnlyAddress": {src: `"OnlyAddress"`, exp: AccessTypeOnlyAddress}, - "Everybody": {src: `"Everybody"`, exp: AccessTypeEverybody}, - "unknown": {src: `""`, exp: AccessTypeUnspecified}, + "Unspecified": {src: `"Unspecified"`, exp: AccessTypeUnspecified}, + "Nobody": {src: `"Nobody"`, exp: AccessTypeNobody}, + "OnlyAddress": {src: `"OnlyAddress"`, exp: AccessTypeOnlyAddress}, + "AnyOfAddresses": {src: `"AnyOfAddresses"`, exp: AccessTypeAnyOfAddresses}, + "Everybody": {src: `"Everybody"`, exp: AccessTypeEverybody}, + "unknown": {src: `""`, exp: AccessTypeUnspecified}, } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { diff --git a/x/wasm/types/types.go b/x/wasm/types/types.go index cdf669e5c9..3712af192c 100644 --- a/x/wasm/types/types.go +++ b/x/wasm/types/types.go @@ -342,9 +342,9 @@ func (a AccessType) IsSubset(superSet AccessType) bool { case AccessTypeNobody: // Only an exact match is a subset of this return a == AccessTypeNobody - case AccessTypeOnlyAddress: - // An exact match or nobody - return a == AccessTypeNobody || a == AccessTypeOnlyAddress + case AccessTypeOnlyAddress, AccessTypeAnyOfAddresses: + // Nobody or address(es) + return a == AccessTypeNobody || a == AccessTypeOnlyAddress || a == AccessTypeAnyOfAddresses default: return false } @@ -356,8 +356,32 @@ func (a AccessConfig) IsSubset(superSet AccessConfig) bool { switch superSet.Permission { case AccessTypeOnlyAddress: // An exact match or nobody - return a.Permission == AccessTypeNobody || (a.Permission == AccessTypeOnlyAddress && a.Address == superSet.Address) + return a.Permission == AccessTypeNobody || (a.Permission == AccessTypeOnlyAddress && a.Address == superSet.Address) || + (a.Permission == AccessTypeAnyOfAddresses && isSubset([]string{superSet.Address}, a.Addresses)) + case AccessTypeAnyOfAddresses: + // An exact match or nobody + return a.Permission == AccessTypeNobody || (a.Permission == AccessTypeOnlyAddress && isSubset(superSet.Addresses, []string{a.Address})) || + a.Permission == AccessTypeAnyOfAddresses && isSubset(superSet.Addresses, a.Addresses) + case AccessTypeUnspecified: + return false default: return a.Permission.IsSubset(superSet.Permission) } } + +// return true when all elements in sub are also part of super +func isSubset(super, sub []string) bool { + if len(sub) == 0 { + return true + } + var matches int + for _, o := range sub { + for _, s := range super { + if o == s { + matches++ + break + } + } + } + return matches == len(sub) +} diff --git a/x/wasm/types/types.pb.go b/x/wasm/types/types.pb.go index 05ff057a0d..f7dc08b405 100644 --- a/x/wasm/types/types.pb.go +++ b/x/wasm/types/types.pb.go @@ -39,10 +39,13 @@ const ( AccessTypeUnspecified AccessType = 0 // AccessTypeNobody forbidden AccessTypeNobody AccessType = 1 - // AccessTypeOnlyAddress restricted to an address + // AccessTypeOnlyAddress restricted to a single address + // Deprecated: use AccessTypeAnyOfAddresses instead AccessTypeOnlyAddress AccessType = 2 // AccessTypeEverybody unrestricted AccessTypeEverybody AccessType = 3 + // AccessTypeAnyOfAddresses allow any of the addresses + AccessTypeAnyOfAddresses AccessType = 4 ) var AccessType_name = map[int32]string{ @@ -50,13 +53,15 @@ var AccessType_name = map[int32]string{ 1: "ACCESS_TYPE_NOBODY", 2: "ACCESS_TYPE_ONLY_ADDRESS", 3: "ACCESS_TYPE_EVERYBODY", + 4: "ACCESS_TYPE_ANY_OF_ADDRESSES", } var AccessType_value = map[string]int32{ - "ACCESS_TYPE_UNSPECIFIED": 0, - "ACCESS_TYPE_NOBODY": 1, - "ACCESS_TYPE_ONLY_ADDRESS": 2, - "ACCESS_TYPE_EVERYBODY": 3, + "ACCESS_TYPE_UNSPECIFIED": 0, + "ACCESS_TYPE_NOBODY": 1, + "ACCESS_TYPE_ONLY_ADDRESS": 2, + "ACCESS_TYPE_EVERYBODY": 3, + "ACCESS_TYPE_ANY_OF_ADDRESSES": 4, } func (AccessType) EnumDescriptor() ([]byte, []int) { @@ -145,7 +150,10 @@ var xxx_messageInfo_AccessTypeParam proto.InternalMessageInfo // AccessConfig access control type. type AccessConfig struct { Permission AccessType `protobuf:"varint,1,opt,name=permission,proto3,enum=cosmwasm.wasm.v1.AccessType" json:"permission,omitempty" yaml:"permission"` - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty" yaml:"address"` + // Address + // Deprecated: replaced by addresses + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty" yaml:"address"` + Addresses []string `protobuf:"bytes,3,rep,name=addresses,proto3" json:"addresses,omitempty" yaml:"addresses"` } func (m *AccessConfig) Reset() { *m = AccessConfig{} } @@ -493,78 +501,81 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/types.proto", fileDescriptor_e6155d98fa173e02) } var fileDescriptor_e6155d98fa173e02 = []byte{ - // 1123 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xcd, 0x8f, 0xdb, 0x44, - 0x14, 0x8f, 0x93, 0xec, 0xd7, 0x34, 0x14, 0x77, 0xd8, 0xa5, 0x49, 0xa8, 0x9c, 0xd4, 0x14, 0xd8, - 0x7e, 0x25, 0x74, 0x41, 0x80, 0x7a, 0xa8, 0x94, 0x0f, 0xd3, 0xb8, 0x62, 0x93, 0x68, 0x92, 0x52, - 0x2d, 0x52, 0x65, 0x39, 0xf6, 0x6c, 0x62, 0xd5, 0xf1, 0x44, 0x9e, 0xc9, 0x36, 0xfe, 0x0f, 0x50, - 0x24, 0x04, 0x37, 0xb8, 0x44, 0x42, 0x80, 0x50, 0xff, 0x00, 0xae, 0xdc, 0x2b, 0x4e, 0x3d, 0x72, - 0x8a, 0x20, 0xbd, 0xc0, 0x75, 0x8f, 0xe5, 0x82, 0x3c, 0x93, 0x10, 0xab, 0xdd, 0x76, 0xc3, 0xc5, - 0xf2, 0xbc, 0xf7, 0x7e, 0xbf, 0xf7, 0xde, 0x6f, 0xde, 0xb3, 0x0c, 0x2e, 0x58, 0x84, 0xf6, 0x1f, - 0x9a, 0xb4, 0x5f, 0xe4, 0x8f, 0xa3, 0x1b, 0x45, 0x16, 0x0c, 0x30, 0x2d, 0x0c, 0x7c, 0xc2, 0x08, - 0x94, 0x17, 0xde, 0x02, 0x7f, 0x1c, 0xdd, 0xc8, 0x66, 0x42, 0x0b, 0xa1, 0x06, 0xf7, 0x17, 0xc5, - 0x41, 0x04, 0x67, 0xb7, 0xbb, 0xa4, 0x4b, 0x84, 0x3d, 0x7c, 0x9b, 0x5b, 0x33, 0x5d, 0x42, 0xba, - 0x2e, 0x2e, 0xf2, 0x53, 0x67, 0x78, 0x58, 0x34, 0xbd, 0x40, 0xb8, 0xd4, 0xfb, 0xe0, 0xf5, 0x92, - 0x65, 0x61, 0x4a, 0xdb, 0xc1, 0x00, 0x37, 0x4d, 0xdf, 0xec, 0xc3, 0x2a, 0x58, 0x3b, 0x32, 0xdd, - 0x21, 0x4e, 0x4b, 0x79, 0x69, 0xf7, 0xec, 0xde, 0x85, 0xc2, 0xf3, 0x05, 0x14, 0x96, 0x88, 0xb2, - 0x7c, 0x3c, 0xcd, 0xa5, 0x02, 0xb3, 0xef, 0xde, 0x54, 0x39, 0x48, 0x45, 0x02, 0x7c, 0x33, 0xf9, - 0xdd, 0xf7, 0x39, 0x49, 0xfd, 0x56, 0x02, 0x29, 0x11, 0x5d, 0x21, 0xde, 0xa1, 0xd3, 0x85, 0x2d, - 0x00, 0x06, 0xd8, 0xef, 0x3b, 0x94, 0x3a, 0xc4, 0x5b, 0x29, 0xc3, 0xce, 0xf1, 0x34, 0x77, 0x4e, - 0x64, 0x58, 0x22, 0x55, 0x14, 0xa1, 0x81, 0xd7, 0xc0, 0x86, 0x69, 0xdb, 0x3e, 0xa6, 0x34, 0x1d, - 0xcf, 0x4b, 0xbb, 0x5b, 0x65, 0x78, 0x3c, 0xcd, 0x9d, 0x15, 0x98, 0xb9, 0x43, 0x45, 0x8b, 0x90, - 0x79, 0x65, 0x5f, 0xc7, 0xc1, 0x3a, 0xef, 0x97, 0x42, 0x02, 0xa0, 0x45, 0x6c, 0x6c, 0x0c, 0x07, - 0x2e, 0x31, 0x6d, 0xc3, 0xe4, 0xb9, 0x79, 0x6d, 0x67, 0xf6, 0x94, 0x97, 0xd5, 0x26, 0xfa, 0x29, - 0x5f, 0x7c, 0x3c, 0xcd, 0xc5, 0x8e, 0xa7, 0xb9, 0x8c, 0xc8, 0xf6, 0x22, 0x8f, 0x8a, 0xe4, 0xd0, - 0x78, 0x97, 0xdb, 0x04, 0x14, 0x7e, 0x25, 0x01, 0xc5, 0xf1, 0x28, 0x33, 0x3d, 0xe6, 0x98, 0x0c, - 0x1b, 0x36, 0x3e, 0x34, 0x87, 0x2e, 0x33, 0x22, 0xca, 0xc4, 0x57, 0x50, 0xe6, 0xf2, 0xf1, 0x34, - 0xf7, 0x8e, 0xc8, 0xfb, 0x6a, 0x36, 0x15, 0x5d, 0x88, 0x04, 0x54, 0x85, 0xbf, 0xf9, 0x9f, 0x9b, - 0x2b, 0x12, 0x53, 0x7f, 0x90, 0xc0, 0x66, 0x85, 0xd8, 0x58, 0xf7, 0x0e, 0x09, 0x7c, 0x0b, 0x6c, - 0xf1, 0x5e, 0x7a, 0x26, 0xed, 0x71, 0x29, 0x52, 0x68, 0x33, 0x34, 0xd4, 0x4c, 0xda, 0x83, 0x69, - 0xb0, 0x61, 0xf9, 0xd8, 0x64, 0xc4, 0x17, 0x7a, 0xa3, 0xc5, 0x11, 0xb6, 0x00, 0x8c, 0x96, 0x62, - 0x71, 0x91, 0xd2, 0x6b, 0x2b, 0x49, 0x99, 0x0c, 0xa5, 0x44, 0xe7, 0x22, 0x78, 0xe1, 0xb8, 0x93, - 0xdc, 0x4c, 0xc8, 0xc9, 0x3b, 0xc9, 0xcd, 0xa4, 0xbc, 0xa6, 0xfe, 0x1a, 0x07, 0xa9, 0x0a, 0xf1, - 0x98, 0x6f, 0x5a, 0x8c, 0x17, 0xfa, 0x36, 0xd8, 0xe0, 0x85, 0x3a, 0x36, 0x2f, 0x33, 0x59, 0x06, - 0xb3, 0x69, 0x6e, 0x9d, 0xf7, 0x51, 0x45, 0xeb, 0xa1, 0x4b, 0xb7, 0x5f, 0x51, 0xf0, 0x36, 0x58, - 0x33, 0xed, 0xbe, 0xe3, 0xa5, 0x13, 0xdc, 0x2e, 0x0e, 0xa1, 0xd5, 0x35, 0x3b, 0xd8, 0x4d, 0x27, - 0x85, 0x95, 0x1f, 0xe0, 0xad, 0x39, 0x0b, 0xb6, 0xe7, 0x1d, 0x5d, 0x3a, 0xa1, 0xa3, 0x0e, 0x25, - 0xee, 0x90, 0xe1, 0xf6, 0xa8, 0x49, 0xa8, 0xc3, 0x1c, 0xe2, 0xa1, 0x05, 0x08, 0x5e, 0x07, 0x67, - 0x9c, 0x8e, 0x65, 0x0c, 0x88, 0xcf, 0xc2, 0x72, 0xd7, 0xf9, 0xa8, 0xbe, 0x36, 0x9b, 0xe6, 0xb6, - 0xf4, 0x72, 0xa5, 0x49, 0x7c, 0xa6, 0x57, 0xd1, 0x96, 0xd3, 0xb1, 0xf8, 0xab, 0x0d, 0xf7, 0xc1, - 0x16, 0x1e, 0x31, 0xec, 0xf1, 0x79, 0xd8, 0xe0, 0x09, 0xb7, 0x0b, 0x62, 0x93, 0x0b, 0x8b, 0x4d, - 0x2e, 0x94, 0xbc, 0xa0, 0x9c, 0xf9, 0xed, 0x97, 0xeb, 0x3b, 0x51, 0x51, 0xb4, 0x05, 0x0c, 0x2d, - 0x19, 0x6e, 0x26, 0xff, 0x0a, 0xc7, 0xfe, 0x1f, 0x09, 0xa4, 0x17, 0xa1, 0xa1, 0x48, 0x35, 0x87, - 0x32, 0xe2, 0x07, 0x9a, 0xc7, 0xfc, 0x00, 0x36, 0xc1, 0x16, 0x19, 0x60, 0xdf, 0x64, 0xcb, 0xdd, - 0xdc, 0x7b, 0xb1, 0xc5, 0x13, 0xe0, 0x8d, 0x05, 0x2a, 0x9c, 0x4b, 0xb4, 0x24, 0x89, 0xde, 0x4e, - 0xfc, 0xa5, 0xb7, 0x73, 0x0b, 0x6c, 0x0c, 0x07, 0x36, 0xd7, 0x35, 0xf1, 0x7f, 0x74, 0x9d, 0x83, - 0xe0, 0x2e, 0x48, 0xf4, 0x69, 0x97, 0xdf, 0x55, 0xaa, 0xfc, 0xe6, 0xb3, 0x69, 0x0e, 0x22, 0xf3, - 0xe1, 0xa2, 0xca, 0x7d, 0x4c, 0xa9, 0xd9, 0xc5, 0x28, 0x0c, 0x51, 0x11, 0x80, 0x2f, 0x12, 0xc1, - 0x8b, 0x20, 0xd5, 0x71, 0x89, 0xf5, 0xc0, 0xe8, 0x61, 0xa7, 0xdb, 0x63, 0x62, 0x8e, 0xd0, 0x19, - 0x6e, 0xab, 0x71, 0x13, 0xcc, 0x80, 0x4d, 0x36, 0x32, 0x1c, 0xcf, 0xc6, 0x23, 0xd1, 0x08, 0xda, - 0x60, 0x23, 0x3d, 0x3c, 0xaa, 0x0e, 0x58, 0xdb, 0x27, 0x36, 0x76, 0xe1, 0x1d, 0x90, 0x78, 0x80, - 0x03, 0xb1, 0x2c, 0xe5, 0x4f, 0x9e, 0x4d, 0x73, 0x1f, 0x76, 0x1d, 0xd6, 0x1b, 0x76, 0x0a, 0x16, - 0xe9, 0x17, 0x19, 0xf6, 0xec, 0x70, 0xe1, 0x3c, 0x16, 0x7d, 0x75, 0x9d, 0x0e, 0x2d, 0x76, 0x02, - 0x86, 0x69, 0xa1, 0x86, 0x47, 0xe5, 0xf0, 0x05, 0x85, 0x24, 0xe1, 0x00, 0x8a, 0x6f, 0x70, 0x9c, - 0xaf, 0x9e, 0x38, 0x5c, 0xf9, 0x5b, 0x02, 0x60, 0xb9, 0xff, 0xf0, 0x23, 0x70, 0xbe, 0x54, 0xa9, - 0x68, 0xad, 0x96, 0xd1, 0x3e, 0x68, 0x6a, 0xc6, 0xdd, 0x7a, 0xab, 0xa9, 0x55, 0xf4, 0x4f, 0x75, - 0xad, 0x2a, 0xc7, 0xb2, 0x99, 0xf1, 0x24, 0xbf, 0xb3, 0x0c, 0xbe, 0xeb, 0xd1, 0x01, 0xb6, 0x9c, - 0x43, 0x07, 0xdb, 0xf0, 0x1a, 0x80, 0x51, 0x5c, 0xbd, 0x51, 0x6e, 0x54, 0x0f, 0x64, 0x29, 0xbb, - 0x3d, 0x9e, 0xe4, 0xe5, 0x25, 0xa4, 0x4e, 0x3a, 0xc4, 0x0e, 0xe0, 0xc7, 0x20, 0x1d, 0x8d, 0x6e, - 0xd4, 0x3f, 0x3b, 0x30, 0x4a, 0xd5, 0x2a, 0xd2, 0x5a, 0x2d, 0x39, 0xfe, 0x7c, 0x9a, 0x86, 0xe7, - 0x06, 0x25, 0xf1, 0x9d, 0x85, 0x7b, 0x60, 0x27, 0x0a, 0xd4, 0x3e, 0xd7, 0xd0, 0x01, 0xcf, 0x94, - 0xc8, 0x9e, 0x1f, 0x4f, 0xf2, 0x6f, 0x2c, 0x51, 0xda, 0x11, 0xf6, 0x83, 0x30, 0x59, 0x76, 0xf3, - 0xcb, 0x1f, 0x95, 0xd8, 0xa3, 0x9f, 0x94, 0xd8, 0x95, 0x9f, 0x13, 0x20, 0x7f, 0xda, 0xa4, 0x41, - 0x0c, 0xde, 0xaf, 0x34, 0xea, 0x6d, 0x54, 0xaa, 0xb4, 0x8d, 0x4a, 0xa3, 0xaa, 0x19, 0x35, 0xbd, - 0xd5, 0x6e, 0xa0, 0x03, 0xa3, 0xd1, 0xd4, 0x50, 0xa9, 0xad, 0x37, 0xea, 0x27, 0x49, 0x53, 0x1c, - 0x4f, 0xf2, 0x57, 0x4f, 0xe3, 0x8e, 0x0a, 0x76, 0x0f, 0x5c, 0x5e, 0x29, 0x8d, 0x5e, 0xd7, 0xdb, - 0xb2, 0x94, 0xdd, 0x1d, 0x4f, 0xf2, 0x97, 0x4e, 0xe3, 0xd7, 0x3d, 0x87, 0xc1, 0xfb, 0xe0, 0xda, - 0x4a, 0xc4, 0xfb, 0xfa, 0x6d, 0x54, 0x6a, 0x6b, 0x72, 0x3c, 0x7b, 0x75, 0x3c, 0xc9, 0xbf, 0x77, - 0x1a, 0xf7, 0xbe, 0xd3, 0xf5, 0x4d, 0x86, 0x57, 0xa6, 0xbf, 0xad, 0xd5, 0xb5, 0x96, 0xde, 0x92, - 0x13, 0xab, 0xd1, 0xdf, 0xc6, 0x1e, 0xa6, 0x0e, 0xcd, 0x26, 0xc3, 0xcb, 0x2a, 0xd7, 0x1e, 0xff, - 0xa9, 0xc4, 0x1e, 0xcd, 0x14, 0xe9, 0xf1, 0x4c, 0x91, 0x9e, 0xcc, 0x14, 0xe9, 0x8f, 0x99, 0x22, - 0x7d, 0xf3, 0x54, 0x89, 0x3d, 0x79, 0xaa, 0xc4, 0x7e, 0x7f, 0xaa, 0xc4, 0xbe, 0x78, 0x37, 0xb2, - 0x07, 0x15, 0x42, 0xfb, 0xf7, 0x16, 0xbf, 0x3a, 0x76, 0x71, 0x24, 0x7e, 0x79, 0xf8, 0xff, 0x4e, - 0x67, 0x9d, 0x7f, 0xd5, 0x3e, 0xf8, 0x37, 0x00, 0x00, 0xff, 0xff, 0x21, 0x8c, 0xa0, 0x70, 0x10, - 0x09, 0x00, 0x00, + // 1178 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xcf, 0x8f, 0xdb, 0xc4, + 0x17, 0x8f, 0x93, 0xec, 0x8f, 0x4c, 0xf7, 0xdb, 0xaf, 0x3b, 0xec, 0xd2, 0x6c, 0x58, 0x25, 0xa9, + 0x29, 0xb0, 0xfd, 0x95, 0xd0, 0x05, 0x01, 0xea, 0xa1, 0x52, 0x7e, 0xb8, 0x5d, 0x57, 0x6c, 0x1c, + 0x4d, 0x52, 0xaa, 0x45, 0xaa, 0x2c, 0xc7, 0x9e, 0xcd, 0x5a, 0x75, 0x3c, 0x91, 0x67, 0xb2, 0x8d, + 0xff, 0x03, 0x14, 0x09, 0xc1, 0x91, 0x4b, 0x24, 0x04, 0x08, 0x95, 0x3b, 0x57, 0xee, 0x15, 0x5c, + 0x7a, 0xe4, 0x14, 0xc1, 0xf6, 0xc2, 0x39, 0xc7, 0x72, 0x41, 0x9e, 0x89, 0x1b, 0xd3, 0x6e, 0xbb, + 0xe1, 0x62, 0xcd, 0xbc, 0xf7, 0x3e, 0x9f, 0xf7, 0xde, 0x67, 0xe6, 0x8d, 0x0c, 0xb6, 0x2c, 0x42, + 0x7b, 0x0f, 0x4d, 0xda, 0x2b, 0xf3, 0xcf, 0xd1, 0xf5, 0x32, 0x0b, 0xfa, 0x98, 0x96, 0xfa, 0x3e, + 0x61, 0x04, 0xca, 0x91, 0xb7, 0xc4, 0x3f, 0x47, 0xd7, 0x73, 0x9b, 0xa1, 0x85, 0x50, 0x83, 0xfb, + 0xcb, 0x62, 0x23, 0x82, 0x73, 0xeb, 0x5d, 0xd2, 0x25, 0xc2, 0x1e, 0xae, 0x66, 0xd6, 0xcd, 0x2e, + 0x21, 0x5d, 0x17, 0x97, 0xf9, 0xae, 0x33, 0x38, 0x28, 0x9b, 0x5e, 0x20, 0x5c, 0xca, 0x7d, 0xf0, + 0xff, 0x8a, 0x65, 0x61, 0x4a, 0xdb, 0x41, 0x1f, 0x37, 0x4d, 0xdf, 0xec, 0xc1, 0x3a, 0x58, 0x3a, + 0x32, 0xdd, 0x01, 0xce, 0x4a, 0x45, 0x69, 0xfb, 0xec, 0xce, 0x56, 0xe9, 0xc5, 0x02, 0x4a, 0x73, + 0x44, 0x55, 0x9e, 0x4e, 0x0a, 0x6b, 0x81, 0xd9, 0x73, 0x6f, 0x28, 0x1c, 0xa4, 0x20, 0x01, 0xbe, + 0x91, 0xfe, 0xe6, 0xdb, 0x82, 0xa4, 0xfc, 0x26, 0x81, 0x35, 0x11, 0x5d, 0x23, 0xde, 0x81, 0xd3, + 0x85, 0x2d, 0x00, 0xfa, 0xd8, 0xef, 0x39, 0x94, 0x3a, 0xc4, 0x5b, 0x28, 0xc3, 0xc6, 0x74, 0x52, + 0x38, 0x27, 0x32, 0xcc, 0x91, 0x0a, 0x8a, 0xd1, 0xc0, 0xab, 0x60, 0xc5, 0xb4, 0x6d, 0x1f, 0x53, + 0x9a, 0x4d, 0x16, 0xa5, 0xed, 0x4c, 0x15, 0x4e, 0x27, 0x85, 0xb3, 0x02, 0x33, 0x73, 0x28, 0x28, + 0x0a, 0x81, 0x3b, 0x20, 0x33, 0x5b, 0x62, 0x9a, 0x4d, 0x15, 0x53, 0xdb, 0x99, 0xea, 0xfa, 0x74, + 0x52, 0x90, 0xff, 0x15, 0x8f, 0xa9, 0x82, 0xe6, 0x61, 0xb3, 0x6e, 0xbe, 0x4a, 0x82, 0x65, 0xae, + 0x11, 0x85, 0x04, 0x40, 0x8b, 0xd8, 0xd8, 0x18, 0xf4, 0x5d, 0x62, 0xda, 0x86, 0xc9, 0xeb, 0xe5, + 0xfd, 0x9c, 0xd9, 0xc9, 0xbf, 0xaa, 0x1f, 0xa1, 0x41, 0xf5, 0xc2, 0xe3, 0x49, 0x21, 0x31, 0x9d, + 0x14, 0x36, 0x45, 0xc6, 0x97, 0x79, 0x14, 0x24, 0x87, 0xc6, 0xbb, 0xdc, 0x26, 0xa0, 0xf0, 0x4b, + 0x09, 0xe4, 0x1d, 0x8f, 0x32, 0xd3, 0x63, 0x8e, 0xc9, 0xb0, 0x61, 0xe3, 0x03, 0x73, 0xe0, 0x32, + 0x23, 0xa6, 0x66, 0x72, 0x01, 0x35, 0x2f, 0x4d, 0x27, 0x85, 0x77, 0x44, 0xde, 0xd7, 0xb3, 0x29, + 0x68, 0x2b, 0x16, 0x50, 0x17, 0xfe, 0xe6, 0x73, 0x37, 0x57, 0x24, 0xa1, 0x7c, 0x27, 0x81, 0xd5, + 0x1a, 0xb1, 0xb1, 0xe6, 0x1d, 0x10, 0xf8, 0x16, 0xc8, 0xf0, 0x5e, 0x0e, 0x4d, 0x7a, 0xc8, 0xa5, + 0x58, 0x43, 0xab, 0xa1, 0x61, 0xd7, 0xa4, 0x87, 0x30, 0x0b, 0x56, 0x2c, 0x1f, 0x9b, 0x8c, 0xf8, + 0xe2, 0x8c, 0x50, 0xb4, 0x85, 0x2d, 0x00, 0xe3, 0xa5, 0x58, 0x5c, 0xa4, 0xec, 0xd2, 0x42, 0x52, + 0xa6, 0x43, 0x29, 0xd1, 0xb9, 0x18, 0x5e, 0x38, 0xee, 0xa4, 0x57, 0x53, 0x72, 0xfa, 0x4e, 0x7a, + 0x35, 0x2d, 0x2f, 0x29, 0xbf, 0x24, 0xc1, 0x5a, 0x8d, 0x78, 0xcc, 0x37, 0x2d, 0xc6, 0x0b, 0x7d, + 0x1b, 0xac, 0xf0, 0x42, 0x1d, 0x9b, 0x97, 0x99, 0xae, 0x82, 0xe3, 0x49, 0x61, 0x99, 0xf7, 0x51, + 0x47, 0xcb, 0xa1, 0x4b, 0xb3, 0x5f, 0x53, 0xf0, 0x3a, 0x58, 0x32, 0xed, 0x9e, 0xe3, 0x65, 0x53, + 0xdc, 0x2e, 0x36, 0xa1, 0xd5, 0x35, 0x3b, 0xd8, 0xcd, 0xa6, 0x85, 0x95, 0x6f, 0xe0, 0xcd, 0x19, + 0x0b, 0xb6, 0x67, 0x1d, 0x5d, 0x3c, 0xa1, 0xa3, 0x0e, 0x25, 0xee, 0x80, 0xe1, 0xf6, 0xb0, 0x49, + 0xa8, 0xc3, 0x1c, 0xe2, 0xa1, 0x08, 0x04, 0xaf, 0x81, 0x33, 0x4e, 0xc7, 0x32, 0xfa, 0xc4, 0x67, + 0x61, 0xb9, 0xcb, 0xfc, 0x7a, 0xff, 0xef, 0x78, 0x52, 0xc8, 0x68, 0xd5, 0x5a, 0x93, 0xf8, 0x4c, + 0xab, 0xa3, 0x8c, 0xd3, 0xb1, 0xf8, 0xd2, 0x86, 0x7b, 0x20, 0x83, 0x87, 0x0c, 0x7b, 0xfc, 0x3e, + 0xac, 0xf0, 0x84, 0xeb, 0x25, 0x31, 0xfd, 0xa5, 0x68, 0xfa, 0x4b, 0x15, 0x2f, 0xa8, 0x6e, 0xfe, + 0xfa, 0xf3, 0xb5, 0x8d, 0xb8, 0x28, 0x6a, 0x04, 0x43, 0x73, 0x86, 0x1b, 0xe9, 0xbf, 0xc2, 0x6b, + 0xff, 0xb7, 0x04, 0xb2, 0x51, 0x68, 0x28, 0xd2, 0xae, 0x43, 0x19, 0xf1, 0x03, 0xd5, 0x63, 0x7e, + 0x00, 0x9b, 0x20, 0x43, 0xfa, 0xd8, 0x37, 0xd9, 0x7c, 0x9e, 0x77, 0x5e, 0x6e, 0xf1, 0x04, 0xb8, + 0x1e, 0xa1, 0xc2, 0x7b, 0x89, 0xe6, 0x24, 0xf1, 0xd3, 0x49, 0xbe, 0xf2, 0x74, 0x6e, 0x82, 0x95, + 0x41, 0xdf, 0xe6, 0xba, 0xa6, 0xfe, 0x8b, 0xae, 0x33, 0x10, 0xdc, 0x06, 0xa9, 0x1e, 0xed, 0xf2, + 0xb3, 0x5a, 0xab, 0xbe, 0xf9, 0x6c, 0x52, 0x80, 0xc8, 0x7c, 0x18, 0x55, 0xb9, 0x87, 0x29, 0x35, + 0xbb, 0x18, 0x85, 0x21, 0x0a, 0x02, 0xf0, 0x65, 0x22, 0x78, 0x01, 0xac, 0x75, 0x5c, 0x62, 0x3d, + 0x30, 0x0e, 0xb1, 0xd3, 0x3d, 0x64, 0xe2, 0x1e, 0xa1, 0x33, 0xdc, 0xb6, 0xcb, 0x4d, 0x70, 0x13, + 0xac, 0xb2, 0xa1, 0xe1, 0x78, 0x36, 0x1e, 0x8a, 0x46, 0xd0, 0x0a, 0x1b, 0x6a, 0xe1, 0x56, 0x71, + 0xc0, 0xd2, 0x1e, 0xb1, 0xb1, 0x0b, 0xef, 0x80, 0xd4, 0x03, 0x1c, 0x88, 0x61, 0xa9, 0x7e, 0xf2, + 0x6c, 0x52, 0xf8, 0xb0, 0xeb, 0xb0, 0xc3, 0x41, 0xa7, 0x64, 0x91, 0x5e, 0x99, 0x61, 0xcf, 0x0e, + 0x07, 0xce, 0x63, 0xf1, 0xa5, 0xeb, 0x74, 0x68, 0xb9, 0x13, 0x30, 0x4c, 0x4b, 0xbb, 0x78, 0x58, + 0x0d, 0x17, 0x28, 0x24, 0x09, 0x2f, 0xa0, 0x78, 0xb7, 0x93, 0x7c, 0xf4, 0xc4, 0xe6, 0xf2, 0x4f, + 0x49, 0x00, 0xe6, 0xf3, 0x0f, 0x3f, 0x02, 0xe7, 0x2b, 0xb5, 0x9a, 0xda, 0x6a, 0x19, 0xed, 0xfd, + 0xa6, 0x6a, 0xdc, 0x6d, 0xb4, 0x9a, 0x6a, 0x4d, 0xbb, 0xa5, 0xa9, 0x75, 0x39, 0x91, 0xdb, 0x1c, + 0x8d, 0x8b, 0x1b, 0xf3, 0xe0, 0xbb, 0x1e, 0xed, 0x63, 0xcb, 0x39, 0x70, 0xb0, 0x0d, 0xaf, 0x02, + 0x18, 0xc7, 0x35, 0xf4, 0xaa, 0x5e, 0xdf, 0x97, 0xa5, 0xdc, 0xfa, 0x68, 0x5c, 0x94, 0xe7, 0x90, + 0x06, 0xe9, 0x10, 0x3b, 0x80, 0x1f, 0x83, 0x6c, 0x3c, 0x5a, 0x6f, 0x7c, 0xba, 0x6f, 0x54, 0xea, + 0x75, 0xa4, 0xb6, 0x5a, 0x72, 0xf2, 0xc5, 0x34, 0xba, 0xe7, 0x06, 0x95, 0xe7, 0x6f, 0xf3, 0x46, + 0x1c, 0xa8, 0x7e, 0xa6, 0xa2, 0x7d, 0x9e, 0x29, 0x95, 0x3b, 0x3f, 0x1a, 0x17, 0xdf, 0x98, 0xa3, + 0xd4, 0x23, 0xec, 0x07, 0x3c, 0xd9, 0x4d, 0xb0, 0x15, 0xc7, 0x54, 0x1a, 0xfb, 0x86, 0x7e, 0x2b, + 0x4a, 0xa7, 0xb6, 0xe4, 0x74, 0x6e, 0x6b, 0x34, 0x2e, 0x66, 0xe7, 0xd0, 0x8a, 0x17, 0xe8, 0x07, + 0x95, 0xe8, 0x6d, 0xcf, 0xad, 0x7e, 0xf1, 0x7d, 0x3e, 0xf1, 0xe8, 0x87, 0x7c, 0xe2, 0xf2, 0x8f, + 0x29, 0x50, 0x3c, 0xed, 0xa6, 0x42, 0x0c, 0xde, 0xaf, 0xe9, 0x8d, 0x36, 0xaa, 0xd4, 0xda, 0x46, + 0x4d, 0xaf, 0xab, 0xc6, 0xae, 0xd6, 0x6a, 0xeb, 0x68, 0xdf, 0xd0, 0x9b, 0x2a, 0xaa, 0xb4, 0x35, + 0xbd, 0x71, 0x92, 0xb4, 0xe5, 0xd1, 0xb8, 0x78, 0xe5, 0x34, 0xee, 0xb8, 0xe0, 0xf7, 0xc0, 0xa5, + 0x85, 0xd2, 0x68, 0x0d, 0xad, 0x2d, 0x4b, 0xb9, 0xed, 0xd1, 0xb8, 0x78, 0xf1, 0x34, 0x7e, 0xcd, + 0x73, 0x18, 0xbc, 0x0f, 0xae, 0x2e, 0x44, 0xbc, 0xa7, 0xdd, 0x46, 0x95, 0xb6, 0x2a, 0x27, 0x73, + 0x57, 0x46, 0xe3, 0xe2, 0x7b, 0xa7, 0x71, 0xef, 0x39, 0x5d, 0xdf, 0x64, 0x78, 0x61, 0xfa, 0xdb, + 0x6a, 0x43, 0x6d, 0x69, 0x2d, 0x39, 0xb5, 0x18, 0xfd, 0x6d, 0xec, 0x61, 0xea, 0xd0, 0x5c, 0x3a, + 0x3c, 0xac, 0xea, 0xee, 0xe3, 0x3f, 0xf3, 0x89, 0x47, 0xc7, 0x79, 0xe9, 0xf1, 0x71, 0x5e, 0x7a, + 0x72, 0x9c, 0x97, 0xfe, 0x38, 0xce, 0x4b, 0x5f, 0x3f, 0xcd, 0x27, 0x9e, 0x3c, 0xcd, 0x27, 0x7e, + 0x7f, 0x9a, 0x4f, 0x7c, 0xfe, 0x6e, 0x6c, 0x8e, 0x6a, 0x84, 0xf6, 0xee, 0x45, 0xbf, 0x57, 0x76, + 0x79, 0x28, 0x7e, 0xb3, 0xf8, 0x3f, 0x56, 0x67, 0x99, 0xbf, 0x8a, 0x1f, 0xfc, 0x13, 0x00, 0x00, + 0xff, 0xff, 0x7a, 0x16, 0x8c, 0xd9, 0x84, 0x09, 0x00, 0x00, } func (this *AccessTypeParam) Equal(that interface{}) bool { @@ -617,6 +628,14 @@ func (this *AccessConfig) Equal(that interface{}) bool { if this.Address != that1.Address { return false } + if len(this.Addresses) != len(that1.Addresses) { + return false + } + for i := range this.Addresses { + if this.Addresses[i] != that1.Addresses[i] { + return false + } + } return true } @@ -860,6 +879,15 @@ func (m *AccessConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } if len(m.Address) > 0 { i -= len(m.Address) copy(dAtA[i:], m.Address) @@ -1199,6 +1227,12 @@ func (m *AccessConfig) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } return n } @@ -1484,6 +1518,38 @@ func (m *AccessConfig) Unmarshal(dAtA []byte) error { } m.Address = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/x/wasm/types/types_test.go b/x/wasm/types/types_test.go index 91b39419c5..be270ddeb3 100644 --- a/x/wasm/types/types_test.go +++ b/x/wasm/types/types_test.go @@ -374,78 +374,186 @@ func TestVerifyAddressLen(t *testing.T) { } func TestAccessConfigSubset(t *testing.T) { + // read + // <, <= is subset of + // !< is not subset of specs := map[string]struct { check AccessConfig superSet AccessConfig isSubSet bool }{ + // nobody "nobody <= nobody": { superSet: AccessConfig{Permission: AccessTypeNobody}, check: AccessConfig{Permission: AccessTypeNobody}, isSubSet: true, }, - "only > nobody": { + "only !< nobody": { superSet: AccessConfig{Permission: AccessTypeNobody}, check: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "foobar"}, isSubSet: false, }, - "everybody > nobody": { + "anyOf !< nobody": { + superSet: AccessConfig{Permission: AccessTypeNobody}, + check: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"foobar"}}, + isSubSet: false, + }, + "everybody !< nobody ": { superSet: AccessConfig{Permission: AccessTypeNobody}, check: AccessConfig{Permission: AccessTypeEverybody}, isSubSet: false, }, - "unspecified > nobody": { + "unspecified !< nobody": { superSet: AccessConfig{Permission: AccessTypeNobody}, check: AccessConfig{Permission: AccessTypeUnspecified}, isSubSet: false, }, - "nobody <= everybody": { + // only + "nobody < only": { + superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + check: AccessConfig{Permission: AccessTypeNobody}, + isSubSet: true, + }, + "only <= only(same)": { + superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + check: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + isSubSet: true, + }, + "only !< only(other)": { + superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + check: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "other"}, + isSubSet: false, + }, + "anyOf(same) <= only": { + superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + check: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner"}}, + isSubSet: true, + }, + "anyOf(other) !< only": { + superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + check: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"foobar"}}, + isSubSet: false, + }, + "anyOf(same, other) !< only": { + superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + check: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner", "foobar"}}, + isSubSet: false, + }, + "everybody !< only": { + superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + check: AccessConfig{Permission: AccessTypeEverybody}, + isSubSet: false, + }, + "unspecified !<= only": { + superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + check: AccessConfig{Permission: AccessTypeUnspecified}, + isSubSet: false, + }, + + // any of + "nobody < anyOf": { + superSet: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner"}}, + check: AccessConfig{Permission: AccessTypeNobody}, + isSubSet: true, + }, + "only(same) < anyOf(same)": { + superSet: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner"}}, + check: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + isSubSet: true, + }, + "only(same) < anyOf(same, other)": { + superSet: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner", "other"}}, + check: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + isSubSet: true, + }, + "only(other) !< anyOf": { + superSet: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner"}}, + check: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "other"}, + isSubSet: false, + }, + "anyOf < anyOf": { + superSet: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner"}}, + check: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner"}}, + isSubSet: true, + }, + "anyOf(multiple) < anyOf(multiple)": { + superSet: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner", "other"}}, + check: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner", "other"}}, + isSubSet: true, + }, + "anyOf(multiple, other) !< anyOf(multiple)": { + superSet: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner", "other", "foo"}}, + check: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner", "other", "bar"}}, + isSubSet: false, + }, + "anyOf(multiple) !< anyOf": { + superSet: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner"}}, + check: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner", "other"}}, + isSubSet: false, + }, + "everybody !< anyOf": { + superSet: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner"}}, + check: AccessConfig{Permission: AccessTypeEverybody}, + isSubSet: false, + }, + "unspecified !< anyOf ": { + superSet: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"owner"}}, + check: AccessConfig{Permission: AccessTypeUnspecified}, + isSubSet: false, + }, + // everybody + "nobody < everybody": { superSet: AccessConfig{Permission: AccessTypeEverybody}, check: AccessConfig{Permission: AccessTypeNobody}, isSubSet: true, }, - "only <= everybody": { + "only < everybody": { superSet: AccessConfig{Permission: AccessTypeEverybody}, check: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "foobar"}, isSubSet: true, }, + "anyOf < everybody": { + superSet: AccessConfig{Permission: AccessTypeEverybody}, + check: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"foobar"}}, + isSubSet: true, + }, "everybody <= everybody": { superSet: AccessConfig{Permission: AccessTypeEverybody}, check: AccessConfig{Permission: AccessTypeEverybody}, isSubSet: true, }, - "unspecified > everybody": { + "unspecified !< everybody ": { superSet: AccessConfig{Permission: AccessTypeEverybody}, check: AccessConfig{Permission: AccessTypeUnspecified}, isSubSet: false, }, - "nobody <= only": { - superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + // unspecified + "nobody !< unspecified": { + superSet: AccessConfig{Permission: AccessTypeUnspecified}, check: AccessConfig{Permission: AccessTypeNobody}, - isSubSet: true, + isSubSet: false, }, - "only <= only(same)": { - superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, - check: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, - isSubSet: true, + "only !< unspecified": { + superSet: AccessConfig{Permission: AccessTypeUnspecified}, + check: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "foobar"}, + isSubSet: false, }, - "only > only(other)": { - superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, - check: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "other"}, + "anyOf !< unspecified": { + superSet: AccessConfig{Permission: AccessTypeUnspecified}, + check: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{"foobar"}}, isSubSet: false, }, - "everybody > only": { - superSet: AccessConfig{Permission: AccessTypeOnlyAddress, Address: "owner"}, + "everybody !< unspecified": { + superSet: AccessConfig{Permission: AccessTypeUnspecified}, check: AccessConfig{Permission: AccessTypeEverybody}, isSubSet: false, }, - "nobody > unspecified": { + "unspecified !< unspecified ": { superSet: AccessConfig{Permission: AccessTypeUnspecified}, - check: AccessConfig{Permission: AccessTypeNobody}, + check: AccessConfig{Permission: AccessTypeUnspecified}, isSubSet: false, }, } - for name, spec := range specs { t.Run(name, func(t *testing.T) { subset := spec.check.IsSubset(spec.superSet) @@ -460,64 +568,134 @@ func TestAccessTypeSubset(t *testing.T) { superSet AccessType isSubSet bool }{ + // nobody "nobody <= nobody": { superSet: AccessTypeNobody, check: AccessTypeNobody, isSubSet: true, }, - "only > nobody": { + "only !< nobody": { superSet: AccessTypeNobody, check: AccessTypeOnlyAddress, isSubSet: false, }, - "everybody > nobody": { + "any !< nobody": { + superSet: AccessTypeNobody, + check: AccessTypeAnyOfAddresses, + isSubSet: false, + }, + "everybody !< nobody": { superSet: AccessTypeNobody, check: AccessTypeEverybody, isSubSet: false, }, - "unspecified > nobody": { + "unspecified !< nobody": { superSet: AccessTypeNobody, check: AccessTypeUnspecified, isSubSet: false, }, - "nobody <= everybody": { + // only + "nobody < only": { + superSet: AccessTypeOnlyAddress, + check: AccessTypeNobody, + isSubSet: true, + }, + "only <= only": { + superSet: AccessTypeOnlyAddress, + check: AccessTypeOnlyAddress, + isSubSet: true, + }, + "anyOf !< only": { + superSet: AccessTypeOnlyAddress, + check: AccessTypeAnyOfAddresses, + isSubSet: true, + }, + "everybody !< only": { + superSet: AccessTypeOnlyAddress, + check: AccessTypeEverybody, + isSubSet: false, + }, + "unspecified !< only": { + superSet: AccessTypeOnlyAddress, + check: AccessTypeUnspecified, + isSubSet: false, + }, + // any of + "nobody < anyOf": { + superSet: AccessTypeAnyOfAddresses, + check: AccessTypeNobody, + isSubSet: true, + }, + "only <= anyOf": { + superSet: AccessTypeAnyOfAddresses, + check: AccessTypeOnlyAddress, + isSubSet: true, + }, + "anyOf <= anyOf": { + superSet: AccessTypeAnyOfAddresses, + check: AccessTypeAnyOfAddresses, + isSubSet: true, + }, + "everybody !< anyOf": { + superSet: AccessTypeAnyOfAddresses, + check: AccessTypeEverybody, + isSubSet: false, + }, + "unspecified !< anyOf": { + superSet: AccessTypeAnyOfAddresses, + check: AccessTypeUnspecified, + isSubSet: false, + }, + // everybody + "nobody < everybody": { superSet: AccessTypeEverybody, check: AccessTypeNobody, isSubSet: true, }, - "only <= everybody": { + "only < everybody": { superSet: AccessTypeEverybody, check: AccessTypeOnlyAddress, isSubSet: true, }, + "anyOf < everybody": { + superSet: AccessTypeEverybody, + check: AccessTypeAnyOfAddresses, + isSubSet: true, + }, "everybody <= everybody": { superSet: AccessTypeEverybody, check: AccessTypeEverybody, isSubSet: true, }, - "unspecified > everybody": { + "unspecified !< everybody": { superSet: AccessTypeEverybody, check: AccessTypeUnspecified, isSubSet: false, }, - "nobody <= only": { - superSet: AccessTypeOnlyAddress, + // unspecified + "nobody !< unspecified": { + superSet: AccessTypeUnspecified, check: AccessTypeNobody, - isSubSet: true, + isSubSet: false, }, - "only <= only(same)": { - superSet: AccessTypeOnlyAddress, + "only !< unspecified": { + superSet: AccessTypeUnspecified, check: AccessTypeOnlyAddress, - isSubSet: true, + isSubSet: false, }, - "everybody > only": { - superSet: AccessTypeOnlyAddress, + "anyOf !< unspecified": { + superSet: AccessTypeUnspecified, + check: AccessTypeAnyOfAddresses, + isSubSet: false, + }, + "everybody !< unspecified": { + superSet: AccessTypeUnspecified, check: AccessTypeEverybody, isSubSet: false, }, - "nobody > unspecified": { + "unspecified !< unspecified": { superSet: AccessTypeUnspecified, - check: AccessTypeNobody, + check: AccessTypeUnspecified, isSubSet: false, }, } From 743c1c34e04ad3291c82a78f3c37da231aeeff1f Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 7 Sep 2022 11:59:29 +0200 Subject: [PATCH 52/94] Prevent empty addresses list --- x/wasm/types/params.go | 7 +++++-- x/wasm/types/params_test.go | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/x/wasm/types/params.go b/x/wasm/types/params.go index 1fbf3fe605..5680cc9f46 100644 --- a/x/wasm/types/params.go +++ b/x/wasm/types/params.go @@ -44,7 +44,7 @@ func (a AccessType) With(addrs ...sdk.AccAddress) AccessConfig { bech32Addrs[i] = v.String() } if err := assertValidAddresses(bech32Addrs); err != nil { - panic(err) + panic(sdkerrors.Wrap(err, "addresses")) } return AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: bech32Addrs} } @@ -181,12 +181,15 @@ func (a AccessConfig) ValidateBasic() error { if a.Address != "" { return ErrInvalid.Wrap("address field set") } - return assertValidAddresses(a.Addresses) + return sdkerrors.Wrap(assertValidAddresses(a.Addresses), "addresses") } return sdkerrors.Wrapf(ErrInvalid, "unknown type: %q", a.Permission) } func assertValidAddresses(addrs []string) error { + if len(addrs) == 0 { + return ErrEmpty + } idx := make(map[string]struct{}, len(addrs)) for _, a := range addrs { if _, err := sdk.AccAddressFromBech32(a); err != nil { diff --git a/x/wasm/types/params_test.go b/x/wasm/types/params_test.go index d4abcfd7cc..a05872243d 100644 --- a/x/wasm/types/params_test.go +++ b/x/wasm/types/params_test.go @@ -110,6 +110,20 @@ func TestValidateParams(t *testing.T) { }, expErr: true, }, + "reject empty addresses in any of addresses": { + src: Params{ + CodeUploadAccess: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{}}, + InstantiateDefaultPermission: AccessTypeAnyOfAddresses, + }, + expErr: true, + }, + "reject addresses not set in any of addresses": { + src: Params{ + CodeUploadAccess: AccessConfig{Permission: AccessTypeAnyOfAddresses}, + InstantiateDefaultPermission: AccessTypeAnyOfAddresses, + }, + expErr: true, + }, "reject invalid address in any of addresses": { src: Params{ CodeUploadAccess: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{invalidAddress}}, From 089076d065586f36250482cbff4a4696c2edea6a Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 7 Sep 2022 12:02:53 +0200 Subject: [PATCH 53/94] Formatting only --- x/wasm/keeper/proposal_handler.go | 1 - 1 file changed, 1 deletion(-) diff --git a/x/wasm/keeper/proposal_handler.go b/x/wasm/keeper/proposal_handler.go index f4cd8a4e1a..905b073d5e 100644 --- a/x/wasm/keeper/proposal_handler.go +++ b/x/wasm/keeper/proposal_handler.go @@ -74,7 +74,6 @@ func handleStoreCodeProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types return nil } return k.PinCode(ctx, codeID) - } func handleInstantiateProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.InstantiateContractProposal) error { From 2567927d097f6a47c7e23aef4c8ce97a300134d2 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 7 Sep 2022 15:46:27 +0200 Subject: [PATCH 54/94] Parse any of address in CLI; more tests --- x/wasm/client/cli/genesis_msg.go | 1 + x/wasm/client/cli/gov_tx.go | 30 +-- x/wasm/client/cli/gov_tx_test.go | 85 ++++++++ x/wasm/client/cli/tx.go | 109 ++++++---- x/wasm/client/cli/tx_test.go | 59 ++++++ x/wasm/keeper/authz_policy_test.go | 311 +++++++++++++++++++++++++++++ x/wasm/types/params.go | 3 + x/wasm/types/params_test.go | 80 ++++++++ 8 files changed, 623 insertions(+), 55 deletions(-) create mode 100644 x/wasm/client/cli/gov_tx_test.go create mode 100644 x/wasm/client/cli/tx_test.go create mode 100644 x/wasm/keeper/authz_policy_test.go diff --git a/x/wasm/client/cli/genesis_msg.go b/x/wasm/client/cli/genesis_msg.go index f4ba94fbd2..7ed5a7f290 100644 --- a/x/wasm/client/cli/genesis_msg.go +++ b/x/wasm/client/cli/genesis_msg.go @@ -73,6 +73,7 @@ func GenesisStoreCodeCmd(defaultNodeHome string, genesisMutator GenesisMutator) cmd.Flags().String(flagInstantiateByEverybody, "", "Everybody can instantiate a contract from the code, optional") cmd.Flags().String(flagInstantiateNobody, "", "Nobody except the governance process can instantiate a contract from the code, optional") cmd.Flags().String(flagInstantiateByAddress, "", "Only this address can instantiate a contract instance from the code, optional") + cmd.Flags().StringSlice(flagInstantiateByAnyOfAddress, []string{}, "Any of the addresses can instantiate a contract from the code, optional") cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") diff --git a/x/wasm/client/cli/gov_tx.go b/x/wasm/client/cli/gov_tx.go index b619dbb8b1..300d0017a7 100644 --- a/x/wasm/client/cli/gov_tx.go +++ b/x/wasm/client/cli/gov_tx.go @@ -597,27 +597,33 @@ func ProposalUnpinCodesCmd() *cobra.Command { return cmd } -func parseAccessConfig(config string) (types.AccessConfig, error) { - switch config { +func parseAccessConfig(raw string) (types.AccessConfig, error) { + switch raw { case "nobody": return types.AllowNobody, nil case "everybody": return types.AllowEverybody, nil default: - address, err := sdk.AccAddressFromBech32(config) - if err != nil { - return types.AccessConfig{}, fmt.Errorf("unable to parse address %s", config) + parts := strings.Split(raw, ",") + addrs := make([]sdk.AccAddress, len(parts)) + for i, v := range parts { + addr, err := sdk.AccAddressFromBech32(v) + if err != nil { + return types.AccessConfig{}, fmt.Errorf("unable to parse address %q: %s", v, err) + } + addrs[i] = addr } - return types.AccessTypeOnlyAddress.With(address), nil + cfg := types.AccessTypeAnyOfAddresses.With(addrs...) + return cfg, cfg.ValidateBasic() } } func parseAccessConfigUpdates(args []string) ([]types.AccessConfigUpdate, error) { updates := make([]types.AccessConfigUpdate, len(args)) for i, c := range args { - // format: code_id,access_config - // access_config: nobody|everybody|address - parts := strings.Split(c, ",") + // format: code_id:access_config + // access_config: nobody|everybody|address(es) + parts := strings.Split(c, ":") if len(parts) != 2 { return nil, fmt.Errorf("invalid format") } @@ -642,15 +648,15 @@ func parseAccessConfigUpdates(args []string) ([]types.AccessConfigUpdate, error) func ProposalUpdateInstantiateConfigCmd() *cobra.Command { bech32Prefix := sdk.GetConfig().GetBech32AccountAddrPrefix() cmd := &cobra.Command{ - Use: "update-instantiate-config [code-id,permission]...", + Use: "update-instantiate-config [code-id:permission]...", Short: "Submit an update instantiate config proposal.", Args: cobra.MinimumNArgs(1), Long: strings.TrimSpace( fmt.Sprintf(`Submit an update instantiate config proposal for multiple code ids. Example: -$ %s tx gov submit-proposal update-instantiate-config 1,nobody 2,everybody 3,%s1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm -`, version.AppName, bech32Prefix)), +$ %s tx gov submit-proposal update-instantiate-config 1:nobody 2:everybody 3:%s1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm,%s1vx8knpllrj7n963p9ttd80w47kpacrhuts497x +`, version.AppName, bech32Prefix, bech32Prefix)), RunE: func(cmd *cobra.Command, args []string) error { clientCtx, err := client.GetClientTxContext(cmd) if err != nil { diff --git a/x/wasm/client/cli/gov_tx_test.go b/x/wasm/client/cli/gov_tx_test.go new file mode 100644 index 0000000000..b4b0274189 --- /dev/null +++ b/x/wasm/client/cli/gov_tx_test.go @@ -0,0 +1,85 @@ +package cli + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/CosmWasm/wasmd/x/wasm/types" +) + +func TestParseAccessConfigUpdates(t *testing.T) { + specs := map[string]struct { + src []string + exp []types.AccessConfigUpdate + expErr bool + }{ + "nobody": { + src: []string{"1:nobody"}, + exp: []types.AccessConfigUpdate{{ + CodeID: 1, + InstantiatePermission: types.AccessConfig{Permission: types.AccessTypeNobody}, + }}, + }, + "everybody": { + src: []string{"1:everybody"}, + exp: []types.AccessConfigUpdate{{ + CodeID: 1, + InstantiatePermission: types.AccessConfig{Permission: types.AccessTypeEverybody}, + }}, + }, + "any of addresses - single": { + src: []string{"1:cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x"}, + exp: []types.AccessConfigUpdate{ + { + CodeID: 1, + InstantiatePermission: types.AccessConfig{ + Permission: types.AccessTypeAnyOfAddresses, + Addresses: []string{"cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x"}, + }, + }, + }, + }, + "any of addresses - multiple": { + src: []string{"1:cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x,cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"}, + exp: []types.AccessConfigUpdate{ + { + CodeID: 1, + InstantiatePermission: types.AccessConfig{ + Permission: types.AccessTypeAnyOfAddresses, + Addresses: []string{"cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x", "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"}, + }, + }, + }, + }, + "multiple code ids with different permissions": { + src: []string{"1:cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x,cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", "2:nobody"}, + exp: []types.AccessConfigUpdate{ + { + CodeID: 1, + InstantiatePermission: types.AccessConfig{ + Permission: types.AccessTypeAnyOfAddresses, + Addresses: []string{"cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x", "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"}, + }, + }, { + CodeID: 2, + InstantiatePermission: types.AccessConfig{ + Permission: types.AccessTypeNobody, + }, + }, + }, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + got, gotErr := parseAccessConfigUpdates(spec.src) + if spec.expErr { + require.Error(t, gotErr) + return + } + require.NoError(t, gotErr) + assert.Equal(t, spec.exp, got) + }) + } +} diff --git a/x/wasm/client/cli/tx.go b/x/wasm/client/cli/tx.go index 28f0a1e2a2..c4dfa473f4 100644 --- a/x/wasm/client/cli/tx.go +++ b/x/wasm/client/cli/tx.go @@ -19,15 +19,16 @@ import ( ) const ( - flagAmount = "amount" - flagLabel = "label" - flagAdmin = "admin" - flagNoAdmin = "no-admin" - flagRunAs = "run-as" - flagInstantiateByEverybody = "instantiate-everybody" - flagInstantiateNobody = "instantiate-nobody" - flagInstantiateByAddress = "instantiate-only-address" - flagUnpinCode = "unpin-code" + flagAmount = "amount" + flagLabel = "label" + flagAdmin = "admin" + flagNoAdmin = "no-admin" + flagRunAs = "run-as" + flagInstantiateByEverybody = "instantiate-everybody" + flagInstantiateNobody = "instantiate-nobody" + flagInstantiateByAddress = "instantiate-only-address" + flagInstantiateByAnyOfAddress = "instantiate-anyof-addresses" + flagUnpinCode = "unpin-code" ) // GetTxCmd returns the transaction commands for this module @@ -75,7 +76,8 @@ func StoreCodeCmd() *cobra.Command { cmd.Flags().String(flagInstantiateByEverybody, "", "Everybody can instantiate a contract from the code, optional") cmd.Flags().String(flagInstantiateNobody, "", "Nobody except the governance process can instantiate a contract from the code, optional") - cmd.Flags().String(flagInstantiateByAddress, "", "Only this address can instantiate a contract instance from the code, optional") + cmd.Flags().String(flagInstantiateByAddress, "", "Deprecated: Only this address can instantiate a contract from the code, optional") + cmd.Flags().StringSlice(flagInstantiateByAnyOfAddress, []string{}, "Any of the addresses can instantiate a contract from the code, optional") flags.AddTxFlagsToCmd(cmd) return cmd } @@ -97,55 +99,76 @@ func parseStoreCodeArgs(file string, sender sdk.AccAddress, flags *flag.FlagSet) return types.MsgStoreCode{}, fmt.Errorf("invalid input file. Use wasm binary or gzip") } - var perm *types.AccessConfig + perm, err := parseAccessConfigFlags(flags) + if err != nil { + return types.MsgStoreCode{}, err + } + + msg := types.MsgStoreCode{ + Sender: sender.String(), + WASMByteCode: wasm, + InstantiatePermission: perm, + } + return msg, nil +} + +func parseAccessConfigFlags(flags *flag.FlagSet) (*types.AccessConfig, error) { + addrs, err := flags.GetStringSlice(flagInstantiateByAnyOfAddress) + if err != nil { + return nil, fmt.Errorf("flag any of: %s", err) + } + if len(addrs) != 0 { + acceptedAddrs := make([]sdk.AccAddress, len(addrs)) + for i, v := range addrs { + acceptedAddrs[i], err = sdk.AccAddressFromBech32(v) + if err != nil { + return nil, fmt.Errorf("parse %q: %w", v, err) + } + } + x := types.AccessTypeAnyOfAddresses.With(acceptedAddrs...) + return &x, nil + } + onlyAddrStr, err := flags.GetString(flagInstantiateByAddress) if err != nil { - return types.MsgStoreCode{}, fmt.Errorf("instantiate by address: %s", err) + return nil, fmt.Errorf("instantiate by address: %s", err) } if onlyAddrStr != "" { allowedAddr, err := sdk.AccAddressFromBech32(onlyAddrStr) if err != nil { - return types.MsgStoreCode{}, sdkerrors.Wrap(err, flagInstantiateByAddress) + return nil, sdkerrors.Wrap(err, flagInstantiateByAddress) } x := types.AccessTypeOnlyAddress.With(allowedAddr) - perm = &x - } else { - everybodyStr, err := flags.GetString(flagInstantiateByEverybody) + return &x, nil + } + everybodyStr, err := flags.GetString(flagInstantiateByEverybody) + if err != nil { + return nil, fmt.Errorf("instantiate by everybody: %s", err) + } + if everybodyStr != "" { + ok, err := strconv.ParseBool(everybodyStr) if err != nil { - return types.MsgStoreCode{}, fmt.Errorf("instantiate by everybody: %s", err) + return nil, fmt.Errorf("boolean value expected for instantiate by everybody: %s", err) } - if everybodyStr != "" { - ok, err := strconv.ParseBool(everybodyStr) - if err != nil { - return types.MsgStoreCode{}, fmt.Errorf("boolean value expected for instantiate by everybody: %s", err) - } - if ok { - perm = &types.AllowEverybody - } + if ok { + return &types.AllowEverybody, nil } + } - nobodyStr, err := flags.GetString(flagInstantiateNobody) + nobodyStr, err := flags.GetString(flagInstantiateNobody) + if err != nil { + return nil, fmt.Errorf("instantiate by nobody: %s", err) + } + if nobodyStr != "" { + ok, err := strconv.ParseBool(nobodyStr) if err != nil { - return types.MsgStoreCode{}, fmt.Errorf("instantiate by nobody: %s", err) + return nil, fmt.Errorf("boolean value expected for instantiate by nobody: %s", err) } - if nobodyStr != "" { - ok, err := strconv.ParseBool(nobodyStr) - if err != nil { - return types.MsgStoreCode{}, fmt.Errorf("boolean value expected for instantiate by nobody: %s", err) - } - if ok { - perm = &types.AllowNobody - } + if ok { + return &types.AllowNobody, nil } - } - - msg := types.MsgStoreCode{ - Sender: sender.String(), - WASMByteCode: wasm, - InstantiatePermission: perm, - } - return msg, nil + return nil, nil } // InstantiateContractCmd will instantiate a contract from previously uploaded code. diff --git a/x/wasm/client/cli/tx_test.go b/x/wasm/client/cli/tx_test.go new file mode 100644 index 0000000000..8fc0cc9def --- /dev/null +++ b/x/wasm/client/cli/tx_test.go @@ -0,0 +1,59 @@ +package cli + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/CosmWasm/wasmd/x/wasm/types" +) + +func TestParseAccessConfigFlags(t *testing.T) { + specs := map[string]struct { + args []string + expCfg *types.AccessConfig + expErr bool + }{ + "nobody": { + args: []string{"--instantiate-nobody=true"}, + expCfg: &types.AccessConfig{Permission: types.AccessTypeNobody}, + }, + "everybody": { + args: []string{"--instantiate-everybody=true"}, + expCfg: &types.AccessConfig{Permission: types.AccessTypeEverybody}, + }, + "only address": { + args: []string{"--instantiate-only-address=cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x"}, + expCfg: &types.AccessConfig{Permission: types.AccessTypeOnlyAddress, Address: "cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x"}, + }, + "only address - invalid": { + args: []string{"--instantiate-only-address=foo"}, + expErr: true, + }, + "any of address": { + args: []string{"--instantiate-anyof-addresses=cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x,cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"}, + expCfg: &types.AccessConfig{Permission: types.AccessTypeAnyOfAddresses, Addresses: []string{"cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x", "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr"}}, + }, + "any of address - invalid": { + args: []string{"--instantiate-anyof-addresses=cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x,foo"}, + expErr: true, + }, + "not set": { + args: []string{}, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + flags := StoreCodeCmd().Flags() + require.NoError(t, flags.Parse(spec.args)) + gotCfg, gotErr := parseAccessConfigFlags(flags) + if spec.expErr { + require.Error(t, gotErr) + return + } + require.NoError(t, gotErr) + assert.Equal(t, spec.expCfg, gotCfg) + }) + } +} diff --git a/x/wasm/keeper/authz_policy_test.go b/x/wasm/keeper/authz_policy_test.go new file mode 100644 index 0000000000..acc9cb346c --- /dev/null +++ b/x/wasm/keeper/authz_policy_test.go @@ -0,0 +1,311 @@ +package keeper + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/assert" + + "github.com/CosmWasm/wasmd/x/wasm/types" +) + +func TestDefaultAuthzPolicyCanCreateCode(t *testing.T) { + myActorAddress := RandomAccountAddress(t) + otherAddress := RandomAccountAddress(t) + specs := map[string]struct { + config types.AccessConfig + actor sdk.AccAddress + exp bool + panics bool + }{ + "nobody": { + config: types.AllowNobody, + exp: false, + }, + "everybody": { + config: types.AllowEverybody, + exp: true, + }, + "only address - same": { + config: types.AccessTypeOnlyAddress.With(myActorAddress), + exp: true, + }, + "only address - different": { + config: types.AccessTypeOnlyAddress.With(otherAddress), + exp: false, + }, + "any address - included": { + config: types.AccessTypeAnyOfAddresses.With(otherAddress, myActorAddress), + exp: true, + }, + "any address - not included": { + config: types.AccessTypeAnyOfAddresses.With(otherAddress), + exp: false, + }, + "undefined config - panics": { + config: types.AccessConfig{}, + panics: true, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + policy := DefaultAuthorizationPolicy{} + if !spec.panics { + got := policy.CanCreateCode(spec.config, myActorAddress) + assert.Equal(t, spec.exp, got) + return + } + assert.Panics(t, func() { + policy.CanCreateCode(spec.config, myActorAddress) + }) + }) + } +} + +func TestDefaultAuthzPolicyCanInstantiateContract(t *testing.T) { + myActorAddress := RandomAccountAddress(t) + otherAddress := RandomAccountAddress(t) + specs := map[string]struct { + config types.AccessConfig + actor sdk.AccAddress + exp bool + panics bool + }{ + "nobody": { + config: types.AllowNobody, + exp: false, + }, + "everybody": { + config: types.AllowEverybody, + exp: true, + }, + "only address - same": { + config: types.AccessTypeOnlyAddress.With(myActorAddress), + exp: true, + }, + "only address - different": { + config: types.AccessTypeOnlyAddress.With(otherAddress), + exp: false, + }, + "any address - included": { + config: types.AccessTypeAnyOfAddresses.With(otherAddress, myActorAddress), + exp: true, + }, + "any address - not included": { + config: types.AccessTypeAnyOfAddresses.With(otherAddress), + exp: false, + }, + "undefined config - panics": { + config: types.AccessConfig{}, + panics: true, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + policy := DefaultAuthorizationPolicy{} + if !spec.panics { + got := policy.CanInstantiateContract(spec.config, myActorAddress) + assert.Equal(t, spec.exp, got) + return + } + assert.Panics(t, func() { + policy.CanInstantiateContract(spec.config, myActorAddress) + }) + }) + } +} + +func TestDefaultAuthzPolicyCanModifyContract(t *testing.T) { + myActorAddress := RandomAccountAddress(t) + otherAddress := RandomAccountAddress(t) + + specs := map[string]struct { + admin sdk.AccAddress + exp bool + }{ + "same as actor": { + admin: myActorAddress, + exp: true, + }, + "different admin": { + admin: otherAddress, + exp: false, + }, + "no admin": { + exp: false, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + policy := DefaultAuthorizationPolicy{} + got := policy.CanModifyContract(spec.admin, myActorAddress) + assert.Equal(t, spec.exp, got) + }) + } +} + +func TestDefaultAuthzPolicyCanModifyCodeAccessConfig(t *testing.T) { + myActorAddress := RandomAccountAddress(t) + otherAddress := RandomAccountAddress(t) + + specs := map[string]struct { + admin sdk.AccAddress + subset bool + exp bool + }{ + "same as actor - subset": { + admin: myActorAddress, + subset: true, + exp: true, + }, + "same as actor - not subset": { + admin: myActorAddress, + subset: false, + exp: false, + }, + "different admin": { + admin: otherAddress, + exp: false, + }, + "no admin": { + exp: false, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + policy := DefaultAuthorizationPolicy{} + got := policy.CanModifyCodeAccessConfig(spec.admin, myActorAddress, spec.subset) + assert.Equal(t, spec.exp, got) + }) + } +} + +func TestGovAuthzPolicyCanCreateCode(t *testing.T) { + myActorAddress := RandomAccountAddress(t) + otherAddress := RandomAccountAddress(t) + specs := map[string]struct { + config types.AccessConfig + actor sdk.AccAddress + }{ + "nobody": { + config: types.AllowNobody, + }, + "everybody": { + config: types.AllowEverybody, + }, + "only address - same": { + config: types.AccessTypeOnlyAddress.With(myActorAddress), + }, + "only address - different": { + config: types.AccessTypeOnlyAddress.With(otherAddress), + }, + "any address - included": { + config: types.AccessTypeAnyOfAddresses.With(otherAddress, myActorAddress), + }, + "any address - not included": { + config: types.AccessTypeAnyOfAddresses.With(otherAddress), + }, + "undefined config - panics": { + config: types.AccessConfig{}, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + policy := GovAuthorizationPolicy{} + got := policy.CanCreateCode(spec.config, myActorAddress) + assert.True(t, got) + }) + } +} + +func TestGovAuthzPolicyCanInstantiateContract(t *testing.T) { + myActorAddress := RandomAccountAddress(t) + otherAddress := RandomAccountAddress(t) + specs := map[string]struct { + config types.AccessConfig + actor sdk.AccAddress + }{ + "nobody": { + config: types.AllowNobody, + }, + "everybody": { + config: types.AllowEverybody, + }, + "only address - same": { + config: types.AccessTypeOnlyAddress.With(myActorAddress), + }, + "only address - different": { + config: types.AccessTypeOnlyAddress.With(otherAddress), + }, + "any address - included": { + config: types.AccessTypeAnyOfAddresses.With(otherAddress, myActorAddress), + }, + "any address - not included": { + config: types.AccessTypeAnyOfAddresses.With(otherAddress), + }, + "undefined config - panics": { + config: types.AccessConfig{}, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + policy := GovAuthorizationPolicy{} + got := policy.CanInstantiateContract(spec.config, myActorAddress) + assert.True(t, got) + }) + } +} + +func TestGovAuthzPolicyCanModifyContract(t *testing.T) { + myActorAddress := RandomAccountAddress(t) + otherAddress := RandomAccountAddress(t) + + specs := map[string]struct { + admin sdk.AccAddress + }{ + "same as actor": { + admin: myActorAddress, + }, + "different admin": { + admin: otherAddress, + }, + "no admin": {}, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + policy := GovAuthorizationPolicy{} + got := policy.CanModifyContract(spec.admin, myActorAddress) + assert.True(t, got) + }) + } +} + +func TestGovAuthzPolicyCanModifyCodeAccessConfig(t *testing.T) { + myActorAddress := RandomAccountAddress(t) + otherAddress := RandomAccountAddress(t) + + specs := map[string]struct { + admin sdk.AccAddress + subset bool + }{ + "same as actor - subset": { + admin: myActorAddress, + subset: true, + }, + "same as actor - not subset": { + admin: myActorAddress, + subset: false, + }, + "different admin": { + admin: otherAddress, + }, + "no admin": {}, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + policy := GovAuthorizationPolicy{} + got := policy.CanModifyCodeAccessConfig(spec.admin, myActorAddress, spec.subset) + assert.True(t, got) + }) + } +} diff --git a/x/wasm/types/params.go b/x/wasm/types/params.go index 5680cc9f46..0ee7dcb619 100644 --- a/x/wasm/types/params.go +++ b/x/wasm/types/params.go @@ -162,6 +162,7 @@ func validateAccessType(i interface{}) error { return sdkerrors.Wrapf(ErrInvalid, "unknown type: %q", a) } +// ValidateBasic performs basic validation func (a AccessConfig) ValidateBasic() error { switch a.Permission { case AccessTypeUnspecified: @@ -203,6 +204,8 @@ func assertValidAddresses(addrs []string) error { return nil } +// Allowed returns if permission includes the actor. +// Actor address must be valid and not nil func (a AccessConfig) Allowed(actor sdk.AccAddress) bool { switch a.Permission { case AccessTypeNobody: diff --git a/x/wasm/types/params_test.go b/x/wasm/types/params_test.go index a05872243d..77ac8b7424 100644 --- a/x/wasm/types/params_test.go +++ b/x/wasm/types/params_test.go @@ -224,3 +224,83 @@ func TestParamsUnmarshalJson(t *testing.T) { }) } } + +func TestAccessTypeWith(t *testing.T) { + myAddress := sdk.AccAddress(randBytes(SDKAddrLen)) + myOtherAddress := sdk.AccAddress(randBytes(SDKAddrLen)) + specs := map[string]struct { + src AccessType + addrs []sdk.AccAddress + exp AccessConfig + expPanic bool + }{ + "nobody": { + src: AccessTypeNobody, + exp: AccessConfig{Permission: AccessTypeNobody}, + }, + "nobody with address": { + src: AccessTypeNobody, + addrs: []sdk.AccAddress{myAddress}, + exp: AccessConfig{Permission: AccessTypeNobody}, + }, + "everybody": { + src: AccessTypeEverybody, + exp: AccessConfig{Permission: AccessTypeEverybody}, + }, + "everybody with address": { + src: AccessTypeEverybody, + addrs: []sdk.AccAddress{myAddress}, + exp: AccessConfig{Permission: AccessTypeEverybody}, + }, + "only address without address": { + src: AccessTypeOnlyAddress, + expPanic: true, + }, + "only address with address": { + src: AccessTypeOnlyAddress, + addrs: []sdk.AccAddress{myAddress}, + exp: AccessConfig{Permission: AccessTypeOnlyAddress, Address: myAddress.String()}, + }, + "only address with invalid address": { + src: AccessTypeOnlyAddress, + addrs: []sdk.AccAddress{nil}, + expPanic: true, + }, + "any of address without address": { + src: AccessTypeAnyOfAddresses, + expPanic: true, + }, + "any of address with single address": { + src: AccessTypeAnyOfAddresses, + addrs: []sdk.AccAddress{myAddress}, + exp: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{myAddress.String()}}, + }, + "any of address with multiple addresses": { + src: AccessTypeAnyOfAddresses, + addrs: []sdk.AccAddress{myAddress, myOtherAddress}, + exp: AccessConfig{Permission: AccessTypeAnyOfAddresses, Addresses: []string{myAddress.String(), myOtherAddress.String()}}, + }, + "any of address with duplicate addresses": { + src: AccessTypeAnyOfAddresses, + addrs: []sdk.AccAddress{myAddress, myAddress}, + expPanic: true, + }, + "any of address with invalid address": { + src: AccessTypeAnyOfAddresses, + addrs: []sdk.AccAddress{nil}, + expPanic: true, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + if !spec.expPanic { + got := spec.src.With(spec.addrs...) + assert.Equal(t, spec.exp, got) + return + } + assert.Panics(t, func() { + spec.src.With(spec.addrs...) + }) + }) + } +} From 20cd4af540b180b0c5129127e7e1d882ea9da139 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 7 Sep 2022 16:19:27 +0200 Subject: [PATCH 55/94] More tests --- x/wasm/client/cli/gov_tx.go | 7 ++++++- x/wasm/client/cli/gov_tx_test.go | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/x/wasm/client/cli/gov_tx.go b/x/wasm/client/cli/gov_tx.go index 300d0017a7..8daeb82183 100644 --- a/x/wasm/client/cli/gov_tx.go +++ b/x/wasm/client/cli/gov_tx.go @@ -597,7 +597,7 @@ func ProposalUnpinCodesCmd() *cobra.Command { return cmd } -func parseAccessConfig(raw string) (types.AccessConfig, error) { +func parseAccessConfig(raw string) (c types.AccessConfig, err error) { switch raw { case "nobody": return types.AllowNobody, nil @@ -613,6 +613,11 @@ func parseAccessConfig(raw string) (types.AccessConfig, error) { } addrs[i] = addr } + defer func() { // convert panic in ".With" to error for better output + if r := recover(); r != nil { + err = r.(error) + } + }() cfg := types.AccessTypeAnyOfAddresses.With(addrs...) return cfg, cfg.ValidateBasic() } diff --git a/x/wasm/client/cli/gov_tx_test.go b/x/wasm/client/cli/gov_tx_test.go index b4b0274189..7c8600e07f 100644 --- a/x/wasm/client/cli/gov_tx_test.go +++ b/x/wasm/client/cli/gov_tx_test.go @@ -70,6 +70,18 @@ func TestParseAccessConfigUpdates(t *testing.T) { }, }, }, + "any of addresses - empty list": { + src: []string{"1:"}, + expErr: true, + }, + "any of addresses - invalid address": { + src: []string{"1:foo"}, + expErr: true, + }, + "any of addresses - duplicate address": { + src: []string{"1:cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x,cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x"}, + expErr: true, + }, } for name, spec := range specs { t.Run(name, func(t *testing.T) { From 10bb470d978283c7f6a31a5c0d9f56c231dfba13 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 7 Sep 2022 16:31:51 +0200 Subject: [PATCH 56/94] Upgrade keyring/ go-keychain dependency --- go.mod | 12 +++++------- go.sum | 28 +++++++++++++++------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index f93697ccc3..c92ecf3287 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/cosmos/iavl v0.19.1 github.com/cosmos/ibc-go/v3 v3.0.0 github.com/cosmos/interchain-accounts v0.1.0 - github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b + github.com/dvsekhvalnov/jose2go v1.5.0 github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.2 github.com/google/gofuzz v1.2.0 @@ -34,7 +34,8 @@ require ( require ( filippo.io/edwards25519 v1.0.0-beta.2 // indirect - github.com/99designs/keyring v1.1.6 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.1 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect github.com/armon/go-metrics v0.4.0 // indirect @@ -51,7 +52,7 @@ require ( github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect github.com/cosmos/ledger-go v0.9.2 // indirect github.com/creachadair/taskgroup v0.3.2 // indirect - github.com/danieljoos/wincred v1.0.2 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect @@ -82,7 +83,6 @@ require ( github.com/improbable-eng/grpc-web v0.14.1 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d // indirect github.com/klauspost/compress v1.15.9 // indirect github.com/lib/pq v1.10.6 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect @@ -113,7 +113,7 @@ require ( github.com/tendermint/go-amino v0.16.0 // indirect github.com/zondax/hid v0.9.0 // indirect go.etcd.io/bbolt v1.3.6 // indirect - golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect golang.org/x/net v0.0.0-20220906165146-f3363e06e74c // indirect golang.org/x/sys v0.0.0-20220907062415-87db552b00fd // indirect @@ -126,8 +126,6 @@ require ( ) replace ( - // Use the cosmos-flavored keyring library - github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 diff --git a/go.sum b/go.sum index efc49e6d07..ab40c9d998 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,10 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0-beta.2 h1:/BZRNzm8N4K4eWfK28dL4yescorxtO7YG1yun8fy+pI= filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= +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/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= @@ -171,8 +175,6 @@ github.com/cosmos/ibc-go/v3 v3.0.0 h1:XUNplHVS51Q2gMnTFsFsH9QJ7flsovMamnltKbEgPQ github.com/cosmos/ibc-go/v3 v3.0.0/go.mod h1:Mb+1NXiPOLd+CPFlOC6BKeAUaxXlhuWenMmRiUiSmwY= github.com/cosmos/interchain-accounts v0.1.0 h1:QmuwNsf1Hxl3P5GSGt7Z+JeuHPiZw4Z34R/038P5T6s= github.com/cosmos/interchain-accounts v0.1.0/go.mod h1:Fv6LXDs+0ng4mIDVWwEJMXbAIMxY4kiq+A7Bw1Fb9AY= -github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 h1:DdzS1m6o/pCqeZ8VOAit/gyATedRgjvkVI+UCrLpyuU= -github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76/go.mod h1:0mkLWIoZuQ7uBoospo5Q9zIpqq6rYCPJDSUdeCJvPM8= github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY= github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI= @@ -183,8 +185,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -213,8 +215,8 @@ github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbT github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b h1:HBah4D48ypg3J7Np4N+HY/ZR76fx3HEUGxDU6Uk39oQ= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= @@ -466,8 +468,6 @@ github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod 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/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= -github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= 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= @@ -557,6 +557,8 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neilotoole/errgroup v0.1.5/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -730,7 +732,6 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= 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.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -825,8 +826,8 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 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= @@ -954,7 +955,6 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1003,6 +1003,7 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1176,8 +1177,9 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw 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= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= From 355ee686ee724ddcedd0b21f9b809c0f554fbfa8 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Wed, 7 Sep 2022 21:39:31 +0700 Subject: [PATCH 57/94] ibc-go v3.2.0 (#937) * 457 * upgrade ci * go get -> go install * change denom to new format * Update config.yml * Revert "change denom to new format" This reverts commit e637cf5aa417f5df9b91c196d97de85dcb70db01. * bump ibc-go to v3.2.x * Update config.yml * ibc-go v3.2.0 * Update CHANGELOG.md * Update CHANGELOG.md * sdk v0.45.8 --- CHANGELOG.md | 1 + go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fee812325..4811418454 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [Unreleased](https://github.com/CosmWasm/wasmd/tree/HEAD) - Upgrade go to v1.18 [\#866]https://github.com/CosmWasm/wasmd/pull/866/) ([faddat](https://github.com/faddat)) +- Upgrade to ibc-go v3.2.0 [\#937](https://github.com/CosmWasm/wasmd/pull/937) ([faddat](https://github.com/faddat)) - Upgrade to cosmos-sdk v0.45.8 [\#964](https://github.com/CosmWasm/wasmd/pull/964/) ([faddat](https://github.com/faddat)) - Upgrade wasmvm to v1.1.0 [\#984](https://github.com/CosmWasm/wasmd/pull/984), see [wasmvm v1.1.0](https://github.com/CosmWasm/wasmvm/releases/tag/v1.1.0) diff --git a/go.mod b/go.mod index f93697ccc3..6b501d99a5 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/CosmWasm/wasmvm v1.1.0 github.com/cosmos/cosmos-sdk v0.45.8 github.com/cosmos/iavl v0.19.1 - github.com/cosmos/ibc-go/v3 v3.0.0 + github.com/cosmos/ibc-go/v3 v3.2.0 github.com/cosmos/interchain-accounts v0.1.0 github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b github.com/gogo/protobuf v1.3.3 diff --git a/go.sum b/go.sum index efc49e6d07..e6dfc73b87 100644 --- a/go.sum +++ b/go.sum @@ -167,8 +167,8 @@ github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4 github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cosmos/iavl v0.19.1 h1:3gaq9b6SjiB0KBTygRnAvEGml2pQlu1TH8uma5g63Ys= github.com/cosmos/iavl v0.19.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= -github.com/cosmos/ibc-go/v3 v3.0.0 h1:XUNplHVS51Q2gMnTFsFsH9QJ7flsovMamnltKbEgPQ4= -github.com/cosmos/ibc-go/v3 v3.0.0/go.mod h1:Mb+1NXiPOLd+CPFlOC6BKeAUaxXlhuWenMmRiUiSmwY= +github.com/cosmos/ibc-go/v3 v3.2.0 h1:Mh+RWo5FHPMM1Xsrar3uwKufdEGdIp5LDkVk9cYKYYA= +github.com/cosmos/ibc-go/v3 v3.2.0/go.mod h1:DrDYXJjWNwgv72cK1Il+BegtyGIDXcx+cnJwWGzve6o= github.com/cosmos/interchain-accounts v0.1.0 h1:QmuwNsf1Hxl3P5GSGt7Z+JeuHPiZw4Z34R/038P5T6s= github.com/cosmos/interchain-accounts v0.1.0/go.mod h1:Fv6LXDs+0ng4mIDVWwEJMXbAIMxY4kiq+A7Bw1Fb9AY= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 h1:DdzS1m6o/pCqeZ8VOAit/gyATedRgjvkVI+UCrLpyuU= From b8c1d76a9a0426095469d0ecc16e28296f6ca879 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Wed, 7 Sep 2022 15:53:55 +0100 Subject: [PATCH 58/94] Add query for the total supply of a coin (#903) * add bank supply query * remove a local dev dependency --- x/wasm/keeper/query_plugins.go | 10 ++++++++++ x/wasm/keeper/query_plugins_test.go | 8 ++++++++ x/wasm/types/expected_keepers.go | 1 + 3 files changed, 19 insertions(+) diff --git a/x/wasm/keeper/query_plugins.go b/x/wasm/keeper/query_plugins.go index b0e095b12c..371242d00a 100644 --- a/x/wasm/keeper/query_plugins.go +++ b/x/wasm/keeper/query_plugins.go @@ -189,6 +189,16 @@ func BankQuerier(bankKeeper types.BankViewKeeper) func(ctx sdk.Context, request } return json.Marshal(res) } + if request.Supply != nil { + coin := bankKeeper.GetSupply(ctx, request.Supply.Denom) + res := wasmvmtypes.SupplyResponse{ + Amount: wasmvmtypes.Coin{ + Denom: coin.Denom, + Amount: coin.Amount.String(), + }, + } + return json.Marshal(res) + } return nil, wasmvmtypes.UnsupportedRequest{Kind: "unknown BankQuery variant"} } } diff --git a/x/wasm/keeper/query_plugins_test.go b/x/wasm/keeper/query_plugins_test.go index c58932d67e..f9282ac152 100644 --- a/x/wasm/keeper/query_plugins_test.go +++ b/x/wasm/keeper/query_plugins_test.go @@ -511,10 +511,18 @@ func (m mockWasmQueryKeeper) IsPinnedCode(ctx sdk.Context, codeID uint64) bool { } type bankKeeperMock struct { + GetSupplyFn func(ctx sdk.Context, denom string) sdk.Coin GetBalanceFn func(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin GetAllBalancesFn func(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins } +func (m bankKeeperMock) GetSupply(ctx sdk.Context, denom string) sdk.Coin { + if m.GetSupplyFn == nil { + panic("not expected to be called") + } + return m.GetSupplyFn(ctx, denom) +} + func (m bankKeeperMock) GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin { if m.GetBalanceFn == nil { panic("not expected to be called") diff --git a/x/wasm/types/expected_keepers.go b/x/wasm/types/expected_keepers.go index 0cdd4d80e0..da00047aa4 100644 --- a/x/wasm/types/expected_keepers.go +++ b/x/wasm/types/expected_keepers.go @@ -17,6 +17,7 @@ import ( type BankViewKeeper interface { GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin + GetSupply(ctx sdk.Context, denom string) sdk.Coin } // Burner is a subset of the sdk bank keeper methods From e63e63b0f454cd85fb7640ba5c3acb19f61c9218 Mon Sep 17 00:00:00 2001 From: "xingqiang.yuan" Date: Thu, 8 Sep 2022 16:49:42 +0800 Subject: [PATCH 59/94] fix bug of contract history --- x/wasm/keeper/keeper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index c5511f3e41..deb78d9db6 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -577,7 +577,7 @@ func (k Keeper) appendToContractHistory(ctx sdk.Context, contractAddr sdk.AccAdd defer iter.Close() if iter.Valid() { - pos = sdk.BigEndianToUint64(iter.Value()) + pos = sdk.BigEndianToUint64(iter.Key()) } // then store with incrementing position for _, e := range newEntries { From f9912e9333516b245594cacfdd5c0dfbbac8bed1 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 8 Sep 2022 14:48:57 +0200 Subject: [PATCH 60/94] Test contract history order --- x/wasm/keeper/keeper_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index ac26f10397..7d2f2c3881 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -4,6 +4,8 @@ import ( "bytes" "encoding/json" "errors" + fuzz "github.com/google/gofuzz" + "github.com/tendermint/tendermint/libs/rand" "math" "os" "testing" @@ -1936,3 +1938,20 @@ func TestSetAccessConfig(t *testing.T) { }) } } + +func TestAppendToContractHistory(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + var contractAddr sdk.AccAddress = rand.Bytes(types.ContractAddrLen) + var orderedEntries []types.ContractCodeHistoryEntry + + f := fuzz.New().Funcs(ModelFuzzers...) + for i := 0; i < 10; i++ { + var entry types.ContractCodeHistoryEntry + f.Fuzz(&entry) + keepers.WasmKeeper.appendToContractHistory(ctx, contractAddr, entry) + orderedEntries = append(orderedEntries, entry) + } + // when + gotHistory := keepers.WasmKeeper.GetContractHistory(ctx, contractAddr) + assert.Equal(t, orderedEntries, gotHistory) +} From e3e7ca3c7d3f22d5e82f7fe9e7bbc32259d7ecba Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 8 Sep 2022 14:55:51 +0200 Subject: [PATCH 61/94] Revert "Create .gitpod.yml" This reverts commit 3864815113aabf281442e800e2fa6f7a8b3d6aeb. --- .gitpod.yml | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .gitpod.yml diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 1a76547d87..0000000000 --- a/.gitpod.yml +++ /dev/null @@ -1 +0,0 @@ -image: github.com/notional-labs/cosmos From 0e41c8cc1c38b729dbfdacf2b27e7f3b7fb0858a Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Fri, 9 Sep 2022 08:36:00 +0200 Subject: [PATCH 62/94] Better wasmvm 1.1 integration test (#988) * Add cosmwasm_1_1 cability, bump reflect contract, supply query integration test * Review feedback --- app/app.go | 2 +- x/wasm/keeper/keeper_test.go | 2 +- x/wasm/keeper/reflect_test.go | 53 ++++++++++++++++++++++- x/wasm/keeper/testdata/reflect.wasm | Bin 262794 -> 265746 bytes x/wasm/keeper/testdata/reflect.wasm.v1_0 | Bin 0 -> 262794 bytes x/wasm/module_test.go | 2 +- 6 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 x/wasm/keeper/testdata/reflect.wasm.v1_0 diff --git a/app/app.go b/app/app.go index 23259d0d0d..a25e507607 100644 --- a/app/app.go +++ b/app/app.go @@ -507,7 +507,7 @@ func NewWasmApp( // The last arguments can contain custom message handlers, and custom query handlers, // if we want to allow any custom callbacks - supportedFeatures := "iterator,staking,stargate" + supportedFeatures := "iterator,staking,stargate,cosmwasm_1_1" app.WasmKeeper = wasm.NewKeeper( appCodec, keys[wasm.StoreKey], diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index 7d2f2c3881..5b3fc38073 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -42,7 +42,7 @@ func init() { var hackatomWasm []byte -const SupportedFeatures = "iterator,staking,stargate" +const SupportedFeatures = "iterator,staking,stargate,cosmwasm_1_1" func TestNewKeeper(t *testing.T) { _, keepers := CreateTestInput(t, false, SupportedFeatures) diff --git a/x/wasm/keeper/reflect_test.go b/x/wasm/keeper/reflect_test.go index 079324fac5..8e4f4829eb 100644 --- a/x/wasm/keeper/reflect_test.go +++ b/x/wasm/keeper/reflect_test.go @@ -35,7 +35,7 @@ func mustParse(t *testing.T, data []byte, res interface{}) { require.NoError(t, err) } -const ReflectFeatures = "staking,mask,stargate" +const ReflectFeatures = "staking,mask,stargate,cosmwasm_1_1" func TestReflectContractSend(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler @@ -298,6 +298,57 @@ func TestReflectStargateQuery(t *testing.T) { assert.Equal(t, simpleBalance.Amount[0].Denom, expectedBalance[0].Denom) } +func TestReflectTotalSupplyQuery(t *testing.T) { + cdc := MakeEncodingConfig(t).Marshaler + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) + keeper := keepers.WasmKeeper + // upload code + codeID := StoreReflectContract(t, ctx, keepers) + // creator instantiates a contract and gives it tokens + creator := RandomAccountAddress(t) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "testing", nil) + require.NoError(t, err) + + currentStakeSupply := keepers.BankKeeper.GetSupply(ctx, "stake") + require.NotEmpty(t, currentStakeSupply.Amount) // ensure we have real data + specs := map[string]struct { + denom string + expAmount wasmvmtypes.Coin + }{ + "known denom": { + denom: "stake", + expAmount: ConvertSdkCoinToWasmCoin(currentStakeSupply), + }, + "unknown denom": { + denom: "unknown", + expAmount: wasmvmtypes.Coin{Denom: "unknown", Amount: "0"}, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + // when + queryBz := mustMarshal(t, testdata.ReflectQueryMsg{ + Chain: &testdata.ChainQuery{ + Request: &wasmvmtypes.QueryRequest{ + Bank: &wasmvmtypes.BankQuery{ + Supply: &wasmvmtypes.SupplyQuery{spec.denom}, + }, + }, + }, + }) + simpleRes, err := keeper.QuerySmart(ctx, contractAddr, queryBz) + + // then + require.NoError(t, err) + var rsp testdata.ChainResponse + mustParse(t, simpleRes, &rsp) + var supplyRsp wasmvmtypes.SupplyResponse + mustParse(t, rsp.Data, &supplyRsp) + assert.Equal(t, spec.expAmount, supplyRsp.Amount, spec.expAmount) + }) + } +} + func TestReflectInvalidStargateQuery(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) diff --git a/x/wasm/keeper/testdata/reflect.wasm b/x/wasm/keeper/testdata/reflect.wasm index 312f45768ddc101725a43fec43fa38b3b44719df..412241177bcd4973a11668a76feb536bb32f1a2f 100644 GIT binary patch literal 265746 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,LBM|?8T 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

lROv>PxW_oALw(xw`BSt8NZhJ%+ z!TfaMsdRCrS5bf9^#^8L7KOD&4W~>Z5~#F;3S$&E0w@C*okP0-$SW$RO7oV zo+-8D_>d5T>lCS2k9|Yg+tCGzLHqzc!CdX z@~Rw_T;muUz0lKxNX?ka98Lv9EttdSMN)KlN*z`w5!twuTNUC)rn1U-cXid2s6;yS zeY}YipY(jijXaKP8A4)+;*Hb{yitm-E=>?}axxZAP*_OIj{UUaixt2QjO0w16W5Q< zR5S7=pOF~1TP#-D^?{o�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

4SR* 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 TmLwGGUXpOq<7sDb>eT-No*-U| literal 262794 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

    04Lg}KJvZxIWL~dWU3aQjL16YDv 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 diff --git a/x/wasm/keeper/testdata/reflect.wasm.v1_0 b/x/wasm/keeper/testdata/reflect.wasm.v1_0 new file mode 100644 index 0000000000000000000000000000000000000000..312f45768ddc101725a43fec43fa38b3b44719df GIT binary patch literal 262794 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

    04Lg}KJvZxIWL~dWU3aQjL16YDv z>)!er0%)f3tkB_RWnR@-1@i5xP<=X?|NI~P=|eyHvB&QD-rfMbkJH3fEvQ5%=u^E3 z_FpoeTz9n&kY{dfUkTHaxPXCvnkBN>XG51^)ti*;{qYvJ8M*UNqhZutyvPC#lFBH8 zE8SHoPTd4qK|>J2zO7wM+xn*wwnEitqZQr$mNsl1q0MO8(7ju>l^H)^>kv(CR#D}# z-BjqEce^f;1FYC(1JjVBLb$c;F3gHeCs~3sIzNP`kd4v$EsP*RVHL&Za~V4{7cy{^ zN$-DmYK>BlBRh?1xP}_qA62AV1-)R0Ll|;ko{{+SGg9^_$E|f|C-Q3m#^p&`~TpxZt^X~HLXMbR!{Qf=V|D(Nh zwl6FhCPjDYLcVKrk?t-MNrCj$pcC`_z(SGi+HCo`$s>GS;J(oQVx}PSph^GdvO!`U zv@IO&{1YZPyTj`ODnadgl#9_@OpHkBl=hRh^>@HedkIlr;qurML4s(ZtPxgPB zbXo~Nci9fN;LFM-Sx}}N^=L-ajs80_+xz_~Iv5&czHGk~gVDR_ECupVUqN8o@SOMW z0;y9VX?0v7??Xmul0xsvLDu*EFIG^`4=VtuFKOX8^aZ;MLO&aYK4l8-1sCWUq%c4= za7W|P+diQo%IgC9wA=kNGOkL8hT@>2g?&YN6)#*aGqH;o9y>+y-NR%z+dPohJye(O z+g-jIs~)o8zVgu@`9xx77zs`YpnaloUA1T5Kt392z5~E%O2CJfj?eKU+(1Z8G?fL& zg_jm9Lex=5(&!xNl3)`g`z!A#TYJC`Z{U{AO4uwbBz-_`Pb6}+X}3M_#XrNoJ=KXbZ*N=9a&vHW3+2PgFbm+AGPlr+SzWbb9O7d(&%-zR}{W2T7<)ZZ~5{wjhNl` zAGn0M6sfPRh5pZo-r6GftKzvniOSK6yt#I5{HQ5zjHXzo( zP^~~=1Tawm0s|S`#E_KfGbEkp4Orriq^OIIow&gWSLrmjB5E##w!l?Srg`KJ6-*K% z7*Ay~zm8&js7ym&R++qX#N(GO1Kgbr%Xid&E1Ut7B>bOp91+UxBAPeUtI*M9TSjmk zWF&~~LSU9PZ(~CM*@UG2ecXmC?BE#jq@KEi>GE+6k>?ifw|XWWZ9{`U!<+q45hGJ@ z>CH-c%=3wwKf&W5$(f-3&)YSltP?6WQU$hFcrCgLX@ebGFEt#2*(B~b&Vd6wNa557 zHf9cYJAh_XEli5_&?bsGOQ<{*J!2^gokAg?|FriM%)$0uB)6OEkUrXB{$BZv`ta;k z8q_&`m4|Y9R!>uU(&#K_d5RTg2(HhM=|yW!FZ!)g&gkWINYQVV?W|rN4=MVsvYpe* z6Cp*vRko+~@?=QSZp^23#tFL@tV^$d@|lAC<(N^xvBm(tDuL0VwwxsXzMx!6I>j&m-xDIUu4=S{in32gI!ylZT%y&Z)br`5S7=Y)r)(fo6@&!S&=J zP-ya2!Vz+6@@(p;arxv~kMHH^F!O*KI#^rGBA%2_`s)oeHe0Oa=K{1|`7HnplY|nZ zu`pMPmVwp3K;%QQK}QjMXLQ#iKgA>%Yw&(o)_*4m76fa}0D`rUYD|D(-#p4ga7F45 zGK>6vwH^E*q+57uGE3GQNQWUj4H%^#VlPQ9(GTQ8m!umqnUosB)PM^uK(9{Q(u%7B zag>GTb49H>Lc>B}^TY;99)VIvwAL?GhK7cdeA@LK%4^+eEyMkYd0l z){3B$g;^GwGvKC>VvY#)Tty)dViAcAWk*)*2x&~Ux?Wg{2w_uKEV!<9FZNMBtu{7* z62=zbLJ^bAfE*l_!coL)7LmXf@-z8Jv$0-qj?3aX$^DgqRtIck&MNZWr(0}sXbOZr zndomOT>XDD5qD5i_6XjijRwEfl-zm$h&WO}b&lW3nFPGr!_D0+0aFe%>8co+^PSvE z%7d&*SYc&QjOz9HLI8KeLTGCt;F=-S0?Aii2xw+;A!Pmkn2F?v25BVQ5fO#G8j`A| zNq>D3G)1G6pxw97Zzh4gGMit^Cz!{15Nn9}!u&R&;dNRmfvD6I5XeLVP^W<*K#d^C z0xgi;QM7<%5J2F)jv!!>twakNAkZv=Im>$DdkLC?NPfupR+|%%UTK!Dq0+CK^ddN* z+YU3Si}Evybcj`&8|h8uYn=M3r&Uc9J@6lOw)c@NZG&4JrEyCI$-GRP`50a)^W%Ep zs6pqOoes(hhCMMdY^v1}537{kI0V$DjH@}Oha5O!eG=8CDmww-)FE|D z%7*LU?VLXKhr&whd${kM_+!zmCgUEHf|rJRMt^8&uGjm3!wnaE^?)f+CTxKiVa*n( z!%@K&h^4;Bz8gy_s=e6)v&t3-w6ukh1%sd%U}Z4c5&I2CqHksw=xCzNGY``aHbZT- z%G$$O9F{KL=a4Q9S!OJoe=4NcG82X>!d2Pr+DJH*AENpVCzXLvGZibeZXAojD+C76>L0+9SxaZR?puAA0v?>CBxb%or}gaGUC@w!BR|%!DmN zCPi0(^3xLIqy(lskinPV6=ez-*k?BOjJR9B;m}sg2gq`g7k?^~Syi7WT{@eJLLd~@ zzp%}M5KvcxRRocp5#Tg6wY%u;E~a-cp!J7F>55Y)I%cwflZTZ^iU2<$-mdNf8#xbP z+r)nB>N_8vy~_RsQM>nZ6Pz!Coc|oun;*zgW-?s1L;qH#`(T2+`GNg1x-UV0l;+fJwyC*&?1Z8M7JLA}5t>4YCaw*djF0o_tCpTNIgytf?U)kFdpT zj4e9T7okbC%rn@cJgY!jR+EzsnZFpe&MG-=p3!jFDWbzLOr7{$k!xlp#B$#-KOfhG zFFDtQ3XO10olLs~mxUjKn;lK7-QE;|&ZZUhUVxJ57W`}^o#E}2LaVuri5bhv$DUZS z!Pj?Oiy*RCDQU;51RmP})v8F#$Ny}}s)sE?mic2LhDcxt%4W+xEgxAiTb`u7pA_v0 zgeJ2cPOKMM|Jih?z+xiO>Xy+`(Ak#7dABzy6V{3?0jP6<5f<+uYU_hWY_T~7=8`OJ zeELGuZUoei7KC-unro&QI;U+#ZEPwQ16WZlL>*jhMVVL1T?@j))=5h>p&iP5k0=p% zC8IV%hbIiJ;8en7)KKFVa-0*kp-b}ATDV373DhU*5&uvAy1nFhU3aO2v+V}(5t4$%-7L|O|c1SucA>;OFGpbCLNtj zFl3WbDI+Fs5g`6=DLVO04{*T>;8kD+_O=8`t|R1u?OSQe;fGyZF7OQ`K>eohZFLbZ zOI~@(Q7dACR6#4?I}Ij*!{#Mv7)*BlM4^gC^hT zCIT~#<>F#*X1|B7ntEoI7*k`cW#}E(#T)hEQl3DES|%$-n}g($73k1Jt)bxaX*j5D z#Q?D8=mjwC)&ekSQi^Hfr)ie3A*@+#!87xeVkRITU|jje@=ZLvBik%gfavVnjL!nt z{eu$hHDe+(@%t5)z;~m!?@$CIgqGgc;7x)n2kX%MNm7HhPWbh1h^8le-ffnvy1NjL6>-u!UzSt*!Eyev|TTqh-6 z>yJ=Vk`1|GU5h{JblKuV?2j+(#tQaIEXBoprIHMPw5XARl3Q6y*{;0^+&BSAG=}vd zNtXAACh!=14Gd7P1w`D|l)siILYBOBXL;P84GDm;6pXd0>Lk`{_lBJN;7m0^YvFUO zoK+=%Q;iq=hCtzr^z@?xMr_+ZfWG1tkcS)cxfqJlF0rj{J_ARt z$>(H`R54>lsua5qLC z+;3+^$OwW>$S@HRGR-abZ;rY2b(S#O08Za?7bH$AG`dk zBu_Vz&1aIlZXDFmZ1Pz;!fbWJNVe5Co@c`9S?KxiZu@1j{P&Fuz01viRQkE>Unz9e zg{EE@Ew1c)>c=|_B4Rum$wKcNR2rnYV+S$|MYVGE!?(r7Hz~ySoeBVD5a26ohlniV zt3;nOgbhny>$stiCIgKu?f+3G4>Eit^BufXxu}EeL;c@YYiN0-N;H+K$0F?ij*{&J zp5Ui`rv1OodSB}= z2(MrU8Sk;cw371o`LG#olxWf4dv+-)*Otfmu_JJgDOw>E6waHYKNv-t$aWYFh3%rs z2wxpu?U0_& zDd`bsi5|-3OD(LQKz0YqRHk;a77+FRU%+d{*k}(aA-r;@vxJ8nw#J|SLjP=5L6U6S zhaJGc!*xUWCpvY32+ZIFR<^Hcn-^dP6b%#!KjKVK9I~jU2+F*CmFb3T+89tViZVMD zU=al0!Wj(B2MHQJH5YUk&dp6tsu822Io*&pCq@$v^v*FSbg;ljm0@z+Lc+G3XeEYf zVpY$CkAf<8m+TZXBux(bv>ysCGyp1r*CN!GOCae#Ns@0&gwMF|{3`F;{7fc2;TV!t zN(qFQynjQ!mFf(BTLnK=w0+n%BFf{d^sa{W3m9c_^VZ`Cs@8{0lbPs3{~510b-~_S z=N$r!8thxCs{ONCp_=ieYLD88B-_0;q~T2Y*Wr+=B#wM zNS*@Br%!sTo^Z*IKIs_6nL0@v8RI4|l*QPZB#^|_i{Cl97cJNcJtNc2Jn zZmzbvJs1zI=p=v|(}DJaUoFG0u)W95ou@r($eJ8$?@JQ|*c4ywn;~e2p@gy789zLp zD;5{ito6pEgIjibTdGTr?kuiM7OekT&{*eCL7*dX?_$Cv?4X4BM$8cFy^JJXNhl)U zUB$6MP_Z~RY(7&HA=3zFGf5m9*atg7Wips5jE;4;C1T^ec3JE)K~0ut%u}Bo9#Juc zzEO}Sih!q98Pq^UtfLgc;UI*lA##lozPc555xoZ?Ce2`4x)`+C;`Y?xX)Lr&VL@t& z>Ai?^grgIS;eh6DnZae(LGqfg^{Fw;B#gAJk#-p=Z#Fcl);L= zKo)!BKms%9FnNH{W`qqS^K6Ho^Ek}G32pU&0Y%4lD;Zk3<5r&t0<$*`6gO`+C58ibNovCd(jdJ?iOxgM_~8W49Tr^D z`x+Jqou?fI^wrWCF#Qa$C8Q7uEs#FM2Ks9gZSQfA2jKxA(5B-OohVpO%AhuW z2F)UUgv18ejMZdq6cam@f&Z&#-0V>*o2HvP>0#$4)6Y?-IC{4X?6C7%x{0n*qz{=D0 zvkrn?$EO2dQrEZhB$EFcYHgQ9u)LlQ=uw>I+wDpB9K6<^6yW?;MU85gPt+AIYsk-R zdS7H~B(xgWW~j}FFWlyLRc(6f;;G)c%s#hjc5MD(MB?tbW*Io*w(qmZVz4GVhSklL#ZU$e(Lg3x%f6N6CX4~{o@ECZL2puR1w=86%Dy!Q#0f_M$qYM&X zA-#zXj6kT;1zA!>_4yFlfFTlb%&y79? zC$>xJhQ!k>2)WR>{*N$2Kh#dAg8kEV%&Xl*2J<3FHd3Jnp=l{rBU}p!kwwaal*o)s zte<|pMX0E%qOVdFEId$)&=X-Zk;Ro3lbqbMZ3wd9S5veHX|4rM?3@nsM!6vdYH_y0 zB2dB8c)mI?xStiFX-oJ0~I3Wc)&qlKEo*3y+*yur{Y?yMsW} zCm5&_HD%&Xb0#HiN#rtN$&TZHzwZyBmD%-9q8$BCI1_QL0-=dHkP*EOiW*pck;R~> zCk@Sosu>-`0Ang?W+oWPQS=F~a@9-*3mo-J!9KZ&Yc(sNTBe%sVOI9-}_aB~&`PObnzj>Ee+VhKGHNIqtP@-6~* zq(Jn*UoAoZ896nPQUbQ!{ol)I3{<;tV}zP}KH7r7KqRTzI6p(vRSm=0n&6N+) zQu%TI6y41wRvCUktcEHHbd<4x@abVoAP4@n{Efdfu#F_-h@#-^G&nn$kVxLGT05!M zNFQwgVxiD(oA|kIp?roajjI-&YqB|yQ>!4hT5){oA{p?*vWA8*n&OqojXX`sfCN#w zAusgZY=Uz<$;j!VUohbP2Geg}L*M)M0o_ivtk7-c!2DGHvbqbQ#N_0|c2YoJk&256 z-EPx13r_F2%}6 zS{9^DpZ>JOeb(Eu4xdA>d;hENPWUo5vZ_T=EnUVZ&&#+ors`#9jPHex7C5WPeEoup zwoDgOA04((*GY`MnPSid#K_=M6VOolfP=sZJPE|FS}6b0XVQZ{w97|rYMB-rHc~QA z+ikE>$k9~RQ>Ga)Y2{d+P6TrmJuo^!sA6zf@IYv@1!@=$dgMDm{mE^nz##%2(j=mu z`3$1el~RnL9MW)Grv4%IVj7U@Uv{;>uO0}A`@d1aY|c2?xD6KR(3N2(~U{e)Wn>w!lrb5TXt5fgK}l+ga>s;r|kKG zN@=f1GCD^i2+lx3K1+Gx=N7a#?ajlO;xMtfi%x22!{l1}CLND9NAoG#N0lls7ePWx z9nD*Gl1^)NYI6z#P6C86FAoD!mnbbOUysEv$1@aI7fP}n^pU+nq7bmB2!#jss+oVd zsn}~yhB)k-6*Qh1fGpdkKFX%83GR2X4G6v1btg>T4<9;q3ZPnX#wS-CP~AVjVTg(6 z4cK{}{rkWB{)Ii7xhh2`j2VunU{$&6E&JbSv`~u4mK==0i35v-ctwmRc{U9tklpkzc1htVw0Y*A|{!&365UpS*mGJoFUKK&3!b z+{tSAHFXxiHVbK~+R9M}s8t*yYjOzk|Nq^62Vfl4wf3~_lC?7KjgbIbwq=bn4+Ip>~pX4aMv)F`Bcz!Uty1q;H^CsAXC zln^3p0bjl`J(LilC72yF8nhG=0#JjPAp~4N67f(Wi-G|6wjjV~^}%k$I!n!-cKp!$ zRfY!;eKlA-u%=q_sL88ITB2=MVch_?1+h}ANyKvdbJ#i22ZjSj(cQ7MmWm=w-V|8$ILW2VeZ;PoJ(nS8x&!8N})D@fAQIVH5a||H%FCSjnc`cN8gIySL!+Zh*CIC`978( zJ#^af%J;Cm@XaS03pc~)H9C2KoT%{N?MF^IUX6^Xapb+9xOyR~h@YLAq9^iv4psQy z2S4}IS*!>X(G>OY6+ukpvP*9kEJ%PRew+Z7UTVtV~?0JjW;~a=Nq-YJaKC7f4 z7N!`&ORV9Gd5e45A(K-G00yAX5_V_K1qcAFweYi2 z^W)&MN^&=j;x^U@aCv8JMmmCOB1e-|%PVn2xM}#4JqAD$j#6nE2Zf=r9F#>VQ6af| z%3c7VfFnqKh?qu8q1S;O@vI{X%SVQSz=|*cxGP3>L0N$j{d>=Ymo11MLn6#m+H0XX)TnJrMh_uEGWi~ z+b)6k0om1;;IRi;=xz{dvLOIps&7S9C!Uw8_pG{t+GCIQb_~1fibG=cdse(1aG!9+ zp`NdQ^uWii`HWG3V8-v&b0C$H883Mgru-?4*If`X&wp80}U|&{ zjdi&k%QWQAhgcXEy8cx{QqwXJ1#kokAt3_#UC|}*-s41#>|q{ZLoav`yAoX^Rpa%#wgyK{LDvMAS{9XqoX3;Grf4>9Lzi1iZ3$^%> zJp6JHf>JfIV(@MZLp2Vc!oY^o!assn9qfdqvIbn;g+!fy**QOsByY#&m#(>ESpj$=Bbo-lX(0-lKkZ>k%@73cv^WN&gI+-h9tSydjY9h)(? zPX*dC(!w_CI&pePkN>k|uPi_hnC(^&6)ENB-#Oq8CKXIW1T>x}Cuy4`U|*BkG7k1- zLAx+TxMI2htZj;by$AuaT)a%2MKY#}iEKMS94(Dw_cLTM}L zpMD1rFysUN;K;-y`ZDk?tZ+8SggYN!-lmWbovDCl(jiSA1g;vDyajuts2FpnNVT6Y z3h@mru_GV|N_FT;pJ2Xnn4;W{Sj|^TGd#7I(F$Z2*fmUF{5=s73e22&an!RXv>0W# ziRp%WaLcW#LW?N^Pr&9M3K2K91sq_P9k%2_5J+MbeOi#yrR*9DeAfzgU2;$+dHWaPJOvK5rwh|1db{Y|>Xsb>7c_>f-(k=)~rKSoO#GBxO zWKyCN5!8ZEW`^(Jv&V?rVSEG@3m-0#aX9#l2D^a}6`?y2x*~K3$7Z}z43;ih!A35B zf(oy^3OB6i1=eGy7yd@CF!RC~E8=-5l3>Kam(I~QR7HAxd8U$nTXsXgExfA`ef%6c zWbfsW(*(+SCai0auIPqtA=@Vm(^tu%EBehqg%y+s5f0(YpBRk(9#&^~ay25s{U0E~ zk0;Ob=s2Wc0ha%6%ZK8L94Li z$y)vml_JCkk3=mR@E{4f?mCW7utJ%j3sNZeT@~U3Osyt>8Pw>Yq_X(~aqxEOsz>2C z@;@`&W8#-0c%VU<$E(99ikXISLLDE!w(p?W6{bB){FVtqFfgO?;)qlH2Nq+!%ZraX zNTMbbfky_*9KN|WfLH#a3-HD}oHZIfG>lI}z!*O$8Sc6K5&=QgLEMuKjUKcI;hSji z`G95^3?gh8SbaL~=fQM@Tl($iMfE5`kwF!3++zXIG0mVwxa6YYX9MvZv|oHKd4N3< zk*u5CZ&;8J-~RKPRl8y1h1TQ2ZUf0Pv;seDhqb_RLP`80gp?gpA@x@ z{X|s7$whp}7rR{8DCPW7Tf|rZP}($+AWlO}%q}6VfZ;6?Q99@nBYqCyd3;1A+KB$y z8Di!h7^ks7RI_*nl9RkUV5wKTB-e+(i){$k)#jh-0&^ZtA6 zZ{-8H=na5hemP&mSkWt->?gg&7hatm18@}*7PlvF@cT6wD*B}#Wp_ot^yB55aR1D^ za=W6>gf?Yx|B+j8|B*R-{L^P}J8e^jk6+~Eqc}#){5%ixem8znGufO zV+T7CDi*!sPe%bhD*E>b7VhOLV;0yj42FV1SgnO+nJzaPhcRQpU|=%`O#x#bAoNM} zfuM7eJ7gnY_|&5x#V?AY15pM7AocLO8njCQ#lSl{6F3xugGUgPK)k`tRNk@tIeXdz zurz=B3*n8*utBZ?D3g(&0yxOj`b-308wg&q)WHk5_=}x<>w7Ymm z9ZbQBLsXyW*Hv{&QLXZi@*1Bkl=51EycQqqdInJkzynDFZ${v=rjW~gf17fd?=p+W z6unajbncL;o`;}N=(0x&SygzUR1?7gCD^I+K*AcDB7<~giRmkov5Em30i=n~k+J9) zk_c)y%o`A{#pjOf^-=E1VhGprV#r=!6mnMBPegyz8ALQkw_H=)lIdu}R^mds147J^(sL1y6y?-ni|M89Y>a7f9-L!hVL+syIx8_u$;f$R1N^Qm`Ev zSt#BL#!;KQh=B= zG(89dfcX;UV$(aHbRWPdqh=m5-3yalDH4%qh0*|JG_BGJH3flJy+7G#D-|M3N z*(5mU0b-+PA#)gq3AJJtpS$+NOzNrB1wcHA+W^A>==>Q3yc0msJp|pMbl{g&u@hdd zD#HwE-@bR^K8FO+ zC_GdX?4xB3i@8bFp$D+~k+SNg9Lgx_AY_Fl7Ir&Ou%sn~aTT|&pdk4i+{vj#o+Vfm zZXkxICPA^|SrIfyhD8ScO6XOX6VVLJkRN&tU9HNXR690QnDA;eC1kY zH5d+DQI^Mz|0GceZxxv`-GhQDPlAoi_rDIdr&W9eR=85(OkgCrf-{#eUtzhr6&%A{ z{GLY%CAt$@2^csSfhJxOBukLLx<-vd9NZ`(fNCgdc)&JW$+m+$&4Y8pw;Hsat@vif zR@gkScA6Ya1Qn!~U zw=;spptl&Vgg0=C=zoq7m&cu{&oxuPVnTOw&%8(3hF{7R)8i~J!CREx9T^$sSDfQi z2ni!Pp9t}qfgQE@l(ER*1)3c=$_Fl(FT#T+q6x$M_-zS+F#a^}ln4_sn|EvCC{%aK7tJxLm{n{n6(kbmkhzQi=ii|P^k5>9z!Q^D96b@%4h+caLQsEfIGw@ z(Avw$hp8e0u>O~D{SozY&l8R3n!Xww{-8_Z2%<-Su1L!?0}BKcm>iy?*W!qb+nBm% z!6&0Z@p%Cenqc<;ZLJJO(vzg?Vg(V9Kn`fTsci({TqFI{2p^|=`l?sWe_m+}_-kQ5 zlc0H7j`R0~<_0nxmAjGLS%eLO_F)<D8zXLPI>bz77o?2*CCt}0y#I`TW^s30e3&HFci%BWrupDg!fV- zL7|fi3Qc2zs4maGPjh?GA@-#Ch~i3`LW%Rch;ySH=YlcFCHcw}#q{a{6I5|D%24X3 zLSq6m!vRaa-bL4P7!kA(wg~yGg}CEsjD`+;piP)-A;nA;Su7#}0y(3m2>28Mg2F9n zTr2`U>3ehnKFi#X(sv4qs1;T0fX}ijA#plJI4__SZuio6gznKozfs*d;k7O63{8?Ep(P9uSh%j{_ z1(+})2SjKsCdIXqG0kFr_da(Naueus0V4>H`1vLa(b`?;OxnRg3uY_d4Upe85XuWx z38~e9vY?tkxduy;A?~IUs=-u^)sTj$#j0FmJ}cG>=!S(vbp(3x0+R6dg*b-peq8Zu__3kx`vn?`4Q4g54SB!dl!jAV=kW;4*}q^_XwJ zq!ur@04_xM_;%c8Lic z&@bj~>K`~eJ2a3?XRY3W;aDnVCGDg)5zktwc<*RzV7HZv$8xb;V#G@4bGb|`l^wJ) zxpZ$V9?w|WY-}W*Pvw*rC9L=rMOlb6gw%_)5-G;mA)EFm(*wKNO*R)B87)2U;q#2O zCy`C0Q^QtbXgG&Jsux;PJb(e^Ls-9Y*R zQZG_n4J$sRL8KgK7E&GQT%@dr`H3EEgpQ^&IUqHe$mSeWXO-P{9~q>aN8HZ$06ft+ zmQ42c$C9zsfR(k;ZD*A)+I4S2N<5tBfIN^+VUY$fT52#|%&>JPws*HRmK}*@awFLx zwD|+tdXWAWDPeycDdE^Iks?6Y6H6wr{^<;1DQ2>9D`^2?STXxfRwzBr_OmG7EAWjz zFVZBOn~`#@RwCt^u0YE5I~gh0Sr8b&N6!xMq#2+wk+P}M$_(aH@hsPJA7M;b88bVU z%~>O+mC2+t-6s0E7yZpb>Qrz#bE-Ux@;NBqj`o=1TR{Y-n6SO%?8MN+$~@F*97xBl zM(%~!kdB#mPJVDg{)q|sd+mH2l#xmF=Q;7* z*r?T;&m@8Fyfu{Gvmw0)`*cql^qEPIrn9jmFhL^0)Bb!W#jVQq7n|9NWw13z5~=(s z*3FXl;=xE_D1#>{Yi}0ckH)O*arfs{HcZFcr=LJMY5yk7h5Pt=q@>HNoj!<^ zac<+ADBO0`$c(`mnMWHdLnj-{l^ z7z6-`)XGMkJEsSXu@!CkHxn0eL)zgUoQ;cnEoK5+qsiEqnHU*OS|jLGun;q2E8<{xtI`>@I5{XT_6ajTx}&fyP)f@7rz#7^bbN)3sPdNW`=6R>OnvmxKfSc6H7)7?Fi9qR60 z6B|wB$PTQyGp_*?287YKfa=j9z=Ou^RO?PhipI@}J-gDHv{ zr7p4Aa#nXY_HxcDA4gJ?^@>I+hov}4i)048GARuy*2IR!nf!4&cy-9_PozL0-Q7JR zoiO005?7owr6R!Dd_OdqECm7=M(oluN}|AWU@k}3w%A^$;0>8f5hmPBpp;eR1K8Ai zwgh|=6a>NZxKDYJ2T^v-$K}?Y79c->-GmL=2gn8O=2Lq!vC+DveP%kvZQHjllj$>s z#DWf}KrfYjEV5H1VhpC#>G(I2$U=$_nS%){iLUz!L8%*Diz_TML zqmJj)$)|Rw(tA@F8FD<8LofBF!#YgVyU(uwI8ySYL`ujRvp<%#+FQHL-{U#Cmh*gP zB9&`zHJ2VKqT!Lp2lo1}MPCl8G+KavBcG3%aAquGu4q3f` z*vg21K(~X5A$vu#rq~A!=GoZN;EIBv%vjD$S}{CGr!3PZI^{}?i}Sv+)yfDoVillj zC9HV2nH#oDssvDr5?M2q&WR@j`Ah~3*A$}yFKFM6_6~g5YR)Y{?L`*rRUzeg6;kSK zS+pSzQJ5VlaY~_^*^O-8rYM)AF6Gaub{`v%x^>O7keB=y{3x5tS^IKZ+&pv&PQ1pw zrCggRZuRGfzBQqLHxC;Hk^LIwTtf#Q!N!n35f^ElWhSl~T<&MJ$WPM$pzID=Lb4>S z)DYB>QQ$7I&x+f+U}c!6L7_)1#+O7tfYa7JDr6^D*UY6&$bXZXf|-UCA55nArc=o= zGn*e33ZWQ4ogBa^VjL{&*iXQzCXX1aUnV_QLDjxx}NPsz(PZxC>aXEO8;GVSHjLXp* zT5#Wrs}0wG2fg7})5`URa>iO@!SWnZly4oroYoS#Y-4O-AU`5$-w215o#_8sTpSzh)XJn{N$1=J76k1f z4h1g*1#URjpR`P#J$T+qqU|!f9g<1%;TDuv;rX3N+4ofP;X#yWcSwSp%KT zEsavbtcWx;wKPOT?YKB)Nj%k8OFVrK6CuBG@;{uA|1t7BlRM>4PbhzOLizuhQ2v_< z<-eOy{>KUBf16M~KB3%$Ly#L@Kk{z)@cpE+^6ClYDS_kY;ZJ~*+<%gbQ$T4Z(`K7LW4a!LwPWxrZyUUs9X~ijTm{87qovVBW^3;}``Yp)2 z`;Q_|3FnlrMV=aiJ5NiMliz@H@^dHuCgf?wa`J=7yW!o3yc_cekav%NCGtFpIqk1O zz6tqFBQPOk6WDm&<_Pr+A$*2odn_|TVbf_QQlt5t**}J39`4N~b&r8z?4)|RIH@!q zOEpSLrmQg|tn6@&^~r&d_|AX})V!%&M;l{AR(Oe~>lFt^b> zj;ed>ooTYmj0Ft~Cje^x{T8-zf-nFS_lz3M9cdE=MA-UrqOq7^E|bnv24mZirc>DB zI6dUjqvkMx^4T5uGP!l!Y-Ufz4vonCDsMFaV-@2iF0oPuzot2znESBIee> zghKmdy*VPR?dS>zlM(2jW;PA;vN+hld}Z3Bq%n_7!*OT{rlXS8_0~Dk>UtjNhWtfx zu3Q=_GuM}3)7IwL7P0cKj8sW@V#3i^();n+W9iZ<97Smv5`DNIxcXU(e&z!XQD-)II04zEvVMnIsixa(qH%k92!pa=TM6U}C*YuHV36UX%dtGJ#fbep#01M7m1 zvegamnG^D7*!knE`3N>|W(=%(8cK?`7jpDE>aGojB?+G3Ckd$5;l9cc6w^5{WcrC zt%T0*bGtL7Bn10ui89u3BWLJyb5wKm7g``?!`j521lGNO%zP{C6y0VWo|9KQ@|s&_ zHJ(uhOFDrSy68utd@@-@*?~H={_aK!MbNHGkwY1eMNA7}W)@IRd^q)l)nX8i#W>c= zmXEjCY#!iF!Cj<2E98<_0_M+qFRBc3{!LVcCgkHO7)CwQEZR+UUYCHiEVa z{2-6|ZdjwpyK%%C?(!a#Zy!!>AI@w|?>#%8+@9}`#^W|cNaa-Q!5=J=UXOo6N^i)| zk#e6q_(8vExYB6nz)F#U64tkz$=FEnZoq z)c@S;Sb`@7r<_o&VM7pVRw*krGpl>7Hy zJN;Lr^a?$Rl)Q%W$|6o2JkqiuNBBu0OmF)#Q-+||p#XYecG*8j1 zlEgE51nvIh@=L}fs&W3iQT{>HBcE7+lc&WHw4vCL8ra@pn8Sqe&7^T7Nj?QL1wHEE zmaaZUcMW2rU__`JP-b9aO*4!DO4M+IYB&8^ROvXZ7>3#^o>JCRqZLPvICUiOu@#*S zTl#lVJ0tI)Y(p)uEa|**mLd;5gfdzDBLrcCQ^d{d+{2334=LqjEgEcT76wg0gg30S zy=zhxD^8G*2%(8_1-x>WrP|OS#d*Pk;RDExnSHrT-h$1&Z!nh3@`fsx*++TX_fn&9 z_QgJy)GvV_K{Q-)=@M5vB6e>HuV&raHIc|Oh4-w59dzld?H*t)xv0E%YOiJ8cgpU2 zUcP(w*3I6wtmkS&g?7YRIqIe;wpVnDmMJqWC}7H789dSeP6U-bS)xg(4dB%zFuU8= zekO(tk6SBtWw{NYuETWI($HjEt{UNy6*MHwSI?dlR{F8$PQf)(i9YoptU2$~UDg~h zlyXCk(}H$gS~2+Nsz0^$XEPufw)UCP?Q1q|nmA=ear*pc^fe9F-)ZI}Y1^*<)X8Dx zB8)?;6Rj6c{!-l6y7K#RUyrLt+5xbW2Zfe8dWw_)e-AjZc8w08S74mCVEjjLG1}{4 ztWM3#B3p^x!HU-|cGaA;jISN^$>z|a!3AKRwOATi-i>=2$?{axUdqG*ADy&4mD-XF zsE|5+eHr&8H+SB2phNMCH3fe438)qyUFHPj1!*ePl6Z>`)!O6xuDL837 z5hhPz0TpI}HTN-g?fq?K^g!`=;|RxUetQKM=Qu6T5aNM@BEsl-Jv0S3D0jMZLix zSu>SJ-E1zuXYanTx0Z%kUf^XDi&0nx^(TS#5$#Hur$5#L`tRYu)d>m`qz4FxY z@zYkFE*t*i{VO1s26DKPBt{FS3FgI}V*oqWQLkk7Z`s*m7m#MOXn1+IEr%freR$ZW?zu@(2{;Br6PhI}7w z1JEb-H%X&Qy{RaNaZf`>0V#DICl$xwzEb{Hl+%Fal)rW*L>}&%8ep@Jv^a-4d18Pm z57r$hRHN`$3@8s{OgcOt$HZu~-+{}pFFrpP*Lk=G?2teincdx89ujEw;q+!XA%UDD z|D4!dCx%{($Tu)>th}mO8evr+h9L${UPGQ?gm1z{Qx9P|AJ+xA2%Cfd3vvHuTs)#V zVMIIzx$E>I--pYYPYn0{xCU_b;c}kGasRqQWClla&Y7&UMTQS$fCw7gI2Qki7oH(v zw)J25Aw^Wp%f?7Ms4Rs!V?3VDpTJl=w`>63*!Sd$3{c-=4WKftLNTm7Y+-N)FcJ;* zl~%b95wxcf?zeY;eLb9^v;osjml1&hc;1K0!Iy=5Y3eI~K8WXvty1qz=Mm-!!w-E5 zoUd?siVQ7Rb}c&Z@Qw=HHLyhuf+*?z62@uaDsa_G^6AvI61EFJoi@F93J^gHKBQaeYT{iI-Iv)IdhiPm2xwMZz=*-!BXV z!i~+mtcWLyatPxiQ9h28`>+pQ4X6KyY}lN&Ee7+E=KAxAB+h4aw-XL$FQjmv#x;t| z#NSWs{+p4n!R6$6X6AV2KLzW9^``kx=B4JPb-}v&rNIl?pR?u{enwy%N zn_HS&o7(62o4Z;fEln-WEiEmrEp09BEgdbLEnTgV)~43x)|S@R*0$F6){fTB z)~>clTT@$eTT5GOTU%Ru8{Q9S>uQg*H?=pnx3ssmx3#yoceHo5cXdQMnmU?0S~~Cw zK}UN>M@MHzS7)TNsk6DWrL(oOt+TzeqqDQKs|z4@VfZd|-GyddcogGH7s7`#2oo_q z$jcaBYpybz5L@TW`Y#YuE9TIn^fVq+PIr)0z=}4N? zHVY1JHNsIkFq{GIzmN7N>XAnh2E4Y1y&_G!lEfThlqKAaq6^Ze9d2rLO1hhcw6@p> z0*h@T-H7L;cBfpnm%W!fuY$7CNVs8@VYDIqmm%f3eDXYUnMUFN5S|&5FkV&tFa1-Z z`+oFM%4Gk9wn~6;vU_fQeie%9T7T+!XIHO3p zj1Pi^U`k3q{PHRD)YD)~iko%3St>0nqzSrE(Dn%0&`SGRq+}tVM@sT>`Y3rk=#G#~ z5-(}2G${jUhRM<;ZPv-Sw50+f2cBoq*JAV)Tq%8P(~(kba{8WxZ`+H~IEoj8atuP1 zcwdcnr?4Mf6rE0f9`4(5DXQ-Ac)hyM>-Pt$g9}1)D`r%Nr&U%NVSW1a69Ti;*`7Jt zTz#HzfwoXRah9ns*Xy+vp$0XgH)+l4&Dy85PaB`{|A+Qh&kM$j`gq{BePi#s`lFHa z-t?}k4lh{vZ_}#IJnOH2YiK6t@UUvu5NKlQn@V=sJ<~*K_sVtaH=Xg8xOM2d4}SQeM;@)L zUb=46d2#FN>pq3b_doQrXMb_5vU=U7xK%jx`MbVx_v23-`}c!yd)LQ5`Hj2p|JEaq zKKbK~H+=nH9(d%@O`Erzcm7*?-+9fopZoHici;2Cx1Ok;HT%Lh|M5>Rju$FNF8=Ay zrd6GoN-tR0d+BALz5Q!<{l~1?i%wj>Ve^(ZUGV0&Tz2`F?*IPdKRNdAf5>F7&E?z{9UtM}hJt?-$)x=`UMeXd_M8jV)NhhKv8 z`l^FltET&Q`gCJKFrfQ&pRQp`Ru~>V#)B*61sA)u{GX zRdgE*Pw6#Bj9sS`9`qczL!ak8@PdB6Z)RwAU`EA^ie28Icb@lr-*V6TU_Cx|s_IRl zdSjk9q!(^QQO)UR87uUh|5Uw7Kh@XiU+y_DUOmU(SiJ&YF0QF6TxA@%er{;y74P*l zdRF?hX>$UFFRaK_6n-$T!c!Rc6n<9me5HQqYP}<{|IITBU-1{dv#e7OdOQ8={T29y z_(l2!#`%H5!8r?pvjS%sg)6}i!u#r$c~N?`QTT>F zU$3fEy!cj$YG@!+Er_q`PBX%4wKm;zLiG%FrZ!ufTe-lq(0{VJOW&>CrF~cXe#PT~ zA81c#PpVIOp4NV?J#QW}{;d5)1EH!FOIEJhyye;(Z~TbY7id3i)w#cW?7PN{IqeKj(1*jW0CwweVez$tv7%9&iM;`{$Oav?DnqiTR!!}9|bxNUw4Zy zxN_BC;@Wqod!PU91^plR;F7wXA3k!^$3A}ZEw_F3uKT>9ikS<$PhWS=CvSfEUyk_Z z&Z|9T)#>*?V3;SJvbe6LvwPziXKmdM(d>e8gI?6y-#)i+r&`rq zdGLdS`B34$EAKkgc;v;NfV^@R`2s5mb$xA2br8}zsJRLy+b z*5!rASLpK$ZU1PuM}3=8cw*^UM$pg>REn{>7{yKl{=KVV=X6m}f7ntkw1@uba(!zI62_Etu zmmS+|xtFmz>Jcf#MOYs0B^o!p7 zXm2hp&Mdu9c*@)EL0d&vl!Jz;T<7UiE;`|eGJW=uMHS{#i+)>gE?*WovON9CzIyGJ zr|K8|^{Exgi$~gS9Dl0q1vS>L25)LVxiZ%AnQ2dVHqNQ(iY$n&|J|aS&N#L!ws}kX zrp+I|t7eP!-KV!GPu6Tzo_hM6$kVay&pmU~j>mre^bS*L*m+F7dna^spRxjKkB0x$ zjiJcQuxj}8~|>Q~QEHD86lU)2I3?-|;B^rosE(^QP-38^Os)Ime_ z0wis&hBxdDe3@1As&H26ioQ@^s4c=LZd9LN)j|Pvg}zs-RrlZH{|d!SqODC)g6ihi})XDZ%= zrWh(dqqr5{=fxD&xtd44UYj?)QeEty8*0!an46|8QP%+L8a|KdR~uD)NJPh1v@q{w znqPgMNK>Hzg%P5LUY=3k=TYztHIGrJ8|o*}zoPwf=nl2Ls#9-5U+eUfJ*s~dz5&u2 zz|K;8bt2HK9#M7wOo2^Rouy9m>7IN2oWg8k605^ns`h^Yj~D5DZKt14b`c9GwR9|_ zM+vCfAF$S-0rfD(GE_5I=M}5t)$|4+S@8i4>b6-LKGUgcZ}nmT;2G4#p;W*R@uaAy t8|UyI^E5nuzvf$HyjNE`jAp+&O`YXYtI$ie=)nUDH5A{7Pw6Wh`%gG0R0041 literal 0 HcmV?d00001 diff --git a/x/wasm/module_test.go b/x/wasm/module_test.go index f9dde8769e..8417225ade 100644 --- a/x/wasm/module_test.go +++ b/x/wasm/module_test.go @@ -35,7 +35,7 @@ type testData struct { } func setupTest(t *testing.T) testData { - ctx, keepers := CreateTestInput(t, false, "iterator,staking,stargate") + ctx, keepers := CreateTestInput(t, false, "iterator,staking,stargate,cosmwasm_1_1") cdc := keeper.MakeTestCodec(t) data := testData{ module: NewAppModule(cdc, keepers.WasmKeeper, keepers.StakingKeeper, keepers.AccountKeeper, keepers.BankKeeper), From 42758d3a13010420aa2cb6c721cd9c0457ff11f5 Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Fri, 9 Sep 2022 09:22:31 +0200 Subject: [PATCH 63/94] Rename features to availableCapabilities (#993) * Rename features to availableCapabilities as in wasmvm * Review feedback --- INTEGRATION.md | 2 +- app/app.go | 4 +- x/wasm/keeper/bench_test.go | 4 +- x/wasm/keeper/genesis_test.go | 2 +- x/wasm/keeper/ibc_test.go | 4 +- x/wasm/keeper/keeper.go | 10 +-- x/wasm/keeper/keeper_test.go | 92 +++++++++++++--------------- x/wasm/keeper/legacy_querier_test.go | 8 +-- x/wasm/keeper/options_test.go | 2 +- x/wasm/keeper/querier_test.go | 24 ++++---- x/wasm/keeper/recurse_test.go | 2 +- x/wasm/keeper/relay_test.go | 12 ++-- x/wasm/keeper/staking_test.go | 4 +- x/wasm/keeper/test_common.go | 8 +-- x/wasm/types/errors.go | 2 +- x/wasm/types/events.go | 8 +-- 16 files changed, 92 insertions(+), 96 deletions(-) diff --git a/INTEGRATION.md b/INTEGRATION.md index 2d7f508919..07000f1d5e 100644 --- a/INTEGRATION.md +++ b/INTEGRATION.md @@ -202,5 +202,5 @@ the SDK is implemented properly. Once you have tested this and are happy with the results, you can wire it up in `app.go`. Just edit [the default `NewKeeper` constructor](https://github.com/CosmWasm/wasmd/blob/v0.8.0-rc1/app/app.go#L257-L258) -to have the proper `supportedFeatures` and pass in the `CustomEncoder` and `CustomQuerier` as the last two arguments to `NewKeeper`. +to have the proper `availableCapabilities` and pass in the `CustomEncoder` and `CustomQuerier` as the last two arguments to `NewKeeper`. Now you can compile your chain and upload your custom contracts on it. \ No newline at end of file diff --git a/app/app.go b/app/app.go index a25e507607..ea10c348eb 100644 --- a/app/app.go +++ b/app/app.go @@ -507,7 +507,7 @@ func NewWasmApp( // The last arguments can contain custom message handlers, and custom query handlers, // if we want to allow any custom callbacks - supportedFeatures := "iterator,staking,stargate,cosmwasm_1_1" + availableCapabilities := "iterator,staking,stargate,cosmwasm_1_1" app.WasmKeeper = wasm.NewKeeper( appCodec, keys[wasm.StoreKey], @@ -524,7 +524,7 @@ func NewWasmApp( app.GRPCQueryRouter(), wasmDir, wasmConfig, - supportedFeatures, + availableCapabilities, wasmOpts..., ) diff --git a/x/wasm/keeper/bench_test.go b/x/wasm/keeper/bench_test.go index 1ad1693bb5..f32b39a0cb 100644 --- a/x/wasm/keeper/bench_test.go +++ b/x/wasm/keeper/bench_test.go @@ -51,7 +51,7 @@ func BenchmarkInstantiationOverhead(b *testing.B) { for name, spec := range specs { b.Run(name, func(b *testing.B) { wasmConfig := types.WasmConfig{MemoryCacheSize: 0} - ctx, keepers := createTestInput(b, false, SupportedFeatures, wasmConfig, spec.db()) + ctx, keepers := createTestInput(b, false, AvailableCapabilities, wasmConfig, spec.db()) example := InstantiateHackatomExampleContract(b, ctx, keepers) if spec.pinned { require.NoError(b, keepers.ContractKeeper.PinCode(ctx, example.CodeID)) @@ -86,7 +86,7 @@ func BenchmarkCompilation(b *testing.B) { b.Run(name, func(b *testing.B) { wasmConfig := types.WasmConfig{MemoryCacheSize: 0} db := dbm.NewMemDB() - ctx, keepers := createTestInput(b, false, SupportedFeatures, wasmConfig, db) + ctx, keepers := createTestInput(b, false, AvailableCapabilities, wasmConfig, db) // print out code size for comparisons code, err := os.ReadFile(spec.wasmFile) diff --git a/x/wasm/keeper/genesis_test.go b/x/wasm/keeper/genesis_test.go index f4e5b476aa..e5410aabb0 100644 --- a/x/wasm/keeper/genesis_test.go +++ b/x/wasm/keeper/genesis_test.go @@ -668,7 +668,7 @@ func setupKeeper(t *testing.T) (*Keeper, sdk.Context, []sdk.StoreKey) { wasmConfig := wasmTypes.DefaultWasmConfig() pk := paramskeeper.NewKeeper(encodingConfig.Marshaler, encodingConfig.Amino, keyParams, tkeyParams) - srcKeeper := NewKeeper(encodingConfig.Marshaler, keyWasm, pk.Subspace(wasmTypes.ModuleName), authkeeper.AccountKeeper{}, nil, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, tempDir, wasmConfig, SupportedFeatures) + srcKeeper := NewKeeper(encodingConfig.Marshaler, keyWasm, pk.Subspace(wasmTypes.ModuleName), authkeeper.AccountKeeper{}, nil, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, tempDir, wasmConfig, AvailableCapabilities) return &srcKeeper, ctx, []sdk.StoreKey{keyWasm, keyParams} } diff --git a/x/wasm/keeper/ibc_test.go b/x/wasm/keeper/ibc_test.go index 704e2f6c2a..ef04b583cb 100644 --- a/x/wasm/keeper/ibc_test.go +++ b/x/wasm/keeper/ibc_test.go @@ -11,14 +11,14 @@ import ( ) func TestDontBindPortNonIBCContract(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) example := InstantiateHackatomExampleContract(t, ctx, keepers) // ensure we bound the port _, _, err := keepers.IBCKeeper.PortKeeper.LookupModuleByPort(ctx, keepers.WasmKeeper.GetContractInfo(ctx, example.Contract).IBCPortID) require.Error(t, err) } func TestBindingPortForIBCContractOnInstantiate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) example := InstantiateIBCReflectContract(t, ctx, keepers) // ensure we bound the port owner, _, err := keepers.IBCKeeper.PortKeeper.LookupModuleByPort(ctx, keepers.WasmKeeper.GetContractInfo(ctx, example.Contract).IBCPortID) require.NoError(t, err) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index deb78d9db6..6e250e9f63 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -103,10 +103,10 @@ func NewKeeper( queryRouter GRPCQueryRouter, homeDir string, wasmConfig types.WasmConfig, - supportedFeatures string, + availableCapabilities string, opts ...Option, ) Keeper { - wasmer, err := wasmvm.NewVM(filepath.Join(homeDir, "wasm"), supportedFeatures, contractMemoryLimit, wasmConfig.ContractDebugMode, wasmConfig.MemoryCacheSize) + wasmer, err := wasmvm.NewVM(filepath.Join(homeDir, "wasm"), availableCapabilities, contractMemoryLimit, wasmConfig.ContractDebugMode, wasmConfig.MemoryCacheSize) if err != nil { panic(err) } @@ -196,7 +196,7 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, return 0, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) } codeID = k.autoIncrementID(ctx, types.KeyLastCodeID) - k.Logger(ctx).Debug("storing new contract", "features", report.RequiredFeatures, "code_id", codeID) + k.Logger(ctx).Debug("storing new contract", "capabilities", report.RequiredCapabilities, "code_id", codeID) codeInfo := types.NewCodeInfo(checksum, creator, *instantiateAccess) k.storeCodeInfo(ctx, codeID, codeInfo) @@ -204,8 +204,8 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, types.EventTypeStoreCode, sdk.NewAttribute(types.AttributeKeyCodeID, strconv.FormatUint(codeID, 10)), ) - for _, f := range strings.Split(report.RequiredFeatures, ",") { - evt.AppendAttributes(sdk.NewAttribute(types.AttributeKeyFeature, strings.TrimSpace(f))) + for _, f := range strings.Split(report.RequiredCapabilities, ",") { + evt.AppendAttributes(sdk.NewAttribute(types.AttributeKeyRequiredCapability, strings.TrimSpace(f))) } ctx.EventManager().EmitEvent(evt) diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index 5b3fc38073..0cde32592f 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -4,27 +4,23 @@ import ( "bytes" "encoding/json" "errors" - fuzz "github.com/google/gofuzz" - "github.com/tendermint/tendermint/libs/rand" "math" "os" "testing" "time" - distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - wasmvm "github.com/CosmWasm/wasmvm" wasmvmtypes "github.com/CosmWasm/wasmvm/types" - stypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - + distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + fuzz "github.com/google/gofuzz" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - + "github.com/tendermint/tendermint/libs/rand" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" @@ -42,15 +38,15 @@ func init() { var hackatomWasm []byte -const SupportedFeatures = "iterator,staking,stargate,cosmwasm_1_1" +const AvailableCapabilities = "iterator,staking,stargate,cosmwasm_1_1" func TestNewKeeper(t *testing.T) { - _, keepers := CreateTestInput(t, false, SupportedFeatures) + _, keepers := CreateTestInput(t, false, AvailableCapabilities) require.NotNil(t, keepers.ContractKeeper) } func TestCreateSuccess(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -70,14 +66,14 @@ func TestCreateSuccess(t *testing.T) { } func TestCreateNilCreatorAddress(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) _, err := keepers.ContractKeeper.Create(ctx, nil, hackatomWasm, nil) require.Error(t, err, "nil creator is not allowed") } func TestCreateNilWasmCode(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) @@ -86,7 +82,7 @@ func TestCreateNilWasmCode(t *testing.T) { } func TestCreateInvalidWasmCode(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) @@ -123,7 +119,7 @@ func TestCreateStoresInstantiatePermission(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper keepers.WasmKeeper.SetParams(ctx, types.Params{ CodeUploadAccess: types.AllowEverybody, @@ -142,7 +138,7 @@ func TestCreateStoresInstantiatePermission(t *testing.T) { } func TestCreateWithParamPermissions(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -188,7 +184,7 @@ func TestCreateWithParamPermissions(t *testing.T) { // ensure that the user cannot set the code instantiate permission to something more permissive // than the default func TestEnforceValidPermissionsOnCreate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper contractKeeper := keepers.ContractKeeper @@ -264,7 +260,7 @@ func TestEnforceValidPermissionsOnCreate(t *testing.T) { } func TestCreateDuplicate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -290,7 +286,7 @@ func TestCreateDuplicate(t *testing.T) { } func TestCreateWithSimulation(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) ctx = ctx.WithBlockHeader(tmproto.Header{Height: 1}). WithGasMeter(stypes.NewInfiniteGasMeter()) @@ -304,7 +300,7 @@ func TestCreateWithSimulation(t *testing.T) { require.Equal(t, uint64(1), contractID) // then try to create it in non-simulation mode (should not fail) - ctx, keepers = CreateTestInput(t, false, SupportedFeatures) + ctx, keepers = CreateTestInput(t, false, AvailableCapabilities) ctx = ctx.WithGasMeter(sdk.NewGasMeter(10_000_000)) creator = keepers.Faucet.NewFundedAccount(ctx, deposit...) contractID, err = keepers.ContractKeeper.Create(ctx, creator, hackatomWasm, nil) @@ -344,7 +340,7 @@ func TestIsSimulationMode(t *testing.T) { } func TestCreateWithGzippedPayload(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -363,7 +359,7 @@ func TestCreateWithGzippedPayload(t *testing.T) { } func TestCreateWithBrokenGzippedPayload(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -380,7 +376,7 @@ func TestCreateWithBrokenGzippedPayload(t *testing.T) { } func TestInstantiate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -470,7 +466,7 @@ func TestInstantiateWithDeposit(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper if spec.fundAddr { @@ -537,7 +533,7 @@ func TestInstantiateWithPermissions(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper fundAccounts(t, ctx, accKeeper, bankKeeper, spec.srcActor, deposit) @@ -551,7 +547,7 @@ func TestInstantiateWithPermissions(t *testing.T) { } func TestInstantiateWithNonExistingCodeID(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) @@ -567,7 +563,7 @@ func TestInstantiateWithNonExistingCodeID(t *testing.T) { } func TestInstantiateWithContractDataResponse(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) wasmerMock := &wasmtesting.MockWasmer{ InstantiateFn: func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, initMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { @@ -584,7 +580,7 @@ func TestInstantiateWithContractDataResponse(t *testing.T) { } func TestExecute(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -721,7 +717,7 @@ func TestExecuteWithDeposit(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper if spec.newBankParams != nil { bankKeeper.SetParams(ctx, *spec.newBankParams) @@ -755,7 +751,7 @@ func TestExecuteWithDeposit(t *testing.T) { } func TestExecuteWithNonExistingAddress(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -768,7 +764,7 @@ func TestExecuteWithNonExistingAddress(t *testing.T) { } func TestExecuteWithPanic(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -799,7 +795,7 @@ func TestExecuteWithPanic(t *testing.T) { } func TestExecuteWithCpuLoop(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -840,7 +836,7 @@ func TestExecuteWithCpuLoop(t *testing.T) { } func TestExecuteWithStorageLoop(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -881,7 +877,7 @@ func TestExecuteWithStorageLoop(t *testing.T) { } func TestMigrate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -1075,7 +1071,7 @@ func TestMigrate(t *testing.T) { } func TestMigrateReplacesTheSecondIndex(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) example := InstantiateHackatomExampleContract(t, ctx, keepers) // then assert a second index exists @@ -1109,7 +1105,7 @@ func TestMigrateReplacesTheSecondIndex(t *testing.T) { } func TestMigrateWithDispatchedMessage(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -1194,7 +1190,7 @@ func TestMigrateWithDispatchedMessage(t *testing.T) { } func TestIterateContractsByCode(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) k, c := keepers.WasmKeeper, keepers.ContractKeeper example1 := InstantiateHackatomExampleContract(t, ctx, keepers) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) @@ -1240,7 +1236,7 @@ func TestIterateContractsByCodeWithMigration(t *testing.T) { return &wasmvmtypes.Response{}, 1, nil }} wasmtesting.MakeInstantiable(&mockWasmVM) - ctx, keepers := CreateTestInput(t, false, SupportedFeatures, WithWasmEngine(&mockWasmVM)) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities, WithWasmEngine(&mockWasmVM)) k, c := keepers.WasmKeeper, keepers.ContractKeeper example1 := InstantiateHackatomExampleContract(t, ctx, keepers) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) @@ -1279,7 +1275,7 @@ type stealFundsMsg struct { } func TestSudo(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -1362,7 +1358,7 @@ func mustMarshal(t *testing.T, r interface{}) []byte { } func TestUpdateContractAdmin(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -1430,7 +1426,7 @@ func TestUpdateContractAdmin(t *testing.T) { } func TestClearContractAdmin(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -1493,7 +1489,7 @@ func TestClearContractAdmin(t *testing.T) { } func TestPinCode(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) k := keepers.WasmKeeper var capturedChecksums []wasmvm.Checksum @@ -1520,7 +1516,7 @@ func TestPinCode(t *testing.T) { } func TestUnpinCode(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) k := keepers.WasmKeeper var capturedChecksums []wasmvm.Checksum @@ -1554,7 +1550,7 @@ func TestUnpinCode(t *testing.T) { } func TestInitializePinnedCodes(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) k := keepers.WasmKeeper var capturedChecksums []wasmvm.Checksum @@ -1594,7 +1590,7 @@ func TestPinnedContractLoops(t *testing.T) { // a pinned contract that calls itself via submessages should terminate with an // error at some point - ctx, keepers := CreateTestInput(t, false, SupportedFeatures, WithWasmEngine(&mock)) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities, WithWasmEngine(&mock)) k := keepers.WasmKeeper example := SeedNewContractInstance(t, ctx, keepers, &mock) @@ -1710,7 +1706,7 @@ func TestNewDefaultWasmVMContractResponseHandler(t *testing.T) { } func TestReply(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) k := keepers.WasmKeeper var mock wasmtesting.MockWasmer wasmtesting.MakeInstantiable(&mock) @@ -1779,7 +1775,7 @@ func TestReply(t *testing.T) { } func TestQueryIsolation(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) k := keepers.WasmKeeper var mock wasmtesting.MockWasmer wasmtesting.MakeInstantiable(&mock) @@ -1857,7 +1853,7 @@ func TestBuildContractAddress(t *testing.T) { } func TestSetAccessConfig(t *testing.T) { - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures) + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) k := keepers.WasmKeeper creatorAddr := RandomAccountAddress(t) nonCreatorAddr := RandomAccountAddress(t) @@ -1940,7 +1936,7 @@ func TestSetAccessConfig(t *testing.T) { } func TestAppendToContractHistory(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) var contractAddr sdk.AccAddress = rand.Bytes(types.ContractAddrLen) var orderedEntries []types.ContractCodeHistoryEntry diff --git a/x/wasm/keeper/legacy_querier_test.go b/x/wasm/keeper/legacy_querier_test.go index dac7eaa784..1f22a5082c 100644 --- a/x/wasm/keeper/legacy_querier_test.go +++ b/x/wasm/keeper/legacy_querier_test.go @@ -17,7 +17,7 @@ import ( ) func TestLegacyQueryContractState(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -154,7 +154,7 @@ func TestLegacyQueryContractState(t *testing.T) { } func TestLegacyQueryContractListByCodeOrdering(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 1000000)) @@ -218,7 +218,7 @@ func TestLegacyQueryContractListByCodeOrdering(t *testing.T) { } func TestLegacyQueryContractHistory(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper var otherAddr sdk.AccAddress = bytes.Repeat([]byte{0x2}, types.ContractAddrLen) @@ -329,7 +329,7 @@ func TestLegacyQueryCodeList(t *testing.T) { for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper for _, codeID := range spec.codeIDs { diff --git a/x/wasm/keeper/options_test.go b/x/wasm/keeper/options_test.go index 6e50c7ba96..07195e0468 100644 --- a/x/wasm/keeper/options_test.go +++ b/x/wasm/keeper/options_test.go @@ -84,7 +84,7 @@ func TestConstructorOptions(t *testing.T) { } for name, spec := range specs { t.Run(name, func(t *testing.T) { - k := NewKeeper(nil, nil, paramtypes.NewSubspace(nil, nil, nil, nil, ""), authkeeper.AccountKeeper{}, nil, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, "tempDir", types.DefaultWasmConfig(), SupportedFeatures, spec.srcOpt) + k := NewKeeper(nil, nil, paramtypes.NewSubspace(nil, nil, nil, nil, ""), authkeeper.AccountKeeper{}, nil, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, "tempDir", types.DefaultWasmConfig(), AvailableCapabilities, spec.srcOpt) spec.verify(t, k) }) } diff --git a/x/wasm/keeper/querier_test.go b/x/wasm/keeper/querier_test.go index 88ee6d3aa4..21df7f94fd 100644 --- a/x/wasm/keeper/querier_test.go +++ b/x/wasm/keeper/querier_test.go @@ -27,7 +27,7 @@ import ( ) func TestQueryAllContractState(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) @@ -114,7 +114,7 @@ func TestQueryAllContractState(t *testing.T) { } func TestQuerySmartContractState(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) @@ -157,7 +157,7 @@ func TestQuerySmartContractState(t *testing.T) { } func TestQuerySmartContractPanics(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) contractAddr := BuildContractAddress(1, 1) keepers.WasmKeeper.storeCodeInfo(ctx, 1, types.CodeInfo{}) keepers.WasmKeeper.storeContractInfo(ctx, contractAddr, &types.ContractInfo{ @@ -202,7 +202,7 @@ func TestQuerySmartContractPanics(t *testing.T) { } func TestQueryRawContractState(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) @@ -257,7 +257,7 @@ func TestQueryRawContractState(t *testing.T) { } func TestQueryContractListByCodeOrdering(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 1000000)) @@ -313,7 +313,7 @@ func TestQueryContractListByCodeOrdering(t *testing.T) { } func TestQueryContractHistory(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper var ( @@ -457,7 +457,7 @@ func TestQueryCodeList(t *testing.T) { wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper specs := map[string]struct { @@ -533,7 +533,7 @@ func TestQueryContractInfo(t *testing.T) { contractAddr = RandomAccountAddress(t) anyDate = time.Now().UTC() ) - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) // register an example extension. must be protobuf keepers.EncodingConfig.InterfaceRegistry.RegisterImplementations( (*types.ContractInfoExtension)(nil), @@ -599,7 +599,7 @@ func TestQueryContractInfo(t *testing.T) { } func TestQueryPinnedCodes(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper exampleContract1 := InstantiateHackatomExampleContract(t, ctx, keepers) @@ -656,7 +656,7 @@ func TestQueryPinnedCodes(t *testing.T) { } func TestQueryParams(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper q := Querier(keeper) @@ -687,7 +687,7 @@ func TestQueryCodeInfo(t *testing.T) { wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper anyAddress, err := sdk.AccAddressFromBech32("cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz") @@ -742,7 +742,7 @@ func TestQueryCodeInfoList(t *testing.T) { wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.WasmKeeper anyAddress, err := sdk.AccAddressFromBech32("cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz") diff --git a/x/wasm/keeper/recurse_test.go b/x/wasm/keeper/recurse_test.go index 18778a52d7..5a16da7878 100644 --- a/x/wasm/keeper/recurse_test.go +++ b/x/wasm/keeper/recurse_test.go @@ -45,7 +45,7 @@ func initRecurseContract(t *testing.T) (contract sdk.AccAddress, creator sdk.Acc return realWasmQuerier.HandleQuery(ctx, caller, request) }) } - ctx, keepers := CreateTestInput(t, false, SupportedFeatures, WithQueryHandlerDecorator(countingQuerierDec)) + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities, WithQueryHandlerDecorator(countingQuerierDec)) keeper = keepers.WasmKeeper exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) return exampleContract.Contract, exampleContract.CreatorAddr, ctx, keeper diff --git a/x/wasm/keeper/relay_test.go b/x/wasm/keeper/relay_test.go index dd9c3da231..a1d2819e50 100644 --- a/x/wasm/keeper/relay_test.go +++ b/x/wasm/keeper/relay_test.go @@ -20,7 +20,7 @@ func TestOnOpenChannel(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 @@ -90,7 +90,7 @@ func TestOnConnectChannel(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 @@ -201,7 +201,7 @@ func TestOnCloseChannel(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 @@ -311,7 +311,7 @@ func TestOnRecvPacket(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 const storageCosts = sdk.Gas(2903) @@ -473,7 +473,7 @@ func TestOnAckPacket(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 @@ -578,7 +578,7 @@ func TestOnTimeoutPacket(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 diff --git a/x/wasm/keeper/staking_test.go b/x/wasm/keeper/staking_test.go index 633cbcf1fa..15f0e0ac70 100644 --- a/x/wasm/keeper/staking_test.go +++ b/x/wasm/keeper/staking_test.go @@ -93,7 +93,7 @@ type InvestmentResponse struct { } func TestInitializeStaking(t *testing.T) { - ctx, k := CreateTestInput(t, false, SupportedFeatures) + ctx, k := CreateTestInput(t, false, AvailableCapabilities) accKeeper, stakingKeeper, keeper, bankKeeper := k.AccountKeeper, k.StakingKeeper, k.ContractKeeper, k.BankKeeper valAddr := addValidator(t, ctx, stakingKeeper, k.Faucet, sdk.NewInt64Coin("stake", 1234567)) @@ -168,7 +168,7 @@ type initInfo struct { } func initializeStaking(t *testing.T) initInfo { - ctx, k := CreateTestInput(t, false, SupportedFeatures) + ctx, k := CreateTestInput(t, false, AvailableCapabilities) accKeeper, stakingKeeper, keeper, bankKeeper := k.AccountKeeper, k.StakingKeeper, k.WasmKeeper, k.BankKeeper valAddr := addValidator(t, ctx, stakingKeeper, k.Faucet, sdk.NewInt64Coin("stake", 1000000)) diff --git a/x/wasm/keeper/test_common.go b/x/wasm/keeper/test_common.go index 9fedc3e7f1..8b0f782047 100644 --- a/x/wasm/keeper/test_common.go +++ b/x/wasm/keeper/test_common.go @@ -189,16 +189,16 @@ func CreateDefaultTestInput(t testing.TB) (sdk.Context, TestKeepers) { } // CreateTestInput encoders can be nil to accept the defaults, or set it to override some of the message handlers (like default) -func CreateTestInput(t testing.TB, isCheckTx bool, supportedFeatures string, opts ...Option) (sdk.Context, TestKeepers) { +func CreateTestInput(t testing.TB, isCheckTx bool, availableCapabilities string, opts ...Option) (sdk.Context, TestKeepers) { // Load default wasm config - return createTestInput(t, isCheckTx, supportedFeatures, types.DefaultWasmConfig(), dbm.NewMemDB(), opts...) + return createTestInput(t, isCheckTx, availableCapabilities, types.DefaultWasmConfig(), dbm.NewMemDB(), opts...) } // encoders can be nil to accept the defaults, or set it to override some of the message handlers (like default) func createTestInput( t testing.TB, isCheckTx bool, - supportedFeatures string, + availableCapabilities string, wasmConfig types.WasmConfig, db dbm.DB, opts ...Option, @@ -386,7 +386,7 @@ func createTestInput( querier, tempDir, wasmConfig, - supportedFeatures, + availableCapabilities, opts..., ) keeper.SetParams(ctx, types.DefaultParams()) diff --git a/x/wasm/types/errors.go b/x/wasm/types/errors.go index 50814f8131..7accd72bcb 100644 --- a/x/wasm/types/errors.go +++ b/x/wasm/types/errors.go @@ -55,7 +55,7 @@ var ( // ErrMaxIBCChannels error for maximum number of ibc channels reached ErrMaxIBCChannels = sdkErrors.Register(DefaultCodespace, 16, "max transfer channels") - // ErrUnsupportedForContract error when a feature is used that is not supported for/ by this contract + // ErrUnsupportedForContract error when a capability is used that is not supported for/ by this contract ErrUnsupportedForContract = sdkErrors.Register(DefaultCodespace, 17, "unsupported for this contract") // ErrPinContractFailed error for pinning contract failures diff --git a/x/wasm/types/events.go b/x/wasm/types/events.go index 0c32476f54..251b95f042 100644 --- a/x/wasm/types/events.go +++ b/x/wasm/types/events.go @@ -21,8 +21,8 @@ const ( const ( AttributeReservedPrefix = "_" - AttributeKeyContractAddr = "_contract_address" - AttributeKeyCodeID = "code_id" - AttributeKeyResultDataHex = "result" - AttributeKeyFeature = "feature" + AttributeKeyContractAddr = "_contract_address" + AttributeKeyCodeID = "code_id" + AttributeKeyResultDataHex = "result" + AttributeKeyRequiredCapability = "required_capability" ) From eb1c95a9a7075063f8ac808886aa2273fa221c1e Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 9 Sep 2022 11:20:53 +0200 Subject: [PATCH 64/94] Link to medium article --- INTEGRATION.md | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/INTEGRATION.md b/INTEGRATION.md index 07000f1d5e..b336ab9085 100644 --- a/INTEGRATION.md +++ b/INTEGRATION.md @@ -3,7 +3,10 @@ # Integration If you want to use Wasm in your own app, here is how you can get this working -quickly and easily. First, check to make sure you fit the pre-requisites, +quickly and easily. +First start with This [article](https://medium.com/cosmwasm/cosmwasm-for-ctos-iv-native-integrations-713140bf75fc) +in the "CosmWasm for CTOs" series that gives you a high level view. +Then check to make sure you fit the pre-requisites, then integrate the `x/wasm` module as described below, and finally, you can add custom messages and queries to your custom Go/SDK modules, exposing them to any chain-specific contract. @@ -14,26 +17,18 @@ The pre-requisites of integrating `x/wasm` into your custom app is to be using a compatible version of the Cosmos SDK, and to accept some limits to the hardware it runs on. -| wasmd | Cosmos SDK | -|:------:|:-----------:| -| v0.24 | v0.45.0 | -| v0.23 | v0.45.0 | -| v0.22 | v0.45.0 | -| v0.21 | v0.42.x | -| v0.20 | v0.42.x | -| v0.19 | v0.42.x | -| v0.18 | v0.42.x | -| v0.17 | v0.42.x | -| v0.16 | v0.42.x | -| v0.15 | v0.41.x | -| v0.14 | v0.40.x | -| v0.13 | v0.40.0-rc3 | -| v0.12 | v0.40.0-rc3 | -| v0.11 | v0.39.1 | -| v0.10 | v0.39.1 | -| v0.9 | v0.38.3 | -| v0.8 | v0.38.3 | -| v0.7 | v0.38.3 | +| wasmd | Cosmos SDK | +|:-----:|:----------:| +| v0.29 | v0.45.8 | +| v0.28 | v0.45.5 | +| v0.27 | v0.45.4 | +| v0.26 | v0.45.1 | +| v0.25 | v0.45.1 | +| v0.24 | v0.45.0 | +| v0.23 | v0.45.0 | +| v0.22 | v0.45.0 | +| v0.21 | v0.42.x | + We currently only support Intel/AMD64 CPUs and OSX or Linux. For Linux, the standard build commands work for `glibc` systems (Ubuntu, Debian, CentOS, etc). If you wish to compile From ccb2fdd0b6ed849eb94d58e0174f4fc34bce336c Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 26 Aug 2022 15:06:03 +0200 Subject: [PATCH 65/94] Make contract addresses predictable --- app/test_helpers.go | 23 + docs/proto/proto-docs.md | 1 + proto/cosmwasm/wasm/v1/tx.proto | 2 + x/wasm/alias.go | 1 - x/wasm/client/cli/genesis_msg.go | 76 +-- x/wasm/client/cli/genesis_msg_test.go | 119 ++-- x/wasm/client/cli/query.go | 32 ++ x/wasm/genesis_test.go | 4 +- x/wasm/ibctesting/wasm.go | 1 + x/wasm/keeper/contract_keeper.go | 4 +- x/wasm/keeper/genesis.go | 8 +- x/wasm/keeper/genesis_test.go | 99 ++-- x/wasm/keeper/handler_plugin_test.go | 2 +- x/wasm/keeper/ibc_test.go | 4 +- x/wasm/keeper/keeper.go | 212 +++++-- x/wasm/keeper/keeper_test.go | 522 +++++++++++++----- x/wasm/keeper/legacy_querier_test.go | 12 +- x/wasm/keeper/migrations.go | 27 + x/wasm/keeper/migrations_test.go | 20 + x/wasm/keeper/msg_server.go | 5 +- x/wasm/keeper/msg_server_integration_test.go | 46 ++ x/wasm/keeper/options.go | 58 ++ x/wasm/keeper/options_test.go | 32 +- x/wasm/keeper/proposal_handler.go | 2 +- x/wasm/keeper/proposal_integration_test.go | 26 +- x/wasm/keeper/querier_test.go | 11 +- x/wasm/keeper/reflect_test.go | 34 +- x/wasm/keeper/snapshotter_integration_test.go | 5 +- x/wasm/keeper/staking_test.go | 24 +- x/wasm/keeper/submsg_test.go | 20 +- x/wasm/keeper/test_common.go | 64 ++- x/wasm/module.go | 7 +- x/wasm/module_test.go | 23 +- x/wasm/simulation/genesis.go | 1 - x/wasm/types/events.go | 1 + x/wasm/types/exported_keepers.go | 2 +- x/wasm/types/keys.go | 3 +- x/wasm/types/proposal.go | 2 +- x/wasm/types/tx.go | 2 +- x/wasm/types/tx.pb.go | 145 +++-- x/wasm/types/tx_test.go | 1 + x/wasm/types/types.go | 2 +- x/wasm/types/validation.go | 3 +- 43 files changed, 1175 insertions(+), 513 deletions(-) create mode 100644 x/wasm/keeper/migrations.go create mode 100644 x/wasm/keeper/migrations_test.go create mode 100644 x/wasm/keeper/msg_server_integration_test.go diff --git a/app/test_helpers.go b/app/test_helpers.go index ccf49656a6..e37db12789 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -71,6 +71,29 @@ func setup(t testing.TB, withGenesis bool, invCheckPeriod uint, opts ...wasm.Opt return app, GenesisState{} } +// Setup initializes a new WasmApp with DefaultNodeHome for integration tests +func Setup(isCheckTx bool, opts ...wasm.Option) *WasmApp { + db := dbm.NewMemDB() + app := NewWasmApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 5, MakeEncodingConfig(), wasm.EnableAllProposals, EmptyBaseAppOptions{}, opts) + + if !isCheckTx { + genesisState := NewDefaultGenesisState() + stateBytes, err := json.MarshalIndent(genesisState, "", " ") + if err != nil { + panic(err) + } + + app.InitChain( + abci.RequestInitChain{ + Validators: []abci.ValidatorUpdate{}, + ConsensusParams: DefaultConsensusParams, + AppStateBytes: stateBytes, + }, + ) + } + return app +} + // SetupWithGenesisValSet initializes a new WasmApp with a validator set and genesis accounts // that also act as delegators. For simplicity, each validator is bonded with a delegation // of one consensus engine unit (10^6) in the default token of the WasmApp from first genesis diff --git a/docs/proto/proto-docs.md b/docs/proto/proto-docs.md index e62564dc73..584398a709 100644 --- a/docs/proto/proto-docs.md +++ b/docs/proto/proto-docs.md @@ -430,6 +430,7 @@ MsgStoreCodeResponse returns store result data. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | `code_id` | [uint64](#uint64) | | CodeID is the reference to the stored WASM code | +| `checksum` | [bytes](#bytes) | | Checksum is the sha256 hash of the stored code | diff --git a/proto/cosmwasm/wasm/v1/tx.proto b/proto/cosmwasm/wasm/v1/tx.proto index 8295907eb8..f1eb8fec68 100644 --- a/proto/cosmwasm/wasm/v1/tx.proto +++ b/proto/cosmwasm/wasm/v1/tx.proto @@ -41,6 +41,8 @@ message MsgStoreCode { message MsgStoreCodeResponse { // CodeID is the reference to the stored WASM code uint64 code_id = 1 [ (gogoproto.customname) = "CodeID" ]; + // Checksum is the sha256 hash of the stored code + bytes checksum = 2; } // MsgInstantiateContract create a new smart contract instance for the given diff --git a/x/wasm/alias.go b/x/wasm/alias.go index 67a79ac541..09f0e7af00 100644 --- a/x/wasm/alias.go +++ b/x/wasm/alias.go @@ -86,7 +86,6 @@ var ( ErrQueryFailed = types.ErrQueryFailed ErrInvalidMsg = types.ErrInvalidMsg KeyLastCodeID = types.KeyLastCodeID - KeyLastInstanceID = types.KeyLastInstanceID CodeKeyPrefix = types.CodeKeyPrefix ContractKeyPrefix = types.ContractKeyPrefix ContractStorePrefix = types.ContractStorePrefix diff --git a/x/wasm/client/cli/genesis_msg.go b/x/wasm/client/cli/genesis_msg.go index 7ed5a7f290..d7936e0145 100644 --- a/x/wasm/client/cli/genesis_msg.go +++ b/x/wasm/client/cli/genesis_msg.go @@ -103,7 +103,7 @@ func GenesisInstantiateContractCmd(defaultNodeHome string, genesisMutator Genesi } return genesisMutator.AlterWasmModuleState(cmd, func(state *types.GenesisState, appState map[string]json.RawMessage) error { - // simple sanity check that sender has some balance although it may be consumed by appState previous message already + // simple sanity check that sender has some balance, although it may be consumed by appState previous message already switch ok, err := hasAccountBalance(cmd, appState, senderAddr, msg.Funds); { case err != nil: return err @@ -112,7 +112,7 @@ func GenesisInstantiateContractCmd(defaultNodeHome string, genesisMutator Genesi } // does code id exists? - codeInfos, err := GetAllCodes(state) + codeInfos := GetAllCodes(state) if err != nil { return err } @@ -171,7 +171,7 @@ func GenesisExecuteContractCmd(defaultNodeHome string, genesisMutator GenesisMut } return genesisMutator.AlterWasmModuleState(cmd, func(state *types.GenesisState, appState map[string]json.RawMessage) error { - // simple sanity check that sender has some balance although it may be consumed by appState previous message already + // simple sanity check that sender has some balance, although it may be consumed by appState previous message already switch ok, err := hasAccountBalance(cmd, appState, senderAddr, msg.Funds); { case err != nil: return err @@ -211,7 +211,7 @@ func GenesisListCodesCmd(defaultNodeHome string, genReader GenesisReader) *cobra if err != nil { return err } - all, err := GetAllCodes(g.WasmModuleState) + all := GetAllCodes(g.WasmModuleState) if err != nil { return err } @@ -236,7 +236,10 @@ func GenesisListContractsCmd(defaultNodeHome string, genReader GenesisReader) *c return err } state := g.WasmModuleState - all := GetAllContracts(state) + all, err := GetAllContracts(state) + if err != nil { + return err + } return printJSONOutput(cmd, all) }, } @@ -245,7 +248,7 @@ func GenesisListContractsCmd(defaultNodeHome string, genReader GenesisReader) *c return cmd } -// clientCtx marshaller works only with proto or bytes so we marshal the output ourself +// clientCtx marshaller works only with proto or bytes, so we marshal the output ourselves func printJSONOutput(cmd *cobra.Command, obj interface{}) error { clientCtx := client.GetClientContextFromCmd(cmd) bz, err := json.MarshalIndent(obj, "", " ") @@ -260,7 +263,7 @@ type CodeMeta struct { Info types.CodeInfo `json:"info"` } -func GetAllCodes(state *types.GenesisState) ([]CodeMeta, error) { +func GetAllCodes(state *types.GenesisState) []CodeMeta { all := make([]CodeMeta, len(state.Codes)) for i, c := range state.Codes { all[i] = CodeMeta{ @@ -277,10 +280,7 @@ func GetAllCodes(state *types.GenesisState) ([]CodeMeta, error) { accessConfig = *msg.InstantiatePermission } else { // default - creator, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return nil, fmt.Errorf("sender: %s", err) - } + creator := sdk.MustAccAddressFromBech32(msg.Sender) accessConfig = state.Params.InstantiateDefaultPermission.With(creator) } hash := sha256.Sum256(msg.WASMByteCode) @@ -295,7 +295,7 @@ func GetAllCodes(state *types.GenesisState) ([]CodeMeta, error) { seq++ } } - return all, nil + return all } type ContractMeta struct { @@ -303,7 +303,18 @@ type ContractMeta struct { Info types.ContractInfo `json:"info"` } -func GetAllContracts(state *types.GenesisState) []ContractMeta { +// returns nil when not found +func codeHashByID(state *types.GenesisState, codeID uint64) []byte { + codes := GetAllCodes(state) + for _, v := range codes { + if v.CodeID == codeID { + return v.Info.CodeHash + } + } + return nil +} + +func GetAllContracts(state *types.GenesisState) ([]ContractMeta, error) { all := make([]ContractMeta, len(state.Contracts)) for i, c := range state.Contracts { all[i] = ContractMeta{ @@ -312,11 +323,18 @@ func GetAllContracts(state *types.GenesisState) []ContractMeta { } } // add inflight - seq := contractSeqValue(state) for _, m := range state.GenMsgs { if msg := m.GetInstantiateContract(); msg != nil { + senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(fmt.Sprintf("unsupported address %q: %s", msg.Sender, err)) + } + codeHash := codeHashByID(state, msg.CodeID) + if codeHash == nil { + return nil, types.ErrNotFound.Wrapf("hash for code-id: %d", msg.CodeID) + } all = append(all, ContractMeta{ - ContractAddress: keeper.BuildContractAddress(msg.CodeID, seq).String(), + ContractAddress: keeper.BuildContractAddress(codeHash, senderAddr, msg.Label).String(), Info: types.ContractInfo{ CodeID: msg.CodeID, Creator: msg.Sender, @@ -324,10 +342,9 @@ func GetAllContracts(state *types.GenesisState) []ContractMeta { Label: msg.Label, }, }) - seq++ } } - return all + return all, nil } func hasAccountBalance(cmd *cobra.Command, appState map[string]json.RawMessage, sender sdk.AccAddress, coins sdk.Coins) (bool, error) { @@ -354,13 +371,19 @@ func hasContract(state *types.GenesisState, contractAddr string) bool { return true } } - seq := contractSeqValue(state) for _, m := range state.GenMsgs { if msg := m.GetInstantiateContract(); msg != nil { - if keeper.BuildContractAddress(msg.CodeID, seq).String() == contractAddr { + senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(fmt.Sprintf("unsupported address %q: %s", msg.Sender, err)) + } + hash := codeHashByID(state, msg.CodeID) + if hash == nil { + panic(fmt.Sprintf("unknown code id: %d", msg.CodeID)) + } + if keeper.BuildContractAddress(hash, senderAddr, msg.Label).String() == contractAddr { return true } - seq++ } } return false @@ -453,19 +476,6 @@ func (x DefaultGenesisIO) AlterWasmModuleState(cmd *cobra.Command, callback func return genutil.ExportGenesisFile(g.GenDoc, g.GenesisFile) } -// contractSeqValue reads the contract sequence from the genesis or -// returns default start value used in the keeper -func contractSeqValue(state *types.GenesisState) uint64 { - var seq uint64 = 1 - for _, s := range state.Sequences { - if bytes.Equal(s.IDKey, types.KeyLastInstanceID) { - seq = s.Value - break - } - } - return seq -} - // codeSeqValue reads the code sequence from the genesis or // returns default start value used in the keeper func codeSeqValue(state *types.GenesisState) uint64 { diff --git a/x/wasm/client/cli/genesis_msg_test.go b/x/wasm/client/cli/genesis_msg_test.go index 78a1c53b58..6b67aa4942 100644 --- a/x/wasm/client/cli/genesis_msg_test.go +++ b/x/wasm/client/cli/genesis_msg_test.go @@ -1,12 +1,15 @@ package cli import ( + "bytes" "context" "encoding/json" "os" "path" "testing" + "github.com/cosmos/cosmos-sdk/types/address" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/hd" @@ -363,7 +366,8 @@ func TestInstantiateContractCmd(t *testing.T) { } func TestExecuteContractCmd(t *testing.T) { - const firstContractAddress = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" + mySenderAddr := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) + myFirstContractAddress := keeper.BuildContractAddress([]byte("myCodeHash"), mySenderAddr, "my").String() minimalWasmGenesis := types.GenesisState{ Params: types.DefaultParams(), } @@ -390,7 +394,7 @@ func TestExecuteContractCmd(t *testing.T) { }, Contracts: []types.Contract{ { - ContractAddress: firstContractAddress, + ContractAddress: myFirstContractAddress, ContractInfo: types.ContractInfoFixture(func(info *types.ContractInfo) { info.Created = nil }), @@ -399,53 +403,34 @@ func TestExecuteContractCmd(t *testing.T) { }, }, mutator: func(cmd *cobra.Command) { - cmd.SetArgs([]string{firstContractAddress, `{}`}) + cmd.SetArgs([]string{myFirstContractAddress, `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", myWellFundedAccount) }, expMsgCount: 1, }, - "all good with contract from genesis store messages without initial sequence": { - srcGenesis: types.GenesisState{ - Params: types.DefaultParams(), - Codes: []types.Code{ - { - CodeID: 1, - CodeInfo: types.CodeInfoFixture(), - CodeBytes: wasmIdent, - }, - }, - GenMsgs: []types.GenesisState_GenMsgs{ - {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: types.MsgInstantiateContractFixture()}}, - }, - }, - mutator: func(cmd *cobra.Command) { - cmd.SetArgs([]string{firstContractAddress, `{}`}) - flagSet := cmd.Flags() - flagSet.Set("run-as", myWellFundedAccount) - }, - expMsgCount: 2, - }, - "all good with contract from genesis store messages and contract sequence set": { + "all good with contract from genesis store messages": { srcGenesis: types.GenesisState{ Params: types.DefaultParams(), Codes: []types.Code{ { - CodeID: 1, - CodeInfo: types.CodeInfoFixture(), + CodeID: 1, + CodeInfo: types.CodeInfoFixture(func(info *types.CodeInfo) { + info.CodeHash = []byte("myCodeHash") + }), CodeBytes: wasmIdent, }, }, GenMsgs: []types.GenesisState_GenMsgs{ - {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: types.MsgInstantiateContractFixture()}}, - }, - Sequences: []types.Sequence{ - {IDKey: types.KeyLastInstanceID, Value: 100}, + {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: types.MsgInstantiateContractFixture( + func(m *types.MsgInstantiateContract) { + m.Sender = mySenderAddr.String() + m.Label = "my" + })}}, }, }, mutator: func(cmd *cobra.Command) { - // See TestBuildContractAddress in keeper_test.go - cmd.SetArgs([]string{"cosmos1mujpjkwhut9yjw4xueyugc02evfv46y0dtmnz4lh8xxkkdapym9stu5qm8", `{}`}) + cmd.SetArgs([]string{myFirstContractAddress, `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", myWellFundedAccount) }, @@ -472,7 +457,7 @@ func TestExecuteContractCmd(t *testing.T) { }, Contracts: []types.Contract{ { - ContractAddress: firstContractAddress, + ContractAddress: myFirstContractAddress, ContractInfo: types.ContractInfoFixture(func(info *types.ContractInfo) { info.Created = nil }), @@ -481,7 +466,7 @@ func TestExecuteContractCmd(t *testing.T) { }, }, mutator: func(cmd *cobra.Command) { - cmd.SetArgs([]string{firstContractAddress, `{}`}) + cmd.SetArgs([]string{myFirstContractAddress, `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", keeper.RandomBech32AccountAddress(t)) }, @@ -499,7 +484,7 @@ func TestExecuteContractCmd(t *testing.T) { }, Contracts: []types.Contract{ { - ContractAddress: firstContractAddress, + ContractAddress: myFirstContractAddress, ContractInfo: types.ContractInfoFixture(func(info *types.ContractInfo) { info.Created = nil }), @@ -508,7 +493,7 @@ func TestExecuteContractCmd(t *testing.T) { }, }, mutator: func(cmd *cobra.Command) { - cmd.SetArgs([]string{firstContractAddress, `{}`}) + cmd.SetArgs([]string{myFirstContractAddress, `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", myWellFundedAccount) flagSet.Set("amount", "100stake") @@ -527,7 +512,7 @@ func TestExecuteContractCmd(t *testing.T) { }, Contracts: []types.Contract{ { - ContractAddress: firstContractAddress, + ContractAddress: myFirstContractAddress, ContractInfo: types.ContractInfoFixture(func(info *types.ContractInfo) { info.Created = nil }), @@ -536,7 +521,7 @@ func TestExecuteContractCmd(t *testing.T) { }, }, mutator: func(cmd *cobra.Command) { - cmd.SetArgs([]string{firstContractAddress, `{}`}) + cmd.SetArgs([]string{myFirstContractAddress, `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", keeper.RandomBech32AccountAddress(t)) flagSet.Set("amount", "10stake") @@ -565,6 +550,9 @@ func TestExecuteContractCmd(t *testing.T) { } func TestGetAllContracts(t *testing.T) { + creatorAddr1 := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) + creatorAddr2 := sdk.AccAddress(bytes.Repeat([]byte{2}, address.Len)) + specs := map[string]struct { src types.GenesisState exp []ContractMeta @@ -595,68 +583,55 @@ func TestGetAllContracts(t *testing.T) { }, "read from message state": { src: types.GenesisState{ + Codes: []types.Code{{CodeID: 1, CodeInfo: types.CodeInfo{CodeHash: []byte("firstCodeHash")}}}, GenMsgs: []types.GenesisState_GenMsgs{ - {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Label: "first"}}}, - {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Label: "second"}}}, + {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Sender: creatorAddr1.String(), Label: "first", CodeID: 1}}}, + {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Sender: creatorAddr2.String(), Label: "second", CodeID: 1}}}, }, }, exp: []ContractMeta{ { - ContractAddress: keeper.BuildContractAddress(0, 1).String(), - Info: types.ContractInfo{Label: "first"}, - }, - { - ContractAddress: keeper.BuildContractAddress(0, 2).String(), - Info: types.ContractInfo{Label: "second"}, - }, - }, - }, - "read from message state with contract sequence": { - src: types.GenesisState{ - Sequences: []types.Sequence{ - {IDKey: types.KeyLastInstanceID, Value: 100}, - }, - GenMsgs: []types.GenesisState_GenMsgs{ - {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Label: "hundred"}}}, + ContractAddress: keeper.BuildContractAddress([]byte("firstCodeHash"), creatorAddr1, "first").String(), + Info: types.ContractInfo{Creator: creatorAddr1.String(), Label: "first", CodeID: 1}, }, - }, - exp: []ContractMeta{ { - ContractAddress: keeper.BuildContractAddress(0, 100).String(), - Info: types.ContractInfo{Label: "hundred"}, + ContractAddress: keeper.BuildContractAddress([]byte("firstCodeHash"), creatorAddr2, "second").String(), + Info: types.ContractInfo{Creator: creatorAddr2.String(), Label: "second", CodeID: 1}, }, }, }, "read from contract and message state with contract sequence": { src: types.GenesisState{ + Codes: []types.Code{ + {CodeID: 1, CodeInfo: types.CodeInfo{CodeHash: []byte("firstCodeHash")}}, + {CodeID: 100, CodeInfo: types.CodeInfo{CodeHash: []byte("otherCodeHash")}}, + }, Contracts: []types.Contract{ { - ContractAddress: "first-contract", - ContractInfo: types.ContractInfo{Label: "first"}, + ContractAddress: keeper.BuildContractAddress([]byte("firstCodeHash"), creatorAddr1, "first").String(), + ContractInfo: types.ContractInfo{Label: "first", CodeID: 1}, }, }, - Sequences: []types.Sequence{ - {IDKey: types.KeyLastInstanceID, Value: 100}, - }, GenMsgs: []types.GenesisState_GenMsgs{ - {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Label: "hundred"}}}, + {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Sender: creatorAddr1.String(), Label: "hundred", CodeID: 100}}}, }, }, exp: []ContractMeta{ { - ContractAddress: "first-contract", - Info: types.ContractInfo{Label: "first"}, + ContractAddress: keeper.BuildContractAddress([]byte("firstCodeHash"), creatorAddr1, "first").String(), + Info: types.ContractInfo{Label: "first", CodeID: 1}, }, { - ContractAddress: keeper.BuildContractAddress(0, 100).String(), - Info: types.ContractInfo{Label: "hundred"}, + ContractAddress: keeper.BuildContractAddress([]byte("otherCodeHash"), creatorAddr1, "hundred").String(), + Info: types.ContractInfo{Creator: creatorAddr1.String(), Label: "hundred", CodeID: 100}, }, }, }, } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - got := GetAllContracts(&spec.src) + got, err := GetAllContracts(&spec.src) + require.NoError(t, err) assert.Equal(t, spec.exp, got) }) } diff --git a/x/wasm/client/cli/query.go b/x/wasm/client/cli/query.go index 5114d56832..f399bfd7d6 100644 --- a/x/wasm/client/cli/query.go +++ b/x/wasm/client/cli/query.go @@ -17,6 +17,7 @@ import ( "github.com/spf13/cobra" flag "github.com/spf13/pflag" + "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/CosmWasm/wasmd/x/wasm/types" ) @@ -39,6 +40,7 @@ func GetQueryCmd() *cobra.Command { GetCmdListPinnedCode(), GetCmdLibVersion(), GetCmdQueryParams(), + GetCmdBuildAddress(), ) return queryCmd } @@ -63,6 +65,33 @@ func GetCmdLibVersion() *cobra.Command { return cmd } +// GetCmdBuildAddress build a contract address +func GetCmdBuildAddress() *cobra.Command { + cmd := &cobra.Command{ + Use: "build-address [code-hash] [creator-address] [label]", + Short: "build contract address", + Aliases: []string{"address"}, + Args: cobra.ExactArgs(3), + RunE: func(cmd *cobra.Command, args []string) error { + codeHash, err := hex.DecodeString(args[0]) + if err != nil { + return fmt.Errorf("code-hash: %s", err) + } + creator, err := sdk.AccAddressFromBech32(args[1]) + if err != nil { + return fmt.Errorf("creator: %s", err) + } + label := args[2] + if err := types.ValidateLabel(label); err != nil { + return fmt.Errorf("label: %s", err) + } + cmd.Println(keeper.BuildContractAddress(codeHash, creator, label).String()) + return nil + }, + } + return cmd +} + // GetCmdListCode lists all wasm code uploaded func GetCmdListCode() *cobra.Command { cmd := &cobra.Command{ @@ -117,6 +146,9 @@ func GetCmdListContractByCode() *cobra.Command { if err != nil { return err } + if codeID == 0 { + return errors.New("empty code id") + } pageReq, err := client.ReadPageRequest(withPageKeyDecoded(cmd.Flags())) if err != nil { diff --git a/x/wasm/genesis_test.go b/x/wasm/genesis_test.go index ea97c97f07..9b97213db5 100644 --- a/x/wasm/genesis_test.go +++ b/x/wasm/genesis_test.go @@ -13,8 +13,8 @@ func TestInitGenesis(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := data.faucet.NewFundedAccount(data.ctx, deposit.Add(deposit...)...) - fred := data.faucet.NewFundedAccount(data.ctx, topUp...) + creator := data.faucet.NewFundedRandomAccount(data.ctx, deposit.Add(deposit...)...) + fred := data.faucet.NewFundedRandomAccount(data.ctx, topUp...) h := data.module.Route().Handler() q := data.module.LegacyQuerierHandler(nil) diff --git a/x/wasm/ibctesting/wasm.go b/x/wasm/ibctesting/wasm.go index 4639688f01..293a9f6926 100644 --- a/x/wasm/ibctesting/wasm.go +++ b/x/wasm/ibctesting/wasm.go @@ -62,6 +62,7 @@ func (chain *TestChain) StoreCode(byteCode []byte) types.MsgStoreCodeResponse { var pInstResp types.MsgStoreCodeResponse require.NoError(chain.t, pInstResp.Unmarshal(protoResult.Data[0].Data)) require.NotEmpty(chain.t, pInstResp.CodeID) + require.NotEmpty(chain.t, pInstResp.Checksum) return pInstResp } diff --git a/x/wasm/keeper/contract_keeper.go b/x/wasm/keeper/contract_keeper.go index 73d925dee1..6e1195dbd1 100644 --- a/x/wasm/keeper/contract_keeper.go +++ b/x/wasm/keeper/contract_keeper.go @@ -10,7 +10,7 @@ var _ types.ContractOpsKeeper = PermissionedKeeper{} // decoratedKeeper contains a subset of the wasm keeper that are already or can be guarded by an authorization policy in the future type decoratedKeeper interface { - create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *types.AccessConfig, authZ AuthorizationPolicy) (codeID uint64, err error) + create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *types.AccessConfig, authZ AuthorizationPolicy) (codeID uint64, checksum []byte, err error) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins, authZ AuthorizationPolicy) (sdk.AccAddress, []byte, error) migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte, authZ AuthorizationPolicy) ([]byte, error) setContractAdmin(ctx sdk.Context, contractAddress, caller, newAdmin sdk.AccAddress, authZ AuthorizationPolicy) error @@ -39,7 +39,7 @@ func NewDefaultPermissionKeeper(nested decoratedKeeper) *PermissionedKeeper { return NewPermissionedKeeper(nested, DefaultAuthorizationPolicy{}) } -func (p PermissionedKeeper) Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *types.AccessConfig) (codeID uint64, err error) { +func (p PermissionedKeeper) Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *types.AccessConfig) (codeID uint64, checksum []byte, err error) { return p.nested.create(ctx, creator, wasmCode, instantiateAccess, p.authZPolicy) } diff --git a/x/wasm/keeper/genesis.go b/x/wasm/keeper/genesis.go index 7fa5280b9e..d81750b708 100644 --- a/x/wasm/keeper/genesis.go +++ b/x/wasm/keeper/genesis.go @@ -35,7 +35,6 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState, staki } } - var maxContractID int for i, contract := range data.Contracts { contractAddr, err := sdk.AccAddressFromBech32(contract.ContractAddress) if err != nil { @@ -45,7 +44,6 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState, staki if err != nil { return nil, sdkerrors.Wrapf(err, "contract number %d", i) } - maxContractID = i + 1 // not ideal but max(contractID) is not persisted otherwise } for i, seq := range data.Sequences { @@ -60,10 +58,6 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState, staki if seqVal <= maxCodeID { return nil, sdkerrors.Wrapf(types.ErrInvalid, "seq %s with value: %d must be greater than: %d ", string(types.KeyLastCodeID), seqVal, maxCodeID) } - seqVal = keeper.PeekAutoIncrementID(ctx, types.KeyLastInstanceID) - if seqVal <= uint64(maxContractID) { - return nil, sdkerrors.Wrapf(types.ErrInvalid, "seq %s with value: %d must be greater than: %d ", string(types.KeyLastInstanceID), seqVal, maxContractID) - } if len(data.GenMsgs) == 0 { return nil, nil @@ -117,7 +111,7 @@ func ExportGenesis(ctx sdk.Context, keeper *Keeper) *types.GenesisState { return false }) - for _, k := range [][]byte{types.KeyLastCodeID, types.KeyLastInstanceID} { + for _, k := range [][]byte{types.KeyLastCodeID} { genState.Sequences = append(genState.Sequences, types.Sequence{ IDKey: k, Value: keeper.PeekAutoIncrementID(ctx, k), diff --git a/x/wasm/keeper/genesis_test.go b/x/wasm/keeper/genesis_test.go index e5410aabb0..4b65f82eaa 100644 --- a/x/wasm/keeper/genesis_test.go +++ b/x/wasm/keeper/genesis_test.go @@ -11,6 +11,10 @@ import ( "testing" "time" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + + "github.com/cosmos/cosmos-sdk/types/address" + "github.com/cosmos/cosmos-sdk/store" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" @@ -65,7 +69,7 @@ func TestGenesisExportImport(t *testing.T) { creatorAddr, err := sdk.AccAddressFromBech32(codeInfo.Creator) require.NoError(t, err) - codeID, err := contractKeeper.Create(srcCtx, creatorAddr, wasmCode, &codeInfo.InstantiateConfig) + codeID, checksum, err := contractKeeper.Create(srcCtx, creatorAddr, wasmCode, &codeInfo.InstantiateConfig) require.NoError(t, err) if pinned { contractKeeper.PinCode(srcCtx, codeID) @@ -80,7 +84,7 @@ func TestGenesisExportImport(t *testing.T) { } contract.CodeID = codeID - contractAddr := wasmKeeper.generateContractAddress(srcCtx, codeID) + contractAddr := BuildContractAddress(checksum, creatorAddr, "testing") wasmKeeper.storeContractInfo(srcCtx, contractAddr, &contract) wasmKeeper.appendToContractHistory(srcCtx, contractAddr, history...) wasmKeeper.importContractState(srcCtx, contractAddr, stateModels) @@ -156,6 +160,16 @@ func TestGenesisInit(t *testing.T) { require.NoError(t, err) myCodeInfo := wasmTypes.CodeInfoFixture(wasmTypes.WithSHA256CodeHash(wasmCode)) + mySenderAddr := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) + myLabel := "testing" + myContractInfoFixture := func(mutators ...func(*types.ContractInfo)) types.ContractInfo { + return types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { + c.CodeID = 1 + c.Creator = mySenderAddr.String() + c.Label = myLabel + }, types.OnlyGenesisFields) + } + specs := map[string]struct { src types.GenesisState stakingMock StakingKeeperMock @@ -171,7 +185,6 @@ func TestGenesisInit(t *testing.T) { }}, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: 2}, - {IDKey: types.KeyLastInstanceID, Value: 1}, }, Params: types.DefaultParams(), }, @@ -190,7 +203,6 @@ func TestGenesisInit(t *testing.T) { }}, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: 10}, - {IDKey: types.KeyLastInstanceID, Value: 1}, }, Params: types.DefaultParams(), }, @@ -210,7 +222,6 @@ func TestGenesisInit(t *testing.T) { Contracts: nil, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: 3}, - {IDKey: types.KeyLastInstanceID, Value: 1}, }, Params: types.DefaultParams(), }, @@ -267,13 +278,12 @@ func TestGenesisInit(t *testing.T) { }}, Contracts: []types.Contract{ { - ContractAddress: BuildContractAddress(1, 1).String(), - ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), + ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), + ContractInfo: myContractInfoFixture(), }, }, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: 2}, - {IDKey: types.KeyLastInstanceID, Value: 2}, }, Params: types.DefaultParams(), }, @@ -288,16 +298,17 @@ func TestGenesisInit(t *testing.T) { }}, Contracts: []types.Contract{ { - ContractAddress: BuildContractAddress(1, 1).String(), - ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), + ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), + ContractInfo: myContractInfoFixture(), }, { - ContractAddress: BuildContractAddress(1, 2).String(), - ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), + ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, "other-label").String(), + ContractInfo: myContractInfoFixture(func(i *wasmTypes.ContractInfo) { + i.Label = "other-label" + }), }, }, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: 2}, - {IDKey: types.KeyLastInstanceID, Value: 3}, }, Params: types.DefaultParams(), }, @@ -307,8 +318,8 @@ func TestGenesisInit(t *testing.T) { src: types.GenesisState{ Contracts: []types.Contract{ { - ContractAddress: BuildContractAddress(1, 1).String(), - ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), + ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), + ContractInfo: myContractInfoFixture(), }, }, Params: types.DefaultParams(), @@ -323,11 +334,11 @@ func TestGenesisInit(t *testing.T) { }}, Contracts: []types.Contract{ { - ContractAddress: BuildContractAddress(1, 1).String(), - ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), + ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), + ContractInfo: myContractInfoFixture(), }, { - ContractAddress: BuildContractAddress(1, 1).String(), - ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), + ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), + ContractInfo: myContractInfoFixture(), }, }, Params: types.DefaultParams(), @@ -342,8 +353,8 @@ func TestGenesisInit(t *testing.T) { }}, Contracts: []types.Contract{ { - ContractAddress: BuildContractAddress(1, 1).String(), - ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), + ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), + ContractInfo: myContractInfoFixture(), ContractState: []types.Model{ { Key: []byte{0x1}, @@ -381,26 +392,6 @@ func TestGenesisInit(t *testing.T) { Params: types.DefaultParams(), }, }, - "prevent contract id seq init value == count contracts": { - src: types.GenesisState{ - Codes: []types.Code{{ - CodeID: firstCodeID, - CodeInfo: myCodeInfo, - CodeBytes: wasmCode, - }}, - Contracts: []types.Contract{ - { - ContractAddress: BuildContractAddress(1, 1).String(), - ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), - }, - }, - Sequences: []types.Sequence{ - {IDKey: types.KeyLastCodeID, Value: 2}, - {IDKey: types.KeyLastInstanceID, Value: 1}, - }, - Params: types.DefaultParams(), - }, - }, "validator set update called for any genesis messages": { src: wasmTypes.GenesisState{ GenMsgs: []types.GenesisState_GenMsgs{ @@ -559,16 +550,17 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { } assert.Equal(t, expHistory, keeper.GetContractHistory(ctx, contractAddr)) assert.Equal(t, uint64(2), keeper.PeekAutoIncrementID(ctx, types.KeyLastCodeID)) - assert.Equal(t, uint64(3), keeper.PeekAutoIncrementID(ctx, types.KeyLastInstanceID)) } func TestSupportedGenMsgTypes(t *testing.T) { wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) + wasmHash := sha256.Sum256(wasmCode) var ( myAddress sdk.AccAddress = bytes.Repeat([]byte{1}, types.ContractAddrLen) verifierAddress sdk.AccAddress = bytes.Repeat([]byte{2}, types.ContractAddrLen) beneficiaryAddress sdk.AccAddress = bytes.Repeat([]byte{3}, types.ContractAddrLen) + contractAddr = BuildContractAddress(wasmHash[:], myAddress, "testing") ) const denom = "stake" importState := types.GenesisState{ @@ -600,7 +592,7 @@ func TestSupportedGenMsgTypes(t *testing.T) { Sum: &types.GenesisState_GenMsgs_ExecuteContract{ ExecuteContract: &types.MsgExecuteContract{ Sender: verifierAddress.String(), - Contract: BuildContractAddress(1, 1).String(), + Contract: contractAddr.String(), Msg: []byte(`{"release":{}}`), }, }, @@ -625,7 +617,7 @@ func TestSupportedGenMsgTypes(t *testing.T) { require.NotNil(t, codeInfo) // verify contract instantiated - cInfo := keeper.GetContractInfo(ctx, BuildContractAddress(1, 1)) + cInfo := keeper.GetContractInfo(ctx, contractAddr) require.NotNil(t, cInfo) // verify contract executed @@ -668,7 +660,24 @@ func setupKeeper(t *testing.T) (*Keeper, sdk.Context, []sdk.StoreKey) { wasmConfig := wasmTypes.DefaultWasmConfig() pk := paramskeeper.NewKeeper(encodingConfig.Marshaler, encodingConfig.Amino, keyParams, tkeyParams) - srcKeeper := NewKeeper(encodingConfig.Marshaler, keyWasm, pk.Subspace(wasmTypes.ModuleName), authkeeper.AccountKeeper{}, nil, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, tempDir, wasmConfig, AvailableCapabilities) + srcKeeper := NewKeeper( + encodingConfig.Marshaler, + keyWasm, + pk.Subspace(wasmTypes.ModuleName), + authkeeper.AccountKeeper{}, + &bankkeeper.BaseKeeper{}, + stakingkeeper.Keeper{}, + distributionkeeper.Keeper{}, + nil, + nil, + nil, + nil, + nil, + nil, + tempDir, + wasmConfig, + AvailableCapabilities, + ) return &srcKeeper, ctx, []sdk.StoreKey{keyWasm, keyParams} } diff --git a/x/wasm/keeper/handler_plugin_test.go b/x/wasm/keeper/handler_plugin_test.go index 4c60bc550f..557478fb44 100644 --- a/x/wasm/keeper/handler_plugin_test.go +++ b/x/wasm/keeper/handler_plugin_test.go @@ -327,7 +327,7 @@ func TestBurnCoinMessageHandlerIntegration(t *testing.T) { // picks the message in the default handler chain ctx, keepers := CreateDefaultTestInput(t) // set some supply - keepers.Faucet.NewFundedAccount(ctx, sdk.NewCoin("denom", sdk.NewInt(10_000_000))) + keepers.Faucet.NewFundedRandomAccount(ctx, sdk.NewCoin("denom", sdk.NewInt(10_000_000))) k := keepers.WasmKeeper example := InstantiateHackatomExampleContract(t, ctx, keepers) // with deposit of 100 stake diff --git a/x/wasm/keeper/ibc_test.go b/x/wasm/keeper/ibc_test.go index ef04b583cb..bdbab1a37c 100644 --- a/x/wasm/keeper/ibc_test.go +++ b/x/wasm/keeper/ibc_test.go @@ -4,6 +4,8 @@ import ( "fmt" "testing" + "github.com/tendermint/tendermint/libs/rand" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" @@ -41,7 +43,7 @@ func TestBindingPortForIBCContractOnInstantiate(t *testing.T) { } func TestContractFromPortID(t *testing.T) { - contractAddr := BuildContractAddress(1, 100) + contractAddr := BuildContractAddress(rand.Bytes(32), RandomAccountAddress(t), "testing") specs := map[string]struct { srcPort string expAddr sdk.AccAddress diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 6e250e9f63..7426ade1ad 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -4,22 +4,25 @@ import ( "bytes" "context" "encoding/binary" + "encoding/hex" "fmt" "math" "path/filepath" + "reflect" "strconv" "strings" "time" - "github.com/cosmos/cosmos-sdk/types/address" - wasmvm "github.com/CosmWasm/wasmvm" wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/store/prefix" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/tendermint/tendermint/libs/log" @@ -54,6 +57,13 @@ type CoinTransferrer interface { TransferCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error } +// CoinPruner handles the balances for accounts that are pruned on contract instantiate. +// This is an extension point to attach custom logic +type CoinPruner interface { + // PruneBalances handle balances for given address + PruneBalances(ctx sdk.Context, contractAddress sdk.AccAddress) error +} + // WasmVMResponseHandler is an extension point to handles the response data returned by a contract call. type WasmVMResponseHandler interface { // Handle processes the data returned by a contract invocation. @@ -66,6 +76,25 @@ type WasmVMResponseHandler interface { ) ([]byte, error) } +// list of account types that are accepted for wasm contracts. Chains importing wasmd +// can overwrite this list with the WithAcceptedAccountTypesOnContractInstantiation option. +var defaultAcceptedAccountTypes = map[reflect.Type]struct{}{ + reflect.TypeOf(&authtypes.BaseAccount{}): {}, +} + +// list of account types that are replaced with base accounts. Chains importing wasmd +// can overwrite this list with the WithPruneAccountTypesOnContractInstantiation option. +// +// contains vesting account types that can be created post genesis +var defaultPruneAccountTypes = map[reflect.Type]struct{}{ + reflect.TypeOf(&vestingtypes.DelayedVestingAccount{}): {}, + reflect.TypeOf(&vestingtypes.ContinuousVestingAccount{}): {}, + // intentionally not added: genesis account types + // reflect.TypeOf(&vestingtypes.BaseVestingAccount{}): {}, + // reflect.TypeOf(&vestingtypes.PeriodicVestingAccount{}): {}, + // reflect.TypeOf(&vestingtypes.PermanentLockedAccount{}): {}, +} + // Keeper will have a reference to Wasmer with it's own data directory. type Keeper struct { storeKey sdk.StoreKey @@ -79,10 +108,13 @@ type Keeper struct { wasmVMResponseHandler WasmVMResponseHandler messenger Messenger // queryGasLimit is the max wasmvm gas that can be spent on executing a query with a contract - queryGasLimit uint64 - paramSpace paramtypes.Subspace - gasRegister GasRegister - maxQueryStackSize uint32 + queryGasLimit uint64 + paramSpace paramtypes.Subspace + gasRegister GasRegister + maxQueryStackSize uint32 + acceptedAccountTypes map[reflect.Type]struct{} + pruneAccountTypes map[reflect.Type]struct{} + coinPruner CoinPruner } // NewKeeper creates a new contract Keeper instance @@ -116,18 +148,21 @@ func NewKeeper( } keeper := &Keeper{ - storeKey: storeKey, - cdc: cdc, - wasmVM: wasmer, - accountKeeper: accountKeeper, - bank: NewBankCoinTransferrer(bankKeeper), - portKeeper: portKeeper, - capabilityKeeper: capabilityKeeper, - messenger: NewDefaultMessageHandler(router, channelKeeper, capabilityKeeper, bankKeeper, cdc, portSource), - queryGasLimit: wasmConfig.SmartQueryGasLimit, - paramSpace: paramSpace, - gasRegister: NewDefaultWasmGasRegister(), - maxQueryStackSize: types.DefaultMaxQueryStackSize, + storeKey: storeKey, + cdc: cdc, + wasmVM: wasmer, + accountKeeper: accountKeeper, + bank: NewBankCoinTransferrer(bankKeeper), + coinPruner: NewCoinBurner(bankKeeper), + portKeeper: portKeeper, + capabilityKeeper: capabilityKeeper, + messenger: NewDefaultMessageHandler(router, channelKeeper, capabilityKeeper, bankKeeper, cdc, portSource), + queryGasLimit: wasmConfig.SmartQueryGasLimit, + paramSpace: paramSpace, + gasRegister: NewDefaultWasmGasRegister(), + maxQueryStackSize: types.DefaultMaxQueryStackSize, + acceptedAccountTypes: defaultAcceptedAccountTypes, + pruneAccountTypes: defaultPruneAccountTypes, } keeper.wasmVMQueryHandler = DefaultQueryPlugins(bankKeeper, stakingKeeper, distKeeper, channelKeeper, queryRouter, keeper) for _, o := range opts { @@ -161,13 +196,13 @@ func (k Keeper) SetParams(ctx sdk.Context, ps types.Params) { k.paramSpace.SetParamSet(ctx, &ps) } -func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *types.AccessConfig, authZ AuthorizationPolicy) (codeID uint64, err error) { +func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *types.AccessConfig, authZ AuthorizationPolicy) (codeID uint64, checksum []byte, err error) { if creator == nil { - return 0, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "cannot be nil") + return 0, checksum, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "cannot be nil") } if !authZ.CanCreateCode(k.getUploadAccessConfig(ctx), creator) { - return 0, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "can not create code") + return 0, checksum, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "can not create code") } // figure out proper instantiate access defaultAccessConfig := k.getInstantiateAccessConfig(ctx).With(creator) @@ -175,25 +210,25 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess = &defaultAccessConfig } else if !instantiateAccess.IsSubset(defaultAccessConfig) { // we enforce this must be subset of default upload access - return 0, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "instantiate access must be subset of default upload access") + return 0, checksum, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "instantiate access must be subset of default upload access") } if ioutils.IsGzip(wasmCode) { ctx.GasMeter().ConsumeGas(k.gasRegister.UncompressCosts(len(wasmCode)), "Uncompress gzip bytecode") wasmCode, err = ioutils.Uncompress(wasmCode, uint64(types.MaxWasmSize)) if err != nil { - return 0, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) + return 0, checksum, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) } } ctx.GasMeter().ConsumeGas(k.gasRegister.CompileCosts(len(wasmCode)), "Compiling wasm bytecode") - checksum, err := k.wasmVM.Create(wasmCode) + checksum, err = k.wasmVM.Create(wasmCode) if err != nil { - return 0, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) + return 0, checksum, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) } report, err := k.wasmVM.AnalyzeCode(checksum) if err != nil { - return 0, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) + return 0, checksum, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) } codeID = k.autoIncrementID(ctx, types.KeyLastCodeID) k.Logger(ctx).Debug("storing new contract", "capabilities", report.RequiredCapabilities, "code_id", codeID) @@ -203,13 +238,14 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, evt := sdk.NewEvent( types.EventTypeStoreCode, sdk.NewAttribute(types.AttributeKeyCodeID, strconv.FormatUint(codeID, 10)), + sdk.NewAttribute(types.AttributeKeyChecksum, hex.EncodeToString(checksum)), ) for _, f := range strings.Split(report.RequiredCapabilities, ",") { evt.AppendAttributes(sdk.NewAttribute(types.AttributeKeyRequiredCapability, strings.TrimSpace(f))) } ctx.EventManager().EmitEvent(evt) - return codeID, nil + return codeID, checksum, nil } func (k Keeper) storeCodeInfo(ctx sdk.Context, codeID uint64, codeInfo types.CodeInfo) { @@ -244,31 +280,15 @@ func (k Keeper) importCode(ctx sdk.Context, codeID uint64, codeInfo types.CodeIn return nil } -func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins, authZ AuthorizationPolicy) (sdk.AccAddress, []byte, error) { +func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins, authPolicy AuthorizationPolicy) (sdk.AccAddress, []byte, error) { defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "instantiate") + if creator == nil { + return nil, nil, types.ErrEmpty.Wrap("creator") + } instanceCosts := k.gasRegister.NewContractInstanceCosts(k.IsPinnedCode(ctx, codeID), len(initMsg)) ctx.GasMeter().ConsumeGas(instanceCosts, "Loading CosmWasm module: instantiate") - // create contract address - contractAddress := k.generateContractAddress(ctx, codeID) - existingAcct := k.accountKeeper.GetAccount(ctx, contractAddress) - if existingAcct != nil { - return nil, nil, sdkerrors.Wrap(types.ErrAccountExists, existingAcct.GetAddress().String()) - } - - // deposit initial contract funds - if !deposit.IsZero() { - if err := k.bank.TransferCoins(ctx, creator, contractAddress, deposit); err != nil { - return nil, nil, err - } - } else { - // create an empty account (so we don't have issues later) - // TODO: can we remove this? - contractAccount := k.accountKeeper.NewAccountWithAddress(ctx, contractAddress) - k.accountKeeper.SetAccount(ctx, contractAccount) - } - // get contact info store := ctx.KVStore(k.storeKey) bz := store.Get(types.GetCodeKey(codeID)) @@ -278,10 +298,53 @@ func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.A var codeInfo types.CodeInfo k.cdc.MustUnmarshal(bz, &codeInfo) - if !authZ.CanInstantiateContract(codeInfo.InstantiateConfig, creator) { + if !authPolicy.CanInstantiateContract(codeInfo.InstantiateConfig, creator) { return nil, nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "can not instantiate") } + contractAddress := BuildContractAddress(codeInfo.CodeHash, creator, label) + if k.HasContractInfo(ctx, contractAddress) { + return nil, nil, types.ErrDuplicate.Wrap("instance with this code id, sender and label exists: try a different label") + } + + // check account + // every cosmos module can define custom account types when needed. The cosmos-sdk comes with extension points + // to support this and a set of base and vesting account types that we integrated in our default lists. + // But not all account types of other modules are known or may make sense for contracts, therefore we kept this + // decision logic also very flexible and extendable. We provide new options to overwrite the default settings via WithAcceptedAccountTypesOnContractInstantiation and + // WithPruneAccountTypesOnContractInstantiation as constructor arguments + existingAcct := k.accountKeeper.GetAccount(ctx, contractAddress) + if existingAcct != nil { + if existingAcct.GetSequence() != 0 || existingAcct.GetPubKey() != nil { + return nil, nil, types.ErrAccountExists.Wrap("address is claimed by external account") + } + if _, accept := k.acceptedAccountTypes[reflect.TypeOf(existingAcct)]; accept { + // keep account and balance as it is + k.Logger(ctx).Info("instantiate contract with existing account", "address", contractAddress.String()) + } else if _, clear := k.pruneAccountTypes[reflect.TypeOf(existingAcct)]; clear { + k.Logger(ctx).Info("pruning existing account for contract instantiation", "address", contractAddress.String()) + // consider an account in the wasmd namespace spam and overwrite it. + contractAccount := k.accountKeeper.NewAccountWithAddress(ctx, contractAddress) + k.accountKeeper.SetAccount(ctx, contractAccount) + // also handle balance to not open cases where these accounts are abused and become liquid + if err := k.coinPruner.PruneBalances(ctx, contractAddress); err != nil { + return nil, nil, err + } + } else { // unknown account type + return nil, nil, types.ErrAccountExists.Wrapf("refusing to overwrite special account type:: %T", existingAcct) + } + } else { + // create an empty account (so we don't have issues later) + contractAccount := k.accountKeeper.NewAccountWithAddress(ctx, contractAddress) + k.accountKeeper.SetAccount(ctx, contractAccount) + } + // deposit initial contract funds + if !deposit.IsZero() { + if err := k.bank.TransferCoins(ctx, creator, contractAddress, deposit); err != nil { + return nil, nil, err + } + } + // prepare params for contract instantiate call env := types.NewEnv(ctx, contractAddress) info := types.NewInfo(creator, deposit) @@ -955,18 +1018,19 @@ func (k Keeper) consumeRuntimeGas(ctx sdk.Context, gas uint64) { } } -// generates a contract address from codeID + instanceID -func (k Keeper) generateContractAddress(ctx sdk.Context, codeID uint64) sdk.AccAddress { - instanceID := k.autoIncrementID(ctx, types.KeyLastInstanceID) - return BuildContractAddress(codeID, instanceID) -} - -// BuildContractAddress builds an sdk account address for a contract. -func BuildContractAddress(codeID, instanceID uint64) sdk.AccAddress { - contractID := make([]byte, 16) - binary.BigEndian.PutUint64(contractID[:8], codeID) - binary.BigEndian.PutUint64(contractID[8:], instanceID) - return address.Module(types.ModuleName, contractID)[:types.ContractAddrLen] +// BuildContractAddress generates a contract address for the wasm module with len = types.ContractAddrLen using the +// Cosmos SDK address.Module function. +// Internally a key is built containing (len(checksum) | checksum | len(sender_address) | sender_address | len(label) | label). +// All method parameter values must be valid and not be empty or nil. +func BuildContractAddress(checksum []byte, creator sdk.AccAddress, label string) sdk.AccAddress { + checksum = address.MustLengthPrefix(checksum) + creator = address.MustLengthPrefix(creator) + labelBz := address.MustLengthPrefix([]byte(label)) + key := make([]byte, len(checksum)+len(creator)+len(labelBz)) + copy(key[0:], checksum) + copy(key[len(checksum):], creator) + copy(key[len(checksum)+len(creator):], labelBz) + return address.Module(types.ModuleName, key)[:types.ContractAddrLen] } func (k Keeper) autoIncrementID(ctx sdk.Context, lastIDKey []byte) uint64 { @@ -1097,6 +1161,34 @@ func (c BankCoinTransferrer) TransferCoins(parentCtx sdk.Context, fromAddr sdk.A return nil } +var _ CoinPruner = CoinBurner{} + +// CoinBurner default implementation for CoinPruner to burn the coins +type CoinBurner struct { + bank types.BankKeeper +} + +// NewCoinBurner constructor +func NewCoinBurner(bank types.BankKeeper) CoinBurner { + if bank == nil { + panic("bank keeper must not be nil") + } + return CoinBurner{bank: bank} +} + +// PruneBalances burns all coins owned by the account. +func (b CoinBurner) PruneBalances(ctx sdk.Context, address sdk.AccAddress) error { + if amt := b.bank.GetAllBalances(ctx, address); !amt.IsZero() { + if err := b.bank.SendCoinsFromAccountToModule(ctx, address, types.ModuleName, amt); err != nil { + return sdkerrors.Wrap(err, "prune account balance") + } + if err := b.bank.BurnCoins(ctx, types.ModuleName, amt); err != nil { + return sdkerrors.Wrap(err, "burn account balance") + } + } + return nil +} + type msgDispatcher interface { DispatchSubmessages(ctx sdk.Context, contractAddr sdk.AccAddress, ibcPort string, msgs []wasmvmtypes.SubMsg) ([]byte, error) } diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index 0cde32592f..f00f28799f 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -2,19 +2,24 @@ package keeper import ( "bytes" + _ "embed" + "encoding/hex" "encoding/json" "errors" - "math" "os" + "strings" "testing" "time" wasmvm "github.com/CosmWasm/wasmvm" wasmvmtypes "github.com/CosmWasm/wasmvm/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" stypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" fuzz "github.com/google/gofuzz" @@ -27,15 +32,7 @@ import ( "github.com/CosmWasm/wasmd/x/wasm/types" ) -// When migrated to go 1.16, embed package should be used instead. -func init() { - b, err := os.ReadFile("./testdata/hackatom.wasm") - if err != nil { - panic(err) - } - hackatomWasm = b -} - +//go:embed testdata/hackatom.wasm var hackatomWasm []byte const AvailableCapabilities = "iterator,staking,stargate,cosmwasm_1_1" @@ -50,10 +47,10 @@ func TestCreateSuccess(t *testing.T) { keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) em := sdk.NewEventManager() - contractID, err := keeper.Create(ctx.WithEventManager(em), creator, hackatomWasm, nil) + contractID, _, err := keeper.Create(ctx.WithEventManager(em), creator, hackatomWasm, nil) require.NoError(t, err) require.Equal(t, uint64(1), contractID) // and verify content @@ -61,32 +58,33 @@ func TestCreateSuccess(t *testing.T) { require.NoError(t, err) require.Equal(t, hackatomWasm, storedCode) // and events emitted - exp := sdk.Events{sdk.NewEvent("store_code", sdk.NewAttribute("code_id", "1"))} + codeHash := "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5" + exp := sdk.Events{sdk.NewEvent("store_code", sdk.NewAttribute("code_id", "1"), sdk.NewAttribute("code_checksum", codeHash))} assert.Equal(t, exp, em.Events()) } func TestCreateNilCreatorAddress(t *testing.T) { ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) - _, err := keepers.ContractKeeper.Create(ctx, nil, hackatomWasm, nil) + _, _, err := keepers.ContractKeeper.Create(ctx, nil, hackatomWasm, nil) require.Error(t, err, "nil creator is not allowed") } func TestCreateNilWasmCode(t *testing.T) { ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) - _, err := keepers.ContractKeeper.Create(ctx, creator, nil, nil) + _, _, err := keepers.ContractKeeper.Create(ctx, creator, nil, nil) require.Error(t, err, "nil WASM code is not allowed") } func TestCreateInvalidWasmCode(t *testing.T) { ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) - _, err := keepers.ContractKeeper.Create(ctx, creator, []byte("potatoes"), nil) + _, _, err := keepers.ContractKeeper.Create(ctx, creator, []byte("potatoes"), nil) require.Error(t, err, "potatoes are not valid WASM code") } @@ -127,7 +125,7 @@ func TestCreateStoresInstantiatePermission(t *testing.T) { }) fundAccounts(t, ctx, accKeeper, bankKeeper, myAddr, deposit) - codeID, err := keeper.Create(ctx, myAddr, hackatomWasm, nil) + codeID, _, err := keeper.Create(ctx, myAddr, hackatomWasm, nil) require.NoError(t, err) codeInfo := keepers.WasmKeeper.GetCodeInfo(ctx, codeID) @@ -142,8 +140,8 @@ func TestCreateWithParamPermissions(t *testing.T) { keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) - otherAddr := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) + otherAddr := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) specs := map[string]struct { srcPermission types.AccessConfig @@ -172,7 +170,7 @@ func TestCreateWithParamPermissions(t *testing.T) { params := types.DefaultParams() params.CodeUploadAccess = spec.srcPermission keepers.WasmKeeper.SetParams(ctx, params) - _, err := keeper.Create(ctx, creator, hackatomWasm, nil) + _, _, err := keeper.Create(ctx, creator, hackatomWasm, nil) require.True(t, spec.expError.Is(err), err) if spec.expError != nil { return @@ -189,8 +187,8 @@ func TestEnforceValidPermissionsOnCreate(t *testing.T) { contractKeeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) - other := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) + other := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) onlyCreator := types.AccessTypeOnlyAddress.With(creator) onlyOther := types.AccessTypeOnlyAddress.With(other) @@ -249,7 +247,7 @@ func TestEnforceValidPermissionsOnCreate(t *testing.T) { params := types.DefaultParams() params.InstantiateDefaultPermission = spec.defaultPermssion keeper.SetParams(ctx, params) - codeID, err := contractKeeper.Create(ctx, creator, hackatomWasm, spec.requestedPermission) + codeID, _, err := contractKeeper.Create(ctx, creator, hackatomWasm, spec.requestedPermission) require.True(t, spec.expError.Is(err), err) if spec.expError == nil { codeInfo := keeper.GetCodeInfo(ctx, codeID) @@ -264,15 +262,15 @@ func TestCreateDuplicate(t *testing.T) { keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) // create one copy - contractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) + contractID, _, err := keeper.Create(ctx, creator, hackatomWasm, nil) require.NoError(t, err) require.Equal(t, uint64(1), contractID) // create second copy - duplicateID, err := keeper.Create(ctx, creator, hackatomWasm, nil) + duplicateID, _, err := keeper.Create(ctx, creator, hackatomWasm, nil) require.NoError(t, err) require.Equal(t, uint64(2), duplicateID) @@ -292,18 +290,18 @@ func TestCreateWithSimulation(t *testing.T) { WithGasMeter(stypes.NewInfiniteGasMeter()) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) // create this once in simulation mode - contractID, err := keepers.ContractKeeper.Create(ctx, creator, hackatomWasm, nil) + contractID, _, err := keepers.ContractKeeper.Create(ctx, creator, hackatomWasm, nil) require.NoError(t, err) require.Equal(t, uint64(1), contractID) // then try to create it in non-simulation mode (should not fail) ctx, keepers = CreateTestInput(t, false, AvailableCapabilities) ctx = ctx.WithGasMeter(sdk.NewGasMeter(10_000_000)) - creator = keepers.Faucet.NewFundedAccount(ctx, deposit...) - contractID, err = keepers.ContractKeeper.Create(ctx, creator, hackatomWasm, nil) + creator = keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) + contractID, _, err = keepers.ContractKeeper.Create(ctx, creator, hackatomWasm, nil) require.NoError(t, err) require.Equal(t, uint64(1), contractID) @@ -344,12 +342,12 @@ func TestCreateWithGzippedPayload(t *testing.T) { keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) wasmCode, err := os.ReadFile("./testdata/hackatom.wasm.gzip") require.NoError(t, err, "reading gzipped WASM code") - contractID, err := keeper.Create(ctx, creator, wasmCode, nil) + contractID, _, err := keeper.Create(ctx, creator, wasmCode, nil) require.NoError(t, err) require.Equal(t, uint64(1), contractID) // and verify content @@ -363,34 +361,30 @@ func TestCreateWithBrokenGzippedPayload(t *testing.T) { keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) wasmCode, err := os.ReadFile("./testdata/broken_crc.gzip") require.NoError(t, err, "reading gzipped WASM code") gm := sdk.NewInfiniteGasMeter() - contractID, err := keeper.Create(ctx.WithGasMeter(gm), creator, wasmCode, nil) + codeID, checksum, err := keeper.Create(ctx.WithGasMeter(gm), creator, wasmCode, nil) require.Error(t, err) - assert.Empty(t, contractID) + assert.Empty(t, codeID) + assert.Empty(t, checksum) assert.GreaterOrEqual(t, gm.GasConsumed(), sdk.Gas(121384)) // 809232 * 0.15 (default uncompress costs) = 121384 } func TestInstantiate(t *testing.T) { ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) - keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) - - codeID, err := keeper.Create(ctx, creator, hackatomWasm, nil) - require.NoError(t, err) - - _, _, bob := keyPubAddr() - _, _, fred := keyPubAddr() + creator := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) + keepers.Faucet.Fund(ctx, creator, deposit...) + example := StoreHackatomExampleContract(t, ctx, keepers) initMsg := HackatomExampleInitMsg{ - Verifier: fred, - Beneficiary: bob, + Verifier: RandomAccountAddress(t), + Beneficiary: RandomAccountAddress(t), } initMsgBz, err := json.Marshal(initMsg) require.NoError(t, err) @@ -399,25 +393,25 @@ func TestInstantiate(t *testing.T) { em := sdk.NewEventManager() // create with no balance is also legal - gotContractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx.WithEventManager(em), codeID, creator, nil, initMsgBz, "demo contract 1", nil) + gotContractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx.WithEventManager(em), example.CodeID, creator, nil, initMsgBz, "demo contract 1", nil) require.NoError(t, err) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", gotContractAddr.String()) + require.Equal(t, "cosmos1xaq0tcwz9fsqmtxlpzwjn2zr8gw66ljjr079ltfc5pelepcs7sjsk28n5n", gotContractAddr.String()) gasAfter := ctx.GasMeter().GasConsumed() if types.EnableGasVerification { - require.Equal(t, uint64(0x18db5), gasAfter-gasBefore) + require.Equal(t, uint64(0x187b8), gasAfter-gasBefore) } // ensure it is stored properly info := keepers.WasmKeeper.GetContractInfo(ctx, gotContractAddr) require.NotNil(t, info) assert.Equal(t, creator.String(), info.Creator) - assert.Equal(t, codeID, info.CodeID) + assert.Equal(t, example.CodeID, info.CodeID) assert.Equal(t, "demo contract 1", info.Label) exp := []types.ContractCodeHistoryEntry{{ Operation: types.ContractCodeHistoryOperationTypeInit, - CodeID: codeID, + CodeID: example.CodeID, Updated: types.NewAbsoluteTxPosition(ctx), Msg: initMsgBz, }} @@ -439,12 +433,9 @@ func TestInstantiateWithDeposit(t *testing.T) { fred = bytes.Repeat([]byte{2}, types.SDKAddrLen) deposit = sdk.NewCoins(sdk.NewInt64Coin("denom", 100)) - initMsg = HackatomExampleInitMsg{Verifier: fred, Beneficiary: bob} + initMsg = mustMarshal(t, HackatomExampleInitMsg{Verifier: fred, Beneficiary: bob}) ) - initMsgBz, err := json.Marshal(initMsg) - require.NoError(t, err) - specs := map[string]struct { srcActor sdk.AccAddress expError bool @@ -472,11 +463,11 @@ func TestInstantiateWithDeposit(t *testing.T) { if spec.fundAddr { fundAccounts(t, ctx, accKeeper, bankKeeper, spec.srcActor, sdk.NewCoins(sdk.NewInt64Coin("denom", 200))) } - contractID, err := keeper.Create(ctx, spec.srcActor, hackatomWasm, nil) + contractID, _, err := keeper.Create(ctx, spec.srcActor, hackatomWasm, nil) require.NoError(t, err) // when - addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, spec.srcActor, nil, initMsgBz, "my label", deposit) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, spec.srcActor, nil, initMsg, "my label", deposit) // then if spec.expError { require.Error(t, err) @@ -527,6 +518,7 @@ func TestInstantiateWithPermissions(t *testing.T) { srcActor: myAddr, }, "onlyAddress with non matching address": { + srcActor: myAddr, srcPermission: types.AccessTypeOnlyAddress.With(otherAddr), expError: sdkerrors.ErrUnauthorized, }, @@ -537,7 +529,7 @@ func TestInstantiateWithPermissions(t *testing.T) { accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper fundAccounts(t, ctx, accKeeper, bankKeeper, spec.srcActor, deposit) - contractID, err := keeper.Create(ctx, myAddr, hackatomWasm, &spec.srcPermission) + contractID, _, err := keeper.Create(ctx, myAddr, hackatomWasm, &spec.srcPermission) require.NoError(t, err) _, _, err = keepers.ContractKeeper.Instantiate(ctx, contractID, spec.srcActor, nil, initMsgBz, "demo contract 1", nil) @@ -546,11 +538,195 @@ func TestInstantiateWithPermissions(t *testing.T) { } } +func TestInstantiateWithUniqueContractAddress(t *testing.T) { + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) + example := InstantiateHackatomExampleContract(t, parentCtx, keepers) + otherExample := InstantiateReflectExampleContract(t, parentCtx, keepers) + initMsg := mustMarshal(t, HackatomExampleInitMsg{Verifier: example.VerifierAddr, Beneficiary: example.BeneficiaryAddr}) + + otherAddress := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(parentCtx, otherAddress, sdk.NewInt64Coin("denom", 100000000)) + used := make(map[string]struct{}) + specs := map[string]struct { + codeID uint64 + sender sdk.AccAddress + label string + initMsg json.RawMessage + expErr error + }{ + "reject duplicate which generates the same address": { + codeID: example.CodeID, + sender: example.CreatorAddr, + label: example.Label, + initMsg: initMsg, + expErr: types.ErrDuplicate, + }, + "different sender": { + codeID: example.CodeID, + sender: otherAddress, + label: example.Label, + initMsg: initMsg, + }, + "different code": { + codeID: otherExample.CodeID, + sender: example.CreatorAddr, + label: example.Label, + initMsg: []byte(`{}`), + }, + "different label": { + codeID: example.CodeID, + sender: example.CreatorAddr, + label: "other label", + initMsg: initMsg, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + ctx, _ := parentCtx.CacheContext() + gotAddr, _, gotErr := keepers.ContractKeeper.Instantiate(ctx, spec.codeID, spec.sender, nil, spec.initMsg, spec.label, example.Deposit) + if spec.expErr != nil { + assert.ErrorIs(t, gotErr, spec.expErr) + return + } + require.NoError(t, gotErr) + expAddr := BuildContractAddress(keepers.WasmKeeper.GetCodeInfo(ctx, spec.codeID).CodeHash, spec.sender, spec.label) + assert.Equal(t, expAddr.String(), gotAddr.String()) + require.NotContains(t, used, gotAddr.String()) + used[gotAddr.String()] = struct{}{} + }) + } +} + +func TestInstantiateWithAccounts(t *testing.T) { + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) + example := StoreHackatomExampleContract(t, parentCtx, keepers) + require.Equal(t, uint64(1), example.CodeID) + initMsg := mustMarshal(t, HackatomExampleInitMsg{Verifier: RandomAccountAddress(t), Beneficiary: RandomAccountAddress(t)}) + + senderAddr := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(parentCtx, senderAddr, sdk.NewInt64Coin("denom", 100000000)) + const myLabel = "testing" + contractAddr := BuildContractAddress(example.Checksum, senderAddr, myLabel) + + lastAccountNumber := keepers.AccountKeeper.GetAccount(parentCtx, senderAddr).GetAccountNumber() + + specs := map[string]struct { + acceptList Option + account authtypes.AccountI + initBalance sdk.Coin + deposit sdk.Coins + expErr error + expAccount authtypes.AccountI + expBalance sdk.Coins + }{ + "unused BaseAccount exists": { + account: authtypes.NewBaseAccount(contractAddr, nil, 0, 0), + initBalance: sdk.NewInt64Coin("denom", 100000000), + expAccount: authtypes.NewBaseAccount(contractAddr, nil, lastAccountNumber+1, 0), // +1 for next seq + expBalance: sdk.NewCoins(sdk.NewInt64Coin("denom", 100000000)), + }, + "BaseAccount with sequence exists": { + account: authtypes.NewBaseAccount(contractAddr, nil, 0, 1), + expErr: types.ErrAccountExists, + }, + "BaseAccount with pubkey exists": { + account: authtypes.NewBaseAccount(contractAddr, &ed25519.PubKey{}, 0, 0), + expErr: types.ErrAccountExists, + }, + "no account existed": { + expAccount: authtypes.NewBaseAccount(contractAddr, nil, lastAccountNumber+1, 0), // +1 for next seq, + expBalance: sdk.NewCoins(), + }, + "no account existed before create with deposit": { + expAccount: authtypes.NewBaseAccount(contractAddr, nil, lastAccountNumber+1, 0), // +1 for next seq + deposit: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), + expBalance: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), + }, + "prune listed DelayedVestingAccount gets overwritten": { + account: vestingtypes.NewDelayedVestingAccount( + authtypes.NewBaseAccount(contractAddr, nil, 0, 0), + sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), time.Now().Add(30*time.Hour).Unix()), + initBalance: sdk.NewCoin("denom", sdk.NewInt(1_000)), + deposit: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1))), + expAccount: authtypes.NewBaseAccount(contractAddr, nil, lastAccountNumber+2, 0), // +1 for next seq, +1 for spec.account created + expBalance: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1))), + }, + "prune listed ContinuousVestingAccount gets overwritten": { + account: vestingtypes.NewContinuousVestingAccount( + authtypes.NewBaseAccount(contractAddr, nil, 0, 0), + sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), time.Now().Add(time.Hour).Unix(), time.Now().Add(2*time.Hour).Unix()), + initBalance: sdk.NewCoin("denom", sdk.NewInt(1_000)), + deposit: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1))), + expAccount: authtypes.NewBaseAccount(contractAddr, nil, lastAccountNumber+2, 0), // +1 for next seq, +1 for spec.account created + expBalance: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1))), + }, + "prune listed account without balance gets overwritten": { + account: vestingtypes.NewContinuousVestingAccount( + authtypes.NewBaseAccount(contractAddr, nil, 0, 0), + sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(0))), time.Now().Add(time.Hour).Unix(), time.Now().Add(2*time.Hour).Unix()), + expAccount: authtypes.NewBaseAccount(contractAddr, nil, lastAccountNumber+2, 0), // +1 for next seq, +1 for spec.account created + expBalance: sdk.NewCoins(), + }, + "unknown account type creates error": { + account: authtypes.NewModuleAccount( + authtypes.NewBaseAccount(contractAddr, nil, 0, 0), + "testing", + ), + initBalance: sdk.NewCoin("denom", sdk.NewInt(1_000)), + expErr: types.ErrAccountExists, + }, + "with option used to set non default type to accept list": { + acceptList: WithAcceptedAccountTypesOnContractInstantiation(&vestingtypes.DelayedVestingAccount{}), + account: vestingtypes.NewDelayedVestingAccount( + authtypes.NewBaseAccount(contractAddr, nil, 0, 0), + sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), time.Now().Add(30*time.Hour).Unix()), + initBalance: sdk.NewCoin("denom", sdk.NewInt(1_000)), + deposit: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1))), + expAccount: vestingtypes.NewDelayedVestingAccount(authtypes.NewBaseAccount(contractAddr, nil, lastAccountNumber+1, 0), + sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), time.Now().Add(30*time.Hour).Unix()), + expBalance: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_001))), + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + ctx, _ := parentCtx.CacheContext() + if spec.account != nil { + keepers.AccountKeeper.SetAccount(ctx, keepers.AccountKeeper.NewAccount(ctx, spec.account)) + } + if !spec.initBalance.IsNil() { + keepers.Faucet.Fund(ctx, spec.account.GetAddress(), spec.initBalance) + } + if spec.acceptList != nil { + spec.acceptList.apply(keepers.WasmKeeper) + } + defer func() { + if spec.acceptList != nil { // reset + WithAcceptedAccountTypesOnContractInstantiation(&authtypes.BaseAccount{}).apply(keepers.WasmKeeper) + } + }() + // when + gotAddr, _, gotErr := keepers.ContractKeeper.Instantiate(ctx, 1, senderAddr, nil, initMsg, myLabel, spec.deposit) + if spec.expErr != nil { + assert.ErrorIs(t, gotErr, spec.expErr) + return + } + require.NoError(t, gotErr) + assert.Equal(t, contractAddr, gotAddr) + // and + gotAcc := keepers.AccountKeeper.GetAccount(ctx, contractAddr) + assert.Equal(t, spec.expAccount, gotAcc) + // and + gotBalance := keepers.BankKeeper.GetAllBalances(ctx, contractAddr) + assert.Equal(t, spec.expBalance, gotBalance) + }) + } +} + func TestInstantiateWithNonExistingCodeID(t *testing.T) { ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) initMsg := HackatomExampleInitMsg{} initMsgBz, err := json.Marshal(initMsg) @@ -585,13 +761,14 @@ func TestExecute(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) - fred := keepers.Faucet.NewFundedAccount(ctx, topUp...) + creator := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(ctx, creator, deposit.Add(deposit...)...) + fred := keepers.Faucet.NewFundedRandomAccount(ctx, topUp...) + bob := RandomAccountAddress(t) - contractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) + contractID, _, err := keeper.Create(ctx, creator, hackatomWasm, nil) require.NoError(t, err) - _, _, bob := keyPubAddr() initMsg := HackatomExampleInitMsg{ Verifier: fred, Beneficiary: bob, @@ -601,7 +778,8 @@ func TestExecute(t *testing.T) { addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) require.NoError(t, err) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", addr.String()) + // cosmos1eycfqpgtcp4gc9g24cvg6useyncxspq8qurv2z7cs0wzcgvmffaquzwe2e build with code-id 1, DeterministicAccountAddress(t, 1) and label `demo contract 3` + require.Equal(t, "cosmos1eycfqpgtcp4gc9g24cvg6useyncxspq8qurv2z7cs0wzcgvmffaquzwe2e", addr.String()) // ensure bob doesn't exist bobAcct := accKeeper.GetAccount(ctx, bob) @@ -638,7 +816,7 @@ func TestExecute(t *testing.T) { // make sure gas is properly deducted from ctx gasAfter := ctx.GasMeter().GasConsumed() if types.EnableGasVerification { - require.Equal(t, uint64(0x17cd2), gasAfter-gasBefore) + require.Equal(t, uint64(0x17d87), gasAfter-gasBefore) } // ensure bob now exists and got both payments released bobAcct = accKeeper.GetAccount(ctx, bob) @@ -725,7 +903,7 @@ func TestExecuteWithDeposit(t *testing.T) { if spec.fundAddr { fundAccounts(t, ctx, accKeeper, bankKeeper, spec.srcActor, sdk.NewCoins(sdk.NewInt64Coin("denom", 200))) } - codeID, err := keeper.Create(ctx, spec.srcActor, hackatomWasm, nil) + codeID, _, err := keeper.Create(ctx, spec.srcActor, hackatomWasm, nil) require.NoError(t, err) initMsg := HackatomExampleInitMsg{Verifier: spec.srcActor, Beneficiary: spec.beneficiary} @@ -755,7 +933,8 @@ func TestExecuteWithNonExistingAddress(t *testing.T) { keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) + creator := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(ctx, creator, deposit.Add(deposit...)...) // unauthorized - trialCtx so we don't change state nonExistingAddress := RandomAccountAddress(t) @@ -769,10 +948,11 @@ func TestExecuteWithPanic(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) - fred := keepers.Faucet.NewFundedAccount(ctx, topUp...) + creator := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(ctx, creator, deposit.Add(deposit...)...) + fred := keepers.Faucet.NewFundedRandomAccount(ctx, topUp...) - contractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) + contractID, _, err := keeper.Create(ctx, creator, hackatomWasm, nil) require.NoError(t, err) _, _, bob := keyPubAddr() @@ -800,10 +980,11 @@ func TestExecuteWithCpuLoop(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) - fred := keepers.Faucet.NewFundedAccount(ctx, topUp...) + creator := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(ctx, creator, deposit.Add(deposit...)...) + fred := keepers.Faucet.NewFundedRandomAccount(ctx, topUp...) - contractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) + contractID, _, err := keeper.Create(ctx, creator, hackatomWasm, nil) require.NoError(t, err) _, _, bob := keyPubAddr() @@ -841,10 +1022,11 @@ func TestExecuteWithStorageLoop(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) - fred := keepers.Faucet.NewFundedAccount(ctx, topUp...) + creator := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(ctx, creator, deposit.Add(deposit...)...) + fred := keepers.Faucet.NewFundedRandomAccount(ctx, topUp...) - contractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) + contractID, _, err := keeper.Create(ctx, creator, hackatomWasm, nil) require.NoError(t, err) _, _, bob := keyPubAddr() @@ -877,21 +1059,23 @@ func TestExecuteWithStorageLoop(t *testing.T) { } func TestMigrate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) - fred := keepers.Faucet.NewFundedAccount(ctx, topUp...) - - originalCodeID := StoreHackatomExampleContract(t, ctx, keepers).CodeID - newCodeID := StoreHackatomExampleContract(t, ctx, keepers).CodeID - ibcCodeID := StoreIBCReflectContract(t, ctx, keepers).CodeID + creator := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(parentCtx, creator, deposit.Add(deposit...)...) + fred := DeterministicAccountAddress(t, 2) + keepers.Faucet.Fund(parentCtx, fred, topUp...) + + originalCodeID := StoreHackatomExampleContract(t, parentCtx, keepers).CodeID + newCodeID := StoreHackatomExampleContract(t, parentCtx, keepers).CodeID + ibcCodeID := StoreIBCReflectContract(t, parentCtx, keepers).CodeID require.NotEqual(t, originalCodeID, newCodeID) - restrictedCodeExample := StoreHackatomExampleContract(t, ctx, keepers) - require.NoError(t, keeper.SetAccessConfig(ctx, restrictedCodeExample.CodeID, restrictedCodeExample.CreatorAddr, types.AllowNobody)) + restrictedCodeExample := StoreHackatomExampleContract(t, parentCtx, keepers) + require.NoError(t, keeper.SetAccessConfig(parentCtx, restrictedCodeExample.CodeID, restrictedCodeExample.CreatorAddr, types.AllowNobody)) require.NotEqual(t, originalCodeID, restrictedCodeExample.CodeID) anyAddr := RandomAccountAddress(t) @@ -1017,7 +1201,7 @@ func TestMigrate(t *testing.T) { "fail when no IBC callbacks": { admin: fred, caller: fred, - initMsg: IBCReflectInitMsg{ReflectCodeID: StoreReflectContract(t, ctx, keepers)}.GetBytes(t), + initMsg: IBCReflectInitMsg{ReflectCodeID: StoreReflectContract(t, parentCtx, keepers).CodeID}.GetBytes(t), fromCodeID: ibcCodeID, toCodeID: newCodeID, migrateMsg: migMsgBz, @@ -1025,10 +1209,13 @@ func TestMigrate(t *testing.T) { }, } + blockHeight := parentCtx.BlockHeight() for msg, spec := range specs { t.Run(msg, func(t *testing.T) { // given a contract instance - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + ctx, _ := parentCtx.WithBlockHeight(blockHeight + 1).CacheContext() + blockHeight++ + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, spec.fromCodeID, creator, spec.admin, spec.initMsg, "demo contract", nil) require.NoError(t, err) if spec.overrideContractAddr != nil { @@ -1109,15 +1296,16 @@ func TestMigrateWithDispatchedMessage(t *testing.T) { keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) - fred := keepers.Faucet.NewFundedAccount(ctx, sdk.NewInt64Coin("denom", 5000)) + creator := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(ctx, creator, deposit.Add(deposit...)...) + fred := keepers.Faucet.NewFundedRandomAccount(ctx, sdk.NewInt64Coin("denom", 5000)) burnerCode, err := os.ReadFile("./testdata/burner.wasm") require.NoError(t, err) - originalContractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) + originalContractID, _, err := keeper.Create(ctx, creator, hackatomWasm, nil) require.NoError(t, err) - burnerContractID, err := keeper.Create(ctx, creator, burnerCode, nil) + burnerContractID, _, err := keeper.Create(ctx, creator, burnerCode, nil) require.NoError(t, err) require.NotEqual(t, originalContractID, burnerContractID) @@ -1279,9 +1467,10 @@ func TestSudo(t *testing.T) { accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) + creator := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(ctx, creator, deposit.Add(deposit...)...) - contractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) + contractID, _, err := keeper.Create(ctx, creator, hackatomWasm, nil) require.NoError(t, err) _, _, bob := keyPubAddr() @@ -1294,7 +1483,7 @@ func TestSudo(t *testing.T) { require.NoError(t, err) addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) require.NoError(t, err) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", addr.String()) + require.Equal(t, "cosmos1eycfqpgtcp4gc9g24cvg6useyncxspq8qurv2z7cs0wzcgvmffaquzwe2e", addr.String()) // the community is broke _, _, community := keyPubAddr() @@ -1358,15 +1547,16 @@ func mustMarshal(t *testing.T, r interface{}) []byte { } func TestUpdateContractAdmin(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) - fred := keepers.Faucet.NewFundedAccount(ctx, topUp...) + creator := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(parentCtx, creator, deposit.Add(deposit...)...) + fred := keepers.Faucet.NewFundedRandomAccount(parentCtx, topUp...) - originalContractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) + originalContractID, _, err := keeper.Create(parentCtx, creator, hackatomWasm, nil) require.NoError(t, err) _, _, anyAddr := keyPubAddr() @@ -1409,6 +1599,7 @@ func TestUpdateContractAdmin(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { + ctx, _ := parentCtx.CacheContext() addr, _, err := keepers.ContractKeeper.Instantiate(ctx, originalContractID, creator, spec.instAdmin, initMsgBz, "demo contract", nil) require.NoError(t, err) if spec.overrideContractAddr != nil { @@ -1426,15 +1617,16 @@ func TestUpdateContractAdmin(t *testing.T) { } func TestClearContractAdmin(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) - fred := keepers.Faucet.NewFundedAccount(ctx, topUp...) + creator := DeterministicAccountAddress(t, 1) + keepers.Faucet.Fund(parentCtx, creator, deposit.Add(deposit...)...) + fred := keepers.Faucet.NewFundedRandomAccount(parentCtx, topUp...) - originalContractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) + originalContractID, _, err := keeper.Create(parentCtx, creator, hackatomWasm, nil) require.NoError(t, err) _, _, anyAddr := keyPubAddr() @@ -1472,6 +1664,7 @@ func TestClearContractAdmin(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { + ctx, _ := parentCtx.CacheContext() addr, _, err := keepers.ContractKeeper.Instantiate(ctx, originalContractID, creator, spec.instAdmin, initMsgBz, "demo contract", nil) require.NoError(t, err) if spec.overrideContractAddr != nil { @@ -1806,52 +1999,103 @@ func TestQueryIsolation(t *testing.T) { } func TestBuildContractAddress(t *testing.T) { + x, y := sdk.GetConfig().GetBech32AccountAddrPrefix(), sdk.GetConfig().GetBech32AccountPubPrefix() + t.Cleanup(func() { + sdk.GetConfig().SetBech32PrefixForAccount(x, y) + }) + sdk.GetConfig().SetBech32PrefixForAccount("purple", "purple") + + // test vectors from https://gist.github.com/webmaster128/e4d401d414bd0e7e6f70482f11877fbe specs := map[string]struct { - srcCodeID uint64 - srcInstanceID uint64 - expectedAddr string + checksum []byte + label string + creator string + expAddress string }{ - "initial contract": { - srcCodeID: 1, - srcInstanceID: 1, - expectedAddr: "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", - }, - "demo value": { - srcCodeID: 1, - srcInstanceID: 100, - expectedAddr: "cosmos1mujpjkwhut9yjw4xueyugc02evfv46y0dtmnz4lh8xxkkdapym9stu5qm8", - }, - "both below max": { - srcCodeID: math.MaxUint32 - 1, - srcInstanceID: math.MaxUint32 - 1, - }, - "both at max": { - srcCodeID: math.MaxUint32, - srcInstanceID: math.MaxUint32, - }, - "codeID > max u32": { - srcCodeID: math.MaxUint32 + 1, - srcInstanceID: 17, - expectedAddr: "cosmos1673hrexz4h6s0ft04l96ygq667djzh2nsr335kstjp49x5dk6rpsf5t0le", - }, - "instanceID > max u32": { - srcCodeID: 22, - srcInstanceID: math.MaxUint32 + 1, - expectedAddr: "cosmos10q3pgfvmeyy0veekgtqhxujxkhz0vm9zmalqgc7evrhj68q3l62qrdfg4m", + "initial account addr example": { + checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), + label: "instance 1", + creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + expAddress: "purple1jukvumwqfxapueg6un6rtmafxktcluzv70xc3edz2m5t3slgw49qrmhc03", + }, + "account addr with different label": { + checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), + label: "instance 2", + creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + expAddress: "purple1jpc2w2vu2t6k7u09p6v8e3w28ptnzvvt2snu5rytlj8qya27dq5sjkwm06", + }, + "initial contract addr example": { + checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), + label: "instance 1", + creator: "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + expAddress: "purple1wde5zlcveuh79w37w5g244qu9xja3hgfulyfkjvkxvwvjzgd5l3qfraz3c", + }, + "contract addr with different label": { + checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), + label: "instance 2", + creator: "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + expAddress: "purple1vae2kf0r3ehtq5q2jmfkg7wp4ckxwrw8dv4pvazz5nlzzu05lxzq878fa9", + }, + "account addr with different checksum": { + checksum: fromHex("1DA6C16DE2CBAF7AD8CBB66F0925BA33F5C278CB2491762D04658C1480EA229B"), + label: "instance 1", + creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + expAddress: "purple1gmgvt9levtn52mpfal3gl5tv60f47zez3wgczrh5c9352sfm9crs47zt0k", + }, + "account addr with different checksum and label": { + checksum: fromHex("1DA6C16DE2CBAF7AD8CBB66F0925BA33F5C278CB2491762D04658C1480EA229B"), + label: "instance 2", + creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + expAddress: "purple13jrcqxknt05rhdxmegjzjel666yay6fj3xvfp6445k7a9q2km4wqa7ss34", + }, + "contract addr with different checksum": { + checksum: fromHex("1DA6C16DE2CBAF7AD8CBB66F0925BA33F5C278CB2491762D04658C1480EA229B"), + label: "instance 1", + creator: "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + expAddress: "purple1lu0lf6wmqeuwtrx93ptzvf4l0dyyz2vz6s8h5y9cj42fvhsmracq49pww9", + }, + "contract addr with different checksum and label": { + checksum: fromHex("1DA6C16DE2CBAF7AD8CBB66F0925BA33F5C278CB2491762D04658C1480EA229B"), + label: "instance 2", + creator: "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + expAddress: "purple1zmerc8a9ml2au29rq3knuu35fktef3akceurckr6pf370n0wku7sw3c9mj", + }, + // regression tests + "min label size": { + checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), + label: "x", + creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + expAddress: "purple16pc8gt824lmp3dh2sxvttj0ykcs02n5p3ldswhv3j7y853gghlfq7mqeh9", + }, + "max label size": { + checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), + label: strings.Repeat("x", types.MaxLabelSize), + creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + expAddress: "purple1prkdvjmvv4s3tnppfxmlpj259v9cplf3wws4qq9qd7w3s4yqzqeqem4759", }, } for name, spec := range specs { t.Run(name, func(t *testing.T) { - gotAddr := BuildContractAddress(spec.srcCodeID, spec.srcInstanceID) - require.NotNil(t, gotAddr) - assert.Nil(t, sdk.VerifyAddressFormat(gotAddr)) - if len(spec.expectedAddr) > 0 { - require.Equal(t, spec.expectedAddr, gotAddr.String()) - } + creatorAddr, err := sdk.AccAddressFromBech32(spec.creator) + require.NoError(t, err) + + // when + gotAddr := BuildContractAddress(spec.checksum, creatorAddr, spec.label) + + require.Equal(t, spec.expAddress, gotAddr.String()) + require.NoError(t, sdk.VerifyAddressFormat(gotAddr)) }) } } +func fromHex(s string) []byte { + r, err := hex.DecodeString(s) + if err != nil { + panic(err) + } + return r +} + func TestSetAccessConfig(t *testing.T) { parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) k := keepers.WasmKeeper diff --git a/x/wasm/keeper/legacy_querier_test.go b/x/wasm/keeper/legacy_querier_test.go index 1f22a5082c..1b6006fa30 100644 --- a/x/wasm/keeper/legacy_querier_test.go +++ b/x/wasm/keeper/legacy_querier_test.go @@ -21,13 +21,13 @@ func TestLegacyQueryContractState(t *testing.T) { keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) - anyAddr := keepers.Faucet.NewFundedAccount(ctx, sdk.NewInt64Coin("denom", 5000)) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit.Add(deposit...)...) + anyAddr := keepers.Faucet.NewFundedRandomAccount(ctx, sdk.NewInt64Coin("denom", 5000)) wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - contractID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) + contractID, _, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) require.NoError(t, err) _, _, bob := keyPubAddr() @@ -159,13 +159,13 @@ func TestLegacyQueryContractListByCodeOrdering(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 1000000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 500)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) - anyAddr := keepers.Faucet.NewFundedAccount(ctx, topUp...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit.Add(deposit...)...) + anyAddr := keepers.Faucet.NewFundedRandomAccount(ctx, topUp...) wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - codeID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) + codeID, _, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) require.NoError(t, err) _, _, bob := keyPubAddr() diff --git a/x/wasm/keeper/migrations.go b/x/wasm/keeper/migrations.go new file mode 100644 index 0000000000..4d218d504a --- /dev/null +++ b/x/wasm/keeper/migrations.go @@ -0,0 +1,27 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/CosmWasm/wasmd/x/wasm/types" +) + +// Migrator is a struct for handling in-place store migrations. +type Migrator struct { + keeper *Keeper +} + +// NewMigrator returns a new Migrator. +func NewMigrator(keeper *Keeper) Migrator { + return Migrator{keeper: keeper} +} + +var keyLastInstanceID = append(types.SequenceKeyPrefix, []byte("lastContractId")...) + +// Migrate1to2 migrates from version 1 to 2. +// Remove the unused sequence for address generation +func (m Migrator) Migrate1to2(ctx sdk.Context) error { + store := ctx.KVStore(m.keeper.storeKey) + store.Delete(keyLastInstanceID) + return nil +} diff --git a/x/wasm/keeper/migrations_test.go b/x/wasm/keeper/migrations_test.go new file mode 100644 index 0000000000..bc9110a3b3 --- /dev/null +++ b/x/wasm/keeper/migrations_test.go @@ -0,0 +1,20 @@ +package keeper + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/assert" +) + +func TestMigrateV1ToV2(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) + store := ctx.KVStore(keepers.WasmKeeper.storeKey) + store.Set(keyLastInstanceID, sdk.Uint64ToBigEndian(100)) + + // when + NewMigrator(keepers.WasmKeeper).Migrate1to2(ctx) + + // then + assert.False(t, store.Has(keyLastInstanceID)) +} diff --git a/x/wasm/keeper/msg_server.go b/x/wasm/keeper/msg_server.go index 1c45ff52ec..8c2a592ebf 100644 --- a/x/wasm/keeper/msg_server.go +++ b/x/wasm/keeper/msg_server.go @@ -32,13 +32,14 @@ func (m msgServer) StoreCode(goCtx context.Context, msg *types.MsgStoreCode) (*t sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), )) - codeID, err := m.keeper.Create(ctx, senderAddr, msg.WASMByteCode, msg.InstantiatePermission) + codeID, checksum, err := m.keeper.Create(ctx, senderAddr, msg.WASMByteCode, msg.InstantiatePermission) if err != nil { return nil, err } return &types.MsgStoreCodeResponse{ - CodeID: codeID, + CodeID: codeID, + Checksum: checksum, }, nil } diff --git a/x/wasm/keeper/msg_server_integration_test.go b/x/wasm/keeper/msg_server_integration_test.go new file mode 100644 index 0000000000..dde8ae7744 --- /dev/null +++ b/x/wasm/keeper/msg_server_integration_test.go @@ -0,0 +1,46 @@ +package keeper_test + +import ( + "crypto/sha256" + _ "embed" + "testing" + + "github.com/cosmos/cosmos-sdk/testutil/testdata" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + "github.com/CosmWasm/wasmd/app" + "github.com/CosmWasm/wasmd/x/wasm/types" +) + +//go:embed testdata/reflect.wasm +var wasmContract []byte + +func TestStoreCode(t *testing.T) { + wasmApp := app.Setup(false) + ctx := wasmApp.BaseApp.NewContext(false, tmproto.Header{}) + _, _, sender := testdata.KeyTestPubAddr() + msg := types.MsgStoreCodeFixture(func(m *types.MsgStoreCode) { + m.WASMByteCode = wasmContract + m.Sender = sender.String() + }) + + // when + rsp, err := wasmApp.MsgServiceRouter().Handler(msg)(ctx, msg) + + // then + require.NoError(t, err) + var result types.MsgStoreCodeResponse + require.NoError(t, wasmApp.AppCodec().Unmarshal(rsp.Data, &result)) + assert.Equal(t, uint64(1), result.CodeID) + expHash := sha256.Sum256(wasmContract) + assert.Equal(t, expHash[:], result.Checksum) + // and + info := wasmApp.WasmKeeper.GetCodeInfo(ctx, 1) + assert.NotNil(t, info) + assert.Equal(t, expHash[:], info.CodeHash) + assert.Equal(t, sender.String(), info.Creator) + assert.Equal(t, types.DefaultParams().InstantiateDefaultPermission.With(sender), info.InstantiateConfig) +} diff --git a/x/wasm/keeper/options.go b/x/wasm/keeper/options.go index c3d9d1248e..e6119b4478 100644 --- a/x/wasm/keeper/options.go +++ b/x/wasm/keeper/options.go @@ -2,7 +2,9 @@ package keeper import ( "fmt" + "reflect" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/prometheus/client_golang/prometheus" "github.com/CosmWasm/wasmd/x/wasm/types" @@ -89,11 +91,25 @@ func WithMessageEncoders(x *MessageEncoders) Option { // WithCoinTransferrer is an optional constructor parameter to set a custom coin transferrer func WithCoinTransferrer(x CoinTransferrer) Option { + if x == nil { + panic("must not be nil") + } return optsFn(func(k *Keeper) { k.bank = x }) } +// WithCoinPruner is an optional constructor parameter to set a custom type that handles balances +// for accounts pruned on contract instantiate +func WithCoinPruner(x CoinPruner) Option { + if x == nil { + panic("must not be nil") + } + return optsFn(func(k *Keeper) { + k.coinPruner = x + }) +} + func WithVMCacheMetrics(r prometheus.Registerer) Option { return optsFn(func(k *Keeper) { NewWasmVMMetricsCollector(k.wasmVM).Register(r) @@ -104,6 +120,9 @@ func WithVMCacheMetrics(r prometheus.Registerer) Option { // When the "gas multiplier" for wasmvm gas conversion is modified inside the new register, // make sure to also use `WithApiCosts` option for non default values func WithGasRegister(x GasRegister) Option { + if x == nil { + panic("must not be nil") + } return optsFn(func(k *Keeper) { k.gasRegister = x }) @@ -123,3 +142,42 @@ func WithMaxQueryStackSize(m uint32) Option { k.maxQueryStackSize = m }) } + +// WithAcceptedAccountTypesOnContractInstantiation sets the accepted account types. Account types of this list won't be overwritten or cause a failure +// when they exist for an address on contract instantiation. +// +// Values should be references and contain the `*authtypes.BaseAccount` as default bank account type. +func WithAcceptedAccountTypesOnContractInstantiation(accts ...authtypes.AccountI) Option { + m := asTypeMap(accts) + return optsFn(func(k *Keeper) { + k.acceptedAccountTypes = m + }) +} + +// WithPruneAccountTypesOnContractInstantiation sets the account types that should be cleared. Account types of this list +// will be overwritten with the BaseAccount type and their balance burned, when they exist for an address on contract +// instantiation. +// +// Values should be references and contain the `*vestingtypes.DelayedVestingAccount`, `*vestingtypes.ContinuousVestingAccount` +// as post genesis account types with an open address range. +func WithPruneAccountTypesOnContractInstantiation(accts ...authtypes.AccountI) Option { + m := asTypeMap(accts) + return optsFn(func(k *Keeper) { + k.pruneAccountTypes = m + }) +} + +func asTypeMap(accts []authtypes.AccountI) map[reflect.Type]struct{} { + m := make(map[reflect.Type]struct{}, len(accts)) + for _, a := range accts { + if a == nil { + panic(types.ErrEmpty.Wrap("address")) + } + at := reflect.TypeOf(a) + if _, exists := m[at]; exists { + panic(types.ErrDuplicate.Wrapf("%T", a)) + } + m[at] = struct{}{} + } + return m +} diff --git a/x/wasm/keeper/options_test.go b/x/wasm/keeper/options_test.go index 07195e0468..b4c7f0861e 100644 --- a/x/wasm/keeper/options_test.go +++ b/x/wasm/keeper/options_test.go @@ -1,9 +1,13 @@ package keeper import ( + "reflect" "testing" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" @@ -81,10 +85,36 @@ func TestConstructorOptions(t *testing.T) { assert.IsType(t, uint32(1), k.maxQueryStackSize) }, }, + "accepted account types": { + srcOpt: WithAcceptedAccountTypesOnContractInstantiation(&authtypes.BaseAccount{}, &vestingtypes.ContinuousVestingAccount{}), + verify: func(t *testing.T, k Keeper) { + exp := map[reflect.Type]struct{}{ + reflect.TypeOf(&authtypes.BaseAccount{}): {}, + reflect.TypeOf(&vestingtypes.ContinuousVestingAccount{}): {}, + } + assert.Equal(t, exp, k.acceptedAccountTypes) + }, + }, + "prune account types": { + srcOpt: WithPruneAccountTypesOnContractInstantiation(&authtypes.BaseAccount{}, &vestingtypes.ContinuousVestingAccount{}), + verify: func(t *testing.T, k Keeper) { + exp := map[reflect.Type]struct{}{ + reflect.TypeOf(&authtypes.BaseAccount{}): {}, + reflect.TypeOf(&vestingtypes.ContinuousVestingAccount{}): {}, + } + assert.Equal(t, exp, k.pruneAccountTypes) + }, + }, + "coin pruner": { + srcOpt: WithCoinPruner(CoinBurner{}), + verify: func(t *testing.T, k Keeper) { + assert.Equal(t, CoinBurner{}, k.coinPruner) + }, + }, } for name, spec := range specs { t.Run(name, func(t *testing.T) { - k := NewKeeper(nil, nil, paramtypes.NewSubspace(nil, nil, nil, nil, ""), authkeeper.AccountKeeper{}, nil, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, "tempDir", types.DefaultWasmConfig(), AvailableCapabilities, spec.srcOpt) + k := NewKeeper(nil, nil, paramtypes.NewSubspace(nil, nil, nil, nil, ""), authkeeper.AccountKeeper{}, &bankkeeper.BaseKeeper{}, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, "tempDir", types.DefaultWasmConfig(), AvailableCapabilities, spec.srcOpt) spec.verify(t, k) }) } diff --git a/x/wasm/keeper/proposal_handler.go b/x/wasm/keeper/proposal_handler.go index 905b073d5e..29b736b00b 100644 --- a/x/wasm/keeper/proposal_handler.go +++ b/x/wasm/keeper/proposal_handler.go @@ -64,7 +64,7 @@ func handleStoreCodeProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types if err != nil { return sdkerrors.Wrap(err, "run as address") } - codeID, err := k.Create(ctx, runAsAddr, p.WASMByteCode, p.InstantiatePermission) + codeID, _, err := k.Create(ctx, runAsAddr, p.WASMByteCode, p.InstantiatePermission) if err != nil { return err } diff --git a/x/wasm/keeper/proposal_integration_test.go b/x/wasm/keeper/proposal_integration_test.go index f7034db562..ace55269db 100644 --- a/x/wasm/keeper/proposal_integration_test.go +++ b/x/wasm/keeper/proposal_integration_test.go @@ -2,6 +2,7 @@ package keeper import ( "bytes" + "crypto/sha256" "encoding/hex" "encoding/json" "errors" @@ -116,9 +117,8 @@ func TestInstantiateProposal(t *testing.T) { require.NoError(t, err) // then - contractAddr, err := sdk.AccAddressFromBech32("cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr") - require.NoError(t, err) - + codeHash := keepers.WasmKeeper.GetCodeInfo(ctx, 1).CodeHash + contractAddr := BuildContractAddress(codeHash, oneAddress, "testing") cInfo := wasmKeeper.GetContractInfo(ctx, contractAddr) require.NotNil(t, cInfo) assert.Equal(t, uint64(1), cInfo.CodeID) @@ -188,9 +188,8 @@ func TestInstantiateProposal_NoAdmin(t *testing.T) { require.NoError(t, err) // then - contractAddr, err := sdk.AccAddressFromBech32("cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr") - require.NoError(t, err) - + codeHash := keepers.WasmKeeper.GetCodeInfo(ctx, 1).CodeHash + contractAddr := BuildContractAddress(codeHash, oneAddress, "testing") cInfo := wasmKeeper.GetContractInfo(ctx, contractAddr) require.NotNil(t, cInfo) assert.Equal(t, uint64(1), cInfo.CodeID) @@ -229,9 +228,9 @@ func TestMigrateProposal(t *testing.T) { require.NoError(t, wasmKeeper.importCode(ctx, 2, codeInfoFixture, wasmCode)) var ( - anyAddress sdk.AccAddress = bytes.Repeat([]byte{0x1}, types.ContractAddrLen) - otherAddress sdk.AccAddress = bytes.Repeat([]byte{0x2}, types.ContractAddrLen) - contractAddr = BuildContractAddress(1, 1) + anyAddress = DeterministicAccountAddress(t, 1) + otherAddress = DeterministicAccountAddress(t, 2) + contractAddr = BuildContractAddress(codeInfoFixture.CodeHash, RandomAccountAddress(t), "") ) contractInfoFixture := types.ContractInfoFixture(func(c *types.ContractInfo) { @@ -408,12 +407,13 @@ func TestSudoProposal(t *testing.T) { } func TestAdminProposals(t *testing.T) { - var ( - otherAddress sdk.AccAddress = bytes.Repeat([]byte{0x2}, types.ContractAddrLen) - contractAddr = BuildContractAddress(1, 1) - ) wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) + var ( + otherAddress = DeterministicAccountAddress(t, 2) + codeHash = sha256.Sum256(wasmCode) + contractAddr = BuildContractAddress(codeHash[:], RandomAccountAddress(t), "") + ) specs := map[string]struct { state types.ContractInfo diff --git a/x/wasm/keeper/querier_test.go b/x/wasm/keeper/querier_test.go index 21df7f94fd..115eeb8419 100644 --- a/x/wasm/keeper/querier_test.go +++ b/x/wasm/keeper/querier_test.go @@ -158,8 +158,9 @@ func TestQuerySmartContractState(t *testing.T) { func TestQuerySmartContractPanics(t *testing.T) { ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) - contractAddr := BuildContractAddress(1, 1) - keepers.WasmKeeper.storeCodeInfo(ctx, 1, types.CodeInfo{}) + creator := RandomAccountAddress(t) + contractAddr := BuildContractAddress([]byte("myCodeHash"), creator, "testing") + keepers.WasmKeeper.storeCodeInfo(ctx, 1, types.CodeInfo{CodeHash: []byte("myCodeHash")}) keepers.WasmKeeper.storeContractInfo(ctx, contractAddr, &types.ContractInfo{ CodeID: 1, Created: types.NewAbsoluteTxPosition(ctx), @@ -262,13 +263,13 @@ func TestQueryContractListByCodeOrdering(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 1000000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 500)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) - anyAddr := keepers.Faucet.NewFundedAccount(ctx, topUp...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) + anyAddr := keepers.Faucet.NewFundedRandomAccount(ctx, topUp...) wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - codeID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) + codeID, _, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) require.NoError(t, err) _, _, bob := keyPubAddr() diff --git a/x/wasm/keeper/reflect_test.go b/x/wasm/keeper/reflect_test.go index 8e4f4829eb..f478a32935 100644 --- a/x/wasm/keeper/reflect_test.go +++ b/x/wasm/keeper/reflect_test.go @@ -43,18 +43,18 @@ func TestReflectContractSend(t *testing.T) { accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) _, _, bob := keyPubAddr() // upload reflect code - reflectID, err := keeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + reflectID, _, err := keeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), reflectID) // upload hackatom escrow code escrowCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - escrowID, err := keeper.Create(ctx, creator, escrowCode, nil) + escrowID, _, err := keeper.Create(ctx, creator, escrowCode, nil) require.NoError(t, err) require.Equal(t, uint64(2), escrowID) @@ -122,12 +122,12 @@ func TestReflectCustomMsg(t *testing.T) { accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) - bob := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) + bob := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) _, _, fred := keyPubAddr() // upload code - codeID, err := keeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + codeID, _, err := keeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) @@ -213,10 +213,10 @@ func TestMaskReflectCustomQuery(t *testing.T) { keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) // upload code - codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + codeID, _, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) @@ -263,10 +263,10 @@ func TestReflectStargateQuery(t *testing.T) { funds := sdk.NewCoins(sdk.NewInt64Coin("denom", 320000)) contractStart := sdk.NewCoins(sdk.NewInt64Coin("denom", 40000)) expectedBalance := funds.Sub(contractStart) - creator := keepers.Faucet.NewFundedAccount(ctx, funds...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, funds...) // upload code - codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + codeID, _, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) @@ -303,7 +303,7 @@ func TestReflectTotalSupplyQuery(t *testing.T) { ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) keeper := keepers.WasmKeeper // upload code - codeID := StoreReflectContract(t, ctx, keepers) + codeID := StoreReflectContract(t, ctx, keepers).CodeID // creator instantiates a contract and gives it tokens creator := RandomAccountAddress(t) contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "testing", nil) @@ -356,10 +356,10 @@ func TestReflectInvalidStargateQuery(t *testing.T) { funds := sdk.NewCoins(sdk.NewInt64Coin("denom", 320000)) contractStart := sdk.NewCoins(sdk.NewInt64Coin("denom", 40000)) - creator := keepers.Faucet.NewFundedAccount(ctx, funds...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, funds...) // upload code - codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + codeID, _, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) @@ -434,10 +434,10 @@ func TestMaskReflectWasmQueries(t *testing.T) { keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) // upload reflect code - reflectID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + reflectID, _, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), reflectID) @@ -504,10 +504,10 @@ func TestWasmRawQueryWithNil(t *testing.T) { keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) // upload reflect code - reflectID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + reflectID, _, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), reflectID) diff --git a/x/wasm/keeper/snapshotter_integration_test.go b/x/wasm/keeper/snapshotter_integration_test.go index bef6cf0050..f100a1698c 100644 --- a/x/wasm/keeper/snapshotter_integration_test.go +++ b/x/wasm/keeper/snapshotter_integration_test.go @@ -55,11 +55,10 @@ func TestSnapshotter(t *testing.T) { for i, v := range spec.wasmFiles { wasmCode, err := os.ReadFile(v) require.NoError(t, err) - codeID, err := contractKeeper.Create(ctx, genesisAddr, wasmCode, nil) + codeID, checksum, err := contractKeeper.Create(ctx, genesisAddr, wasmCode, nil) require.NoError(t, err) require.Equal(t, uint64(i+1), codeID) - hash := sha256.Sum256(wasmCode) - srcCodeIDToChecksum[codeID] = hash[:] + srcCodeIDToChecksum[codeID] = checksum } // create snapshot srcWasmApp.Commit() diff --git a/x/wasm/keeper/staking_test.go b/x/wasm/keeper/staking_test.go index 15f0e0ac70..23ca71819b 100644 --- a/x/wasm/keeper/staking_test.go +++ b/x/wasm/keeper/staking_test.go @@ -103,12 +103,12 @@ func TestInitializeStaking(t *testing.T) { assert.Equal(t, v.GetDelegatorShares(), sdk.NewDec(1234567)) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000), sdk.NewInt64Coin("stake", 500000)) - creator := k.Faucet.NewFundedAccount(ctx, deposit...) + creator := k.Faucet.NewFundedRandomAccount(ctx, deposit...) // upload staking derivates code stakingCode, err := os.ReadFile("./testdata/staking.wasm") require.NoError(t, err) - stakingID, err := keeper.Create(ctx, creator, stakingCode, nil) + stakingID, _, err := keeper.Create(ctx, creator, stakingCode, nil) require.NoError(t, err) require.Equal(t, uint64(1), stakingID) @@ -186,12 +186,12 @@ func initializeStaking(t *testing.T) initInfo { assert.Equal(t, v.Status, stakingtypes.Bonded) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000), sdk.NewInt64Coin("stake", 500000)) - creator := k.Faucet.NewFundedAccount(ctx, deposit...) + creator := k.Faucet.NewFundedRandomAccount(ctx, deposit...) // upload staking derivates code stakingCode, err := os.ReadFile("./testdata/staking.wasm") require.NoError(t, err) - stakingID, err := k.ContractKeeper.Create(ctx, creator, stakingCode, nil) + stakingID, _, err := k.ContractKeeper.Create(ctx, creator, stakingCode, nil) require.NoError(t, err) require.Equal(t, uint64(1), stakingID) @@ -239,7 +239,7 @@ func TestBonding(t *testing.T) { // bob has 160k, putting 80k into the contract full := sdk.NewCoins(sdk.NewInt64Coin("stake", 160000)) funds := sdk.NewCoins(sdk.NewInt64Coin("stake", 80000)) - bob := initInfo.faucet.NewFundedAccount(ctx, full...) + bob := initInfo.faucet.NewFundedRandomAccount(ctx, full...) // check contract state before assertBalance(t, ctx, keeper, contractAddr, bob, "0") @@ -287,7 +287,7 @@ func TestUnbonding(t *testing.T) { // bob has 160k, putting 80k into the contract full := sdk.NewCoins(sdk.NewInt64Coin("stake", 160000)) funds := sdk.NewCoins(sdk.NewInt64Coin("stake", 80000)) - bob := initInfo.faucet.NewFundedAccount(ctx, full...) + bob := initInfo.faucet.NewFundedRandomAccount(ctx, full...) bond := StakingHandleMsg{ Bond: &struct{}{}, @@ -354,7 +354,7 @@ func TestReinvest(t *testing.T) { // full is 2x funds, 1x goes to the contract, other stays on his wallet full := sdk.NewCoins(sdk.NewInt64Coin("stake", 400000)) funds := sdk.NewCoins(sdk.NewInt64Coin("stake", 200000)) - bob := initInfo.faucet.NewFundedAccount(ctx, full...) + bob := initInfo.faucet.NewFundedRandomAccount(ctx, full...) // we will stake 200k to a validator with 1M self-bond // this means we should get 1/6 of the rewards @@ -422,7 +422,7 @@ func TestQueryStakingInfo(t *testing.T) { // full is 2x funds, 1x goes to the contract, other stays on his wallet full := sdk.NewCoins(sdk.NewInt64Coin("stake", 400000)) funds := sdk.NewCoins(sdk.NewInt64Coin("stake", 200000)) - bob := initInfo.faucet.NewFundedAccount(ctx, full...) + bob := initInfo.faucet.NewFundedRandomAccount(ctx, full...) // we will stake 200k to a validator with 1M self-bond // this means we should get 1/6 of the rewards @@ -444,10 +444,10 @@ func TestQueryStakingInfo(t *testing.T) { // STEP 2: Prepare the mask contract deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator := initInfo.faucet.NewFundedAccount(ctx, deposit...) + creator := initInfo.faucet.NewFundedRandomAccount(ctx, deposit...) // upload mask code - maskID, err := initInfo.contractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + maskID, _, err := initInfo.contractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(2), maskID) @@ -599,7 +599,7 @@ func TestQueryStakingPlugin(t *testing.T) { // full is 2x funds, 1x goes to the contract, other stays on his wallet full := sdk.NewCoins(sdk.NewInt64Coin("stake", 400000)) funds := sdk.NewCoins(sdk.NewInt64Coin("stake", 200000)) - bob := initInfo.faucet.NewFundedAccount(ctx, full...) + bob := initInfo.faucet.NewFundedRandomAccount(ctx, full...) // we will stake 200k to a validator with 1M self-bond // this means we should get 1/6 of the rewards @@ -652,7 +652,7 @@ func TestQueryStakingPlugin(t *testing.T) { // adds a few validators and returns a list of validators that are registered func addValidator(t *testing.T, ctx sdk.Context, stakingKeeper stakingkeeper.Keeper, faucet *TestFaucet, value sdk.Coin) sdk.ValAddress { - owner := faucet.NewFundedAccount(ctx, value) + owner := faucet.NewFundedRandomAccount(ctx, value) privKey := secp256k1.GenPrivKey() pubKey := privKey.PubKey() diff --git a/x/wasm/keeper/submsg_test.go b/x/wasm/keeper/submsg_test.go index d1f1d30cda..cd2555fef7 100644 --- a/x/wasm/keeper/submsg_test.go +++ b/x/wasm/keeper/submsg_test.go @@ -26,12 +26,12 @@ func TestDispatchSubMsgSuccessCase(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) contractStart := sdk.NewCoins(sdk.NewInt64Coin("denom", 40000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) creatorBalance := deposit.Sub(contractStart) _, _, fred := keyPubAddr() // upload code - codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + codeID, _, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) @@ -110,16 +110,16 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { ctx = ctx.WithBlockGasMeter(sdk.NewInfiniteGasMeter()) keeper := keepers.WasmKeeper contractStart := sdk.NewCoins(sdk.NewInt64Coin(fundedDenom, int64(fundedAmount))) - uploader := keepers.Faucet.NewFundedAccount(ctx, contractStart.Add(contractStart...)...) + uploader := keepers.Faucet.NewFundedRandomAccount(ctx, contractStart.Add(contractStart...)...) // upload code - reflectID, err := keepers.ContractKeeper.Create(ctx, uploader, testdata.ReflectContractWasm(), nil) + reflectID, _, err := keepers.ContractKeeper.Create(ctx, uploader, testdata.ReflectContractWasm(), nil) require.NoError(t, err) // create hackatom contract for testing (for infinite loop) hackatomCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - hackatomID, err := keepers.ContractKeeper.Create(ctx, uploader, hackatomCode, nil) + hackatomID, _, err := keepers.ContractKeeper.Create(ctx, uploader, hackatomCode, nil) require.NoError(t, err) _, _, bob := keyPubAddr() _, _, fred := keyPubAddr() @@ -282,7 +282,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { } for name, tc := range cases { t.Run(name, func(t *testing.T) { - creator := keepers.Faucet.NewFundedAccount(ctx, contractStart...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, contractStart...) _, _, empty := keyPubAddr() contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, reflectID, creator, nil, []byte("{}"), fmt.Sprintf("contract %s", name), contractStart) @@ -366,11 +366,11 @@ func TestDispatchSubMsgEncodeToNoSdkMsg(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) contractStart := sdk.NewCoins(sdk.NewInt64Coin("denom", 40000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) _, _, fred := keyPubAddr() // upload code - codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + codeID, _, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) // creator instantiates a contract and gives it tokens @@ -432,11 +432,11 @@ func TestDispatchSubMsgConditionalReplyOn(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) contractStart := sdk.NewCoins(sdk.NewInt64Coin("denom", 40000)) - creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + creator := keepers.Faucet.NewFundedRandomAccount(ctx, deposit...) _, _, fred := keyPubAddr() // upload code - codeID, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) + codeID, _, err := keepers.ContractKeeper.Create(ctx, creator, testdata.ReflectContractWasm(), nil) require.NoError(t, err) // creator instantiates a contract and gives it tokens diff --git a/x/wasm/keeper/test_common.go b/x/wasm/keeper/test_common.go index 8b0f782047..fff90af36b 100644 --- a/x/wasm/keeper/test_common.go +++ b/x/wasm/keeper/test_common.go @@ -1,6 +1,7 @@ package keeper import ( + "bytes" "encoding/binary" "encoding/json" "fmt" @@ -8,7 +9,9 @@ import ( "testing" "time" - "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" + "github.com/cosmos/cosmos-sdk/x/auth/vesting" + + "github.com/cosmos/cosmos-sdk/types/address" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" @@ -91,6 +94,7 @@ var moduleBasics = module.NewBasicManager( upgrade.AppModuleBasic{}, evidence.AppModuleBasic{}, transfer.AppModuleBasic{}, + vesting.AppModuleBasic{}, ) func MakeTestCodec(t testing.TB) codec.Codec { @@ -162,7 +166,7 @@ func (f *TestFaucet) Fund(parentCtx sdk.Context, receiver sdk.AccAddress, amount f.balance = f.balance.Sub(amounts) } -func (f *TestFaucet) NewFundedAccount(ctx sdk.Context, amounts ...sdk.Coin) sdk.AccAddress { +func (f *TestFaucet) NewFundedRandomAccount(ctx sdk.Context, amounts ...sdk.Coin) sdk.AccAddress { _, _, addr := keyPubAddr() f.Fund(ctx, addr, amounts...) return addr @@ -464,7 +468,7 @@ func handleStoreCode(ctx sdk.Context, k types.ContractOpsKeeper, msg *types.MsgS if err != nil { return nil, sdkerrors.Wrap(err, "sender") } - codeID, err := k.Create(ctx, senderAddr, msg.WASMByteCode, msg.InstantiatePermission) + codeID, _, err := k.Create(ctx, senderAddr, msg.WASMByteCode, msg.InstantiatePermission) if err != nil { return nil, err } @@ -523,6 +527,11 @@ func RandomAccountAddress(_ testing.TB) sdk.AccAddress { return addr } +// DeterministicAccountAddress creates a test address with v repeated to valid address size +func DeterministicAccountAddress(_ testing.TB, v byte) sdk.AccAddress { + return bytes.Repeat([]byte{v}, address.Len) +} + func RandomBech32AccountAddress(t testing.TB) string { return RandomAccountAddress(t).String() } @@ -532,6 +541,7 @@ type ExampleContract struct { Creator crypto.PrivKey CreatorAddr sdk.AccAddress CodeID uint64 + Checksum []byte } func StoreHackatomExampleContract(t testing.TB, ctx sdk.Context, keepers TestKeepers) ExampleContract { @@ -546,11 +556,8 @@ func StoreIBCReflectContract(t testing.TB, ctx sdk.Context, keepers TestKeepers) return StoreExampleContract(t, ctx, keepers, "./testdata/ibc_reflect.wasm") } -func StoreReflectContract(t testing.TB, ctx sdk.Context, keepers TestKeepers) uint64 { - _, _, creatorAddr := keyPubAddr() - codeID, err := keepers.ContractKeeper.Create(ctx, creatorAddr, testdata.ReflectContractWasm(), nil) - require.NoError(t, err) - return codeID +func StoreReflectContract(t testing.TB, ctx sdk.Context, keepers TestKeepers) ExampleContract { + return StoreExampleContract(t, ctx, keepers, "./testdata/reflect.wasm") } func StoreExampleContract(t testing.TB, ctx sdk.Context, keepers TestKeepers, wasmFile string) ExampleContract { @@ -561,9 +568,10 @@ func StoreExampleContract(t testing.TB, ctx sdk.Context, keepers TestKeepers, wa wasmCode, err := os.ReadFile(wasmFile) require.NoError(t, err) - codeID, err := keepers.ContractKeeper.Create(ctx, creatorAddr, wasmCode, nil) + codeID, _, err := keepers.ContractKeeper.Create(ctx, creatorAddr, wasmCode, nil) require.NoError(t, err) - return ExampleContract{anyAmount, creator, creatorAddr, codeID} + hash := keepers.WasmKeeper.GetCodeInfo(ctx, codeID).CodeHash + return ExampleContract{anyAmount, creator, creatorAddr, codeID, hash} } var wasmIdent = []byte("\x00\x61\x73\x6D") @@ -602,9 +610,9 @@ func StoreRandomContractWithAccessConfig( fundAccounts(t, ctx, keepers.AccountKeeper, keepers.BankKeeper, creatorAddr, anyAmount) keepers.WasmKeeper.wasmVM = mock wasmCode := append(wasmIdent, rand.Bytes(10)...) //nolint:gocritic - codeID, err := keepers.ContractKeeper.Create(ctx, creatorAddr, wasmCode, cfg) + codeID, checksum, err := keepers.ContractKeeper.Create(ctx, creatorAddr, wasmCode, cfg) require.NoError(t, err) - exampleContract := ExampleContract{InitialAmount: anyAmount, Creator: creator, CreatorAddr: creatorAddr, CodeID: codeID} + exampleContract := ExampleContract{InitialAmount: anyAmount, Creator: creator, CreatorAddr: creatorAddr, CodeID: codeID, Checksum: checksum} return exampleContract } @@ -615,6 +623,8 @@ type HackatomExampleInstance struct { VerifierAddr sdk.AccAddress Beneficiary crypto.PrivKey BeneficiaryAddr sdk.AccAddress + Label string + Deposit sdk.Coins } // InstantiateHackatomExampleContract load and instantiate the "./testdata/hackatom.wasm" contract @@ -632,7 +642,8 @@ func InstantiateHackatomExampleContract(t testing.TB, ctx sdk.Context, keepers T initialAmount := sdk.NewCoins(sdk.NewInt64Coin("denom", 100)) adminAddr := contract.CreatorAddr - contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, contract.CodeID, contract.CreatorAddr, adminAddr, initMsgBz, "demo contract to query", initialAmount) + label := "demo contract to query" + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, contract.CodeID, contract.CreatorAddr, adminAddr, initMsgBz, label, initialAmount) require.NoError(t, err) return HackatomExampleInstance{ ExampleContract: contract, @@ -641,6 +652,31 @@ func InstantiateHackatomExampleContract(t testing.TB, ctx sdk.Context, keepers T VerifierAddr: verifierAddr, Beneficiary: beneficiary, BeneficiaryAddr: beneficiaryAddr, + Label: label, + Deposit: initialAmount, + } +} + +type ExampleInstance struct { + ExampleContract + Contract sdk.AccAddress + Label string + Deposit sdk.Coins +} + +// InstantiateReflectExampleContract load and instantiate the "./testdata/reflect.wasm" contract +func InstantiateReflectExampleContract(t testing.TB, ctx sdk.Context, keepers TestKeepers) ExampleInstance { + example := StoreReflectContract(t, ctx, keepers) + initialAmount := sdk.NewCoins(sdk.NewInt64Coin("denom", 100)) + label := "demo contract to query" + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, example.CodeID, example.CreatorAddr, nil, []byte("{}"), label, initialAmount) + + require.NoError(t, err) + return ExampleInstance{ + ExampleContract: example, + Contract: contractAddr, + Label: label, + Deposit: initialAmount, } } @@ -664,7 +700,7 @@ type IBCReflectExampleInstance struct { // InstantiateIBCReflectContract load and instantiate the "./testdata/ibc_reflect.wasm" contract func InstantiateIBCReflectContract(t testing.TB, ctx sdk.Context, keepers TestKeepers) IBCReflectExampleInstance { - reflectID := StoreReflectContract(t, ctx, keepers) + reflectID := StoreReflectContract(t, ctx, keepers).CodeID ibcReflectID := StoreIBCReflectContract(t, ctx, keepers).CodeID initMsgBz := IBCReflectInitMsg{ diff --git a/x/wasm/module.go b/x/wasm/module.go index a237a910d4..2433fe0219 100644 --- a/x/wasm/module.go +++ b/x/wasm/module.go @@ -111,7 +111,7 @@ type AppModule struct { // 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 1 } +func (AppModule) ConsensusVersion() uint64 { return 2 } // NewAppModule creates a new AppModule object func NewAppModule( @@ -134,6 +134,11 @@ func NewAppModule( func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(keeper.NewDefaultPermissionKeeper(am.keeper))) types.RegisterQueryServer(cfg.QueryServer(), NewQuerier(am.keeper)) + + m := keeper.NewMigrator(am.keeper) + if err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2); err != nil { + panic(err) + } } func (am AppModule) LegacyQuerierHandler(amino *codec.LegacyAmino) sdk.Querier { //nolint:staticcheck diff --git a/x/wasm/module_test.go b/x/wasm/module_test.go index 8417225ade..d3530e5a3a 100644 --- a/x/wasm/module_test.go +++ b/x/wasm/module_test.go @@ -1,11 +1,14 @@ package wasm import ( + "bytes" "encoding/json" "fmt" "os" "testing" + "github.com/cosmos/cosmos-sdk/types/address" + "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" sdk "github.com/cosmos/cosmos-sdk/types" @@ -145,7 +148,8 @@ type state struct { func TestHandleInstantiate(t *testing.T) { data := setupTest(t) - creator := data.faucet.NewFundedAccount(data.ctx, sdk.NewInt64Coin("denom", 100000)) + creator := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) + data.faucet.Fund(data.ctx, creator, sdk.NewInt64Coin("denom", 100000)) h := data.module.Route().Handler() q := data.module.LegacyQuerierHandler(nil) @@ -179,7 +183,7 @@ func TestHandleInstantiate(t *testing.T) { require.NoError(t, err) contractBech32Addr := parseInitResponse(t, res.Data) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", contractBech32Addr) + require.Equal(t, "cosmos1400ax8h2dxe8ch64sus5sczqdhwv28hpjkkaphpa83he4fhz6k4qcm9kul", contractBech32Addr) // this should be standard x/wasm init event, nothing from contract require.Equal(t, 3, len(res.Events), prettyEvents(res.Events)) require.Equal(t, "message", res.Events[0].Type) @@ -206,8 +210,10 @@ func TestHandleExecute(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := data.faucet.NewFundedAccount(data.ctx, deposit.Add(deposit...)...) - fred := data.faucet.NewFundedAccount(data.ctx, topUp...) + creator := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) + data.faucet.Fund(data.ctx, creator, sdk.NewInt64Coin("denom", 100000*2)) + + fred := data.faucet.NewFundedRandomAccount(data.ctx, topUp...) h := data.module.Route().Handler() q := data.module.LegacyQuerierHandler(nil) @@ -238,7 +244,7 @@ func TestHandleExecute(t *testing.T) { require.NoError(t, err) contractBech32Addr := parseInitResponse(t, res.Data) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", contractBech32Addr) + require.Equal(t, "cosmos1400ax8h2dxe8ch64sus5sczqdhwv28hpjkkaphpa83he4fhz6k4qcm9kul", contractBech32Addr) // this should be standard x/wasm message event, init event, plus a bank send event (2), with no custom contract events require.Equal(t, 6, len(res.Events), prettyEvents(res.Events)) require.Equal(t, "message", res.Events[0].Type) @@ -341,8 +347,9 @@ func TestHandleExecuteEscrow(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := data.faucet.NewFundedAccount(data.ctx, deposit.Add(deposit...)...) - fred := data.faucet.NewFundedAccount(data.ctx, topUp...) + creator := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) + data.faucet.Fund(data.ctx, creator, sdk.NewInt64Coin("denom", 100000)) + fred := data.faucet.NewFundedRandomAccount(data.ctx, topUp...) h := data.module.Route().Handler() @@ -370,7 +377,7 @@ func TestHandleExecuteEscrow(t *testing.T) { res, err = h(data.ctx, &initCmd) require.NoError(t, err) contractBech32Addr := parseInitResponse(t, res.Data) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", contractBech32Addr) + require.Equal(t, "cosmos1400ax8h2dxe8ch64sus5sczqdhwv28hpjkkaphpa83he4fhz6k4qcm9kul", contractBech32Addr) handleMsg := map[string]interface{}{ "release": map[string]interface{}{}, diff --git a/x/wasm/simulation/genesis.go b/x/wasm/simulation/genesis.go index 039a4394c4..5271bd2365 100644 --- a/x/wasm/simulation/genesis.go +++ b/x/wasm/simulation/genesis.go @@ -15,7 +15,6 @@ func RandomizedGenState(simstate *module.SimulationState) { Contracts: nil, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: simstate.Rand.Uint64()}, - {IDKey: types.KeyLastInstanceID, Value: simstate.Rand.Uint64()}, }, GenMsgs: nil, } diff --git a/x/wasm/types/events.go b/x/wasm/types/events.go index 251b95f042..579024ed0c 100644 --- a/x/wasm/types/events.go +++ b/x/wasm/types/events.go @@ -23,6 +23,7 @@ const ( AttributeKeyContractAddr = "_contract_address" AttributeKeyCodeID = "code_id" + AttributeKeyChecksum = "code_checksum" AttributeKeyResultDataHex = "result" AttributeKeyRequiredCapability = "required_capability" ) diff --git a/x/wasm/types/exported_keepers.go b/x/wasm/types/exported_keepers.go index 88f9d980b3..df09957915 100644 --- a/x/wasm/types/exported_keepers.go +++ b/x/wasm/types/exported_keepers.go @@ -26,7 +26,7 @@ type ViewKeeper interface { // ContractOpsKeeper contains mutable operations on a contract. type ContractOpsKeeper interface { // Create uploads and compiles a WASM contract, returning a short identifier for the contract - Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *AccessConfig) (codeID uint64, err error) + Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *AccessConfig) (codeID uint64, checksum []byte, err error) // Instantiate creates an instance of a WASM contract Instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins) (sdk.AccAddress, []byte, error) diff --git a/x/wasm/types/keys.go b/x/wasm/types/keys.go index fb636ef4f3..9660360cb8 100644 --- a/x/wasm/types/keys.go +++ b/x/wasm/types/keys.go @@ -32,8 +32,7 @@ var ( PinnedCodeIndexPrefix = []byte{0x07} TXCounterPrefix = []byte{0x08} - KeyLastCodeID = append(SequenceKeyPrefix, []byte("lastCodeId")...) - KeyLastInstanceID = append(SequenceKeyPrefix, []byte("lastContractId")...) + KeyLastCodeID = append(SequenceKeyPrefix, []byte("lastCodeId")...) ) // GetCodeKey constructs the key for retreiving the ID for the WASM code diff --git a/x/wasm/types/proposal.go b/x/wasm/types/proposal.go index 748a03895b..acf30784c9 100644 --- a/x/wasm/types/proposal.go +++ b/x/wasm/types/proposal.go @@ -170,7 +170,7 @@ func (p InstantiateContractProposal) ValidateBasic() error { return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "code id is required") } - if err := validateLabel(p.Label); err != nil { + if err := ValidateLabel(p.Label); err != nil { return err } diff --git a/x/wasm/types/tx.go b/x/wasm/types/tx.go index 498dc28266..0c83018df0 100644 --- a/x/wasm/types/tx.go +++ b/x/wasm/types/tx.go @@ -95,7 +95,7 @@ func (msg MsgInstantiateContract) ValidateBasic() error { return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "code id is required") } - if err := validateLabel(msg.Label); err != nil { + if err := ValidateLabel(msg.Label); err != nil { return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "label is required") } diff --git a/x/wasm/types/tx.pb.go b/x/wasm/types/tx.pb.go index 7976d9e8f0..52d5098de4 100644 --- a/x/wasm/types/tx.pb.go +++ b/x/wasm/types/tx.pb.go @@ -87,6 +87,8 @@ var xxx_messageInfo_MsgStoreCode proto.InternalMessageInfo type MsgStoreCodeResponse struct { // CodeID is the reference to the stored WASM code CodeID uint64 `protobuf:"varint,1,opt,name=code_id,json=codeId,proto3" json:"code_id,omitempty"` + // Checksum is the sha256 hash of the stored code + Checksum []byte `protobuf:"bytes,2,opt,name=checksum,proto3" json:"checksum,omitempty"` } func (m *MsgStoreCodeResponse) Reset() { *m = MsgStoreCodeResponse{} } @@ -611,55 +613,55 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/tx.proto", fileDescriptor_4f74d82755520264) } var fileDescriptor_4f74d82755520264 = []byte{ - // 759 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0xcd, 0x6e, 0xd3, 0x4a, - 0x14, 0x8e, 0x1b, 0x27, 0x4d, 0x4e, 0x73, 0x7b, 0x23, 0xdf, 0x36, 0x37, 0xf5, 0xbd, 0x72, 0xa2, - 0x80, 0x8a, 0x17, 0x60, 0x37, 0x45, 0x62, 0xc3, 0xaa, 0x49, 0x59, 0xb4, 0x92, 0x11, 0x72, 0x55, - 0x2a, 0xd8, 0x44, 0x13, 0x7b, 0x6a, 0x2c, 0x1a, 0x4f, 0xf0, 0x71, 0x9b, 0xf6, 0x25, 0x10, 0x3b, - 0xde, 0x81, 0xb7, 0x60, 0xd7, 0x15, 0xea, 0x06, 0x89, 0x55, 0x80, 0xf4, 0x2d, 0x58, 0x21, 0xff, - 0xa5, 0x6e, 0xea, 0xa4, 0x41, 0x88, 0x4d, 0x32, 0xc7, 0xf3, 0x7d, 0xe7, 0xcc, 0xf9, 0xf4, 0xcd, - 0x19, 0x58, 0x33, 0x18, 0xf6, 0x06, 0x04, 0x7b, 0x6a, 0xf0, 0x73, 0xd2, 0x54, 0xbd, 0x53, 0xa5, - 0xef, 0x32, 0x8f, 0x09, 0xe5, 0x78, 0x4b, 0x09, 0x7e, 0x4e, 0x9a, 0xa2, 0xe4, 0x7f, 0x61, 0xa8, - 0x76, 0x09, 0x52, 0xf5, 0xa4, 0xd9, 0xa5, 0x1e, 0x69, 0xaa, 0x06, 0xb3, 0x9d, 0x90, 0x21, 0xae, - 0x58, 0xcc, 0x62, 0xc1, 0x52, 0xf5, 0x57, 0xd1, 0xd7, 0xff, 0x6f, 0x96, 0x38, 0xeb, 0x53, 0x0c, - 0x77, 0x1b, 0x1f, 0x39, 0x28, 0x69, 0x68, 0xed, 0x79, 0xcc, 0xa5, 0x6d, 0x66, 0x52, 0xa1, 0x02, - 0x79, 0xa4, 0x8e, 0x49, 0xdd, 0x2a, 0x57, 0xe7, 0xe4, 0xa2, 0x1e, 0x45, 0xc2, 0x23, 0x58, 0xf6, - 0xf9, 0x9d, 0xee, 0x99, 0x47, 0x3b, 0x06, 0x33, 0x69, 0x75, 0xa1, 0xce, 0xc9, 0xa5, 0x56, 0x79, - 0x34, 0xac, 0x95, 0x0e, 0xb6, 0xf6, 0xb4, 0xd6, 0x99, 0x17, 0x64, 0xd0, 0x4b, 0x3e, 0x2e, 0x8e, - 0x84, 0x7d, 0xa8, 0xd8, 0x0e, 0x7a, 0xc4, 0xf1, 0x6c, 0xe2, 0xd1, 0x4e, 0x9f, 0xba, 0x3d, 0x1b, - 0xd1, 0x66, 0x4e, 0x35, 0x57, 0xe7, 0xe4, 0xa5, 0x4d, 0x49, 0x99, 0xec, 0x53, 0xd9, 0x32, 0x0c, - 0x8a, 0xd8, 0x66, 0xce, 0xa1, 0x6d, 0xe9, 0xab, 0x09, 0xf6, 0xb3, 0x31, 0x79, 0x97, 0x2f, 0x64, - 0xcb, 0xfc, 0x2e, 0x5f, 0xe0, 0xcb, 0xb9, 0xc6, 0x63, 0x58, 0x49, 0xb6, 0xa0, 0x53, 0xec, 0x33, - 0x07, 0xa9, 0x70, 0x07, 0x16, 0xfd, 0x83, 0x76, 0x6c, 0x33, 0xe8, 0x85, 0x6f, 0xc1, 0x68, 0x58, - 0xcb, 0xfb, 0x90, 0x9d, 0x6d, 0x3d, 0xef, 0x6f, 0xed, 0x98, 0x8d, 0xb7, 0x0b, 0x50, 0xd1, 0xd0, - 0xda, 0xb9, 0xaa, 0xd2, 0x66, 0x8e, 0xe7, 0x12, 0xc3, 0x9b, 0x2a, 0xc5, 0x0a, 0xe4, 0x88, 0xd9, - 0xb3, 0x9d, 0x40, 0x81, 0xa2, 0x1e, 0x06, 0xc9, 0x6a, 0xd9, 0x69, 0xd5, 0x7c, 0xea, 0x11, 0xe9, - 0xd2, 0xa3, 0x2a, 0x1f, 0x52, 0x83, 0x40, 0x90, 0x21, 0xdb, 0x43, 0x2b, 0x10, 0xa4, 0xd4, 0xaa, - 0xfc, 0x18, 0xd6, 0x04, 0x9d, 0x0c, 0xe2, 0x63, 0x68, 0x14, 0x91, 0x58, 0x54, 0xf7, 0x21, 0x02, - 0x81, 0xdc, 0xe1, 0xb1, 0x63, 0x62, 0x35, 0x5f, 0xcf, 0xca, 0x4b, 0x9b, 0x6b, 0x4a, 0x68, 0x09, - 0xc5, 0xb7, 0x84, 0x12, 0x59, 0x42, 0x69, 0x33, 0xdb, 0x69, 0x6d, 0x9c, 0x0f, 0x6b, 0x99, 0x0f, - 0x5f, 0x6b, 0xb2, 0x65, 0x7b, 0xaf, 0x8e, 0xbb, 0x8a, 0xc1, 0x7a, 0x6a, 0xe4, 0x9f, 0xf0, 0xef, - 0x01, 0x9a, 0xaf, 0x23, 0x2b, 0xf8, 0x04, 0xd4, 0xc3, 0xcc, 0x8d, 0xa7, 0x20, 0xa5, 0xeb, 0x31, - 0xd6, 0xb5, 0x0a, 0x8b, 0xc4, 0x34, 0x5d, 0x8a, 0x18, 0x09, 0x13, 0x87, 0x82, 0x00, 0xbc, 0x49, - 0x3c, 0x12, 0x5a, 0x43, 0x0f, 0xd6, 0x8d, 0xcf, 0x1c, 0x08, 0x1a, 0x5a, 0x4f, 0x4e, 0xa9, 0x71, - 0x3c, 0x87, 0xb8, 0x22, 0x14, 0x8c, 0x08, 0x13, 0xe9, 0x3b, 0x8e, 0x63, 0x9d, 0xb2, 0xbf, 0xa0, - 0x53, 0xee, 0x8f, 0xe9, 0xb4, 0x01, 0xe2, 0xcd, 0xb6, 0xc6, 0x1a, 0xc5, 0x4a, 0x70, 0x09, 0x25, - 0xde, 0x87, 0x4a, 0x68, 0xb6, 0xe5, 0x92, 0xdf, 0x54, 0x62, 0x2e, 0xb3, 0x45, 0x72, 0xf1, 0xb7, - 0xca, 0x15, 0xf5, 0x32, 0x71, 0xb0, 0x99, 0xbd, 0x10, 0x58, 0xd6, 0xd0, 0xda, 0xef, 0x9b, 0xc4, - 0xa3, 0x5b, 0x81, 0xff, 0xa7, 0xb5, 0xf1, 0x1f, 0x14, 0x1d, 0x3a, 0xe8, 0x24, 0x6f, 0x4c, 0xc1, - 0xa1, 0x83, 0x90, 0x94, 0xec, 0x31, 0x7b, 0xbd, 0xc7, 0x46, 0x35, 0xb8, 0x98, 0x89, 0x12, 0xf1, - 0x81, 0x1a, 0x6d, 0xf8, 0x4b, 0x43, 0xab, 0x7d, 0x44, 0x89, 0x3b, 0xbb, 0xf6, 0xac, 0xf4, 0xff, - 0xc2, 0xea, 0xb5, 0x24, 0x71, 0xf6, 0xcd, 0x4f, 0x3c, 0x64, 0x35, 0xb4, 0x84, 0x3d, 0x28, 0x5e, - 0x8d, 0xc5, 0x94, 0x31, 0x95, 0x9c, 0x39, 0xe2, 0xfa, 0xec, 0xfd, 0xb1, 0x96, 0x6f, 0xe0, 0x9f, - 0xb4, 0x51, 0x23, 0xa7, 0xd2, 0x53, 0x90, 0xe2, 0xc6, 0xbc, 0xc8, 0x71, 0x49, 0x0a, 0x7f, 0x4f, - 0x5e, 0xbe, 0xbb, 0xa9, 0x49, 0x26, 0x50, 0xe2, 0xfd, 0x79, 0x50, 0xc9, 0x32, 0x93, 0xce, 0x4e, - 0x2f, 0x33, 0x81, 0x9a, 0x52, 0x66, 0x9a, 0x19, 0x5f, 0xc0, 0x52, 0xd2, 0x75, 0xf5, 0x54, 0x72, - 0x02, 0x21, 0xca, 0xb7, 0x21, 0xc6, 0xa9, 0x9f, 0x03, 0x24, 0x3c, 0x55, 0x4b, 0xe5, 0x5d, 0x01, - 0xc4, 0x7b, 0xb7, 0x00, 0xe2, 0xbc, 0xad, 0xed, 0xf3, 0xef, 0x52, 0xe6, 0x7c, 0x24, 0x71, 0x17, - 0x23, 0x89, 0xfb, 0x36, 0x92, 0xb8, 0x77, 0x97, 0x52, 0xe6, 0xe2, 0x52, 0xca, 0x7c, 0xb9, 0x94, - 0x32, 0x2f, 0xd7, 0x13, 0x83, 0xa7, 0xcd, 0xb0, 0x77, 0x10, 0x3f, 0xd5, 0xa6, 0x7a, 0x1a, 0x3e, - 0xd9, 0xc1, 0xf0, 0xe9, 0xe6, 0x83, 0x07, 0xfb, 0xe1, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x56, - 0xd2, 0x4b, 0x17, 0x33, 0x08, 0x00, 0x00, + // 766 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0xcb, 0x6e, 0xd3, 0x40, + 0x14, 0x8d, 0x1b, 0x27, 0x4d, 0x6e, 0x43, 0x89, 0x4c, 0x1a, 0x52, 0x83, 0x9c, 0x28, 0xa0, 0xe2, + 0x05, 0xd8, 0x4d, 0x91, 0xd8, 0x37, 0x29, 0x8b, 0x56, 0x32, 0x42, 0xae, 0x4a, 0x05, 0x9b, 0x68, + 0x62, 0x4f, 0x5d, 0xab, 0xb5, 0x27, 0x78, 0x9c, 0xa6, 0xfd, 0x09, 0xc4, 0x8e, 0x7f, 0xe0, 0x2f, + 0xd8, 0x75, 0x85, 0xba, 0x41, 0x62, 0x15, 0x20, 0xfd, 0x0b, 0x56, 0xc8, 0xcf, 0xba, 0xa9, 0x93, + 0x06, 0x21, 0x36, 0xce, 0xdc, 0x99, 0x73, 0x5f, 0x27, 0x67, 0xee, 0xc0, 0xaa, 0x46, 0xa8, 0x35, + 0x44, 0xd4, 0x92, 0xfd, 0xcf, 0x49, 0x4b, 0x76, 0x4f, 0xa5, 0xbe, 0x43, 0x5c, 0xc2, 0x95, 0xa3, + 0x23, 0xc9, 0xff, 0x9c, 0xb4, 0x78, 0xc1, 0xdb, 0x21, 0x54, 0xee, 0x21, 0x8a, 0xe5, 0x93, 0x56, + 0x0f, 0xbb, 0xa8, 0x25, 0x6b, 0xc4, 0xb4, 0x03, 0x0f, 0xbe, 0x62, 0x10, 0x83, 0xf8, 0x4b, 0xd9, + 0x5b, 0x85, 0xbb, 0x0f, 0x6f, 0xa6, 0x38, 0xeb, 0x63, 0x1a, 0x9c, 0x36, 0xbf, 0x30, 0x50, 0x52, + 0xa8, 0xb1, 0xeb, 0x12, 0x07, 0x77, 0x88, 0x8e, 0xb9, 0x2a, 0xe4, 0x29, 0xb6, 0x75, 0xec, 0xd4, + 0x98, 0x06, 0x23, 0x16, 0xd5, 0xd0, 0xe2, 0x5e, 0xc0, 0xb2, 0xe7, 0xdf, 0xed, 0x9d, 0xb9, 0xb8, + 0xab, 0x11, 0x1d, 0xd7, 0x16, 0x1a, 0x8c, 0x58, 0x6a, 0x97, 0xc7, 0xa3, 0x7a, 0x69, 0x7f, 0x73, + 0x57, 0x69, 0x9f, 0xb9, 0x7e, 0x04, 0xb5, 0xe4, 0xe1, 0x22, 0x8b, 0xdb, 0x83, 0xaa, 0x69, 0x53, + 0x17, 0xd9, 0xae, 0x89, 0x5c, 0xdc, 0xed, 0x63, 0xc7, 0x32, 0x29, 0x35, 0x89, 0x5d, 0xcb, 0x35, + 0x18, 0x71, 0x69, 0x43, 0x90, 0x26, 0xfb, 0x94, 0x36, 0x35, 0x0d, 0x53, 0xda, 0x21, 0xf6, 0x81, + 0x69, 0xa8, 0x2b, 0x09, 0xef, 0xd7, 0xb1, 0xf3, 0x0e, 0x5b, 0xc8, 0x96, 0xd9, 0x1d, 0xb6, 0xc0, + 0x96, 0x73, 0xcd, 0x7d, 0xa8, 0x24, 0x5b, 0x50, 0x31, 0xed, 0x13, 0x9b, 0x62, 0xee, 0x11, 0x2c, + 0x7a, 0x85, 0x76, 0x4d, 0xdd, 0xef, 0x85, 0x6d, 0xc3, 0x78, 0x54, 0xcf, 0x7b, 0x90, 0xed, 0x2d, + 0x35, 0xef, 0x1d, 0x6d, 0xeb, 0x1c, 0x0f, 0x05, 0xed, 0x10, 0x6b, 0x47, 0x74, 0x60, 0x05, 0x1d, + 0xa9, 0xb1, 0xdd, 0xfc, 0xb0, 0x00, 0x55, 0x85, 0x1a, 0xdb, 0x57, 0x15, 0x74, 0x88, 0xed, 0x3a, + 0x48, 0x73, 0xa7, 0xd2, 0x54, 0x81, 0x1c, 0xd2, 0x2d, 0xd3, 0xf6, 0x63, 0x15, 0xd5, 0xc0, 0x48, + 0x56, 0x92, 0x9d, 0x5a, 0x49, 0x05, 0x72, 0xc7, 0xa8, 0x87, 0x8f, 0x6b, 0x6c, 0xe0, 0xea, 0x1b, + 0x9c, 0x08, 0x59, 0x8b, 0x1a, 0x3e, 0x59, 0xa5, 0x76, 0xf5, 0xf7, 0xa8, 0xce, 0xa9, 0x68, 0x18, + 0x95, 0xa1, 0x60, 0x4a, 0x91, 0x81, 0x55, 0x0f, 0xc2, 0x21, 0xc8, 0x1d, 0x0c, 0x6c, 0x9d, 0xd6, + 0xf2, 0x8d, 0xac, 0xb8, 0xb4, 0xb1, 0x2a, 0x05, 0x72, 0x91, 0x3c, 0xb9, 0x48, 0xa1, 0x5c, 0xa4, + 0x0e, 0x31, 0xed, 0xf6, 0xfa, 0xf9, 0xa8, 0x9e, 0xf9, 0xfc, 0xa3, 0x2e, 0x1a, 0xa6, 0x7b, 0x38, + 0xe8, 0x49, 0x1a, 0xb1, 0xe4, 0x50, 0x5b, 0xc1, 0xcf, 0x33, 0xaa, 0x1f, 0x85, 0x32, 0xf1, 0x1c, + 0xa8, 0x1a, 0x44, 0x6e, 0xbe, 0x02, 0x21, 0x9d, 0x8f, 0x98, 0xf3, 0x1a, 0x2c, 0x22, 0x5d, 0x77, + 0x30, 0xa5, 0x21, 0x31, 0x91, 0xc9, 0x71, 0xc0, 0xea, 0xc8, 0x45, 0x21, 0xc9, 0xfe, 0xba, 0xf9, + 0x8d, 0x01, 0x4e, 0xa1, 0xc6, 0xcb, 0x53, 0xac, 0x0d, 0xe6, 0x20, 0xd7, 0xfb, 0xaf, 0x42, 0x4c, + 0xc8, 0x6f, 0x6c, 0x47, 0x3c, 0x65, 0xff, 0x82, 0xa7, 0xdc, 0x7f, 0xe3, 0x69, 0x1d, 0xf8, 0x9b, + 0x6d, 0xc5, 0x1c, 0x45, 0x4c, 0x30, 0x09, 0x26, 0x3e, 0x05, 0x4c, 0x28, 0xa6, 0xe1, 0xa0, 0x7f, + 0x64, 0x62, 0x2e, 0xb1, 0x85, 0x74, 0xb1, 0xb7, 0xd2, 0x15, 0xf6, 0x32, 0x51, 0xd8, 0xcc, 0x5e, + 0x10, 0x2c, 0x2b, 0xd4, 0xd8, 0xeb, 0xeb, 0xc8, 0xc5, 0x9b, 0xbe, 0xfe, 0xa7, 0xb5, 0xf1, 0x00, + 0x8a, 0x36, 0x1e, 0x76, 0x93, 0x37, 0xa6, 0x60, 0xe3, 0x61, 0xe0, 0x94, 0xec, 0x31, 0x7b, 0xbd, + 0xc7, 0x66, 0xcd, 0xbf, 0x98, 0x89, 0x14, 0x51, 0x41, 0xcd, 0x0e, 0xdc, 0x51, 0xa8, 0xd1, 0x39, + 0xc6, 0xc8, 0x99, 0x9d, 0x7b, 0x56, 0xf8, 0xfb, 0xb0, 0x72, 0x2d, 0x48, 0x14, 0x7d, 0xe3, 0x2b, + 0x0b, 0x59, 0x85, 0x1a, 0xdc, 0x2e, 0x14, 0xaf, 0x46, 0x66, 0xca, 0x08, 0x4b, 0xce, 0x23, 0x7e, + 0x6d, 0xf6, 0x79, 0xcc, 0xe5, 0x7b, 0xb8, 0x97, 0x36, 0x6a, 0xc4, 0x54, 0xf7, 0x14, 0x24, 0xbf, + 0x3e, 0x2f, 0x32, 0x4e, 0x89, 0xe1, 0xee, 0xe4, 0xe5, 0x7b, 0x9c, 0x1a, 0x64, 0x02, 0xc5, 0x3f, + 0x9d, 0x07, 0x95, 0x4c, 0x33, 0xa9, 0xec, 0xf4, 0x34, 0x13, 0xa8, 0x29, 0x69, 0xa6, 0x89, 0xf1, + 0x2d, 0x2c, 0x25, 0x55, 0xd7, 0x48, 0x75, 0x4e, 0x20, 0x78, 0xf1, 0x36, 0x44, 0x1c, 0xfa, 0x0d, + 0x40, 0x42, 0x53, 0xf5, 0x54, 0xbf, 0x2b, 0x00, 0xff, 0xe4, 0x16, 0x40, 0x14, 0xb7, 0xbd, 0x75, + 0xfe, 0x4b, 0xc8, 0x9c, 0x8f, 0x05, 0xe6, 0x62, 0x2c, 0x30, 0x3f, 0xc7, 0x02, 0xf3, 0xf1, 0x52, + 0xc8, 0x5c, 0x5c, 0x0a, 0x99, 0xef, 0x97, 0x42, 0xe6, 0xdd, 0x5a, 0x62, 0xf0, 0x74, 0x08, 0xb5, + 0xf6, 0xa3, 0x67, 0x5c, 0x97, 0x4f, 0x83, 0xe7, 0xdc, 0x1f, 0x3e, 0xbd, 0xbc, 0xff, 0x98, 0x3f, + 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xef, 0x6b, 0xa0, 0xa3, 0x4f, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1007,6 +1009,13 @@ func (m *MsgStoreCodeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Checksum) > 0 { + i -= len(m.Checksum) + copy(dAtA[i:], m.Checksum) + i = encodeVarintTx(dAtA, i, uint64(len(m.Checksum))) + i-- + dAtA[i] = 0x12 + } if m.CodeID != 0 { i = encodeVarintTx(dAtA, i, uint64(m.CodeID)) i-- @@ -1458,6 +1467,10 @@ func (m *MsgStoreCodeResponse) Size() (n int) { if m.CodeID != 0 { n += 1 + sovTx(uint64(m.CodeID)) } + l = len(m.Checksum) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } return n } @@ -1854,6 +1867,40 @@ func (m *MsgStoreCodeResponse) Unmarshal(dAtA []byte) error { break } } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Checksum", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Checksum = append(m.Checksum[:0], dAtA[iNdEx:postIndex]...) + if m.Checksum == nil { + m.Checksum = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) diff --git a/x/wasm/types/tx_test.go b/x/wasm/types/tx_test.go index b0ea43e969..b59ad7ce40 100644 --- a/x/wasm/types/tx_test.go +++ b/x/wasm/types/tx_test.go @@ -84,6 +84,7 @@ func TestInstantiateContractValidation(t *testing.T) { badAddress := bad.String() // proper address size goodAddress := sdk.AccAddress(make([]byte, 20)).String() + sdk.GetConfig().SetAddressVerifier(VerifyAddressLen()) cases := map[string]struct { msg MsgInstantiateContract diff --git a/x/wasm/types/types.go b/x/wasm/types/types.go index 3712af192c..6453c5f1d0 100644 --- a/x/wasm/types/types.go +++ b/x/wasm/types/types.go @@ -88,7 +88,7 @@ func (c *ContractInfo) ValidateBasic() error { return sdkerrors.Wrap(err, "admin") } } - if err := validateLabel(c.Label); err != nil { + if err := ValidateLabel(c.Label); err != nil { return sdkerrors.Wrap(err, "label") } if c.Extension == nil { diff --git a/x/wasm/types/validation.go b/x/wasm/types/validation.go index 4984fa28dd..0619c7f082 100644 --- a/x/wasm/types/validation.go +++ b/x/wasm/types/validation.go @@ -22,7 +22,8 @@ func validateWasmCode(s []byte) error { return nil } -func validateLabel(label string) error { +// ValidateLabel ensure label constraints +func ValidateLabel(label string) error { if label == "" { return sdkerrors.Wrap(ErrEmpty, "is required") } From 4a1d1b1e4216a81e2ea52bd7046aaa4d65adbd82 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 14 Sep 2022 10:35:47 +0200 Subject: [PATCH 66/94] Add factory contract scenario --- x/wasm/keeper/keeper_test.go | 79 ++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index f00f28799f..b8c6f5a114 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -6,11 +6,14 @@ import ( "encoding/hex" "encoding/json" "errors" + "fmt" "os" "strings" "testing" "time" + "github.com/cosmos/cosmos-sdk/baseapp" + wasmvm "github.com/CosmWasm/wasmvm" wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" @@ -755,6 +758,82 @@ func TestInstantiateWithContractDataResponse(t *testing.T) { assert.Equal(t, []byte("my-response-data"), data) } +func TestInstantiateWithContractFactoryChildQueriesParent(t *testing.T) { + // Scenario: + // given a factory contract stored + // when instantiated, the contract creates a new child contract instance + // and the child contracts queries the senders ContractInfo on instantiation + // then the factory contract's ContractInfo should be returned to the child contract + // + // see also: https://github.com/CosmWasm/wasmd/issues/896 + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) + keeper := keepers.WasmKeeper + + var instantiationCount int + callbacks := make([]func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, initMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error), 2) + wasmerMock := &wasmtesting.MockWasmer{ + // dispatch instantiation calls to callbacks + InstantiateFn: func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, initMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { + require.Greater(t, len(callbacks), instantiationCount, "unexpected call to instantiation") + do := callbacks[instantiationCount] + instantiationCount++ + return do(codeID, env, info, initMsg, store, goapi, querier, gasMeter, gasLimit, deserCost) + }, + AnalyzeCodeFn: wasmtesting.WithoutIBCAnalyzeFn, + CreateFn: wasmtesting.NoOpCreateFn, + } + + // overwrite wasmvm in router + router := baseapp.NewMsgServiceRouter() + router.SetInterfaceRegistry(keepers.EncodingConfig.InterfaceRegistry) + types.RegisterMsgServer(router, NewMsgServerImpl(NewDefaultPermissionKeeper(keeper))) + keeper.messenger = NewDefaultMessageHandler(router, nil, nil, nil, keepers.EncodingConfig.Marshaler, nil) + // overwrite wasmvm in response handler + keeper.wasmVMResponseHandler = NewDefaultWasmVMContractResponseHandler(NewMessageDispatcher(keeper.messenger, keeper)) + + example := StoreRandomContract(t, ctx, keepers, wasmerMock) + // factory contract + callbacks[0] = func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, initMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { + t.Log("called factory") + return &wasmvmtypes.Response{Data: []byte("parent"), Messages: []wasmvmtypes.SubMsg{ + { + ID: 1, ReplyOn: wasmvmtypes.ReplyNever, + Msg: wasmvmtypes.CosmosMsg{ + Wasm: &wasmvmtypes.WasmMsg{ + Instantiate: &wasmvmtypes.InstantiateMsg{CodeID: example.CodeID, Msg: []byte(`{}`), Label: "child"}, + }, + }, + }, + }}, 0, nil + } + + // child contract + var capturedSenderAddr string + var capturedCodeInfo []byte + callbacks[1] = func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, initMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { + t.Log("called child") + capturedSenderAddr = info.Sender + var err error + capturedCodeInfo, err = querier.Query(wasmvmtypes.QueryRequest{ + Wasm: &wasmvmtypes.WasmQuery{ + ContractInfo: &wasmvmtypes.ContractInfoQuery{ContractAddr: info.Sender}, + }, + }, gasLimit) + require.NoError(t, err) + return &wasmvmtypes.Response{Data: []byte("child")}, 0, nil + } + + // when + parentAddr, data, err := keepers.ContractKeeper.Instantiate(ctx, example.CodeID, example.CreatorAddr, nil, nil, "test", nil) + + // then + require.NoError(t, err) + assert.Equal(t, []byte("parent"), data) + require.Equal(t, parentAddr.String(), capturedSenderAddr) + expCodeInfo := fmt.Sprintf(`{"code_id":%d,"creator":%q,"pinned":false}`, example.CodeID, example.CreatorAddr.String()) + assert.JSONEq(t, expCodeInfo, string(capturedCodeInfo)) +} + func TestExecute(t *testing.T) { ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper From 0b400d6c8802ba78f53a38db912d089cc1dc695b Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 14 Sep 2022 12:34:50 +0200 Subject: [PATCH 67/94] Fix genesis message tooling --- x/wasm/client/cli/genesis_msg.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/x/wasm/client/cli/genesis_msg.go b/x/wasm/client/cli/genesis_msg.go index d7936e0145..0859b03251 100644 --- a/x/wasm/client/cli/genesis_msg.go +++ b/x/wasm/client/cli/genesis_msg.go @@ -8,6 +8,8 @@ import ( "errors" "fmt" + "github.com/CosmWasm/wasmd/x/wasm/ioutils" + "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/cosmos/cosmos-sdk/client" @@ -283,7 +285,15 @@ func GetAllCodes(state *types.GenesisState) []CodeMeta { creator := sdk.MustAccAddressFromBech32(msg.Sender) accessConfig = state.Params.InstantiateDefaultPermission.With(creator) } - hash := sha256.Sum256(msg.WASMByteCode) + bz := msg.WASMByteCode + if ioutils.IsGzip(msg.WASMByteCode) { + var err error + bz, err = ioutils.Uncompress(msg.WASMByteCode, uint64(types.MaxWasmSize)) + if err != nil { + panic(fmt.Sprintf("failed to unzip wasm binary: %s", err)) + } + } + hash := sha256.Sum256(bz) all = append(all, CodeMeta{ CodeID: seq, Info: types.CodeInfo{ From 2d896aaefe4f0cdc57ee535c9163bd2facebbdc3 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 14 Sep 2022 15:43:29 +0200 Subject: [PATCH 68/94] Minor cleanup --- x/wasm/simulation/operations.go | 80 ++++++++++++++------------------- 1 file changed, 34 insertions(+), 46 deletions(-) diff --git a/x/wasm/simulation/operations.go b/x/wasm/simulation/operations.go index 41903002a1..13c2f01670 100644 --- a/x/wasm/simulation/operations.go +++ b/x/wasm/simulation/operations.go @@ -114,7 +114,7 @@ func WeightedOperations( } // SimulateMsgStoreCode generates a MsgStoreCode with random values -func SimulateMsgStoreCode(ak types.AccountKeeper, bk simulation.BankKeeper, wasmKeeper WasmKeeper, wasmBz []byte, gas uint64) simtypes.Operation { +func SimulateMsgStoreCode(ak types.AccountKeeper, bk BankKeeper, wasmKeeper WasmKeeper, wasmBz []byte, gas uint64) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, @@ -136,21 +136,7 @@ func SimulateMsgStoreCode(ak types.AccountKeeper, bk simulation.BankKeeper, wasm WASMByteCode: wasmBz, InstantiatePermission: &config, } - - txCtx := simulation.OperationInput{ - R: r, - App: app, - TxGen: simappparams.MakeTestEncodingConfig().TxConfig, - Cdc: nil, - Msg: &msg, - MsgType: msg.Type(), - Context: ctx, - SimAccount: simAccount, - AccountKeeper: ak, - Bankkeeper: bk, - ModuleName: types.ModuleName, - } - + txCtx := BuildOperationInput(r, app, ctx, &msg, simAccount, ak, bk, nil) return GenAndDeliverTxWithRandFees(txCtx, gas) } } @@ -202,22 +188,7 @@ func SimulateMsgInstantiateContract(ak types.AccountKeeper, bk BankKeeper, wasmK Msg: []byte(`{}`), Funds: deposit, } - - txCtx := simulation.OperationInput{ - R: r, - App: app, - TxGen: simappparams.MakeTestEncodingConfig().TxConfig, - Cdc: nil, - Msg: &msg, - MsgType: msg.Type(), - Context: ctx, - SimAccount: simAccount, - AccountKeeper: ak, - Bankkeeper: bk, - ModuleName: types.ModuleName, - CoinsSpentInMsg: deposit, - } - + txCtx := BuildOperationInput(r, app, ctx, &msg, simAccount, ak, bk, deposit) return simulation.GenAndDeliverTxWithRandFees(txCtx) } } @@ -275,24 +246,41 @@ func SimulateMsgExecuteContract( return simtypes.NoOpMsg(types.ModuleName, types.MsgExecuteContract{}.Type(), "contract execute payload"), nil, err } - txCtx := simulation.OperationInput{ - R: r, - App: app, - TxGen: simappparams.MakeTestEncodingConfig().TxConfig, - Cdc: nil, - Msg: &msg, - MsgType: msg.Type(), - Context: ctx, - SimAccount: simAccount, - AccountKeeper: ak, - Bankkeeper: bk, - ModuleName: types.ModuleName, - CoinsSpentInMsg: deposit, - } + txCtx := BuildOperationInput(r, app, ctx, &msg, simAccount, ak, bk, deposit) return simulation.GenAndDeliverTxWithRandFees(txCtx) } } +// BuildOperationInput helper to build object +func BuildOperationInput( + r *rand.Rand, + app *baseapp.BaseApp, + ctx sdk.Context, + msg interface { + sdk.Msg + Type() string + }, + simAccount simtypes.Account, + ak types.AccountKeeper, + bk BankKeeper, + deposit sdk.Coins, +) simulation.OperationInput { + return simulation.OperationInput{ + R: r, + App: app, + TxGen: simappparams.MakeTestEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: deposit, + } +} + // DefaultSimulationExecuteContractSelector picks the first contract address func DefaultSimulationExecuteContractSelector(ctx sdk.Context, wasmKeeper WasmKeeper) sdk.AccAddress { var r sdk.AccAddress From 4d81fd44de0c992713762d6c062af2753ab279b0 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 14 Sep 2022 15:56:12 +0200 Subject: [PATCH 69/94] Bump ibc proto to v3.2.0 --- .../ibc/applications/transfer/v1/query.proto | 21 ++++++++++++++++- .../proto/ibc/core/channel/v1/tx.proto | 11 +++++---- .../proto/ibc/core/client/v1/client.proto | 11 +++++---- .../proto/ibc/core/client/v1/query.proto | 23 +++++++++++++++++++ .../ibc/core/commitment/v1/commitment.proto | 2 +- .../tendermint/v1/tendermint.proto | 13 +++++------ 6 files changed, 64 insertions(+), 17 deletions(-) diff --git a/third_party/proto/ibc/applications/transfer/v1/query.proto b/third_party/proto/ibc/applications/transfer/v1/query.proto index 2ed28049fd..5298338c10 100644 --- a/third_party/proto/ibc/applications/transfer/v1/query.proto +++ b/third_party/proto/ibc/applications/transfer/v1/query.proto @@ -30,12 +30,17 @@ service Query { rpc DenomHash(QueryDenomHashRequest) returns (QueryDenomHashResponse) { option (google.api.http).get = "/ibc/apps/transfer/v1/denom_hashes/{trace}"; } + + // EscrowAddress returns the escrow address for a particular port and channel id. + rpc EscrowAddress(QueryEscrowAddressRequest) returns (QueryEscrowAddressResponse) { + option (google.api.http).get = "/ibc/apps/transfer/v1/channels/{channel_id}/ports/{port_id}/escrow_address"; + } } // QueryDenomTraceRequest is the request type for the Query/DenomTrace RPC // method message QueryDenomTraceRequest { - // hash (in hex format) of the denomination trace information. + // hash (in hex format) or denom (full denom with ibc prefix) of the denomination trace information. string hash = 1; } @@ -84,3 +89,17 @@ message QueryDenomHashResponse { // hash (in hex format) of the denomination trace information. string hash = 1; } + +// QueryEscrowAddressRequest is the request type for the EscrowAddress RPC method. +message QueryEscrowAddressRequest { + // unique port identifier + string port_id = 1; + // unique channel identifier + string channel_id = 2; +} + +// QueryEscrowAddressResponse is the response type of the EscrowAddress RPC method. +message QueryEscrowAddressResponse { + // the escrow account address + string escrow_address = 1; +} \ No newline at end of file diff --git a/third_party/proto/ibc/core/channel/v1/tx.proto b/third_party/proto/ibc/core/channel/v1/tx.proto index d4d6df1d5e..d34b00e912 100644 --- a/third_party/proto/ibc/core/channel/v1/tx.proto +++ b/third_party/proto/ibc/core/channel/v1/tx.proto @@ -47,11 +47,11 @@ enum ResponseResultType { option (gogoproto.goproto_enum_prefix) = false; // Default zero value enumeration - RESPONSE_RESULT_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNSPECIFIED"]; + RESPONSE_RESULT_TYPE_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNSPECIFIED"]; // The message did not call the IBC application callbacks (because, for example, the packet had already been relayed) - RESPONSE_RESULT_NOOP = 1 [(gogoproto.enumvalue_customname) = "NOOP"]; + RESPONSE_RESULT_TYPE_NOOP = 1 [(gogoproto.enumvalue_customname) = "NOOP"]; // The message was executed successfully - RESPONSE_RESULT_SUCCESS = 2 [(gogoproto.enumvalue_customname) = "SUCCESS"]; + RESPONSE_RESULT_TYPE_SUCCESS = 2 [(gogoproto.enumvalue_customname) = "SUCCESS"]; } // MsgChannelOpenInit defines an sdk.Msg to initialize a channel handshake. It @@ -68,6 +68,7 @@ message MsgChannelOpenInit { // MsgChannelOpenInitResponse defines the Msg/ChannelOpenInit response type. message MsgChannelOpenInitResponse { string channel_id = 1 [(gogoproto.moretags) = "yaml:\"channel_id\""]; + string version = 2; } // MsgChannelOpenInit defines a msg sent by a Relayer to try to open a channel @@ -91,7 +92,9 @@ message MsgChannelOpenTry { } // MsgChannelOpenTryResponse defines the Msg/ChannelOpenTry response type. -message MsgChannelOpenTryResponse {} +message MsgChannelOpenTryResponse { + string version = 1; +} // MsgChannelOpenAck defines a msg sent by a Relayer to Chain A to acknowledge // the change of channel state to TRYOPEN on Chain B. diff --git a/third_party/proto/ibc/core/client/v1/client.proto b/third_party/proto/ibc/core/client/v1/client.proto index 657d99ed20..f97263c4fc 100644 --- a/third_party/proto/ibc/core/client/v1/client.proto +++ b/third_party/proto/ibc/core/client/v1/client.proto @@ -7,6 +7,7 @@ option go_package = "github.com/cosmos/ibc-go/v3/modules/core/02-client/types"; import "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; import "cosmos/upgrade/v1beta1/upgrade.proto"; +import "cosmos_proto/cosmos.proto"; // IdentifiedClientState defines a client state with an additional client // identifier field. @@ -41,7 +42,8 @@ message ClientConsensusStates { // handler may fail if the subject and the substitute do not match in client and // chain parameters (with exception to latest height, frozen height, and chain-id). message ClientUpdateProposal { - option (gogoproto.goproto_getters) = false; + option (gogoproto.goproto_getters) = false; + option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content"; // the title of the update proposal string title = 1; // the description of the proposal @@ -56,9 +58,10 @@ message ClientUpdateProposal { // UpgradeProposal is a gov Content type for initiating an IBC breaking // upgrade. message UpgradeProposal { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.equal) = true; + option (gogoproto.goproto_getters) = false; + option (gogoproto.goproto_stringer) = false; + option (gogoproto.equal) = true; + option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content"; string title = 1; string description = 2; diff --git a/third_party/proto/ibc/core/client/v1/query.proto b/third_party/proto/ibc/core/client/v1/query.proto index 91a906fe54..33a4191cd0 100644 --- a/third_party/proto/ibc/core/client/v1/query.proto +++ b/third_party/proto/ibc/core/client/v1/query.proto @@ -36,6 +36,11 @@ service Query { option (google.api.http).get = "/ibc/core/client/v1/consensus_states/{client_id}"; } + // ConsensusStateHeights queries the height of every consensus states associated with a given client. + rpc ConsensusStateHeights(QueryConsensusStateHeightsRequest) returns (QueryConsensusStateHeightsResponse) { + option (google.api.http).get = "/ibc/core/client/v1/consensus_states/{client_id}/heights"; + } + // Status queries the status of an IBC client. rpc ClientStatus(QueryClientStatusRequest) returns (QueryClientStatusResponse) { option (google.api.http).get = "/ibc/core/client/v1/client_status/{client_id}"; @@ -137,6 +142,24 @@ message QueryConsensusStatesResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } +// QueryConsensusStateHeightsRequest is the request type for Query/ConsensusStateHeights +// RPC method. +message QueryConsensusStateHeightsRequest { + // client identifier + string client_id = 1; + // pagination request + cosmos.base.query.v1beta1.PageRequest pagination = 2; +} + +// QueryConsensusStateHeightsResponse is the response type for the +// Query/ConsensusStateHeights RPC method +message QueryConsensusStateHeightsResponse { + // consensus state heights + repeated Height consensus_state_heights = 1 [(gogoproto.nullable) = false]; + // pagination response + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + // QueryClientStatusRequest is the request type for the Query/ClientStatus RPC // method message QueryClientStatusRequest { diff --git a/third_party/proto/ibc/core/commitment/v1/commitment.proto b/third_party/proto/ibc/core/commitment/v1/commitment.proto index f0118b7165..b0afed2273 100644 --- a/third_party/proto/ibc/core/commitment/v1/commitment.proto +++ b/third_party/proto/ibc/core/commitment/v1/commitment.proto @@ -5,7 +5,7 @@ package ibc.core.commitment.v1; option go_package = "github.com/cosmos/ibc-go/v3/modules/core/23-commitment/types"; import "gogoproto/gogo.proto"; -import "confio/proofs.proto"; +import "proofs.proto"; // MerkleRoot defines a merkle root hash. // In the Cosmos SDK, the AppHash of a block header becomes the root. diff --git a/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto b/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto index ac39341dbf..2815fe6ad2 100644 --- a/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto +++ b/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto @@ -6,7 +6,7 @@ option go_package = "github.com/cosmos/ibc-go/v3/modules/light-clients/07-tender import "tendermint/types/validator.proto"; import "tendermint/types/types.proto"; -import "confio/proofs.proto"; +import "proofs.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "ibc/core/client/v1/client.proto"; @@ -52,12 +52,11 @@ message ClientState { // "upgradedIBCState"}` repeated string upgrade_path = 9 [(gogoproto.moretags) = "yaml:\"upgrade_path\""]; - // This flag, when set to true, will allow governance to recover a client - // which has expired - bool allow_update_after_expiry = 10 [(gogoproto.moretags) = "yaml:\"allow_update_after_expiry\""]; - // This flag, when set to true, will allow governance to unfreeze a client - // whose chain has experienced a misbehaviour event - bool allow_update_after_misbehaviour = 11 [(gogoproto.moretags) = "yaml:\"allow_update_after_misbehaviour\""]; + // allow_update_after_expiry is deprecated + bool allow_update_after_expiry = 10 [deprecated = true, (gogoproto.moretags) = "yaml:\"allow_update_after_expiry\""]; + // allow_update_after_misbehaviour is deprecated + bool allow_update_after_misbehaviour = 11 + [deprecated = true, (gogoproto.moretags) = "yaml:\"allow_update_after_misbehaviour\""]; } // ConsensusState defines the consensus state from Tendermint. From a9d2918000067e957964685761f8620d4e955e2e Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Tue, 20 Sep 2022 08:52:12 +0200 Subject: [PATCH 70/94] Update changelog --- CHANGELOG.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4811418454..47818a853a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,23 @@ # Changelog ## [Unreleased](https://github.com/CosmWasm/wasmd/tree/HEAD) + +- Allow AccessConfig to use a list of addresses instead of just a single address [\#945](https://github.com/CosmWasm/wasmd/issues/945) +- Make contract addresses predictable \("deterministic"\) [\#942](https://github.com/CosmWasm/wasmd/issues/942) +- Add query for the total supply of a coin [\#903](https://github.com/CosmWasm/wasmd/pull/903) ([larry0x](https://github.com/larry0x)) - Upgrade go to v1.18 [\#866]https://github.com/CosmWasm/wasmd/pull/866/) ([faddat](https://github.com/faddat)) - Upgrade to ibc-go v3.2.0 [\#937](https://github.com/CosmWasm/wasmd/pull/937) ([faddat](https://github.com/faddat)) - Upgrade to cosmos-sdk v0.45.8 [\#964](https://github.com/CosmWasm/wasmd/pull/964/) ([faddat](https://github.com/faddat)) - Upgrade wasmvm to v1.1.0 [\#984](https://github.com/CosmWasm/wasmd/pull/984), see [wasmvm v1.1.0](https://github.com/CosmWasm/wasmvm/releases/tag/v1.1.0) - +- Add documentation how to add x/wasm to a new Cosmos SDK chain [\#876](https://github.com/CosmWasm/wasmd/issues/876) +- Upgrade keyring / go-keychain dependencies (removes deprecate warning) [\#957](https://github.com/CosmWasm/wasmd/issues/957) +- Make contract pinning an optional field in StoreCode proposals [\#972](https://github.com/CosmWasm/wasmd/issues/972) +- Add gRPC query for WASM params [\#889](https://github.com/CosmWasm/wasmd/issues/889) +- Expose Keepers in app.go? [\#881](https://github.com/CosmWasm/wasmd/issues/881) +- Remove unused `flagProposalType` flag in gov proposals [\#849](https://github.com/CosmWasm/wasmd/issues/849) +- Restrict code access config modifications [\#901](https://github.com/CosmWasm/wasmd/pull/901) ([alpe](https://github.com/alpe)) +- Prevent migration to a restricted code [\#900](https://github.com/CosmWasm/wasmd/pull/900) ([alpe](https://github.com/alpe)) +- Charge gas to unzip wasm code [\#898](https://github.com/CosmWasm/wasmd/pull/898) ([alpe](https://github.com/alpe)) [Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.28.0...HEAD) From bad814e19b0f258c76179343c6c9c7f51bc943fc Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Tue, 20 Sep 2022 09:02:31 +0200 Subject: [PATCH 71/94] Add migration note --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47818a853a..52676a23a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ - Make contract addresses predictable \("deterministic"\) [\#942](https://github.com/CosmWasm/wasmd/issues/942) - Add query for the total supply of a coin [\#903](https://github.com/CosmWasm/wasmd/pull/903) ([larry0x](https://github.com/larry0x)) - Upgrade go to v1.18 [\#866]https://github.com/CosmWasm/wasmd/pull/866/) ([faddat](https://github.com/faddat)) -- Upgrade to ibc-go v3.2.0 [\#937](https://github.com/CosmWasm/wasmd/pull/937) ([faddat](https://github.com/faddat)) +- Upgrade to ibc-go v3.2.0 REQUIRES [MIGRATION](https://github.com/cosmos/ibc-go/blob/v3.2.0/docs/migrations/support-denoms-with-slashes.md) [\#937](https://github.com/CosmWasm/wasmd/pull/937) ([faddat](https://github.com/faddat)) - Upgrade to cosmos-sdk v0.45.8 [\#964](https://github.com/CosmWasm/wasmd/pull/964/) ([faddat](https://github.com/faddat)) - Upgrade wasmvm to v1.1.0 [\#984](https://github.com/CosmWasm/wasmd/pull/984), see [wasmvm v1.1.0](https://github.com/CosmWasm/wasmvm/releases/tag/v1.1.0) - Add documentation how to add x/wasm to a new Cosmos SDK chain [\#876](https://github.com/CosmWasm/wasmd/issues/876) @@ -19,6 +19,9 @@ - Prevent migration to a restricted code [\#900](https://github.com/CosmWasm/wasmd/pull/900) ([alpe](https://github.com/alpe)) - Charge gas to unzip wasm code [\#898](https://github.com/CosmWasm/wasmd/pull/898) ([alpe](https://github.com/alpe)) +Migration notes: +- See ibc-go [migration notes](https://github.com/cosmos/ibc-go/blob/v3.2.0/docs/migrations/support-denoms-with-slashes.md) [\#937](https://github.com/CosmWasm/wasmd/pull/937) + [Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.28.0...HEAD) ## [v0.28.0](https://github.com/CosmWasm/wasmd/tree/v0.28.0) (2022-07-29) From d40888ac8b5c7b1d2e3459aee26946cef5d16eca Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Sep 2022 10:07:09 +0200 Subject: [PATCH 72/94] Fix master -> main in CI config --- .circleci/config.yml | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f0767528e5..a94d0cb0b4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -161,15 +161,17 @@ jobs: - run: name: Build Docker artifact command: docker build --pull -t "cosmwasm/wasmd:${CIRCLE_SHA1}" . - - run: - name: Push application Docker image to docker hub - command: | - if [ "${CIRCLE_BRANCH}" = "master" ]; then - docker tag "cosmwasm/wasmd:${CIRCLE_SHA1}" cosmwasm/wasmd:latest - docker login --password-stdin -u "$DOCKER_USER" \<<<"$DOCKER_PASS" - docker push cosmwasm/wasmd:latest - docker logout - fi + - when: + condition: + equal: [ main, << pipeline.git.branch >> ] + steps: + - run: + name: Push application Docker image to docker hub + command: | + docker tag "cosmwasm/wasmd:${CIRCLE_SHA1}" cosmwasm/wasmd:latest + docker login --password-stdin -u "$DOCKER_USER" \<<<"$DOCKER_PASS" + docker push cosmwasm/wasmd:latest + docker logout docker-tagged: executor: golang @@ -194,14 +196,14 @@ workflows: version: 2 test-suite: jobs: - # this is now a slow process... let's only run on master + # this is now a slow process... let's only run on main and PR branches we care about - docker-image: requires: - setup-dependencies filters: branches: only: - - master + - main - docker-tagged: filters: tags: From f0072e6ff9662905332ccc9cc30533cd614a4e09 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Sep 2022 13:05:09 +0200 Subject: [PATCH 73/94] Always run docker-image --- .circleci/config.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a94d0cb0b4..40c9c28344 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -196,14 +196,9 @@ workflows: version: 2 test-suite: jobs: - # this is now a slow process... let's only run on main and PR branches we care about - docker-image: requires: - setup-dependencies - filters: - branches: - only: - - main - docker-tagged: filters: tags: From a8842ef774d147aa1b23991f98680d6e3e96086e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Sep 2022 12:56:37 +0200 Subject: [PATCH 74/94] Add libwasmvm version check --- .circleci/config.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 40c9c28344..9b226efb97 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -161,6 +161,17 @@ jobs: - run: name: Build Docker artifact command: docker build --pull -t "cosmwasm/wasmd:${CIRCLE_SHA1}" . + - run: + name: Ensure libwasmvm version is correct + command: | + IN_DOCKER=$(docker run --rm "cosmwasm/wasmd:${CIRCLE_SHA1}" /usr/bin/wasmd query wasm libwasmvm-version) + echo "Runtime libwasmvm-version in docker: $IN_DOCKER" + IN_GOMOD=$(go list -m github.com/CosmWasm/wasmvm | cut -d" " -f2 | cut -d"v" -f2) + echo "wasmvm version in go.mod: $IN_GOMOD" + if [[ "$IN_DOCKER" != "$IN_GOMOD" ]]; then + echo "Mismatch of wasmvm versions detected" + exit 1 + fi - when: condition: equal: [ main, << pipeline.git.branch >> ] From 76df37d5fd1d12877b7dd3e987f799109d52fa5e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Sep 2022 13:00:33 +0200 Subject: [PATCH 75/94] Bump wasmvm to 1.1.1 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6699cd8286..4fb3cf9892 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/CosmWasm/wasmd go 1.18 require ( - github.com/CosmWasm/wasmvm v1.1.0 + github.com/CosmWasm/wasmvm v1.1.1 github.com/cosmos/cosmos-sdk v0.45.8 github.com/cosmos/iavl v0.19.1 github.com/cosmos/ibc-go/v3 v3.2.0 diff --git a/go.sum b/go.sum index fe9da2d4b6..d242411a15 100644 --- a/go.sum +++ b/go.sum @@ -59,8 +59,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -github.com/CosmWasm/wasmvm v1.1.0 h1:FLd2njaJcZPgq/yLrXtQdndg0oG/QySKpWyVP2tBCnQ= -github.com/CosmWasm/wasmvm v1.1.0/go.mod h1:ei0xpvomwSdONsxDuONzV7bL1jSET1M8brEx0FCXc+A= +github.com/CosmWasm/wasmvm v1.1.1 h1:0xtdrmmsP9fibe+x42WcMkp5aQ738BICgcH3FNVLzm4= +github.com/CosmWasm/wasmvm v1.1.1/go.mod h1:ei0xpvomwSdONsxDuONzV7bL1jSET1M8brEx0FCXc+A= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= From 0ec5b77480cb6ec56a3d2c1f5b78f9d9e59a83cf Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 20 Sep 2022 13:36:33 +0200 Subject: [PATCH 76/94] Upgrade .a files to 1.1.1 --- Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0fac41b100..42494493c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,10 +16,10 @@ WORKDIR /code COPY . /code/ # See https://github.com/CosmWasm/wasmvm/releases -ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.1.0/libwasmvm_muslc.aarch64.a /lib/libwasmvm_muslc.aarch64.a -ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.1.0/libwasmvm_muslc.x86_64.a /lib/libwasmvm_muslc.x86_64.a -RUN sha256sum /lib/libwasmvm_muslc.aarch64.a | grep 728993b91b35037ae8d9933c3a9ee018e49a7926571ce4109f55d9954efcbe9a -RUN sha256sum /lib/libwasmvm_muslc.x86_64.a | grep d06607db7bda6d3981f0717133584dd5480a6bca7b1e208b4526e68f3ccf3b31 +ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.1.1/libwasmvm_muslc.aarch64.a /lib/libwasmvm_muslc.aarch64.a +ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.1.1/libwasmvm_muslc.x86_64.a /lib/libwasmvm_muslc.x86_64.a +RUN sha256sum /lib/libwasmvm_muslc.aarch64.a | grep 9ecb037336bd56076573dc18c26631a9d2099a7f2b40dc04b6cae31ffb4c8f9a +RUN sha256sum /lib/libwasmvm_muslc.x86_64.a | grep 6e4de7ba9bad4ae9679c7f9ecf7e283dd0160e71567c6a7be6ae47c81ebe7f32 # Copy the library you want to the final location that will be found by the linker flag `-lwasmvm_muslc` RUN cp /lib/libwasmvm_muslc.${arch}.a /lib/libwasmvm_muslc.a From 8ee2c9330ca1fa4d31b8c0113c56b77655134f8a Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Tue, 20 Sep 2022 15:54:26 +0200 Subject: [PATCH 77/94] Fix path to proofs in protos --- third_party/proto/confio/README.md | 1 + third_party/proto/confio/proofs.proto | 2 +- third_party/proto/ibc/core/commitment/v1/commitment.proto | 2 +- .../proto/ibc/lightclients/tendermint/v1/tendermint.proto | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 third_party/proto/confio/README.md diff --git a/third_party/proto/confio/README.md b/third_party/proto/confio/README.md new file mode 100644 index 0000000000..c57da2e224 --- /dev/null +++ b/third_party/proto/confio/README.md @@ -0,0 +1 @@ +This project can be found at: https://github.com/confio/ics23 diff --git a/third_party/proto/confio/proofs.proto b/third_party/proto/confio/proofs.proto index da43503ecb..12d9e2da69 100644 --- a/third_party/proto/confio/proofs.proto +++ b/third_party/proto/confio/proofs.proto @@ -1,7 +1,6 @@ syntax = "proto3"; package ics23; -option go_package = "github.com/confio/ics23/go"; enum HashOp { // NO_HASH is the default if no data passed. Note this is an illegal argument some places. @@ -11,6 +10,7 @@ enum HashOp { KECCAK = 3; RIPEMD160 = 4; BITCOIN = 5; // ripemd160(sha256(x)) + SHA512_256 = 6; } /** diff --git a/third_party/proto/ibc/core/commitment/v1/commitment.proto b/third_party/proto/ibc/core/commitment/v1/commitment.proto index b0afed2273..f0118b7165 100644 --- a/third_party/proto/ibc/core/commitment/v1/commitment.proto +++ b/third_party/proto/ibc/core/commitment/v1/commitment.proto @@ -5,7 +5,7 @@ package ibc.core.commitment.v1; option go_package = "github.com/cosmos/ibc-go/v3/modules/core/23-commitment/types"; import "gogoproto/gogo.proto"; -import "proofs.proto"; +import "confio/proofs.proto"; // MerkleRoot defines a merkle root hash. // In the Cosmos SDK, the AppHash of a block header becomes the root. diff --git a/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto b/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto index 2815fe6ad2..f04dc17565 100644 --- a/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto +++ b/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto @@ -6,7 +6,7 @@ option go_package = "github.com/cosmos/ibc-go/v3/modules/light-clients/07-tender import "tendermint/types/validator.proto"; import "tendermint/types/types.proto"; -import "proofs.proto"; +import "confio/proofs.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "ibc/core/client/v1/client.proto"; From 7fb0a3acdb772be9ab044bde2d2be313f3fb80fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Sep 2022 08:20:56 +0000 Subject: [PATCH 78/94] Bump github.com/cosmos/ibc-go/v3 from 3.2.0 to 3.3.0 Bumps [github.com/cosmos/ibc-go/v3](https://github.com/cosmos/ibc-go) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/cosmos/ibc-go/releases) - [Changelog](https://github.com/cosmos/ibc-go/blob/v3.3.0/CHANGELOG.md) - [Commits](https://github.com/cosmos/ibc-go/compare/v3.2.0...v3.3.0) --- updated-dependencies: - dependency-name: github.com/cosmos/ibc-go/v3 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 4fb3cf9892..aed1e1aede 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/CosmWasm/wasmvm v1.1.1 github.com/cosmos/cosmos-sdk v0.45.8 github.com/cosmos/iavl v0.19.1 - github.com/cosmos/ibc-go/v3 v3.2.0 + github.com/cosmos/ibc-go/v3 v3.3.0 github.com/cosmos/interchain-accounts v0.1.0 github.com/dvsekhvalnov/jose2go v1.5.0 github.com/gogo/protobuf v1.3.3 diff --git a/go.sum b/go.sum index d242411a15..b9ed8af879 100644 --- a/go.sum +++ b/go.sum @@ -171,8 +171,8 @@ github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4 github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cosmos/iavl v0.19.1 h1:3gaq9b6SjiB0KBTygRnAvEGml2pQlu1TH8uma5g63Ys= github.com/cosmos/iavl v0.19.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= -github.com/cosmos/ibc-go/v3 v3.2.0 h1:Mh+RWo5FHPMM1Xsrar3uwKufdEGdIp5LDkVk9cYKYYA= -github.com/cosmos/ibc-go/v3 v3.2.0/go.mod h1:DrDYXJjWNwgv72cK1Il+BegtyGIDXcx+cnJwWGzve6o= +github.com/cosmos/ibc-go/v3 v3.3.0 h1:r8gYUvQreMQrf4R5RgedK9gcbjLk4uE2q6fuZGjf4n0= +github.com/cosmos/ibc-go/v3 v3.3.0/go.mod h1:VUWLHw0C3USmTQZnTdkuXXdUdLbW8zsK3lV1Ieposog= github.com/cosmos/interchain-accounts v0.1.0 h1:QmuwNsf1Hxl3P5GSGt7Z+JeuHPiZw4Z34R/038P5T6s= github.com/cosmos/interchain-accounts v0.1.0/go.mod h1:Fv6LXDs+0ng4mIDVWwEJMXbAIMxY4kiq+A7Bw1Fb9AY= github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= From 54fec05c1198fbbf58d123ae30a2e622d3997b1c Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Wed, 21 Sep 2022 15:13:58 +0200 Subject: [PATCH 79/94] Prune vesting accounts balances (#1003) * Prevent out of gas * Prune vesting account denoms only * Fix test state * Move account exists error up again * Review feedback: better naming --- x/wasm/keeper/keeper.go | 85 +++++++++++++++++------------------ x/wasm/keeper/keeper_test.go | 75 ++++++++++++++++++++++++++++--- x/wasm/keeper/options.go | 19 ++------ x/wasm/keeper/options_test.go | 16 ++----- 4 files changed, 116 insertions(+), 79 deletions(-) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 7426ade1ad..c349603613 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -22,7 +22,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/address" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + vestingexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/tendermint/tendermint/libs/log" @@ -57,11 +57,13 @@ type CoinTransferrer interface { TransferCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error } -// CoinPruner handles the balances for accounts that are pruned on contract instantiate. +// AccountPruner handles the balances and data cleanup for accounts that are pruned on contract instantiate. // This is an extension point to attach custom logic -type CoinPruner interface { - // PruneBalances handle balances for given address - PruneBalances(ctx sdk.Context, contractAddress sdk.AccAddress) error +type AccountPruner interface { + // CleanupExistingAccount handles the cleanup process for balances and data of the given account. The persisted account + // type is already reset to base account at this stage. + // The method returns true when the account address can be reused. Unsupported account types are rejected by returning false + CleanupExistingAccount(ctx sdk.Context, existingAccount authtypes.AccountI) (handled bool, err error) } // WasmVMResponseHandler is an extension point to handles the response data returned by a contract call. @@ -82,19 +84,6 @@ var defaultAcceptedAccountTypes = map[reflect.Type]struct{}{ reflect.TypeOf(&authtypes.BaseAccount{}): {}, } -// list of account types that are replaced with base accounts. Chains importing wasmd -// can overwrite this list with the WithPruneAccountTypesOnContractInstantiation option. -// -// contains vesting account types that can be created post genesis -var defaultPruneAccountTypes = map[reflect.Type]struct{}{ - reflect.TypeOf(&vestingtypes.DelayedVestingAccount{}): {}, - reflect.TypeOf(&vestingtypes.ContinuousVestingAccount{}): {}, - // intentionally not added: genesis account types - // reflect.TypeOf(&vestingtypes.BaseVestingAccount{}): {}, - // reflect.TypeOf(&vestingtypes.PeriodicVestingAccount{}): {}, - // reflect.TypeOf(&vestingtypes.PermanentLockedAccount{}): {}, -} - // Keeper will have a reference to Wasmer with it's own data directory. type Keeper struct { storeKey sdk.StoreKey @@ -113,8 +102,7 @@ type Keeper struct { gasRegister GasRegister maxQueryStackSize uint32 acceptedAccountTypes map[reflect.Type]struct{} - pruneAccountTypes map[reflect.Type]struct{} - coinPruner CoinPruner + accountPruner AccountPruner } // NewKeeper creates a new contract Keeper instance @@ -153,7 +141,7 @@ func NewKeeper( wasmVM: wasmer, accountKeeper: accountKeeper, bank: NewBankCoinTransferrer(bankKeeper), - coinPruner: NewCoinBurner(bankKeeper), + accountPruner: NewVestingCoinBurner(bankKeeper), portKeeper: portKeeper, capabilityKeeper: capabilityKeeper, messenger: NewDefaultMessageHandler(router, channelKeeper, capabilityKeeper, bankKeeper, cdc, portSource), @@ -162,7 +150,6 @@ func NewKeeper( gasRegister: NewDefaultWasmGasRegister(), maxQueryStackSize: types.DefaultMaxQueryStackSize, acceptedAccountTypes: defaultAcceptedAccountTypes, - pruneAccountTypes: defaultPruneAccountTypes, } keeper.wasmVMQueryHandler = DefaultQueryPlugins(bankKeeper, stakingKeeper, distKeeper, channelKeeper, queryRouter, keeper) for _, o := range opts { @@ -321,17 +308,18 @@ func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.A if _, accept := k.acceptedAccountTypes[reflect.TypeOf(existingAcct)]; accept { // keep account and balance as it is k.Logger(ctx).Info("instantiate contract with existing account", "address", contractAddress.String()) - } else if _, clear := k.pruneAccountTypes[reflect.TypeOf(existingAcct)]; clear { - k.Logger(ctx).Info("pruning existing account for contract instantiation", "address", contractAddress.String()) + } else { // consider an account in the wasmd namespace spam and overwrite it. + k.Logger(ctx).Info("pruning existing account for contract instantiation", "address", contractAddress.String()) contractAccount := k.accountKeeper.NewAccountWithAddress(ctx, contractAddress) k.accountKeeper.SetAccount(ctx, contractAccount) // also handle balance to not open cases where these accounts are abused and become liquid - if err := k.coinPruner.PruneBalances(ctx, contractAddress); err != nil { - return nil, nil, err + switch handled, err := k.accountPruner.CleanupExistingAccount(ctx, existingAcct); { + case err != nil: + return nil, nil, sdkerrors.Wrap(err, "prune balance") + case !handled: + return nil, nil, types.ErrAccountExists.Wrap("address is claimed by external account") } - } else { // unknown account type - return nil, nil, types.ErrAccountExists.Wrapf("refusing to overwrite special account type:: %T", existingAcct) } } else { // create an empty account (so we don't have issues later) @@ -1161,32 +1149,41 @@ func (c BankCoinTransferrer) TransferCoins(parentCtx sdk.Context, fromAddr sdk.A return nil } -var _ CoinPruner = CoinBurner{} +var _ AccountPruner = VestingCoinBurner{} -// CoinBurner default implementation for CoinPruner to burn the coins -type CoinBurner struct { +// VestingCoinBurner default implementation for AccountPruner to burn the coins +type VestingCoinBurner struct { bank types.BankKeeper } -// NewCoinBurner constructor -func NewCoinBurner(bank types.BankKeeper) CoinBurner { +// NewVestingCoinBurner constructor +func NewVestingCoinBurner(bank types.BankKeeper) VestingCoinBurner { if bank == nil { panic("bank keeper must not be nil") } - return CoinBurner{bank: bank} + return VestingCoinBurner{bank: bank} } -// PruneBalances burns all coins owned by the account. -func (b CoinBurner) PruneBalances(ctx sdk.Context, address sdk.AccAddress) error { - if amt := b.bank.GetAllBalances(ctx, address); !amt.IsZero() { - if err := b.bank.SendCoinsFromAccountToModule(ctx, address, types.ModuleName, amt); err != nil { - return sdkerrors.Wrap(err, "prune account balance") - } - if err := b.bank.BurnCoins(ctx, types.ModuleName, amt); err != nil { - return sdkerrors.Wrap(err, "burn account balance") - } +// CleanupExistingAccount accepts only vesting account types to burns all their original vesting coin balances. +// Other account types will be rejected and returned as unhandled. +func (b VestingCoinBurner) CleanupExistingAccount(ctx sdk.Context, existingAcc authtypes.AccountI) (handled bool, err error) { + v, ok := existingAcc.(vestingexported.VestingAccount) + if !ok { + return false, nil } - return nil + + ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) + coinsToBurn := sdk.NewCoins() + for _, orig := range v.GetOriginalVesting() { // focus on the coin denoms that were setup originally; getAllBalances has some issues + coinsToBurn = append(coinsToBurn, b.bank.GetBalance(ctx, existingAcc.GetAddress(), orig.Denom)) + } + if err := b.bank.SendCoinsFromAccountToModule(ctx, existingAcc.GetAddress(), types.ModuleName, coinsToBurn); err != nil { + return false, sdkerrors.Wrap(err, "prune account balance") + } + if err := b.bank.BurnCoins(ctx, types.ModuleName, coinsToBurn); err != nil { + return false, sdkerrors.Wrap(err, "burn account balance") + } + return true, nil } type msgDispatcher interface { diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index b8c6f5a114..5235141f36 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -12,16 +12,16 @@ import ( "testing" "time" - "github.com/cosmos/cosmos-sdk/baseapp" - wasmvm "github.com/CosmWasm/wasmvm" wasmvmtypes "github.com/CosmWasm/wasmvm/types" + "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" stypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/address" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/auth/vesting" vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" @@ -645,7 +645,7 @@ func TestInstantiateWithAccounts(t *testing.T) { deposit: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), expBalance: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), }, - "prune listed DelayedVestingAccount gets overwritten": { + "prunable DelayedVestingAccount gets overwritten": { account: vestingtypes.NewDelayedVestingAccount( authtypes.NewBaseAccount(contractAddr, nil, 0, 0), sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), time.Now().Add(30*time.Hour).Unix()), @@ -654,7 +654,7 @@ func TestInstantiateWithAccounts(t *testing.T) { expAccount: authtypes.NewBaseAccount(contractAddr, nil, lastAccountNumber+2, 0), // +1 for next seq, +1 for spec.account created expBalance: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1))), }, - "prune listed ContinuousVestingAccount gets overwritten": { + "prunable ContinuousVestingAccount gets overwritten": { account: vestingtypes.NewContinuousVestingAccount( authtypes.NewBaseAccount(contractAddr, nil, 0, 0), sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), time.Now().Add(time.Hour).Unix(), time.Now().Add(2*time.Hour).Unix()), @@ -663,14 +663,14 @@ func TestInstantiateWithAccounts(t *testing.T) { expAccount: authtypes.NewBaseAccount(contractAddr, nil, lastAccountNumber+2, 0), // +1 for next seq, +1 for spec.account created expBalance: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1))), }, - "prune listed account without balance gets overwritten": { + "prunable account without balance gets overwritten": { account: vestingtypes.NewContinuousVestingAccount( authtypes.NewBaseAccount(contractAddr, nil, 0, 0), sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(0))), time.Now().Add(time.Hour).Unix(), time.Now().Add(2*time.Hour).Unix()), expAccount: authtypes.NewBaseAccount(contractAddr, nil, lastAccountNumber+2, 0), // +1 for next seq, +1 for spec.account created expBalance: sdk.NewCoins(), }, - "unknown account type creates error": { + "unknown account type is rejected with error": { account: authtypes.NewModuleAccount( authtypes.NewBaseAccount(contractAddr, nil, 0, 0), "testing", @@ -2274,3 +2274,66 @@ func TestAppendToContractHistory(t *testing.T) { gotHistory := keepers.WasmKeeper.GetContractHistory(ctx, contractAddr) assert.Equal(t, orderedEntries, gotHistory) } + +func TestCoinBurnerPruneBalances(t *testing.T) { + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) + amts := sdk.NewCoins(sdk.NewInt64Coin("denom", 100)) + senderAddr := keepers.Faucet.NewFundedRandomAccount(parentCtx, amts...) + + // create vesting account + var vestingAddr sdk.AccAddress = rand.Bytes(types.ContractAddrLen) + msgCreateVestingAccount := vestingtypes.NewMsgCreateVestingAccount(senderAddr, vestingAddr, amts, time.Now().Add(time.Minute).Unix(), false) + _, err := vesting.NewMsgServerImpl(keepers.AccountKeeper, keepers.BankKeeper).CreateVestingAccount(sdk.WrapSDKContext(parentCtx), msgCreateVestingAccount) + require.NoError(t, err) + myVestingAccount := keepers.AccountKeeper.GetAccount(parentCtx, vestingAddr) + require.NotNil(t, myVestingAccount) + + specs := map[string]struct { + setupAcc func(t *testing.T, ctx sdk.Context) authtypes.AccountI + expBalances sdk.Coins + expHandled bool + expErr *sdkerrors.Error + }{ + "vesting account - all removed": { + setupAcc: func(t *testing.T, ctx sdk.Context) authtypes.AccountI { return myVestingAccount }, + expBalances: sdk.NewCoins(), + expHandled: true, + }, + "vesting account with other tokens - only original denoms removed": { + setupAcc: func(t *testing.T, ctx sdk.Context) authtypes.AccountI { + keepers.Faucet.Fund(ctx, vestingAddr, sdk.NewCoin("other", sdk.NewInt(2))) + return myVestingAccount + }, + expBalances: sdk.NewCoins(sdk.NewCoin("other", sdk.NewInt(2))), + expHandled: true, + }, + "non vesting account - not handled": { + setupAcc: func(t *testing.T, ctx sdk.Context) authtypes.AccountI { + return &authtypes.BaseAccount{Address: myVestingAccount.GetAddress().String()} + }, + expBalances: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(100))), + expHandled: false, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + ctx, _ := parentCtx.CacheContext() + existingAccount := spec.setupAcc(t, ctx) + // overwrite account in store as in keeper before calling prune + keepers.AccountKeeper.SetAccount(ctx, keepers.AccountKeeper.NewAccountWithAddress(ctx, vestingAddr)) + + // when + noGasCtx := ctx.WithGasMeter(sdk.NewGasMeter(0)) // should not use callers gas + gotHandled, gotErr := NewVestingCoinBurner(keepers.BankKeeper).CleanupExistingAccount(noGasCtx, existingAccount) + // then + if spec.expErr != nil { + require.ErrorIs(t, gotErr, spec.expErr) + return + } + require.NoError(t, gotErr) + assert.Equal(t, spec.expBalances, keepers.BankKeeper.GetAllBalances(ctx, vestingAddr)) + assert.Equal(t, spec.expHandled, gotHandled) + // and no out of gas panic + }) + } +} diff --git a/x/wasm/keeper/options.go b/x/wasm/keeper/options.go index e6119b4478..cc5547f22c 100644 --- a/x/wasm/keeper/options.go +++ b/x/wasm/keeper/options.go @@ -99,14 +99,14 @@ func WithCoinTransferrer(x CoinTransferrer) Option { }) } -// WithCoinPruner is an optional constructor parameter to set a custom type that handles balances +// WithAccountPruner is an optional constructor parameter to set a custom type that handles balances and data cleanup // for accounts pruned on contract instantiate -func WithCoinPruner(x CoinPruner) Option { +func WithAccountPruner(x AccountPruner) Option { if x == nil { panic("must not be nil") } return optsFn(func(k *Keeper) { - k.coinPruner = x + k.accountPruner = x }) } @@ -154,19 +154,6 @@ func WithAcceptedAccountTypesOnContractInstantiation(accts ...authtypes.AccountI }) } -// WithPruneAccountTypesOnContractInstantiation sets the account types that should be cleared. Account types of this list -// will be overwritten with the BaseAccount type and their balance burned, when they exist for an address on contract -// instantiation. -// -// Values should be references and contain the `*vestingtypes.DelayedVestingAccount`, `*vestingtypes.ContinuousVestingAccount` -// as post genesis account types with an open address range. -func WithPruneAccountTypesOnContractInstantiation(accts ...authtypes.AccountI) Option { - m := asTypeMap(accts) - return optsFn(func(k *Keeper) { - k.pruneAccountTypes = m - }) -} - func asTypeMap(accts []authtypes.AccountI) map[reflect.Type]struct{} { m := make(map[reflect.Type]struct{}, len(accts)) for _, a := range accts { diff --git a/x/wasm/keeper/options_test.go b/x/wasm/keeper/options_test.go index b4c7f0861e..29d2f9bd26 100644 --- a/x/wasm/keeper/options_test.go +++ b/x/wasm/keeper/options_test.go @@ -95,20 +95,10 @@ func TestConstructorOptions(t *testing.T) { assert.Equal(t, exp, k.acceptedAccountTypes) }, }, - "prune account types": { - srcOpt: WithPruneAccountTypesOnContractInstantiation(&authtypes.BaseAccount{}, &vestingtypes.ContinuousVestingAccount{}), + "account pruner": { + srcOpt: WithAccountPruner(VestingCoinBurner{}), verify: func(t *testing.T, k Keeper) { - exp := map[reflect.Type]struct{}{ - reflect.TypeOf(&authtypes.BaseAccount{}): {}, - reflect.TypeOf(&vestingtypes.ContinuousVestingAccount{}): {}, - } - assert.Equal(t, exp, k.pruneAccountTypes) - }, - }, - "coin pruner": { - srcOpt: WithCoinPruner(CoinBurner{}), - verify: func(t *testing.T, k Keeper) { - assert.Equal(t, CoinBurner{}, k.coinPruner) + assert.Equal(t, VestingCoinBurner{}, k.accountPruner) }, }, } From 9c5ebbbc4ca58053c633742f75503d231ef904bf Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Thu, 22 Sep 2022 18:22:35 +0200 Subject: [PATCH 80/94] Implement improvements to new address generation (#1014) * Revert default instance address generation to classic sequence based method Please enter the commit message for your changes. Lines starting * Start re-adding classic address generator * Extract address generation to file; minor updates * Review comments * Set max salt size * Support predictable address on instantiation * Switch attribute order for backwards compatiblity * Fix salt param check in CLI * Enable tests * Add more tests * Minor fix * Remove migration * Better cli description * Fix init message length prefix * Add sanity checks to address generation and minor updates * Reduce max length in tests for CI * CLI and address generation updates * Add test vectors * Minor updates * Fix cli long doc --- contrib/local/02-contracts.sh | 16 +- docs/proto/proto-docs.md | 50 +- proto/cosmwasm/wasm/v1/genesis.proto | 2 + proto/cosmwasm/wasm/v1/tx.proto | 45 +- x/wasm/alias.go | 2 + x/wasm/client/cli/genesis_msg.go | 65 +- x/wasm/client/cli/genesis_msg_test.go | 119 ++- x/wasm/client/cli/query.go | 28 +- x/wasm/client/cli/tx.go | 101 +- x/wasm/handler.go | 2 + x/wasm/keeper/addresses.go | 76 ++ x/wasm/keeper/addresses_test.go | 432 +++++++++ x/wasm/keeper/contract_keeper.go | 50 +- x/wasm/keeper/contract_keeper_test.go | 168 ++++ x/wasm/keeper/genesis.go | 8 +- x/wasm/keeper/genesis_test.go | 81 +- x/wasm/keeper/ibc_test.go | 4 +- x/wasm/keeper/keeper.go | 41 +- x/wasm/keeper/keeper_test.go | 195 +--- x/wasm/keeper/migrations.go | 27 - x/wasm/keeper/migrations_test.go | 20 - x/wasm/keeper/msg_server.go | 32 + x/wasm/keeper/proposal_integration_test.go | 29 +- x/wasm/keeper/querier_test.go | 5 +- x/wasm/keeper/test_common.go | 7 +- x/wasm/keeper/wasmtesting/coin_transferrer.go | 14 - x/wasm/keeper/wasmtesting/extension_mocks.go | 28 + x/wasm/module.go | 5 - x/wasm/module_test.go | 19 +- x/wasm/types/codec.go | 2 + x/wasm/types/exported_keepers.go | 23 +- x/wasm/types/keys.go | 3 +- x/wasm/types/tx.go | 53 + x/wasm/types/tx.pb.go | 917 ++++++++++++++++-- x/wasm/types/tx_test.go | 136 +++ x/wasm/types/validation.go | 18 +- 36 files changed, 2271 insertions(+), 552 deletions(-) create mode 100644 x/wasm/keeper/addresses.go create mode 100644 x/wasm/keeper/addresses_test.go create mode 100644 x/wasm/keeper/contract_keeper_test.go delete mode 100644 x/wasm/keeper/migrations.go delete mode 100644 x/wasm/keeper/migrations_test.go delete mode 100644 x/wasm/keeper/wasmtesting/coin_transferrer.go create mode 100644 x/wasm/keeper/wasmtesting/extension_mocks.go diff --git a/contrib/local/02-contracts.sh b/contrib/local/02-contracts.sh index ecbadf31eb..c445d948b6 100755 --- a/contrib/local/02-contracts.sh +++ b/contrib/local/02-contracts.sh @@ -1,5 +1,5 @@ #!/bin/bash -set -o errexit -o nounset -o pipefail +set -o errexit -o nounset -o pipefail -x DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" @@ -9,7 +9,10 @@ RESP=$(wasmd tx wasm store "$DIR/../../x/wasm/keeper/testdata/hackatom.wasm" \ --from validator --gas 1500000 -y --chain-id=testing --node=http://localhost:26657 -b block -o json) CODE_ID=$(echo "$RESP" | jq -r '.logs[0].events[1].attributes[-1].value') +CODE_HASH=$(echo "$RESP" | jq -r '.logs[0].events[1].attributes[-2].value') echo "* Code id: $CODE_ID" +echo "* Code checksum: $CODE_HASH" + echo "* Download code" TMPDIR=$(mktemp -t wasmdXXXXXX) wasmd q wasm code "$CODE_ID" "$TMPDIR" @@ -27,6 +30,17 @@ wasmd tx wasm instantiate "$CODE_ID" "$INIT" --admin="$(wasmd keys show validato CONTRACT=$(wasmd query wasm list-contract-by-code "$CODE_ID" -o json | jq -r '.contracts[-1]') echo "* Contract address: $CONTRACT" + +echo "## Create new contract instance with predictable address" +wasmd tx wasm instantiate2 "$CODE_ID" "$INIT" $(echo -n "testing" | xxd -ps) \ + --admin="$(wasmd keys show validator -a)" \ + --from validator --amount="100ustake" --label "local0.1.0" \ + --fix-msg \ + --gas 1000000 -y --chain-id=testing -b block -o json | jq + +predictedAdress=$(wasmd q wasm build-address "$CODE_HASH" $(wasmd keys show validator -a) $(echo -n "testing" | xxd -ps) "$INIT") +wasmd q wasm contract "$predictedAdress" -o json | jq + echo "### Query all" RESP=$(wasmd query wasm contract-state all "$CONTRACT" -o json) echo "$RESP" | jq diff --git a/docs/proto/proto-docs.md b/docs/proto/proto-docs.md index 584398a709..add638f07f 100644 --- a/docs/proto/proto-docs.md +++ b/docs/proto/proto-docs.md @@ -23,6 +23,8 @@ - [MsgExecuteContract](#cosmwasm.wasm.v1.MsgExecuteContract) - [MsgExecuteContractResponse](#cosmwasm.wasm.v1.MsgExecuteContractResponse) - [MsgInstantiateContract](#cosmwasm.wasm.v1.MsgInstantiateContract) + - [MsgInstantiateContract2](#cosmwasm.wasm.v1.MsgInstantiateContract2) + - [MsgInstantiateContract2Response](#cosmwasm.wasm.v1.MsgInstantiateContract2Response) - [MsgInstantiateContractResponse](#cosmwasm.wasm.v1.MsgInstantiateContractResponse) - [MsgMigrateContract](#cosmwasm.wasm.v1.MsgMigrateContract) - [MsgMigrateContractResponse](#cosmwasm.wasm.v1.MsgMigrateContractResponse) @@ -327,7 +329,7 @@ MsgExecuteContractResponse returns execution result data. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| `data` | [bytes](#bytes) | | Data contains base64-encoded bytes to returned from the contract | +| `data` | [bytes](#bytes) | | Data contains bytes to returned from the contract | @@ -355,6 +357,45 @@ code id. + + +### MsgInstantiateContract2 +MsgInstantiateContract2 create a new smart contract instance for the given +code id with a predicable address. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `sender` | [string](#string) | | Sender is the that actor that signed the messages | +| `admin` | [string](#string) | | Admin is an optional address that can execute migrations | +| `code_id` | [uint64](#uint64) | | CodeID is the reference to the stored WASM code | +| `label` | [string](#string) | | Label is optional metadata to be stored with a contract instance. | +| `msg` | [bytes](#bytes) | | Msg json encoded message to be passed to the contract on instantiation | +| `funds` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | Funds coins that are transferred to the contract on instantiation | +| `salt` | [bytes](#bytes) | | Salt is an arbitrary value provided by the sender. Size can be 1 to 64. | +| `fix_msg` | [bool](#bool) | | FixMsg include the msg value into the hash for the predictable address. Default is false | + + + + + + + + +### MsgInstantiateContract2Response +MsgInstantiateContract2Response return instantiation result data + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `address` | [string](#string) | | Address is the bech32 address of the new contract instance. | +| `data` | [bytes](#bytes) | | Data contains bytes to returned from the contract | + + + + + + ### MsgInstantiateContractResponse @@ -364,7 +405,7 @@ MsgInstantiateContractResponse return instantiation result data | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | `address` | [string](#string) | | Address is the bech32 address of the new contract instance. | -| `data` | [bytes](#bytes) | | Data contains base64-encoded bytes to returned from the contract | +| `data` | [bytes](#bytes) | | Data contains bytes to returned from the contract | @@ -478,7 +519,8 @@ Msg defines the wasm Msg service. | Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint | | ----------- | ------------ | ------------- | ------------| ------- | -------- | | `StoreCode` | [MsgStoreCode](#cosmwasm.wasm.v1.MsgStoreCode) | [MsgStoreCodeResponse](#cosmwasm.wasm.v1.MsgStoreCodeResponse) | StoreCode to submit Wasm code to the system | | -| `InstantiateContract` | [MsgInstantiateContract](#cosmwasm.wasm.v1.MsgInstantiateContract) | [MsgInstantiateContractResponse](#cosmwasm.wasm.v1.MsgInstantiateContractResponse) | Instantiate creates a new smart contract instance for the given code id. | | +| `InstantiateContract` | [MsgInstantiateContract](#cosmwasm.wasm.v1.MsgInstantiateContract) | [MsgInstantiateContractResponse](#cosmwasm.wasm.v1.MsgInstantiateContractResponse) | InstantiateContract creates a new smart contract instance for the given code id. | | +| `InstantiateContract2` | [MsgInstantiateContract2](#cosmwasm.wasm.v1.MsgInstantiateContract2) | [MsgInstantiateContract2Response](#cosmwasm.wasm.v1.MsgInstantiateContract2Response) | InstantiateContract2 creates a new smart contract instance for the given code id with a predictable address | | | `ExecuteContract` | [MsgExecuteContract](#cosmwasm.wasm.v1.MsgExecuteContract) | [MsgExecuteContractResponse](#cosmwasm.wasm.v1.MsgExecuteContractResponse) | Execute submits the given message data to a smart contract | | | `MigrateContract` | [MsgMigrateContract](#cosmwasm.wasm.v1.MsgMigrateContract) | [MsgMigrateContractResponse](#cosmwasm.wasm.v1.MsgMigrateContractResponse) | Migrate runs a code upgrade/ downgrade for a smart contract | | | `UpdateAdmin` | [MsgUpdateAdmin](#cosmwasm.wasm.v1.MsgUpdateAdmin) | [MsgUpdateAdminResponse](#cosmwasm.wasm.v1.MsgUpdateAdminResponse) | UpdateAdmin sets a new admin for a smart contract | | @@ -560,7 +602,7 @@ order. The intention is to have more human readable data that is auditable. | ----- | ---- | ----- | ----------- | | `store_code` | [MsgStoreCode](#cosmwasm.wasm.v1.MsgStoreCode) | | | | `instantiate_contract` | [MsgInstantiateContract](#cosmwasm.wasm.v1.MsgInstantiateContract) | | | -| `execute_contract` | [MsgExecuteContract](#cosmwasm.wasm.v1.MsgExecuteContract) | | | +| `execute_contract` | [MsgExecuteContract](#cosmwasm.wasm.v1.MsgExecuteContract) | | MsgInstantiateContract2 intentionally not supported see https://github.com/CosmWasm/wasmd/issues/987 | diff --git a/proto/cosmwasm/wasm/v1/genesis.proto b/proto/cosmwasm/wasm/v1/genesis.proto index f02f330750..87373e18d7 100644 --- a/proto/cosmwasm/wasm/v1/genesis.proto +++ b/proto/cosmwasm/wasm/v1/genesis.proto @@ -33,6 +33,8 @@ message GenesisState { MsgStoreCode store_code = 1; MsgInstantiateContract instantiate_contract = 2; MsgExecuteContract execute_contract = 3; + // MsgInstantiateContract2 intentionally not supported + // see https://github.com/CosmWasm/wasmd/issues/987 } } } diff --git a/proto/cosmwasm/wasm/v1/tx.proto b/proto/cosmwasm/wasm/v1/tx.proto index f1eb8fec68..04acc8ef7f 100644 --- a/proto/cosmwasm/wasm/v1/tx.proto +++ b/proto/cosmwasm/wasm/v1/tx.proto @@ -12,9 +12,14 @@ option (gogoproto.goproto_getters_all) = false; service Msg { // StoreCode to submit Wasm code to the system rpc StoreCode(MsgStoreCode) returns (MsgStoreCodeResponse); - // Instantiate creates a new smart contract instance for the given code id. + // InstantiateContract creates a new smart contract instance for the given + // code id. rpc InstantiateContract(MsgInstantiateContract) returns (MsgInstantiateContractResponse); + // InstantiateContract2 creates a new smart contract instance for the given + // code id with a predictable address + rpc InstantiateContract2(MsgInstantiateContract2) + returns (MsgInstantiateContract2Response); // Execute submits the given message data to a smart contract rpc ExecuteContract(MsgExecuteContract) returns (MsgExecuteContractResponse); // Migrate runs a code upgrade/ downgrade for a smart contract @@ -64,11 +69,45 @@ message MsgInstantiateContract { (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins" ]; } + +// MsgInstantiateContract2 create a new smart contract instance for the given +// code id with a predicable address. +message MsgInstantiateContract2 { + // Sender is the that actor that signed the messages + string sender = 1; + // Admin is an optional address that can execute migrations + string admin = 2; + // CodeID is the reference to the stored WASM code + uint64 code_id = 3 [ (gogoproto.customname) = "CodeID" ]; + // Label is optional metadata to be stored with a contract instance. + string label = 4; + // Msg json encoded message to be passed to the contract on instantiation + bytes msg = 5 [ (gogoproto.casttype) = "RawContractMessage" ]; + // Funds coins that are transferred to the contract on instantiation + repeated cosmos.base.v1beta1.Coin funds = 6 [ + (gogoproto.nullable) = false, + (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins" + ]; + // Salt is an arbitrary value provided by the sender. Size can be 1 to 64. + bytes salt = 7; + // FixMsg include the msg value into the hash for the predictable address. + // Default is false + bool fix_msg = 8; +} + // MsgInstantiateContractResponse return instantiation result data message MsgInstantiateContractResponse { // Address is the bech32 address of the new contract instance. string address = 1; - // Data contains base64-encoded bytes to returned from the contract + // Data contains bytes to returned from the contract + bytes data = 2; +} + +// MsgInstantiateContract2Response return instantiation result data +message MsgInstantiateContract2Response { + // Address is the bech32 address of the new contract instance. + string address = 1; + // Data contains bytes to returned from the contract bytes data = 2; } @@ -89,7 +128,7 @@ message MsgExecuteContract { // MsgExecuteContractResponse returns execution result data. message MsgExecuteContractResponse { - // Data contains base64-encoded bytes to returned from the contract + // Data contains bytes to returned from the contract bytes data = 1; } diff --git a/x/wasm/alias.go b/x/wasm/alias.go index 09f0e7af00..a64de37bdd 100644 --- a/x/wasm/alias.go +++ b/x/wasm/alias.go @@ -86,6 +86,7 @@ var ( ErrQueryFailed = types.ErrQueryFailed ErrInvalidMsg = types.ErrInvalidMsg KeyLastCodeID = types.KeyLastCodeID + KeyLastInstanceID = types.KeyLastInstanceID CodeKeyPrefix = types.CodeKeyPrefix ContractKeyPrefix = types.ContractKeyPrefix ContractStorePrefix = types.ContractStorePrefix @@ -101,6 +102,7 @@ type ( MsgStoreCode = types.MsgStoreCode MsgStoreCodeResponse = types.MsgStoreCodeResponse MsgInstantiateContract = types.MsgInstantiateContract + MsgInstantiateContract2 = types.MsgInstantiateContract2 MsgInstantiateContractResponse = types.MsgInstantiateContractResponse MsgExecuteContract = types.MsgExecuteContract MsgExecuteContractResponse = types.MsgExecuteContractResponse diff --git a/x/wasm/client/cli/genesis_msg.go b/x/wasm/client/cli/genesis_msg.go index 0859b03251..8aedae358a 100644 --- a/x/wasm/client/cli/genesis_msg.go +++ b/x/wasm/client/cli/genesis_msg.go @@ -8,10 +8,6 @@ import ( "errors" "fmt" - "github.com/CosmWasm/wasmd/x/wasm/ioutils" - - "github.com/CosmWasm/wasmd/x/wasm/keeper" - "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/keyring" @@ -24,6 +20,8 @@ import ( "github.com/spf13/cobra" tmtypes "github.com/tendermint/tendermint/types" + "github.com/CosmWasm/wasmd/x/wasm/ioutils" + "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/CosmWasm/wasmd/x/wasm/types" ) @@ -133,7 +131,7 @@ func GenesisInstantiateContractCmd(defaultNodeHome string, genesisMutator Genesi return fmt.Errorf("permissions were not granted for %s", senderAddr) } state.GenMsgs = append(state.GenMsgs, types.GenesisState_GenMsgs{ - Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &msg}, + Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: msg}, }) return nil }) @@ -238,10 +236,7 @@ func GenesisListContractsCmd(defaultNodeHome string, genReader GenesisReader) *c return err } state := g.WasmModuleState - all, err := GetAllContracts(state) - if err != nil { - return err - } + all := GetAllContracts(state) return printJSONOutput(cmd, all) }, } @@ -313,18 +308,7 @@ type ContractMeta struct { Info types.ContractInfo `json:"info"` } -// returns nil when not found -func codeHashByID(state *types.GenesisState, codeID uint64) []byte { - codes := GetAllCodes(state) - for _, v := range codes { - if v.CodeID == codeID { - return v.Info.CodeHash - } - } - return nil -} - -func GetAllContracts(state *types.GenesisState) ([]ContractMeta, error) { +func GetAllContracts(state *types.GenesisState) []ContractMeta { all := make([]ContractMeta, len(state.Contracts)) for i, c := range state.Contracts { all[i] = ContractMeta{ @@ -333,18 +317,11 @@ func GetAllContracts(state *types.GenesisState) ([]ContractMeta, error) { } } // add inflight + seq := contractSeqValue(state) for _, m := range state.GenMsgs { if msg := m.GetInstantiateContract(); msg != nil { - senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - panic(fmt.Sprintf("unsupported address %q: %s", msg.Sender, err)) - } - codeHash := codeHashByID(state, msg.CodeID) - if codeHash == nil { - return nil, types.ErrNotFound.Wrapf("hash for code-id: %d", msg.CodeID) - } all = append(all, ContractMeta{ - ContractAddress: keeper.BuildContractAddress(codeHash, senderAddr, msg.Label).String(), + ContractAddress: keeper.BuildContractAddressClassic(msg.CodeID, seq).String(), Info: types.ContractInfo{ CodeID: msg.CodeID, Creator: msg.Sender, @@ -352,9 +329,10 @@ func GetAllContracts(state *types.GenesisState) ([]ContractMeta, error) { Label: msg.Label, }, }) + seq++ } } - return all, nil + return all } func hasAccountBalance(cmd *cobra.Command, appState map[string]json.RawMessage, sender sdk.AccAddress, coins sdk.Coins) (bool, error) { @@ -381,19 +359,13 @@ func hasContract(state *types.GenesisState, contractAddr string) bool { return true } } + seq := contractSeqValue(state) for _, m := range state.GenMsgs { if msg := m.GetInstantiateContract(); msg != nil { - senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - panic(fmt.Sprintf("unsupported address %q: %s", msg.Sender, err)) - } - hash := codeHashByID(state, msg.CodeID) - if hash == nil { - panic(fmt.Sprintf("unknown code id: %d", msg.CodeID)) - } - if keeper.BuildContractAddress(hash, senderAddr, msg.Label).String() == contractAddr { + if keeper.BuildContractAddressClassic(msg.CodeID, seq).String() == contractAddr { return true } + seq++ } } return false @@ -486,6 +458,19 @@ func (x DefaultGenesisIO) AlterWasmModuleState(cmd *cobra.Command, callback func return genutil.ExportGenesisFile(g.GenDoc, g.GenesisFile) } +// contractSeqValue reads the contract sequence from the genesis or +// returns default start value used in the keeper +func contractSeqValue(state *types.GenesisState) uint64 { + var seq uint64 = 1 + for _, s := range state.Sequences { + if bytes.Equal(s.IDKey, types.KeyLastInstanceID) { + seq = s.Value + break + } + } + return seq +} + // codeSeqValue reads the code sequence from the genesis or // returns default start value used in the keeper func codeSeqValue(state *types.GenesisState) uint64 { diff --git a/x/wasm/client/cli/genesis_msg_test.go b/x/wasm/client/cli/genesis_msg_test.go index 6b67aa4942..a1d24f29cd 100644 --- a/x/wasm/client/cli/genesis_msg_test.go +++ b/x/wasm/client/cli/genesis_msg_test.go @@ -1,15 +1,12 @@ package cli import ( - "bytes" "context" "encoding/json" "os" "path" "testing" - "github.com/cosmos/cosmos-sdk/types/address" - "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/hd" @@ -366,8 +363,7 @@ func TestInstantiateContractCmd(t *testing.T) { } func TestExecuteContractCmd(t *testing.T) { - mySenderAddr := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) - myFirstContractAddress := keeper.BuildContractAddress([]byte("myCodeHash"), mySenderAddr, "my").String() + const firstContractAddress = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" minimalWasmGenesis := types.GenesisState{ Params: types.DefaultParams(), } @@ -394,7 +390,7 @@ func TestExecuteContractCmd(t *testing.T) { }, Contracts: []types.Contract{ { - ContractAddress: myFirstContractAddress, + ContractAddress: firstContractAddress, ContractInfo: types.ContractInfoFixture(func(info *types.ContractInfo) { info.Created = nil }), @@ -403,34 +399,53 @@ func TestExecuteContractCmd(t *testing.T) { }, }, mutator: func(cmd *cobra.Command) { - cmd.SetArgs([]string{myFirstContractAddress, `{}`}) + cmd.SetArgs([]string{firstContractAddress, `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", myWellFundedAccount) }, expMsgCount: 1, }, - "all good with contract from genesis store messages": { + "all good with contract from genesis store messages without initial sequence": { srcGenesis: types.GenesisState{ Params: types.DefaultParams(), Codes: []types.Code{ { - CodeID: 1, - CodeInfo: types.CodeInfoFixture(func(info *types.CodeInfo) { - info.CodeHash = []byte("myCodeHash") - }), + CodeID: 1, + CodeInfo: types.CodeInfoFixture(), + CodeBytes: wasmIdent, + }, + }, + GenMsgs: []types.GenesisState_GenMsgs{ + {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: types.MsgInstantiateContractFixture()}}, + }, + }, + mutator: func(cmd *cobra.Command) { + cmd.SetArgs([]string{firstContractAddress, `{}`}) + flagSet := cmd.Flags() + flagSet.Set("run-as", myWellFundedAccount) + }, + expMsgCount: 2, + }, + "all good with contract from genesis store messages and contract sequence set": { + srcGenesis: types.GenesisState{ + Params: types.DefaultParams(), + Codes: []types.Code{ + { + CodeID: 1, + CodeInfo: types.CodeInfoFixture(), CodeBytes: wasmIdent, }, }, GenMsgs: []types.GenesisState_GenMsgs{ - {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: types.MsgInstantiateContractFixture( - func(m *types.MsgInstantiateContract) { - m.Sender = mySenderAddr.String() - m.Label = "my" - })}}, + {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: types.MsgInstantiateContractFixture()}}, + }, + Sequences: []types.Sequence{ + {IDKey: types.KeyLastInstanceID, Value: 100}, }, }, mutator: func(cmd *cobra.Command) { - cmd.SetArgs([]string{myFirstContractAddress, `{}`}) + // See TestBuildContractAddress in keeper_test.go + cmd.SetArgs([]string{"cosmos1mujpjkwhut9yjw4xueyugc02evfv46y0dtmnz4lh8xxkkdapym9stu5qm8", `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", myWellFundedAccount) }, @@ -457,7 +472,7 @@ func TestExecuteContractCmd(t *testing.T) { }, Contracts: []types.Contract{ { - ContractAddress: myFirstContractAddress, + ContractAddress: firstContractAddress, ContractInfo: types.ContractInfoFixture(func(info *types.ContractInfo) { info.Created = nil }), @@ -466,7 +481,7 @@ func TestExecuteContractCmd(t *testing.T) { }, }, mutator: func(cmd *cobra.Command) { - cmd.SetArgs([]string{myFirstContractAddress, `{}`}) + cmd.SetArgs([]string{firstContractAddress, `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", keeper.RandomBech32AccountAddress(t)) }, @@ -484,7 +499,7 @@ func TestExecuteContractCmd(t *testing.T) { }, Contracts: []types.Contract{ { - ContractAddress: myFirstContractAddress, + ContractAddress: firstContractAddress, ContractInfo: types.ContractInfoFixture(func(info *types.ContractInfo) { info.Created = nil }), @@ -493,7 +508,7 @@ func TestExecuteContractCmd(t *testing.T) { }, }, mutator: func(cmd *cobra.Command) { - cmd.SetArgs([]string{myFirstContractAddress, `{}`}) + cmd.SetArgs([]string{firstContractAddress, `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", myWellFundedAccount) flagSet.Set("amount", "100stake") @@ -512,7 +527,7 @@ func TestExecuteContractCmd(t *testing.T) { }, Contracts: []types.Contract{ { - ContractAddress: myFirstContractAddress, + ContractAddress: firstContractAddress, ContractInfo: types.ContractInfoFixture(func(info *types.ContractInfo) { info.Created = nil }), @@ -521,7 +536,7 @@ func TestExecuteContractCmd(t *testing.T) { }, }, mutator: func(cmd *cobra.Command) { - cmd.SetArgs([]string{myFirstContractAddress, `{}`}) + cmd.SetArgs([]string{firstContractAddress, `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", keeper.RandomBech32AccountAddress(t)) flagSet.Set("amount", "10stake") @@ -550,9 +565,6 @@ func TestExecuteContractCmd(t *testing.T) { } func TestGetAllContracts(t *testing.T) { - creatorAddr1 := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) - creatorAddr2 := sdk.AccAddress(bytes.Repeat([]byte{2}, address.Len)) - specs := map[string]struct { src types.GenesisState exp []ContractMeta @@ -583,55 +595,68 @@ func TestGetAllContracts(t *testing.T) { }, "read from message state": { src: types.GenesisState{ - Codes: []types.Code{{CodeID: 1, CodeInfo: types.CodeInfo{CodeHash: []byte("firstCodeHash")}}}, GenMsgs: []types.GenesisState_GenMsgs{ - {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Sender: creatorAddr1.String(), Label: "first", CodeID: 1}}}, - {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Sender: creatorAddr2.String(), Label: "second", CodeID: 1}}}, + {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Label: "first"}}}, + {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Label: "second"}}}, }, }, exp: []ContractMeta{ { - ContractAddress: keeper.BuildContractAddress([]byte("firstCodeHash"), creatorAddr1, "first").String(), - Info: types.ContractInfo{Creator: creatorAddr1.String(), Label: "first", CodeID: 1}, + ContractAddress: keeper.BuildContractAddressClassic(0, 1).String(), + Info: types.ContractInfo{Label: "first"}, }, { - ContractAddress: keeper.BuildContractAddress([]byte("firstCodeHash"), creatorAddr2, "second").String(), - Info: types.ContractInfo{Creator: creatorAddr2.String(), Label: "second", CodeID: 1}, + ContractAddress: keeper.BuildContractAddressClassic(0, 2).String(), + Info: types.ContractInfo{Label: "second"}, }, }, }, - "read from contract and message state with contract sequence": { + "read from message state with contract sequence": { src: types.GenesisState{ - Codes: []types.Code{ - {CodeID: 1, CodeInfo: types.CodeInfo{CodeHash: []byte("firstCodeHash")}}, - {CodeID: 100, CodeInfo: types.CodeInfo{CodeHash: []byte("otherCodeHash")}}, + Sequences: []types.Sequence{ + {IDKey: types.KeyLastInstanceID, Value: 100}, + }, + GenMsgs: []types.GenesisState_GenMsgs{ + {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Label: "hundred"}}}, + }, + }, + exp: []ContractMeta{ + { + ContractAddress: keeper.BuildContractAddressClassic(0, 100).String(), + Info: types.ContractInfo{Label: "hundred"}, }, + }, + }, + "read from contract and message state with contract sequence": { + src: types.GenesisState{ Contracts: []types.Contract{ { - ContractAddress: keeper.BuildContractAddress([]byte("firstCodeHash"), creatorAddr1, "first").String(), - ContractInfo: types.ContractInfo{Label: "first", CodeID: 1}, + ContractAddress: "first-contract", + ContractInfo: types.ContractInfo{Label: "first"}, }, }, + Sequences: []types.Sequence{ + {IDKey: types.KeyLastInstanceID, Value: 100}, + }, GenMsgs: []types.GenesisState_GenMsgs{ - {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Sender: creatorAddr1.String(), Label: "hundred", CodeID: 100}}}, + {Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &types.MsgInstantiateContract{Label: "hundred"}}}, }, }, exp: []ContractMeta{ { - ContractAddress: keeper.BuildContractAddress([]byte("firstCodeHash"), creatorAddr1, "first").String(), - Info: types.ContractInfo{Label: "first", CodeID: 1}, + ContractAddress: "first-contract", + Info: types.ContractInfo{Label: "first"}, }, { - ContractAddress: keeper.BuildContractAddress([]byte("otherCodeHash"), creatorAddr1, "hundred").String(), - Info: types.ContractInfo{Creator: creatorAddr1.String(), Label: "hundred", CodeID: 100}, + ContractAddress: keeper.BuildContractAddressClassic(0, 100).String(), + Info: types.ContractInfo{Label: "hundred"}, }, }, }, } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - got, err := GetAllContracts(&spec.src) - require.NoError(t, err) + got := GetAllContracts(&spec.src) assert.Equal(t, spec.exp, got) }) } diff --git a/x/wasm/client/cli/query.go b/x/wasm/client/cli/query.go index f399bfd7d6..b847b3d843 100644 --- a/x/wasm/client/cli/query.go +++ b/x/wasm/client/cli/query.go @@ -67,11 +67,12 @@ func GetCmdLibVersion() *cobra.Command { // GetCmdBuildAddress build a contract address func GetCmdBuildAddress() *cobra.Command { + decoder := newArgDecoder(hex.DecodeString) cmd := &cobra.Command{ - Use: "build-address [code-hash] [creator-address] [label]", + Use: "build-address [code-hash] [creator-address] [salt-hex-encoded] [json_encoded_init_args (required when set as fixed)]", Short: "build contract address", Aliases: []string{"address"}, - Args: cobra.ExactArgs(3), + Args: cobra.RangeArgs(3, 4), RunE: func(cmd *cobra.Command, args []string) error { codeHash, err := hex.DecodeString(args[0]) if err != nil { @@ -81,14 +82,27 @@ func GetCmdBuildAddress() *cobra.Command { if err != nil { return fmt.Errorf("creator: %s", err) } - label := args[2] - if err := types.ValidateLabel(label); err != nil { - return fmt.Errorf("label: %s", err) + salt, err := hex.DecodeString(args[2]) + switch { + case err != nil: + return fmt.Errorf("salt: %s", err) + case len(salt) == 0: + return errors.New("empty salt") + } + + if len(args) == 3 { + cmd.Println(keeper.BuildContractAddressPredictable(codeHash, creator, salt, []byte{}).String()) + return nil + } + msg := types.RawContractMessage(args[3]) + if err := msg.ValidateBasic(); err != nil { + return fmt.Errorf("init message: %s", err) } - cmd.Println(keeper.BuildContractAddress(codeHash, creator, label).String()) + cmd.Println(keeper.BuildContractAddressPredictable(codeHash, creator, salt, msg).String()) return nil }, } + decoder.RegisterFlags(cmd.PersistentFlags(), "salt") return cmd } @@ -526,7 +540,7 @@ func newArgDecoder(def func(string) ([]byte, error)) *argumentDecoder { func (a *argumentDecoder) RegisterFlags(f *flag.FlagSet, argName string) { f.BoolVar(&a.asciiF, "ascii", false, "ascii encoded "+argName) - f.BoolVar(&a.hexF, "hex", false, "hex encoded "+argName) + f.BoolVar(&a.hexF, "hex", false, "hex encoded "+argName) f.BoolVar(&a.b64F, "b64", false, "base64 encoded "+argName) } diff --git a/x/wasm/client/cli/tx.go b/x/wasm/client/cli/tx.go index c4dfa473f4..d65e45c2d1 100644 --- a/x/wasm/client/cli/tx.go +++ b/x/wasm/client/cli/tx.go @@ -1,6 +1,7 @@ package cli import ( + "encoding/hex" "errors" "fmt" "os" @@ -11,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/tx" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/version" "github.com/spf13/cobra" flag "github.com/spf13/pflag" @@ -23,6 +25,7 @@ const ( flagLabel = "label" flagAdmin = "admin" flagNoAdmin = "no-admin" + flagFixMsg = "fix-msg" flagRunAs = "run-as" flagInstantiateByEverybody = "instantiate-everybody" flagInstantiateNobody = "instantiate-nobody" @@ -43,6 +46,7 @@ func GetTxCmd() *cobra.Command { txCmd.AddCommand( StoreCodeCmd(), InstantiateContractCmd(), + InstantiateContract2Cmd(), ExecuteContractCmd(), MigrateContractCmd(), UpdateContractAdminCmd(), @@ -174,8 +178,14 @@ func parseAccessConfigFlags(flags *flag.FlagSet) (*types.AccessConfig, error) { // InstantiateContractCmd will instantiate a contract from previously uploaded code. func InstantiateContractCmd() *cobra.Command { cmd := &cobra.Command{ - Use: "instantiate [code_id_int64] [json_encoded_init_args] --label [text] --admin [address,optional] --amount [coins,optional]", - Short: "Instantiate a wasm contract", + Use: "instantiate [code_id_int64] [json_encoded_init_args] --label [text] --admin [address,optional] --amount [coins,optional] ", + Short: "Instantiate a wasm contract", + Long: fmt.Sprintf(`Creates a new instance of an uploaded wasm code with the given 'constructor' message. +Each contract instance has a unique address assigned. +Example: +$ %s wasmd tx wasm instantiate 1 '{"foo":"bar"}' --admin="$(%s keys show mykey -a)" \ + --from mykey --amount="100ustake" --label "local0.1.0" +`, version.AppName, version.AppName), Aliases: []string{"start", "init", "inst", "i"}, Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { @@ -183,7 +193,6 @@ func InstantiateContractCmd() *cobra.Command { if err != nil { return err } - msg, err := parseInstantiateArgs(args[0], args[1], clientCtx.GetFromAddress(), cmd.Flags()) if err != nil { return err @@ -191,7 +200,7 @@ func InstantiateContractCmd() *cobra.Command { if err := msg.ValidateBasic(); err != nil { return err } - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, } @@ -203,43 +212,105 @@ func InstantiateContractCmd() *cobra.Command { return cmd } -func parseInstantiateArgs(rawCodeID, initMsg string, sender sdk.AccAddress, flags *flag.FlagSet) (types.MsgInstantiateContract, error) { +// InstantiateContract2Cmd will instantiate a contract from previously uploaded code with predicable address generated +func InstantiateContract2Cmd() *cobra.Command { + decoder := newArgDecoder(hex.DecodeString) + cmd := &cobra.Command{ + Use: "instantiate2 [code_id_int64] [json_encoded_init_args] [salt] --label [text] --admin [address,optional] --amount [coins,optional] " + + "--fix-msg [bool,optional]", + Short: "Instantiate a wasm contract with predictable address", + Long: fmt.Sprintf(`Creates a new instance of an uploaded wasm code with the given 'constructor' message. +Each contract instance has a unique address assigned. They are assigned automatically but in order to have predictable addresses +for special use cases, the given 'salt' argument and '--fix-msg' parameters can be used to generate a custom address. + +Predictable address example (also see '%s query wasm build-address -h'): +$ %s wasmd tx wasm instantiate2 1 '{"foo":"bar"}' $(echo -n "testing" | xxd -ps) --admin="$(%s keys show mykey -a)" \ + --from mykey --amount="100ustake" --label "local0.1.0" \ + --fix-msg +`, version.AppName, version.AppName, version.AppName), + Aliases: []string{"start", "init", "inst", "i"}, + Args: cobra.ExactArgs(3), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + salt, err := decoder.DecodeString(args[2]) + if err != nil { + return fmt.Errorf("salt: %w", err) + } + fixMsg, err := cmd.Flags().GetBool(flagFixMsg) + if err != nil { + return fmt.Errorf("fix msg: %w", err) + } + data, err := parseInstantiateArgs(args[0], args[1], clientCtx.GetFromAddress(), cmd.Flags()) + if err != nil { + return err + } + msg := &types.MsgInstantiateContract2{ + Sender: data.Sender, + Admin: data.Admin, + CodeID: data.CodeID, + Label: data.Label, + Msg: data.Msg, + Funds: data.Funds, + Salt: salt, + FixMsg: fixMsg, + } + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + cmd.Flags().String(flagAmount, "", "Coins to send to the contract during instantiation") + cmd.Flags().String(flagLabel, "", "A human-readable name for this contract in lists") + cmd.Flags().String(flagAdmin, "", "Address of an admin") + cmd.Flags().Bool(flagNoAdmin, false, "You must set this explicitly if you don't want an admin") + cmd.Flags().Bool(flagFixMsg, false, "An optional flag to include the json_encoded_init_args for the predictable address generation mode") + decoder.RegisterFlags(cmd.PersistentFlags(), "salt") + flags.AddTxFlagsToCmd(cmd) + return cmd +} + +func parseInstantiateArgs(rawCodeID, initMsg string, sender sdk.AccAddress, flags *flag.FlagSet) (*types.MsgInstantiateContract, error) { // get the id of the code to instantiate codeID, err := strconv.ParseUint(rawCodeID, 10, 64) if err != nil { - return types.MsgInstantiateContract{}, err + return nil, err } amountStr, err := flags.GetString(flagAmount) if err != nil { - return types.MsgInstantiateContract{}, fmt.Errorf("amount: %s", err) + return nil, fmt.Errorf("amount: %s", err) } amount, err := sdk.ParseCoinsNormalized(amountStr) if err != nil { - return types.MsgInstantiateContract{}, fmt.Errorf("amount: %s", err) + return nil, fmt.Errorf("amount: %s", err) } label, err := flags.GetString(flagLabel) if err != nil { - return types.MsgInstantiateContract{}, fmt.Errorf("label: %s", err) + return nil, fmt.Errorf("label: %s", err) } if label == "" { - return types.MsgInstantiateContract{}, errors.New("label is required on all contracts") + return nil, errors.New("label is required on all contracts") } adminStr, err := flags.GetString(flagAdmin) if err != nil { - return types.MsgInstantiateContract{}, fmt.Errorf("admin: %s", err) + return nil, fmt.Errorf("admin: %s", err) } noAdmin, err := flags.GetBool(flagNoAdmin) if err != nil { - return types.MsgInstantiateContract{}, fmt.Errorf("no-admin: %s", err) + return nil, fmt.Errorf("no-admin: %s", err) } // ensure sensible admin is set (or explicitly immutable) if adminStr == "" && !noAdmin { - return types.MsgInstantiateContract{}, fmt.Errorf("you must set an admin or explicitly pass --no-admin to make it immutible (wasmd issue #719)") + return nil, fmt.Errorf("you must set an admin or explicitly pass --no-admin to make it immutible (wasmd issue #719)") } if adminStr != "" && noAdmin { - return types.MsgInstantiateContract{}, fmt.Errorf("you set an admin and passed --no-admin, those cannot both be true") + return nil, fmt.Errorf("you set an admin and passed --no-admin, those cannot both be true") } // build and sign the transaction, then broadcast to Tendermint @@ -251,7 +322,7 @@ func parseInstantiateArgs(rawCodeID, initMsg string, sender sdk.AccAddress, flag Msg: []byte(initMsg), Admin: adminStr, } - return msg, nil + return &msg, nil } // ExecuteContractCmd will instantiate a contract from previously uploaded code. diff --git a/x/wasm/handler.go b/x/wasm/handler.go index e6004cd7a0..c7f27b754b 100644 --- a/x/wasm/handler.go +++ b/x/wasm/handler.go @@ -29,6 +29,8 @@ func NewHandler(k types.ContractOpsKeeper) sdk.Handler { res, err = msgServer.StoreCode(sdk.WrapSDKContext(ctx), msg) case *MsgInstantiateContract: res, err = msgServer.InstantiateContract(sdk.WrapSDKContext(ctx), msg) + case *MsgInstantiateContract2: + res, err = msgServer.InstantiateContract2(sdk.WrapSDKContext(ctx), msg) case *MsgExecuteContract: res, err = msgServer.ExecuteContract(sdk.WrapSDKContext(ctx), msg) case *MsgMigrateContract: diff --git a/x/wasm/keeper/addresses.go b/x/wasm/keeper/addresses.go new file mode 100644 index 0000000000..67eabb4403 --- /dev/null +++ b/x/wasm/keeper/addresses.go @@ -0,0 +1,76 @@ +package keeper + +import ( + "encoding/binary" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" + + "github.com/CosmWasm/wasmd/x/wasm/types" +) + +// AddressGenerator abstract address generator to be used for a single contract address +type AddressGenerator func(ctx sdk.Context, codeID uint64, checksum []byte) sdk.AccAddress + +// ClassicAddressGenerator generates a contract address using codeID and instanceID sequence +func (k Keeper) ClassicAddressGenerator() AddressGenerator { + return func(ctx sdk.Context, codeID uint64, _ []byte) sdk.AccAddress { + instanceID := k.autoIncrementID(ctx, types.KeyLastInstanceID) + return BuildContractAddressClassic(codeID, instanceID) + } +} + +// PredicableAddressGenerator generates a predictable contract address +func PredicableAddressGenerator(creator sdk.AccAddress, salt []byte, msg []byte, fixMsg bool) AddressGenerator { + return func(ctx sdk.Context, _ uint64, checksum []byte) sdk.AccAddress { + if !fixMsg { // clear msg to not be included in the address generation + msg = []byte{} + } + return BuildContractAddressPredictable(checksum, creator, salt, msg) + } +} + +// BuildContractAddressClassic builds an sdk account address for a contract. +func BuildContractAddressClassic(codeID, instanceID uint64) sdk.AccAddress { + contractID := make([]byte, 16) + binary.BigEndian.PutUint64(contractID[:8], codeID) + binary.BigEndian.PutUint64(contractID[8:], instanceID) + return address.Module(types.ModuleName, contractID)[:types.ContractAddrLen] +} + +// BuildContractAddressPredictable generates a contract address for the wasm module with len = types.ContractAddrLen using the +// Cosmos SDK address.Module function. +// Internally a key is built containing: +// (len(checksum) | checksum | len(sender_address) | sender_address | len(salt) | salt| len(initMsg) | initMsg). +// +// All method parameter values must be valid and not nil. +func BuildContractAddressPredictable(checksum []byte, creator sdk.AccAddress, salt, initMsg types.RawContractMessage) sdk.AccAddress { + if len(checksum) != 32 { + panic("invalid checksum") + } + if err := sdk.VerifyAddressFormat(creator); err != nil { + panic(fmt.Sprintf("creator: %s", err)) + } + if err := types.ValidateSalt(salt); err != nil { + panic(fmt.Sprintf("salt: %s", err)) + } + if err := initMsg.ValidateBasic(); len(initMsg) != 0 && err != nil { + panic(fmt.Sprintf("initMsg: %s", err)) + } + checksum = UInt64LengthPrefix(checksum) + creator = UInt64LengthPrefix(creator) + salt = UInt64LengthPrefix(salt) + initMsg = UInt64LengthPrefix(initMsg) + key := make([]byte, len(checksum)+len(creator)+len(salt)+len(initMsg)) + copy(key[0:], checksum) + copy(key[len(checksum):], creator) + copy(key[len(checksum)+len(creator):], salt) + copy(key[len(checksum)+len(creator)+len(salt):], initMsg) + return address.Module(types.ModuleName, key)[:types.ContractAddrLen] +} + +// UInt64LengthPrefix prepend big endian encoded byte length +func UInt64LengthPrefix(bz []byte) []byte { + return append(sdk.Uint64ToBigEndian(uint64(len(bz))), bz...) +} diff --git a/x/wasm/keeper/addresses_test.go b/x/wasm/keeper/addresses_test.go new file mode 100644 index 0000000000..fbcc607fc5 --- /dev/null +++ b/x/wasm/keeper/addresses_test.go @@ -0,0 +1,432 @@ +package keeper + +import ( + "encoding/json" + "fmt" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + tmbytes "github.com/tendermint/tendermint/libs/bytes" +) + +func TestBuildContractAddress(t *testing.T) { + x, y := sdk.GetConfig().GetBech32AccountAddrPrefix(), sdk.GetConfig().GetBech32AccountPubPrefix() + t.Cleanup(func() { + sdk.GetConfig().SetBech32PrefixForAccount(x, y) + }) + sdk.GetConfig().SetBech32PrefixForAccount("purple", "purple") + + // test vectors generated via cosmjs: https://github.com/cosmos/cosmjs/pull/1253/files + type Spec struct { + In struct { + Checksum tmbytes.HexBytes `json:"checksum"` + Creator sdk.AccAddress `json:"creator"` + Salt tmbytes.HexBytes `json:"salt"` + Msg string `json:"msg"` + } `json:"in"` + Out struct { + Address sdk.AccAddress `json:"address"` + } `json:"out"` + } + var specs []Spec + require.NoError(t, json.Unmarshal([]byte(goldenMasterPredictableContractAddr), &specs)) + require.NotEmpty(t, specs) + for i, spec := range specs { + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + // when + gotAddr := BuildContractAddressPredictable(spec.In.Checksum, spec.In.Creator, spec.In.Salt.Bytes(), []byte(spec.In.Msg)) + + require.Equal(t, spec.Out.Address.String(), gotAddr.String()) + require.NoError(t, sdk.VerifyAddressFormat(gotAddr)) + }) + } +} + +const goldenMasterPredictableContractAddr = `[ + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": null + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000001610000000000000000", + "addressData": "5e865d3e45ad3e961f77fd77d46543417ced44d924dc3e079b5415ff6775f847" + }, + "out": { + "address": "purple1t6r960j945lfv8mhl4mage2rg97w63xeynwrupum2s2l7em4lprs9ce5hk" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc00000000000000016100000000000000027b7d", + "addressData": "0995499608947a5281e2c7ebd71bdb26a1ad981946dad57f6c4d3ee35de77835" + }, + "out": { + "address": "purple1px25n9sgj3a99q0zcl4awx7my6s6mxqegmdd2lmvf5lwxh080q6suttktr" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc000000000000000161000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "83326e554723b15bac664ceabc8a5887e27003abe9fbd992af8c7bcea4745167" + }, + "out": { + "address": "purple1svexu428ywc4htrxfn4tezjcsl38qqata8aany4033auafr529ns4v254c" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": null + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae0000000000000000", + "addressData": "9384c6248c0bb171e306fd7da0993ec1e20eba006452a3a9e078883eb3594564" + }, + "out": { + "address": "purple1jwzvvfyvpwchrccxl476pxf7c83qawsqv3f2820q0zyrav6eg4jqdcq7gc" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae00000000000000027b7d", + "addressData": "9a8d5f98fb186825401a26206158e7a1213311a9b6a87944469913655af52ffb" + }, + "out": { + "address": "purple1n2x4lx8mrp5z2sq6ycsxzk885ysnxydfk658j3zxnyfk2kh49lasesxf6j" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "932f07bc53f7d0b0b43cb5a54ac3e245b205e6ae6f7c1d991dc6af4a2ff9ac18" + }, + "out": { + "address": "purple1jvhs00zn7lgtpdpukkj54slzgkeqte4wda7pmxgac6h55tle4svq8cmp60" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": null + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000001610000000000000000", + "addressData": "9725e94f528d8b78d33c25f3dfcd60e6142d8be60ab36f6a5b59036fd51560db" + }, + "out": { + "address": "purple1juj7jn6j3k9h35euyhealntquc2zmzlxp2ek76jmtypkl4g4vrdsfwmwxk" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff00000000000000016100000000000000027b7d", + "addressData": "b056e539bbaf447ba18f3f13b792970111fc78933eb6700f4d227b5216d63658" + }, + "out": { + "address": "purple1kptw2wdm4az8hgv08ufm0y5hqyglc7yn86m8qr6dyfa4y9kkxevqmkm9q3" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff000000000000000161000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "6c98434180f052294ff89fb6d2dae34f9f4468b0b8e6e7c002b2a44adee39abd" + }, + "out": { + "address": "purple1djvyxsvq7pfzjnlcn7md9khrf705g69shrnw0sqzk2jy4hhrn27sjh2ysy" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": null + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae0000000000000000", + "addressData": "0aaf1c31c5d529d21d898775bc35b3416f47bfd99188c334c6c716102cbd3101" + }, + "out": { + "address": "purple1p2h3cvw9655ay8vfsa6mcddng9h5007ejxyvxdxxcutpqt9axyqsagmmay" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae00000000000000027b7d", + "addressData": "36fe6ab732187cdfed46290b448b32eb7f4798e7a4968b0537de8a842cbf030e" + }, + "out": { + "address": "purple1xmlx4dejrp7dlm2x9y95fzejadl50x885jtgkpfhm69ggt9lqv8qk3vn4f" + } + }, + { + "in": { + "checksum": "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d00000000000000002013a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a500000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "a0d0c942adac6f3e5e7c23116c4c42a24e96e0ab75f53690ec2d3de16067c751" + }, + "out": { + "address": "purple15rgvjs4d43hnuhnuyvgkcnzz5f8fdc9twh6ndy8v9577zcr8cags40l9dt" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": null + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000001610000000000000000", + "addressData": "b95c467218d408a0f93046f227b6ece7fe18133ff30113db4d2a7becdfeca141" + }, + "out": { + "address": "purple1h9wyvusc6sy2p7fsgmez0dhvullpsyel7vq38k6d9fa7ehlv59qsvnyh36" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc00000000000000016100000000000000027b7d", + "addressData": "23fe45dbbd45dc6cd25244a74b6e99e7a65bf0bac2f2842a05049d37555a3ae6" + }, + "out": { + "address": "purple1y0lytkaaghwxe5jjgjn5km5eu7n9hu96ctegg2s9qjwnw4268tnqxhg60a" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "61", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc000000000000000161000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "6faea261ed63baa65b05726269e83b217fa6205dc7d9fb74f9667d004a69c082" + }, + "out": { + "address": "purple1d7h2yc0dvwa2vkc9wf3xn6pmy9l6vgzaclvlka8eve7sqjnfczpqqsdnwu" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": null + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae0000000000000000", + "addressData": "67a3ab6384729925fdb144574628ce96836fe098d2c6be4e84ac106b2728d96c" + }, + "out": { + "address": "purple1v736kcuyw2vjtld3g3t5v2xwj6pklcyc6trtun5y4sgxkfegm9kq7vgpnt" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae00000000000000027b7d", + "addressData": "23a121263bfce05c144f4af86f3d8a9f87dc56f9dc48dbcffc8c5a614da4c661" + }, + "out": { + "address": "purple1ywsjzf3mlns9c9z0ftux70v2n7rac4hem3ydhnlu33dxzndycesssc7x2m" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbcccccccccc", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000149999999999aaaaaaaaaabbbbbbbbbbcccccccccc0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "dd90dba6d6fcd5fb9c9c8f536314eb1bb29cb5aa084b633c5806b926a5636b58" + }, + "out": { + "address": "purple1mkgdhfkkln2lh8yu3afkx98trwefedd2pp9kx0zcq6ujdftrddvq50esay" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": null + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000001610000000000000000", + "addressData": "547a743022f4f1af05b102f57bf1c1c7d7ee81bae427dc20d36b2c4ec57612ae" + }, + "out": { + "address": "purple123a8gvpz7nc67pd3qt6hhuwpclt7aqd6usnacgxndvkya3tkz2hq5hz38f" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff00000000000000016100000000000000027b7d", + "addressData": "416e169110e4b411bc53162d7503b2bbf14d6b36b1413a4f4c9af622696e9665" + }, + "out": { + "address": "purple1g9hpdygsuj6pr0znzckh2qajh0c566ekk9qn5n6vntmzy6twjejsrl9alk" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "61", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff000000000000000161000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "619a0988b92d8796cea91dea63cbb1f1aefa4a6b6ee5c5d1e937007252697220" + }, + "out": { + "address": "purple1vxdqnz9e9kredn4frh4x8ja37xh05jntdmjut50fxuq8y5nfwgsquu9mxh" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": null + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae0000000000000000", + "addressData": "d8af856a6a04852d19b647ad6d4336eb26e077f740aef1a0331db34d299a885a" + }, + "out": { + "address": "purple1mzhc26n2qjzj6xdkg7kk6sekavnwqalhgzh0rgpnrke562v63pdq8grp8q" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae00000000000000027b7d", + "addressData": "c7fb7bea96daab23e416c4fcf328215303005e1d0d5424257335568e5381e33c" + }, + "out": { + "address": "purple1clahh65km24j8eqkcn70x2pp2vpsqhsap42zgftnx4tgu5upuv7q9ywjws" + } + }, + { + "in": { + "checksum": "1da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b", + "creator": "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", + "creatorData": "9999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff", + "salt": "aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae", + "msg": "{\"some\":123,\"structure\":{\"nested\":[\"ok\",true]}}" + }, + "intermediate": { + "key": "7761736d0000000000000000201da6c16de2cbaf7ad8cbb66f0925ba33f5c278cb2491762d04658c1480ea229b00000000000000209999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffff0000000000000040aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbccddeeffffeeddbbccddaa66551155aaaabbcc787878789900aabbbbcc221100acadae000000000000002f7b22736f6d65223a3132332c22737472756374757265223a7b226e6573746564223a5b226f6b222c747275655d7d7d", + "addressData": "ccdf9dea141a6c2475870529ab38fae9dec30df28e005894fe6578b66133ab4a" + }, + "out": { + "address": "purple1en0em6s5rfkzgav8q556kw86a80vxr0j3cq93987v4utvcfn4d9q0tql4w" + } + } +] +` diff --git a/x/wasm/keeper/contract_keeper.go b/x/wasm/keeper/contract_keeper.go index 6e1195dbd1..564adc5532 100644 --- a/x/wasm/keeper/contract_keeper.go +++ b/x/wasm/keeper/contract_keeper.go @@ -11,7 +11,18 @@ var _ types.ContractOpsKeeper = PermissionedKeeper{} // decoratedKeeper contains a subset of the wasm keeper that are already or can be guarded by an authorization policy in the future type decoratedKeeper interface { create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *types.AccessConfig, authZ AuthorizationPolicy) (codeID uint64, checksum []byte, err error) - instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins, authZ AuthorizationPolicy) (sdk.AccAddress, []byte, error) + + instantiate( + ctx sdk.Context, + codeID uint64, + creator, admin sdk.AccAddress, + initMsg []byte, + label string, + deposit sdk.Coins, + addressGenerator AddressGenerator, + authZ AuthorizationPolicy, + ) (sdk.AccAddress, []byte, error) + migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte, authZ AuthorizationPolicy) ([]byte, error) setContractAdmin(ctx sdk.Context, contractAddress, caller, newAdmin sdk.AccAddress, authZ AuthorizationPolicy) error pinCode(ctx sdk.Context, codeID uint64) error @@ -20,6 +31,7 @@ type decoratedKeeper interface { Sudo(ctx sdk.Context, contractAddress sdk.AccAddress, msg []byte) ([]byte, error) setContractInfoExtension(ctx sdk.Context, contract sdk.AccAddress, extra types.ContractInfoExtension) error setAccessConfig(ctx sdk.Context, codeID uint64, caller sdk.AccAddress, newConfig types.AccessConfig, autz AuthorizationPolicy) error + ClassicAddressGenerator() AddressGenerator } type PermissionedKeeper struct { @@ -43,8 +55,40 @@ func (p PermissionedKeeper) Create(ctx sdk.Context, creator sdk.AccAddress, wasm return p.nested.create(ctx, creator, wasmCode, instantiateAccess, p.authZPolicy) } -func (p PermissionedKeeper) Instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins) (sdk.AccAddress, []byte, error) { - return p.nested.instantiate(ctx, codeID, creator, admin, initMsg, label, deposit, p.authZPolicy) +// Instantiate creates an instance of a WASM contract using the classic sequence based address generator +func (p PermissionedKeeper) Instantiate( + ctx sdk.Context, + codeID uint64, + creator, admin sdk.AccAddress, + initMsg []byte, + label string, + deposit sdk.Coins, +) (sdk.AccAddress, []byte, error) { + return p.nested.instantiate(ctx, codeID, creator, admin, initMsg, label, deposit, p.nested.ClassicAddressGenerator(), p.authZPolicy) +} + +// Instantiate2 creates an instance of a WASM contract using the predictable address generator +func (p PermissionedKeeper) Instantiate2( + ctx sdk.Context, + codeID uint64, + creator, admin sdk.AccAddress, + initMsg []byte, + label string, + deposit sdk.Coins, + salt []byte, + fixMsg bool, +) (sdk.AccAddress, []byte, error) { + return p.nested.instantiate( + ctx, + codeID, + creator, + admin, + initMsg, + label, + deposit, + PredicableAddressGenerator(creator, salt, initMsg, fixMsg), + p.authZPolicy, + ) } func (p PermissionedKeeper) Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) ([]byte, error) { diff --git a/x/wasm/keeper/contract_keeper_test.go b/x/wasm/keeper/contract_keeper_test.go new file mode 100644 index 0000000000..0a8bd1e224 --- /dev/null +++ b/x/wasm/keeper/contract_keeper_test.go @@ -0,0 +1,168 @@ +package keeper + +import ( + "encoding/json" + "fmt" + "math" + "strings" + "testing" + + "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/CosmWasm/wasmd/x/wasm/types" +) + +func TestInstantiate2(t *testing.T) { + parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) + example := StoreHackatomExampleContract(t, parentCtx, keepers) + otherExample := StoreReflectContract(t, parentCtx, keepers) + mock := &wasmtesting.MockWasmer{} + wasmtesting.MakeInstantiable(mock) + keepers.WasmKeeper.wasmVM = mock // set mock to not fail on contract init message + + verifierAddr := RandomAccountAddress(t) + beneficiaryAddr := RandomAccountAddress(t) + initMsg := mustMarshal(t, HackatomExampleInitMsg{Verifier: verifierAddr, Beneficiary: beneficiaryAddr}) + + otherAddr := keepers.Faucet.NewFundedRandomAccount(parentCtx, sdk.NewInt64Coin("denom", 1_000_000_000)) + + const ( + mySalt = "my salt" + myLabel = "my label" + ) + // create instances for duplicate checks + exampleContract := func(t *testing.T, ctx sdk.Context, fixMsg bool) { + _, _, err := keepers.ContractKeeper.Instantiate2( + ctx, + example.CodeID, + example.CreatorAddr, + nil, + initMsg, + myLabel, + sdk.NewCoins(sdk.NewInt64Coin("denom", 1)), + []byte(mySalt), + fixMsg, + ) + require.NoError(t, err) + } + exampleWithFixMsg := func(t *testing.T, ctx sdk.Context) { + exampleContract(t, ctx, true) + } + exampleWithoutFixMsg := func(t *testing.T, ctx sdk.Context) { + exampleContract(t, ctx, false) + } + specs := map[string]struct { + setup func(t *testing.T, ctx sdk.Context) + codeID uint64 + sender sdk.AccAddress + salt []byte + initMsg json.RawMessage + fixMsg bool + expErr error + }{ + "fix msg - generates different address than without fixMsg": { + setup: exampleWithoutFixMsg, + codeID: example.CodeID, + sender: example.CreatorAddr, + salt: []byte(mySalt), + initMsg: initMsg, + fixMsg: true, + }, + "fix msg - different sender": { + setup: exampleWithFixMsg, + codeID: example.CodeID, + sender: otherAddr, + salt: []byte(mySalt), + initMsg: initMsg, + fixMsg: true, + }, + "fix msg - different code": { + setup: exampleWithFixMsg, + codeID: otherExample.CodeID, + sender: example.CreatorAddr, + salt: []byte(mySalt), + initMsg: []byte(`{}`), + fixMsg: true, + }, + "fix msg - different salt": { + setup: exampleWithFixMsg, + codeID: example.CodeID, + sender: example.CreatorAddr, + salt: []byte("other salt"), + initMsg: initMsg, + fixMsg: true, + }, + "fix msg - different init msg": { + setup: exampleWithFixMsg, + codeID: example.CodeID, + sender: example.CreatorAddr, + salt: []byte(mySalt), + initMsg: mustMarshal(t, HackatomExampleInitMsg{Verifier: otherAddr, Beneficiary: beneficiaryAddr}), + fixMsg: true, + }, + "different sender": { + setup: exampleWithoutFixMsg, + codeID: example.CodeID, + sender: otherAddr, + salt: []byte(mySalt), + initMsg: initMsg, + }, + "different code": { + setup: exampleWithoutFixMsg, + codeID: otherExample.CodeID, + sender: example.CreatorAddr, + salt: []byte(mySalt), + initMsg: []byte(`{}`), + }, + "different salt": { + setup: exampleWithoutFixMsg, + codeID: example.CodeID, + sender: example.CreatorAddr, + salt: []byte(`other salt`), + initMsg: initMsg, + }, + "different init msg - reject same address": { + setup: exampleWithoutFixMsg, + codeID: example.CodeID, + sender: example.CreatorAddr, + salt: []byte(mySalt), + initMsg: mustMarshal(t, HackatomExampleInitMsg{Verifier: otherAddr, Beneficiary: beneficiaryAddr}), + expErr: types.ErrDuplicate, + }, + "fix msg - long msg": { + setup: exampleWithFixMsg, + codeID: example.CodeID, + sender: otherAddr, + salt: []byte(mySalt), + initMsg: []byte(fmt.Sprintf(`{"foo":%q}`, strings.Repeat("b", math.MaxInt16+1))), // too long kills CI + fixMsg: true, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + ctx, _ := parentCtx.CacheContext() + spec.setup(t, ctx) + gotAddr, _, gotErr := keepers.ContractKeeper.Instantiate2( + ctx, + spec.codeID, + spec.sender, + nil, + spec.initMsg, + myLabel, + sdk.NewCoins(sdk.NewInt64Coin("denom", 2)), + spec.salt, + spec.fixMsg, + ) + if spec.expErr != nil { + assert.ErrorIs(t, gotErr, spec.expErr) + return + } + require.NoError(t, gotErr) + assert.NotEmpty(t, gotAddr) + }) + } +} diff --git a/x/wasm/keeper/genesis.go b/x/wasm/keeper/genesis.go index d81750b708..7fa5280b9e 100644 --- a/x/wasm/keeper/genesis.go +++ b/x/wasm/keeper/genesis.go @@ -35,6 +35,7 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState, staki } } + var maxContractID int for i, contract := range data.Contracts { contractAddr, err := sdk.AccAddressFromBech32(contract.ContractAddress) if err != nil { @@ -44,6 +45,7 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState, staki if err != nil { return nil, sdkerrors.Wrapf(err, "contract number %d", i) } + maxContractID = i + 1 // not ideal but max(contractID) is not persisted otherwise } for i, seq := range data.Sequences { @@ -58,6 +60,10 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState, staki if seqVal <= maxCodeID { return nil, sdkerrors.Wrapf(types.ErrInvalid, "seq %s with value: %d must be greater than: %d ", string(types.KeyLastCodeID), seqVal, maxCodeID) } + seqVal = keeper.PeekAutoIncrementID(ctx, types.KeyLastInstanceID) + if seqVal <= uint64(maxContractID) { + return nil, sdkerrors.Wrapf(types.ErrInvalid, "seq %s with value: %d must be greater than: %d ", string(types.KeyLastInstanceID), seqVal, maxContractID) + } if len(data.GenMsgs) == 0 { return nil, nil @@ -111,7 +117,7 @@ func ExportGenesis(ctx sdk.Context, keeper *Keeper) *types.GenesisState { return false }) - for _, k := range [][]byte{types.KeyLastCodeID} { + for _, k := range [][]byte{types.KeyLastCodeID, types.KeyLastInstanceID} { genState.Sequences = append(genState.Sequences, types.Sequence{ IDKey: k, Value: keeper.PeekAutoIncrementID(ctx, k), diff --git a/x/wasm/keeper/genesis_test.go b/x/wasm/keeper/genesis_test.go index 4b65f82eaa..aee7ad009e 100644 --- a/x/wasm/keeper/genesis_test.go +++ b/x/wasm/keeper/genesis_test.go @@ -11,14 +11,11 @@ import ( "testing" "time" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - - "github.com/cosmos/cosmos-sdk/types/address" - "github.com/cosmos/cosmos-sdk/store" "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" @@ -69,7 +66,7 @@ func TestGenesisExportImport(t *testing.T) { creatorAddr, err := sdk.AccAddressFromBech32(codeInfo.Creator) require.NoError(t, err) - codeID, checksum, err := contractKeeper.Create(srcCtx, creatorAddr, wasmCode, &codeInfo.InstantiateConfig) + codeID, _, err := contractKeeper.Create(srcCtx, creatorAddr, wasmCode, &codeInfo.InstantiateConfig) require.NoError(t, err) if pinned { contractKeeper.PinCode(srcCtx, codeID) @@ -84,7 +81,7 @@ func TestGenesisExportImport(t *testing.T) { } contract.CodeID = codeID - contractAddr := BuildContractAddress(checksum, creatorAddr, "testing") + contractAddr := wasmKeeper.ClassicAddressGenerator()(srcCtx, codeID, nil) wasmKeeper.storeContractInfo(srcCtx, contractAddr, &contract) wasmKeeper.appendToContractHistory(srcCtx, contractAddr, history...) wasmKeeper.importContractState(srcCtx, contractAddr, stateModels) @@ -160,16 +157,6 @@ func TestGenesisInit(t *testing.T) { require.NoError(t, err) myCodeInfo := wasmTypes.CodeInfoFixture(wasmTypes.WithSHA256CodeHash(wasmCode)) - mySenderAddr := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) - myLabel := "testing" - myContractInfoFixture := func(mutators ...func(*types.ContractInfo)) types.ContractInfo { - return types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { - c.CodeID = 1 - c.Creator = mySenderAddr.String() - c.Label = myLabel - }, types.OnlyGenesisFields) - } - specs := map[string]struct { src types.GenesisState stakingMock StakingKeeperMock @@ -185,6 +172,7 @@ func TestGenesisInit(t *testing.T) { }}, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: 2}, + {IDKey: types.KeyLastInstanceID, Value: 1}, }, Params: types.DefaultParams(), }, @@ -203,6 +191,7 @@ func TestGenesisInit(t *testing.T) { }}, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: 10}, + {IDKey: types.KeyLastInstanceID, Value: 1}, }, Params: types.DefaultParams(), }, @@ -222,6 +211,7 @@ func TestGenesisInit(t *testing.T) { Contracts: nil, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: 3}, + {IDKey: types.KeyLastInstanceID, Value: 1}, }, Params: types.DefaultParams(), }, @@ -278,12 +268,13 @@ func TestGenesisInit(t *testing.T) { }}, Contracts: []types.Contract{ { - ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), - ContractInfo: myContractInfoFixture(), + ContractAddress: BuildContractAddressClassic(1, 1).String(), + ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), }, }, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: 2}, + {IDKey: types.KeyLastInstanceID, Value: 2}, }, Params: types.DefaultParams(), }, @@ -298,17 +289,16 @@ func TestGenesisInit(t *testing.T) { }}, Contracts: []types.Contract{ { - ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), - ContractInfo: myContractInfoFixture(), + ContractAddress: BuildContractAddressClassic(1, 1).String(), + ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), }, { - ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, "other-label").String(), - ContractInfo: myContractInfoFixture(func(i *wasmTypes.ContractInfo) { - i.Label = "other-label" - }), + ContractAddress: BuildContractAddressClassic(1, 2).String(), + ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), }, }, Sequences: []types.Sequence{ {IDKey: types.KeyLastCodeID, Value: 2}, + {IDKey: types.KeyLastInstanceID, Value: 3}, }, Params: types.DefaultParams(), }, @@ -318,8 +308,8 @@ func TestGenesisInit(t *testing.T) { src: types.GenesisState{ Contracts: []types.Contract{ { - ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), - ContractInfo: myContractInfoFixture(), + ContractAddress: BuildContractAddressClassic(1, 1).String(), + ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), }, }, Params: types.DefaultParams(), @@ -334,11 +324,11 @@ func TestGenesisInit(t *testing.T) { }}, Contracts: []types.Contract{ { - ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), - ContractInfo: myContractInfoFixture(), + ContractAddress: BuildContractAddressClassic(1, 1).String(), + ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), }, { - ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), - ContractInfo: myContractInfoFixture(), + ContractAddress: BuildContractAddressClassic(1, 1).String(), + ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), }, }, Params: types.DefaultParams(), @@ -353,8 +343,8 @@ func TestGenesisInit(t *testing.T) { }}, Contracts: []types.Contract{ { - ContractAddress: BuildContractAddress(myCodeInfo.CodeHash, mySenderAddr, myLabel).String(), - ContractInfo: myContractInfoFixture(), + ContractAddress: BuildContractAddressClassic(1, 1).String(), + ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), ContractState: []types.Model{ { Key: []byte{0x1}, @@ -392,6 +382,26 @@ func TestGenesisInit(t *testing.T) { Params: types.DefaultParams(), }, }, + "prevent contract id seq init value == count contracts": { + src: types.GenesisState{ + Codes: []types.Code{{ + CodeID: firstCodeID, + CodeInfo: myCodeInfo, + CodeBytes: wasmCode, + }}, + Contracts: []types.Contract{ + { + ContractAddress: BuildContractAddressClassic(1, 1).String(), + ContractInfo: types.ContractInfoFixture(func(c *wasmTypes.ContractInfo) { c.CodeID = 1 }, types.OnlyGenesisFields), + }, + }, + Sequences: []types.Sequence{ + {IDKey: types.KeyLastCodeID, Value: 2}, + {IDKey: types.KeyLastInstanceID, Value: 1}, + }, + Params: types.DefaultParams(), + }, + }, "validator set update called for any genesis messages": { src: wasmTypes.GenesisState{ GenMsgs: []types.GenesisState_GenMsgs{ @@ -550,17 +560,16 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { } assert.Equal(t, expHistory, keeper.GetContractHistory(ctx, contractAddr)) assert.Equal(t, uint64(2), keeper.PeekAutoIncrementID(ctx, types.KeyLastCodeID)) + assert.Equal(t, uint64(3), keeper.PeekAutoIncrementID(ctx, types.KeyLastInstanceID)) } func TestSupportedGenMsgTypes(t *testing.T) { wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - wasmHash := sha256.Sum256(wasmCode) var ( myAddress sdk.AccAddress = bytes.Repeat([]byte{1}, types.ContractAddrLen) verifierAddress sdk.AccAddress = bytes.Repeat([]byte{2}, types.ContractAddrLen) beneficiaryAddress sdk.AccAddress = bytes.Repeat([]byte{3}, types.ContractAddrLen) - contractAddr = BuildContractAddress(wasmHash[:], myAddress, "testing") ) const denom = "stake" importState := types.GenesisState{ @@ -592,7 +601,7 @@ func TestSupportedGenMsgTypes(t *testing.T) { Sum: &types.GenesisState_GenMsgs_ExecuteContract{ ExecuteContract: &types.MsgExecuteContract{ Sender: verifierAddress.String(), - Contract: contractAddr.String(), + Contract: BuildContractAddressClassic(1, 1).String(), Msg: []byte(`{"release":{}}`), }, }, @@ -617,7 +626,7 @@ func TestSupportedGenMsgTypes(t *testing.T) { require.NotNil(t, codeInfo) // verify contract instantiated - cInfo := keeper.GetContractInfo(ctx, contractAddr) + cInfo := keeper.GetContractInfo(ctx, BuildContractAddressClassic(1, 1)) require.NotNil(t, cInfo) // verify contract executed diff --git a/x/wasm/keeper/ibc_test.go b/x/wasm/keeper/ibc_test.go index bdbab1a37c..063dfb7f7d 100644 --- a/x/wasm/keeper/ibc_test.go +++ b/x/wasm/keeper/ibc_test.go @@ -4,8 +4,6 @@ import ( "fmt" "testing" - "github.com/tendermint/tendermint/libs/rand" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" @@ -43,7 +41,7 @@ func TestBindingPortForIBCContractOnInstantiate(t *testing.T) { } func TestContractFromPortID(t *testing.T) { - contractAddr := BuildContractAddress(rand.Bytes(32), RandomAccountAddress(t), "testing") + contractAddr := BuildContractAddressClassic(1, 100) specs := map[string]struct { srcPort string expAddr sdk.AccAddress diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index c349603613..f29f6e18ed 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -19,7 +19,6 @@ import ( "github.com/cosmos/cosmos-sdk/store/prefix" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/address" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" vestingexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" @@ -224,8 +223,8 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, evt := sdk.NewEvent( types.EventTypeStoreCode, - sdk.NewAttribute(types.AttributeKeyCodeID, strconv.FormatUint(codeID, 10)), sdk.NewAttribute(types.AttributeKeyChecksum, hex.EncodeToString(checksum)), + sdk.NewAttribute(types.AttributeKeyCodeID, strconv.FormatUint(codeID, 10)), // last element to be compatible with scripts ) for _, f := range strings.Split(report.RequiredCapabilities, ",") { evt.AppendAttributes(sdk.NewAttribute(types.AttributeKeyRequiredCapability, strings.TrimSpace(f))) @@ -267,7 +266,16 @@ func (k Keeper) importCode(ctx sdk.Context, codeID uint64, codeInfo types.CodeIn return nil } -func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins, authPolicy AuthorizationPolicy) (sdk.AccAddress, []byte, error) { +func (k Keeper) instantiate( + ctx sdk.Context, + codeID uint64, + creator, admin sdk.AccAddress, + initMsg []byte, + label string, + deposit sdk.Coins, + addressGenerator AddressGenerator, + authPolicy AuthorizationPolicy, +) (sdk.AccAddress, []byte, error) { defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "instantiate") if creator == nil { @@ -277,19 +285,15 @@ func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.A ctx.GasMeter().ConsumeGas(instanceCosts, "Loading CosmWasm module: instantiate") // get contact info - store := ctx.KVStore(k.storeKey) - bz := store.Get(types.GetCodeKey(codeID)) - if bz == nil { + codeInfo := k.GetCodeInfo(ctx, codeID) + if codeInfo == nil { return nil, nil, sdkerrors.Wrap(types.ErrNotFound, "code") } - var codeInfo types.CodeInfo - k.cdc.MustUnmarshal(bz, &codeInfo) - if !authPolicy.CanInstantiateContract(codeInfo.InstantiateConfig, creator) { return nil, nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "can not instantiate") } - contractAddress := BuildContractAddress(codeInfo.CodeHash, creator, label) + contractAddress := addressGenerator(ctx, codeID, codeInfo.CodeHash) if k.HasContractInfo(ctx, contractAddress) { return nil, nil, types.ErrDuplicate.Wrap("instance with this code id, sender and label exists: try a different label") } @@ -338,7 +342,7 @@ func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.A info := types.NewInfo(creator, deposit) // create prefixed data store - // 0x03 | BuildContractAddress (sdk.AccAddress) + // 0x03 | BuildContractAddressClassic (sdk.AccAddress) prefixStoreKey := types.GetContractStorePrefix(contractAddress) prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), prefixStoreKey) @@ -1006,21 +1010,6 @@ func (k Keeper) consumeRuntimeGas(ctx sdk.Context, gas uint64) { } } -// BuildContractAddress generates a contract address for the wasm module with len = types.ContractAddrLen using the -// Cosmos SDK address.Module function. -// Internally a key is built containing (len(checksum) | checksum | len(sender_address) | sender_address | len(label) | label). -// All method parameter values must be valid and not be empty or nil. -func BuildContractAddress(checksum []byte, creator sdk.AccAddress, label string) sdk.AccAddress { - checksum = address.MustLengthPrefix(checksum) - creator = address.MustLengthPrefix(creator) - labelBz := address.MustLengthPrefix([]byte(label)) - key := make([]byte, len(checksum)+len(creator)+len(labelBz)) - copy(key[0:], checksum) - copy(key[len(checksum):], creator) - copy(key[len(checksum)+len(creator):], labelBz) - return address.Module(types.ModuleName, key)[:types.ContractAddrLen] -} - func (k Keeper) autoIncrementID(ctx sdk.Context, lastIDKey []byte) uint64 { store := ctx.KVStore(k.storeKey) bz := store.Get(lastIDKey) diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index 5235141f36..947edd27c3 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -3,12 +3,10 @@ package keeper import ( "bytes" _ "embed" - "encoding/hex" "encoding/json" "errors" "fmt" "os" - "strings" "testing" "time" @@ -62,7 +60,7 @@ func TestCreateSuccess(t *testing.T) { require.Equal(t, hackatomWasm, storedCode) // and events emitted codeHash := "13a1fc994cc6d1c81b746ee0c0ff6f90043875e0bf1d9be6b7d779fc978dc2a5" - exp := sdk.Events{sdk.NewEvent("store_code", sdk.NewAttribute("code_id", "1"), sdk.NewAttribute("code_checksum", codeHash))} + exp := sdk.Events{sdk.NewEvent("store_code", sdk.NewAttribute("code_checksum", codeHash), sdk.NewAttribute("code_id", "1"))} assert.Equal(t, exp, em.Events()) } @@ -398,11 +396,11 @@ func TestInstantiate(t *testing.T) { // create with no balance is also legal gotContractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx.WithEventManager(em), example.CodeID, creator, nil, initMsgBz, "demo contract 1", nil) require.NoError(t, err) - require.Equal(t, "cosmos1xaq0tcwz9fsqmtxlpzwjn2zr8gw66ljjr079ltfc5pelepcs7sjsk28n5n", gotContractAddr.String()) + require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", gotContractAddr.String()) gasAfter := ctx.GasMeter().GasConsumed() if types.EnableGasVerification { - require.Equal(t, uint64(0x187b8), gasAfter-gasBefore) + require.Equal(t, uint64(0x1964f), gasAfter-gasBefore) } // ensure it is stored properly @@ -541,65 +539,6 @@ func TestInstantiateWithPermissions(t *testing.T) { } } -func TestInstantiateWithUniqueContractAddress(t *testing.T) { - parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) - example := InstantiateHackatomExampleContract(t, parentCtx, keepers) - otherExample := InstantiateReflectExampleContract(t, parentCtx, keepers) - initMsg := mustMarshal(t, HackatomExampleInitMsg{Verifier: example.VerifierAddr, Beneficiary: example.BeneficiaryAddr}) - - otherAddress := DeterministicAccountAddress(t, 1) - keepers.Faucet.Fund(parentCtx, otherAddress, sdk.NewInt64Coin("denom", 100000000)) - used := make(map[string]struct{}) - specs := map[string]struct { - codeID uint64 - sender sdk.AccAddress - label string - initMsg json.RawMessage - expErr error - }{ - "reject duplicate which generates the same address": { - codeID: example.CodeID, - sender: example.CreatorAddr, - label: example.Label, - initMsg: initMsg, - expErr: types.ErrDuplicate, - }, - "different sender": { - codeID: example.CodeID, - sender: otherAddress, - label: example.Label, - initMsg: initMsg, - }, - "different code": { - codeID: otherExample.CodeID, - sender: example.CreatorAddr, - label: example.Label, - initMsg: []byte(`{}`), - }, - "different label": { - codeID: example.CodeID, - sender: example.CreatorAddr, - label: "other label", - initMsg: initMsg, - }, - } - for name, spec := range specs { - t.Run(name, func(t *testing.T) { - ctx, _ := parentCtx.CacheContext() - gotAddr, _, gotErr := keepers.ContractKeeper.Instantiate(ctx, spec.codeID, spec.sender, nil, spec.initMsg, spec.label, example.Deposit) - if spec.expErr != nil { - assert.ErrorIs(t, gotErr, spec.expErr) - return - } - require.NoError(t, gotErr) - expAddr := BuildContractAddress(keepers.WasmKeeper.GetCodeInfo(ctx, spec.codeID).CodeHash, spec.sender, spec.label) - assert.Equal(t, expAddr.String(), gotAddr.String()) - require.NotContains(t, used, gotAddr.String()) - used[gotAddr.String()] = struct{}{} - }) - } -} - func TestInstantiateWithAccounts(t *testing.T) { parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) example := StoreHackatomExampleContract(t, parentCtx, keepers) @@ -609,12 +548,13 @@ func TestInstantiateWithAccounts(t *testing.T) { senderAddr := DeterministicAccountAddress(t, 1) keepers.Faucet.Fund(parentCtx, senderAddr, sdk.NewInt64Coin("denom", 100000000)) const myLabel = "testing" - contractAddr := BuildContractAddress(example.Checksum, senderAddr, myLabel) + mySalt := []byte(`my salt`) + contractAddr := BuildContractAddressPredictable(example.Checksum, senderAddr, mySalt, []byte{}) lastAccountNumber := keepers.AccountKeeper.GetAccount(parentCtx, senderAddr).GetAccountNumber() specs := map[string]struct { - acceptList Option + option Option account authtypes.AccountI initBalance sdk.Coin deposit sdk.Coins @@ -679,7 +619,7 @@ func TestInstantiateWithAccounts(t *testing.T) { expErr: types.ErrAccountExists, }, "with option used to set non default type to accept list": { - acceptList: WithAcceptedAccountTypesOnContractInstantiation(&vestingtypes.DelayedVestingAccount{}), + option: WithAcceptedAccountTypesOnContractInstantiation(&vestingtypes.DelayedVestingAccount{}), account: vestingtypes.NewDelayedVestingAccount( authtypes.NewBaseAccount(contractAddr, nil, 0, 0), sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), time.Now().Add(30*time.Hour).Unix()), @@ -689,6 +629,15 @@ func TestInstantiateWithAccounts(t *testing.T) { sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), time.Now().Add(30*time.Hour).Unix()), expBalance: sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_001))), }, + "pruning account fails": { + option: WithAccountPruner(wasmtesting.AccountPrunerMock{CleanupExistingAccountFn: func(ctx sdk.Context, existingAccount authtypes.AccountI) (handled bool, err error) { + return false, types.ErrUnsupportedForContract.Wrap("testing") + }}), + account: vestingtypes.NewDelayedVestingAccount( + authtypes.NewBaseAccount(contractAddr, nil, 0, 0), + sdk.NewCoins(sdk.NewCoin("denom", sdk.NewInt(1_000))), time.Now().Add(30*time.Hour).Unix()), + expErr: types.ErrUnsupportedForContract, + }, } for name, spec := range specs { t.Run(name, func(t *testing.T) { @@ -699,16 +648,17 @@ func TestInstantiateWithAccounts(t *testing.T) { if !spec.initBalance.IsNil() { keepers.Faucet.Fund(ctx, spec.account.GetAddress(), spec.initBalance) } - if spec.acceptList != nil { - spec.acceptList.apply(keepers.WasmKeeper) + if spec.option != nil { + spec.option.apply(keepers.WasmKeeper) } defer func() { - if spec.acceptList != nil { // reset + if spec.option != nil { // reset WithAcceptedAccountTypesOnContractInstantiation(&authtypes.BaseAccount{}).apply(keepers.WasmKeeper) + WithAccountPruner(NewVestingCoinBurner(keepers.BankKeeper)).apply(keepers.WasmKeeper) } }() // when - gotAddr, _, gotErr := keepers.ContractKeeper.Instantiate(ctx, 1, senderAddr, nil, initMsg, myLabel, spec.deposit) + gotAddr, _, gotErr := keepers.ContractKeeper.Instantiate2(ctx, 1, senderAddr, nil, initMsg, myLabel, spec.deposit, mySalt, false) if spec.expErr != nil { assert.ErrorIs(t, gotErr, spec.expErr) return @@ -857,8 +807,7 @@ func TestExecute(t *testing.T) { addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) require.NoError(t, err) - // cosmos1eycfqpgtcp4gc9g24cvg6useyncxspq8qurv2z7cs0wzcgvmffaquzwe2e build with code-id 1, DeterministicAccountAddress(t, 1) and label `demo contract 3` - require.Equal(t, "cosmos1eycfqpgtcp4gc9g24cvg6useyncxspq8qurv2z7cs0wzcgvmffaquzwe2e", addr.String()) + require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", addr.String()) // ensure bob doesn't exist bobAcct := accKeeper.GetAccount(ctx, bob) @@ -1562,7 +1511,7 @@ func TestSudo(t *testing.T) { require.NoError(t, err) addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) require.NoError(t, err) - require.Equal(t, "cosmos1eycfqpgtcp4gc9g24cvg6useyncxspq8qurv2z7cs0wzcgvmffaquzwe2e", addr.String()) + require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", addr.String()) // the community is broke _, _, community := keyPubAddr() @@ -2077,104 +2026,6 @@ func TestQueryIsolation(t *testing.T) { assert.Nil(t, ctx.KVStore(k.storeKey).Get([]byte(`set_in_query`))) } -func TestBuildContractAddress(t *testing.T) { - x, y := sdk.GetConfig().GetBech32AccountAddrPrefix(), sdk.GetConfig().GetBech32AccountPubPrefix() - t.Cleanup(func() { - sdk.GetConfig().SetBech32PrefixForAccount(x, y) - }) - sdk.GetConfig().SetBech32PrefixForAccount("purple", "purple") - - // test vectors from https://gist.github.com/webmaster128/e4d401d414bd0e7e6f70482f11877fbe - specs := map[string]struct { - checksum []byte - label string - creator string - expAddress string - }{ - "initial account addr example": { - checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), - label: "instance 1", - creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", - expAddress: "purple1jukvumwqfxapueg6un6rtmafxktcluzv70xc3edz2m5t3slgw49qrmhc03", - }, - "account addr with different label": { - checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), - label: "instance 2", - creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", - expAddress: "purple1jpc2w2vu2t6k7u09p6v8e3w28ptnzvvt2snu5rytlj8qya27dq5sjkwm06", - }, - "initial contract addr example": { - checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), - label: "instance 1", - creator: "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", - expAddress: "purple1wde5zlcveuh79w37w5g244qu9xja3hgfulyfkjvkxvwvjzgd5l3qfraz3c", - }, - "contract addr with different label": { - checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), - label: "instance 2", - creator: "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", - expAddress: "purple1vae2kf0r3ehtq5q2jmfkg7wp4ckxwrw8dv4pvazz5nlzzu05lxzq878fa9", - }, - "account addr with different checksum": { - checksum: fromHex("1DA6C16DE2CBAF7AD8CBB66F0925BA33F5C278CB2491762D04658C1480EA229B"), - label: "instance 1", - creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", - expAddress: "purple1gmgvt9levtn52mpfal3gl5tv60f47zez3wgczrh5c9352sfm9crs47zt0k", - }, - "account addr with different checksum and label": { - checksum: fromHex("1DA6C16DE2CBAF7AD8CBB66F0925BA33F5C278CB2491762D04658C1480EA229B"), - label: "instance 2", - creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", - expAddress: "purple13jrcqxknt05rhdxmegjzjel666yay6fj3xvfp6445k7a9q2km4wqa7ss34", - }, - "contract addr with different checksum": { - checksum: fromHex("1DA6C16DE2CBAF7AD8CBB66F0925BA33F5C278CB2491762D04658C1480EA229B"), - label: "instance 1", - creator: "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", - expAddress: "purple1lu0lf6wmqeuwtrx93ptzvf4l0dyyz2vz6s8h5y9cj42fvhsmracq49pww9", - }, - "contract addr with different checksum and label": { - checksum: fromHex("1DA6C16DE2CBAF7AD8CBB66F0925BA33F5C278CB2491762D04658C1480EA229B"), - label: "instance 2", - creator: "purple1nxvenxve42424242hwamhwamenxvenxvmhwamhwaamhwamhwlllsatsy6m", - expAddress: "purple1zmerc8a9ml2au29rq3knuu35fktef3akceurckr6pf370n0wku7sw3c9mj", - }, - // regression tests - "min label size": { - checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), - label: "x", - creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", - expAddress: "purple16pc8gt824lmp3dh2sxvttj0ykcs02n5p3ldswhv3j7y853gghlfq7mqeh9", - }, - "max label size": { - checksum: fromHex("13A1FC994CC6D1C81B746EE0C0FF6F90043875E0BF1D9BE6B7D779FC978DC2A5"), - label: strings.Repeat("x", types.MaxLabelSize), - creator: "purple1nxvenxve42424242hwamhwamenxvenxvhxf2py", - expAddress: "purple1prkdvjmvv4s3tnppfxmlpj259v9cplf3wws4qq9qd7w3s4yqzqeqem4759", - }, - } - for name, spec := range specs { - t.Run(name, func(t *testing.T) { - creatorAddr, err := sdk.AccAddressFromBech32(spec.creator) - require.NoError(t, err) - - // when - gotAddr := BuildContractAddress(spec.checksum, creatorAddr, spec.label) - - require.Equal(t, spec.expAddress, gotAddr.String()) - require.NoError(t, sdk.VerifyAddressFormat(gotAddr)) - }) - } -} - -func fromHex(s string) []byte { - r, err := hex.DecodeString(s) - if err != nil { - panic(err) - } - return r -} - func TestSetAccessConfig(t *testing.T) { parentCtx, keepers := CreateTestInput(t, false, AvailableCapabilities) k := keepers.WasmKeeper diff --git a/x/wasm/keeper/migrations.go b/x/wasm/keeper/migrations.go deleted file mode 100644 index 4d218d504a..0000000000 --- a/x/wasm/keeper/migrations.go +++ /dev/null @@ -1,27 +0,0 @@ -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/CosmWasm/wasmd/x/wasm/types" -) - -// Migrator is a struct for handling in-place store migrations. -type Migrator struct { - keeper *Keeper -} - -// NewMigrator returns a new Migrator. -func NewMigrator(keeper *Keeper) Migrator { - return Migrator{keeper: keeper} -} - -var keyLastInstanceID = append(types.SequenceKeyPrefix, []byte("lastContractId")...) - -// Migrate1to2 migrates from version 1 to 2. -// Remove the unused sequence for address generation -func (m Migrator) Migrate1to2(ctx sdk.Context) error { - store := ctx.KVStore(m.keeper.storeKey) - store.Delete(keyLastInstanceID) - return nil -} diff --git a/x/wasm/keeper/migrations_test.go b/x/wasm/keeper/migrations_test.go deleted file mode 100644 index bc9110a3b3..0000000000 --- a/x/wasm/keeper/migrations_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package keeper - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/assert" -) - -func TestMigrateV1ToV2(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) - store := ctx.KVStore(keepers.WasmKeeper.storeKey) - store.Set(keyLastInstanceID, sdk.Uint64ToBigEndian(100)) - - // when - NewMigrator(keepers.WasmKeeper).Migrate1to2(ctx) - - // then - assert.False(t, store.Has(keyLastInstanceID)) -} diff --git a/x/wasm/keeper/msg_server.go b/x/wasm/keeper/msg_server.go index 8c2a592ebf..d3051f4307 100644 --- a/x/wasm/keeper/msg_server.go +++ b/x/wasm/keeper/msg_server.go @@ -43,6 +43,7 @@ func (m msgServer) StoreCode(goCtx context.Context, msg *types.MsgStoreCode) (*t }, nil } +// InstantiateContract instantiate a new contract with classic sequence based address generation func (m msgServer) InstantiateContract(goCtx context.Context, msg *types.MsgInstantiateContract) (*types.MsgInstantiateContractResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) @@ -74,6 +75,37 @@ func (m msgServer) InstantiateContract(goCtx context.Context, msg *types.MsgInst }, nil } +// InstantiateContract2 instantiate a new contract with predicatable address generated +func (m msgServer) InstantiateContract2(goCtx context.Context, msg *types.MsgInstantiateContract2) (*types.MsgInstantiateContract2Response, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return nil, sdkerrors.Wrap(err, "sender") + } + var adminAddr sdk.AccAddress + if msg.Admin != "" { + if adminAddr, err = sdk.AccAddressFromBech32(msg.Admin); err != nil { + return nil, sdkerrors.Wrap(err, "admin") + } + } + + ctx.EventManager().EmitEvent(sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), + )) + contractAddr, data, err := m.keeper.Instantiate2(ctx, msg.CodeID, senderAddr, adminAddr, msg.Msg, msg.Label, msg.Funds, msg.Salt, msg.FixMsg) + if err != nil { + return nil, err + } + + return &types.MsgInstantiateContract2Response{ + Address: contractAddr.String(), + Data: data, + }, nil +} + func (m msgServer) ExecuteContract(goCtx context.Context, msg *types.MsgExecuteContract) (*types.MsgExecuteContractResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) diff --git a/x/wasm/keeper/proposal_integration_test.go b/x/wasm/keeper/proposal_integration_test.go index ace55269db..5a0305a485 100644 --- a/x/wasm/keeper/proposal_integration_test.go +++ b/x/wasm/keeper/proposal_integration_test.go @@ -2,25 +2,21 @@ package keeper import ( "bytes" - "crypto/sha256" "encoding/hex" "encoding/json" "errors" "os" "testing" - "github.com/cosmos/cosmos-sdk/x/params/client/utils" - wasmvm "github.com/CosmWasm/wasmvm" - - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/cosmos/cosmos-sdk/x/params/client/utils" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" "github.com/CosmWasm/wasmd/x/wasm/types" ) @@ -117,8 +113,9 @@ func TestInstantiateProposal(t *testing.T) { require.NoError(t, err) // then - codeHash := keepers.WasmKeeper.GetCodeInfo(ctx, 1).CodeHash - contractAddr := BuildContractAddress(codeHash, oneAddress, "testing") + contractAddr, err := sdk.AccAddressFromBech32("cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr") + require.NoError(t, err) + cInfo := wasmKeeper.GetContractInfo(ctx, contractAddr) require.NotNil(t, cInfo) assert.Equal(t, uint64(1), cInfo.CodeID) @@ -188,8 +185,9 @@ func TestInstantiateProposal_NoAdmin(t *testing.T) { require.NoError(t, err) // then - codeHash := keepers.WasmKeeper.GetCodeInfo(ctx, 1).CodeHash - contractAddr := BuildContractAddress(codeHash, oneAddress, "testing") + contractAddr, err := sdk.AccAddressFromBech32("cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr") + require.NoError(t, err) + cInfo := wasmKeeper.GetContractInfo(ctx, contractAddr) require.NotNil(t, cInfo) assert.Equal(t, uint64(1), cInfo.CodeID) @@ -230,7 +228,7 @@ func TestMigrateProposal(t *testing.T) { var ( anyAddress = DeterministicAccountAddress(t, 1) otherAddress = DeterministicAccountAddress(t, 2) - contractAddr = BuildContractAddress(codeInfoFixture.CodeHash, RandomAccountAddress(t), "") + contractAddr = BuildContractAddressClassic(1, 1) ) contractInfoFixture := types.ContractInfoFixture(func(c *types.ContractInfo) { @@ -407,13 +405,12 @@ func TestSudoProposal(t *testing.T) { } func TestAdminProposals(t *testing.T) { - wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") - require.NoError(t, err) var ( - otherAddress = DeterministicAccountAddress(t, 2) - codeHash = sha256.Sum256(wasmCode) - contractAddr = BuildContractAddress(codeHash[:], RandomAccountAddress(t), "") + otherAddress sdk.AccAddress = bytes.Repeat([]byte{0x2}, types.ContractAddrLen) + contractAddr = BuildContractAddressClassic(1, 1) ) + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") + require.NoError(t, err) specs := map[string]struct { state types.ContractInfo diff --git a/x/wasm/keeper/querier_test.go b/x/wasm/keeper/querier_test.go index 115eeb8419..f4341d169d 100644 --- a/x/wasm/keeper/querier_test.go +++ b/x/wasm/keeper/querier_test.go @@ -158,9 +158,8 @@ func TestQuerySmartContractState(t *testing.T) { func TestQuerySmartContractPanics(t *testing.T) { ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) - creator := RandomAccountAddress(t) - contractAddr := BuildContractAddress([]byte("myCodeHash"), creator, "testing") - keepers.WasmKeeper.storeCodeInfo(ctx, 1, types.CodeInfo{CodeHash: []byte("myCodeHash")}) + contractAddr := BuildContractAddressClassic(1, 1) + keepers.WasmKeeper.storeCodeInfo(ctx, 1, types.CodeInfo{}) keepers.WasmKeeper.storeContractInfo(ctx, contractAddr, &types.ContractInfo{ CodeID: 1, Created: types.NewAbsoluteTxPosition(ctx), diff --git a/x/wasm/keeper/test_common.go b/x/wasm/keeper/test_common.go index fff90af36b..721a327826 100644 --- a/x/wasm/keeper/test_common.go +++ b/x/wasm/keeper/test_common.go @@ -9,20 +9,18 @@ import ( "testing" "time" - "github.com/cosmos/cosmos-sdk/x/auth/vesting" - - "github.com/cosmos/cosmos-sdk/types/address" - "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/auth/vesting" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" "github.com/cosmos/cosmos-sdk/x/bank" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" @@ -72,7 +70,6 @@ import ( dbm "github.com/tendermint/tm-db" wasmappparams "github.com/CosmWasm/wasmd/app/params" - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" "github.com/CosmWasm/wasmd/x/wasm/types" ) diff --git a/x/wasm/keeper/wasmtesting/coin_transferrer.go b/x/wasm/keeper/wasmtesting/coin_transferrer.go deleted file mode 100644 index 497ecc747f..0000000000 --- a/x/wasm/keeper/wasmtesting/coin_transferrer.go +++ /dev/null @@ -1,14 +0,0 @@ -package wasmtesting - -import sdk "github.com/cosmos/cosmos-sdk/types" - -type MockCoinTransferrer struct { - TransferCoinsFn func(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error -} - -func (m *MockCoinTransferrer) TransferCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error { - if m.TransferCoinsFn == nil { - panic("not expected to be called") - } - return m.TransferCoinsFn(ctx, fromAddr, toAddr, amt) -} diff --git a/x/wasm/keeper/wasmtesting/extension_mocks.go b/x/wasm/keeper/wasmtesting/extension_mocks.go new file mode 100644 index 0000000000..562d9e74b0 --- /dev/null +++ b/x/wasm/keeper/wasmtesting/extension_mocks.go @@ -0,0 +1,28 @@ +package wasmtesting + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +type MockCoinTransferrer struct { + TransferCoinsFn func(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error +} + +func (m *MockCoinTransferrer) TransferCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error { + if m.TransferCoinsFn == nil { + panic("not expected to be called") + } + return m.TransferCoinsFn(ctx, fromAddr, toAddr, amt) +} + +type AccountPrunerMock struct { + CleanupExistingAccountFn func(ctx sdk.Context, existingAccount authtypes.AccountI) (handled bool, err error) +} + +func (m AccountPrunerMock) CleanupExistingAccount(ctx sdk.Context, existingAccount authtypes.AccountI) (handled bool, err error) { + if m.CleanupExistingAccountFn == nil { + panic("not expected to be called") + } + return m.CleanupExistingAccountFn(ctx, existingAccount) +} diff --git a/x/wasm/module.go b/x/wasm/module.go index 2433fe0219..c7ea6339c0 100644 --- a/x/wasm/module.go +++ b/x/wasm/module.go @@ -134,11 +134,6 @@ func NewAppModule( func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(keeper.NewDefaultPermissionKeeper(am.keeper))) types.RegisterQueryServer(cfg.QueryServer(), NewQuerier(am.keeper)) - - m := keeper.NewMigrator(am.keeper) - if err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2); err != nil { - panic(err) - } } func (am AppModule) LegacyQuerierHandler(amino *codec.LegacyAmino) sdk.Querier { //nolint:staticcheck diff --git a/x/wasm/module_test.go b/x/wasm/module_test.go index d3530e5a3a..66591aba27 100644 --- a/x/wasm/module_test.go +++ b/x/wasm/module_test.go @@ -7,11 +7,8 @@ import ( "os" "testing" - "github.com/cosmos/cosmos-sdk/types/address" - - "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" "github.com/cosmos/cosmos-sdk/types/module" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" @@ -24,6 +21,7 @@ import ( "github.com/tendermint/tendermint/crypto/ed25519" "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/CosmWasm/wasmd/x/wasm/keeper/testdata" "github.com/CosmWasm/wasmd/x/wasm/types" ) @@ -148,8 +146,7 @@ type state struct { func TestHandleInstantiate(t *testing.T) { data := setupTest(t) - creator := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) - data.faucet.Fund(data.ctx, creator, sdk.NewInt64Coin("denom", 100000)) + creator := data.faucet.NewFundedRandomAccount(data.ctx, sdk.NewInt64Coin("denom", 100000)) h := data.module.Route().Handler() q := data.module.LegacyQuerierHandler(nil) @@ -183,7 +180,7 @@ func TestHandleInstantiate(t *testing.T) { require.NoError(t, err) contractBech32Addr := parseInitResponse(t, res.Data) - require.Equal(t, "cosmos1400ax8h2dxe8ch64sus5sczqdhwv28hpjkkaphpa83he4fhz6k4qcm9kul", contractBech32Addr) + require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", contractBech32Addr) // this should be standard x/wasm init event, nothing from contract require.Equal(t, 3, len(res.Events), prettyEvents(res.Events)) require.Equal(t, "message", res.Events[0].Type) @@ -210,9 +207,7 @@ func TestHandleExecute(t *testing.T) { deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := sdk.AccAddress(bytes.Repeat([]byte{1}, address.Len)) - data.faucet.Fund(data.ctx, creator, sdk.NewInt64Coin("denom", 100000*2)) - + creator := data.faucet.NewFundedRandomAccount(data.ctx, deposit.Add(deposit...)...) fred := data.faucet.NewFundedRandomAccount(data.ctx, topUp...) h := data.module.Route().Handler() @@ -244,7 +239,7 @@ func TestHandleExecute(t *testing.T) { require.NoError(t, err) contractBech32Addr := parseInitResponse(t, res.Data) - require.Equal(t, "cosmos1400ax8h2dxe8ch64sus5sczqdhwv28hpjkkaphpa83he4fhz6k4qcm9kul", contractBech32Addr) + require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", contractBech32Addr) // this should be standard x/wasm message event, init event, plus a bank send event (2), with no custom contract events require.Equal(t, 6, len(res.Events), prettyEvents(res.Events)) require.Equal(t, "message", res.Events[0].Type) @@ -377,7 +372,7 @@ func TestHandleExecuteEscrow(t *testing.T) { res, err = h(data.ctx, &initCmd) require.NoError(t, err) contractBech32Addr := parseInitResponse(t, res.Data) - require.Equal(t, "cosmos1400ax8h2dxe8ch64sus5sczqdhwv28hpjkkaphpa83he4fhz6k4qcm9kul", contractBech32Addr) + require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", contractBech32Addr) handleMsg := map[string]interface{}{ "release": map[string]interface{}{}, diff --git a/x/wasm/types/codec.go b/x/wasm/types/codec.go index e7e578b7f8..f1cd6f557f 100644 --- a/x/wasm/types/codec.go +++ b/x/wasm/types/codec.go @@ -13,6 +13,7 @@ import ( func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { //nolint:staticcheck cdc.RegisterConcrete(&MsgStoreCode{}, "wasm/MsgStoreCode", nil) cdc.RegisterConcrete(&MsgInstantiateContract{}, "wasm/MsgInstantiateContract", nil) + cdc.RegisterConcrete(&MsgInstantiateContract2{}, "wasm/MsgInstantiateContract2", nil) cdc.RegisterConcrete(&MsgExecuteContract{}, "wasm/MsgExecuteContract", nil) cdc.RegisterConcrete(&MsgMigrateContract{}, "wasm/MsgMigrateContract", nil) cdc.RegisterConcrete(&MsgUpdateAdmin{}, "wasm/MsgUpdateAdmin", nil) @@ -35,6 +36,7 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { (*sdk.Msg)(nil), &MsgStoreCode{}, &MsgInstantiateContract{}, + &MsgInstantiateContract2{}, &MsgExecuteContract{}, &MsgMigrateContract{}, &MsgUpdateAdmin{}, diff --git a/x/wasm/types/exported_keepers.go b/x/wasm/types/exported_keepers.go index df09957915..e68df8ee7b 100644 --- a/x/wasm/types/exported_keepers.go +++ b/x/wasm/types/exported_keepers.go @@ -28,8 +28,27 @@ type ContractOpsKeeper interface { // Create uploads and compiles a WASM contract, returning a short identifier for the contract Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *AccessConfig) (codeID uint64, checksum []byte, err error) - // Instantiate creates an instance of a WASM contract - Instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins) (sdk.AccAddress, []byte, error) + // Instantiate creates an instance of a WASM contract using the classic sequence based address generator + Instantiate( + ctx sdk.Context, + codeID uint64, + creator, admin sdk.AccAddress, + initMsg []byte, + label string, + deposit sdk.Coins, + ) (sdk.AccAddress, []byte, error) + + // Instantiate2 creates an instance of a WASM contract using the predictable address generator + Instantiate2( + ctx sdk.Context, + codeID uint64, + creator, admin sdk.AccAddress, + initMsg []byte, + label string, + deposit sdk.Coins, + salt []byte, + fixMsg bool, + ) (sdk.AccAddress, []byte, error) // Execute executes the contract instance Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) ([]byte, error) diff --git a/x/wasm/types/keys.go b/x/wasm/types/keys.go index 9660360cb8..fb636ef4f3 100644 --- a/x/wasm/types/keys.go +++ b/x/wasm/types/keys.go @@ -32,7 +32,8 @@ var ( PinnedCodeIndexPrefix = []byte{0x07} TXCounterPrefix = []byte{0x08} - KeyLastCodeID = append(SequenceKeyPrefix, []byte("lastCodeId")...) + KeyLastCodeID = append(SequenceKeyPrefix, []byte("lastCodeId")...) + KeyLastInstanceID = append(SequenceKeyPrefix, []byte("lastContractId")...) ) // GetCodeKey constructs the key for retreiving the ID for the WASM code diff --git a/x/wasm/types/tx.go b/x/wasm/types/tx.go index 0c83018df0..9630777f29 100644 --- a/x/wasm/types/tx.go +++ b/x/wasm/types/tx.go @@ -306,3 +306,56 @@ func (msg MsgIBCCloseChannel) GetSignBytes() []byte { func (msg MsgIBCCloseChannel) GetSigners() []sdk.AccAddress { return nil } + +var _ sdk.Msg = &MsgInstantiateContract2{} + +func (msg MsgInstantiateContract2) Route() string { + return RouterKey +} + +func (msg MsgInstantiateContract2) Type() string { + return "instantiate2" +} + +func (msg MsgInstantiateContract2) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(msg.Sender); err != nil { + return sdkerrors.Wrap(err, "sender") + } + + if msg.CodeID == 0 { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "code id is required") + } + + if err := ValidateLabel(msg.Label); err != nil { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "label is required") + } + + if !msg.Funds.IsValid() { + return sdkerrors.ErrInvalidCoins + } + + if len(msg.Admin) != 0 { + if _, err := sdk.AccAddressFromBech32(msg.Admin); err != nil { + return sdkerrors.Wrap(err, "admin") + } + } + if err := msg.Msg.ValidateBasic(); err != nil { + return sdkerrors.Wrap(err, "payload msg") + } + if err := ValidateSalt(msg.Salt); err != nil { + return sdkerrors.Wrap(err, "salt") + } + return nil +} + +func (msg MsgInstantiateContract2) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgInstantiateContract2) GetSigners() []sdk.AccAddress { + senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { // should never happen as valid basic rejects invalid addresses + panic(err.Error()) + } + return []sdk.AccAddress{senderAddr} +} diff --git a/x/wasm/types/tx.pb.go b/x/wasm/types/tx.pb.go index 52d5098de4..cf90465b69 100644 --- a/x/wasm/types/tx.pb.go +++ b/x/wasm/types/tx.pb.go @@ -184,11 +184,71 @@ func (m *MsgInstantiateContract) XXX_DiscardUnknown() { var xxx_messageInfo_MsgInstantiateContract proto.InternalMessageInfo +// MsgInstantiateContract2 create a new smart contract instance for the given +// code id with a predicable address. +type MsgInstantiateContract2 struct { + // Sender is the that actor that signed the messages + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` + // Admin is an optional address that can execute migrations + Admin string `protobuf:"bytes,2,opt,name=admin,proto3" json:"admin,omitempty"` + // CodeID is the reference to the stored WASM code + CodeID uint64 `protobuf:"varint,3,opt,name=code_id,json=codeId,proto3" json:"code_id,omitempty"` + // Label is optional metadata to be stored with a contract instance. + Label string `protobuf:"bytes,4,opt,name=label,proto3" json:"label,omitempty"` + // Msg json encoded message to be passed to the contract on instantiation + Msg RawContractMessage `protobuf:"bytes,5,opt,name=msg,proto3,casttype=RawContractMessage" json:"msg,omitempty"` + // Funds coins that are transferred to the contract on instantiation + Funds github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,6,rep,name=funds,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"funds"` + // Salt is an arbitrary value provided by the sender. Size can be 1 to 64. + Salt []byte `protobuf:"bytes,7,opt,name=salt,proto3" json:"salt,omitempty"` + // FixMsg include the msg value into the hash for the predictable address. + // Default is false + FixMsg bool `protobuf:"varint,8,opt,name=fix_msg,json=fixMsg,proto3" json:"fix_msg,omitempty"` +} + +func (m *MsgInstantiateContract2) Reset() { *m = MsgInstantiateContract2{} } +func (m *MsgInstantiateContract2) String() string { return proto.CompactTextString(m) } +func (*MsgInstantiateContract2) ProtoMessage() {} +func (*MsgInstantiateContract2) Descriptor() ([]byte, []int) { + return fileDescriptor_4f74d82755520264, []int{3} +} + +func (m *MsgInstantiateContract2) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *MsgInstantiateContract2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgInstantiateContract2.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 *MsgInstantiateContract2) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgInstantiateContract2.Merge(m, src) +} + +func (m *MsgInstantiateContract2) XXX_Size() int { + return m.Size() +} + +func (m *MsgInstantiateContract2) XXX_DiscardUnknown() { + xxx_messageInfo_MsgInstantiateContract2.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgInstantiateContract2 proto.InternalMessageInfo + // MsgInstantiateContractResponse return instantiation result data type MsgInstantiateContractResponse struct { // Address is the bech32 address of the new contract instance. Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - // Data contains base64-encoded bytes to returned from the contract + // Data contains bytes to returned from the contract Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` } @@ -196,7 +256,7 @@ func (m *MsgInstantiateContractResponse) Reset() { *m = MsgInstantiateCo func (m *MsgInstantiateContractResponse) String() string { return proto.CompactTextString(m) } func (*MsgInstantiateContractResponse) ProtoMessage() {} func (*MsgInstantiateContractResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_4f74d82755520264, []int{3} + return fileDescriptor_4f74d82755520264, []int{4} } func (m *MsgInstantiateContractResponse) XXX_Unmarshal(b []byte) error { @@ -230,6 +290,52 @@ func (m *MsgInstantiateContractResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgInstantiateContractResponse proto.InternalMessageInfo +// MsgInstantiateContract2Response return instantiation result data +type MsgInstantiateContract2Response struct { + // Address is the bech32 address of the new contract instance. + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + // Data contains bytes to returned from the contract + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *MsgInstantiateContract2Response) Reset() { *m = MsgInstantiateContract2Response{} } +func (m *MsgInstantiateContract2Response) String() string { return proto.CompactTextString(m) } +func (*MsgInstantiateContract2Response) ProtoMessage() {} +func (*MsgInstantiateContract2Response) Descriptor() ([]byte, []int) { + return fileDescriptor_4f74d82755520264, []int{5} +} + +func (m *MsgInstantiateContract2Response) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} + +func (m *MsgInstantiateContract2Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgInstantiateContract2Response.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 *MsgInstantiateContract2Response) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgInstantiateContract2Response.Merge(m, src) +} + +func (m *MsgInstantiateContract2Response) XXX_Size() int { + return m.Size() +} + +func (m *MsgInstantiateContract2Response) XXX_DiscardUnknown() { + xxx_messageInfo_MsgInstantiateContract2Response.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgInstantiateContract2Response proto.InternalMessageInfo + // MsgExecuteContract submits the given message data to a smart contract type MsgExecuteContract struct { // Sender is the that actor that signed the messages @@ -246,7 +352,7 @@ func (m *MsgExecuteContract) Reset() { *m = MsgExecuteContract{} } func (m *MsgExecuteContract) String() string { return proto.CompactTextString(m) } func (*MsgExecuteContract) ProtoMessage() {} func (*MsgExecuteContract) Descriptor() ([]byte, []int) { - return fileDescriptor_4f74d82755520264, []int{4} + return fileDescriptor_4f74d82755520264, []int{6} } func (m *MsgExecuteContract) XXX_Unmarshal(b []byte) error { @@ -282,7 +388,7 @@ var xxx_messageInfo_MsgExecuteContract proto.InternalMessageInfo // MsgExecuteContractResponse returns execution result data. type MsgExecuteContractResponse struct { - // Data contains base64-encoded bytes to returned from the contract + // Data contains bytes to returned from the contract Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` } @@ -290,7 +396,7 @@ func (m *MsgExecuteContractResponse) Reset() { *m = MsgExecuteContractRe func (m *MsgExecuteContractResponse) String() string { return proto.CompactTextString(m) } func (*MsgExecuteContractResponse) ProtoMessage() {} func (*MsgExecuteContractResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_4f74d82755520264, []int{5} + return fileDescriptor_4f74d82755520264, []int{7} } func (m *MsgExecuteContractResponse) XXX_Unmarshal(b []byte) error { @@ -340,7 +446,7 @@ func (m *MsgMigrateContract) Reset() { *m = MsgMigrateContract{} } func (m *MsgMigrateContract) String() string { return proto.CompactTextString(m) } func (*MsgMigrateContract) ProtoMessage() {} func (*MsgMigrateContract) Descriptor() ([]byte, []int) { - return fileDescriptor_4f74d82755520264, []int{6} + return fileDescriptor_4f74d82755520264, []int{8} } func (m *MsgMigrateContract) XXX_Unmarshal(b []byte) error { @@ -385,7 +491,7 @@ func (m *MsgMigrateContractResponse) Reset() { *m = MsgMigrateContractRe func (m *MsgMigrateContractResponse) String() string { return proto.CompactTextString(m) } func (*MsgMigrateContractResponse) ProtoMessage() {} func (*MsgMigrateContractResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_4f74d82755520264, []int{7} + return fileDescriptor_4f74d82755520264, []int{9} } func (m *MsgMigrateContractResponse) XXX_Unmarshal(b []byte) error { @@ -433,7 +539,7 @@ func (m *MsgUpdateAdmin) Reset() { *m = MsgUpdateAdmin{} } func (m *MsgUpdateAdmin) String() string { return proto.CompactTextString(m) } func (*MsgUpdateAdmin) ProtoMessage() {} func (*MsgUpdateAdmin) Descriptor() ([]byte, []int) { - return fileDescriptor_4f74d82755520264, []int{8} + return fileDescriptor_4f74d82755520264, []int{10} } func (m *MsgUpdateAdmin) XXX_Unmarshal(b []byte) error { @@ -474,7 +580,7 @@ func (m *MsgUpdateAdminResponse) Reset() { *m = MsgUpdateAdminResponse{} func (m *MsgUpdateAdminResponse) String() string { return proto.CompactTextString(m) } func (*MsgUpdateAdminResponse) ProtoMessage() {} func (*MsgUpdateAdminResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_4f74d82755520264, []int{9} + return fileDescriptor_4f74d82755520264, []int{11} } func (m *MsgUpdateAdminResponse) XXX_Unmarshal(b []byte) error { @@ -520,7 +626,7 @@ func (m *MsgClearAdmin) Reset() { *m = MsgClearAdmin{} } func (m *MsgClearAdmin) String() string { return proto.CompactTextString(m) } func (*MsgClearAdmin) ProtoMessage() {} func (*MsgClearAdmin) Descriptor() ([]byte, []int) { - return fileDescriptor_4f74d82755520264, []int{10} + return fileDescriptor_4f74d82755520264, []int{12} } func (m *MsgClearAdmin) XXX_Unmarshal(b []byte) error { @@ -561,7 +667,7 @@ func (m *MsgClearAdminResponse) Reset() { *m = MsgClearAdminResponse{} } func (m *MsgClearAdminResponse) String() string { return proto.CompactTextString(m) } func (*MsgClearAdminResponse) ProtoMessage() {} func (*MsgClearAdminResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_4f74d82755520264, []int{11} + return fileDescriptor_4f74d82755520264, []int{13} } func (m *MsgClearAdminResponse) XXX_Unmarshal(b []byte) error { @@ -599,7 +705,9 @@ func init() { proto.RegisterType((*MsgStoreCode)(nil), "cosmwasm.wasm.v1.MsgStoreCode") proto.RegisterType((*MsgStoreCodeResponse)(nil), "cosmwasm.wasm.v1.MsgStoreCodeResponse") proto.RegisterType((*MsgInstantiateContract)(nil), "cosmwasm.wasm.v1.MsgInstantiateContract") + proto.RegisterType((*MsgInstantiateContract2)(nil), "cosmwasm.wasm.v1.MsgInstantiateContract2") proto.RegisterType((*MsgInstantiateContractResponse)(nil), "cosmwasm.wasm.v1.MsgInstantiateContractResponse") + proto.RegisterType((*MsgInstantiateContract2Response)(nil), "cosmwasm.wasm.v1.MsgInstantiateContract2Response") proto.RegisterType((*MsgExecuteContract)(nil), "cosmwasm.wasm.v1.MsgExecuteContract") proto.RegisterType((*MsgExecuteContractResponse)(nil), "cosmwasm.wasm.v1.MsgExecuteContractResponse") proto.RegisterType((*MsgMigrateContract)(nil), "cosmwasm.wasm.v1.MsgMigrateContract") @@ -613,55 +721,60 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/tx.proto", fileDescriptor_4f74d82755520264) } var fileDescriptor_4f74d82755520264 = []byte{ - // 766 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0xcb, 0x6e, 0xd3, 0x40, - 0x14, 0x8d, 0x1b, 0x27, 0x4d, 0x6e, 0x43, 0x89, 0x4c, 0x1a, 0x52, 0x83, 0x9c, 0x28, 0xa0, 0xe2, - 0x05, 0xd8, 0x4d, 0x91, 0xd8, 0x37, 0x29, 0x8b, 0x56, 0x32, 0x42, 0xae, 0x4a, 0x05, 0x9b, 0x68, - 0x62, 0x4f, 0x5d, 0xab, 0xb5, 0x27, 0x78, 0x9c, 0xa6, 0xfd, 0x09, 0xc4, 0x8e, 0x7f, 0xe0, 0x2f, - 0xd8, 0x75, 0x85, 0xba, 0x41, 0x62, 0x15, 0x20, 0xfd, 0x0b, 0x56, 0xc8, 0xcf, 0xba, 0xa9, 0x93, - 0x06, 0x21, 0x36, 0xce, 0xdc, 0x99, 0x73, 0x5f, 0x27, 0x67, 0xee, 0xc0, 0xaa, 0x46, 0xa8, 0x35, - 0x44, 0xd4, 0x92, 0xfd, 0xcf, 0x49, 0x4b, 0x76, 0x4f, 0xa5, 0xbe, 0x43, 0x5c, 0xc2, 0x95, 0xa3, - 0x23, 0xc9, 0xff, 0x9c, 0xb4, 0x78, 0xc1, 0xdb, 0x21, 0x54, 0xee, 0x21, 0x8a, 0xe5, 0x93, 0x56, - 0x0f, 0xbb, 0xa8, 0x25, 0x6b, 0xc4, 0xb4, 0x03, 0x0f, 0xbe, 0x62, 0x10, 0x83, 0xf8, 0x4b, 0xd9, - 0x5b, 0x85, 0xbb, 0x0f, 0x6f, 0xa6, 0x38, 0xeb, 0x63, 0x1a, 0x9c, 0x36, 0xbf, 0x30, 0x50, 0x52, - 0xa8, 0xb1, 0xeb, 0x12, 0x07, 0x77, 0x88, 0x8e, 0xb9, 0x2a, 0xe4, 0x29, 0xb6, 0x75, 0xec, 0xd4, - 0x98, 0x06, 0x23, 0x16, 0xd5, 0xd0, 0xe2, 0x5e, 0xc0, 0xb2, 0xe7, 0xdf, 0xed, 0x9d, 0xb9, 0xb8, - 0xab, 0x11, 0x1d, 0xd7, 0x16, 0x1a, 0x8c, 0x58, 0x6a, 0x97, 0xc7, 0xa3, 0x7a, 0x69, 0x7f, 0x73, - 0x57, 0x69, 0x9f, 0xb9, 0x7e, 0x04, 0xb5, 0xe4, 0xe1, 0x22, 0x8b, 0xdb, 0x83, 0xaa, 0x69, 0x53, - 0x17, 0xd9, 0xae, 0x89, 0x5c, 0xdc, 0xed, 0x63, 0xc7, 0x32, 0x29, 0x35, 0x89, 0x5d, 0xcb, 0x35, - 0x18, 0x71, 0x69, 0x43, 0x90, 0x26, 0xfb, 0x94, 0x36, 0x35, 0x0d, 0x53, 0xda, 0x21, 0xf6, 0x81, - 0x69, 0xa8, 0x2b, 0x09, 0xef, 0xd7, 0xb1, 0xf3, 0x0e, 0x5b, 0xc8, 0x96, 0xd9, 0x1d, 0xb6, 0xc0, - 0x96, 0x73, 0xcd, 0x7d, 0xa8, 0x24, 0x5b, 0x50, 0x31, 0xed, 0x13, 0x9b, 0x62, 0xee, 0x11, 0x2c, - 0x7a, 0x85, 0x76, 0x4d, 0xdd, 0xef, 0x85, 0x6d, 0xc3, 0x78, 0x54, 0xcf, 0x7b, 0x90, 0xed, 0x2d, - 0x35, 0xef, 0x1d, 0x6d, 0xeb, 0x1c, 0x0f, 0x05, 0xed, 0x10, 0x6b, 0x47, 0x74, 0x60, 0x05, 0x1d, - 0xa9, 0xb1, 0xdd, 0xfc, 0xb0, 0x00, 0x55, 0x85, 0x1a, 0xdb, 0x57, 0x15, 0x74, 0x88, 0xed, 0x3a, - 0x48, 0x73, 0xa7, 0xd2, 0x54, 0x81, 0x1c, 0xd2, 0x2d, 0xd3, 0xf6, 0x63, 0x15, 0xd5, 0xc0, 0x48, - 0x56, 0x92, 0x9d, 0x5a, 0x49, 0x05, 0x72, 0xc7, 0xa8, 0x87, 0x8f, 0x6b, 0x6c, 0xe0, 0xea, 0x1b, - 0x9c, 0x08, 0x59, 0x8b, 0x1a, 0x3e, 0x59, 0xa5, 0x76, 0xf5, 0xf7, 0xa8, 0xce, 0xa9, 0x68, 0x18, - 0x95, 0xa1, 0x60, 0x4a, 0x91, 0x81, 0x55, 0x0f, 0xc2, 0x21, 0xc8, 0x1d, 0x0c, 0x6c, 0x9d, 0xd6, - 0xf2, 0x8d, 0xac, 0xb8, 0xb4, 0xb1, 0x2a, 0x05, 0x72, 0x91, 0x3c, 0xb9, 0x48, 0xa1, 0x5c, 0xa4, - 0x0e, 0x31, 0xed, 0xf6, 0xfa, 0xf9, 0xa8, 0x9e, 0xf9, 0xfc, 0xa3, 0x2e, 0x1a, 0xa6, 0x7b, 0x38, - 0xe8, 0x49, 0x1a, 0xb1, 0xe4, 0x50, 0x5b, 0xc1, 0xcf, 0x33, 0xaa, 0x1f, 0x85, 0x32, 0xf1, 0x1c, - 0xa8, 0x1a, 0x44, 0x6e, 0xbe, 0x02, 0x21, 0x9d, 0x8f, 0x98, 0xf3, 0x1a, 0x2c, 0x22, 0x5d, 0x77, - 0x30, 0xa5, 0x21, 0x31, 0x91, 0xc9, 0x71, 0xc0, 0xea, 0xc8, 0x45, 0x21, 0xc9, 0xfe, 0xba, 0xf9, - 0x8d, 0x01, 0x4e, 0xa1, 0xc6, 0xcb, 0x53, 0xac, 0x0d, 0xe6, 0x20, 0xd7, 0xfb, 0xaf, 0x42, 0x4c, - 0xc8, 0x6f, 0x6c, 0x47, 0x3c, 0x65, 0xff, 0x82, 0xa7, 0xdc, 0x7f, 0xe3, 0x69, 0x1d, 0xf8, 0x9b, - 0x6d, 0xc5, 0x1c, 0x45, 0x4c, 0x30, 0x09, 0x26, 0x3e, 0x05, 0x4c, 0x28, 0xa6, 0xe1, 0xa0, 0x7f, - 0x64, 0x62, 0x2e, 0xb1, 0x85, 0x74, 0xb1, 0xb7, 0xd2, 0x15, 0xf6, 0x32, 0x51, 0xd8, 0xcc, 0x5e, - 0x10, 0x2c, 0x2b, 0xd4, 0xd8, 0xeb, 0xeb, 0xc8, 0xc5, 0x9b, 0xbe, 0xfe, 0xa7, 0xb5, 0xf1, 0x00, - 0x8a, 0x36, 0x1e, 0x76, 0x93, 0x37, 0xa6, 0x60, 0xe3, 0x61, 0xe0, 0x94, 0xec, 0x31, 0x7b, 0xbd, - 0xc7, 0x66, 0xcd, 0xbf, 0x98, 0x89, 0x14, 0x51, 0x41, 0xcd, 0x0e, 0xdc, 0x51, 0xa8, 0xd1, 0x39, - 0xc6, 0xc8, 0x99, 0x9d, 0x7b, 0x56, 0xf8, 0xfb, 0xb0, 0x72, 0x2d, 0x48, 0x14, 0x7d, 0xe3, 0x2b, - 0x0b, 0x59, 0x85, 0x1a, 0xdc, 0x2e, 0x14, 0xaf, 0x46, 0x66, 0xca, 0x08, 0x4b, 0xce, 0x23, 0x7e, - 0x6d, 0xf6, 0x79, 0xcc, 0xe5, 0x7b, 0xb8, 0x97, 0x36, 0x6a, 0xc4, 0x54, 0xf7, 0x14, 0x24, 0xbf, - 0x3e, 0x2f, 0x32, 0x4e, 0x89, 0xe1, 0xee, 0xe4, 0xe5, 0x7b, 0x9c, 0x1a, 0x64, 0x02, 0xc5, 0x3f, - 0x9d, 0x07, 0x95, 0x4c, 0x33, 0xa9, 0xec, 0xf4, 0x34, 0x13, 0xa8, 0x29, 0x69, 0xa6, 0x89, 0xf1, - 0x2d, 0x2c, 0x25, 0x55, 0xd7, 0x48, 0x75, 0x4e, 0x20, 0x78, 0xf1, 0x36, 0x44, 0x1c, 0xfa, 0x0d, - 0x40, 0x42, 0x53, 0xf5, 0x54, 0xbf, 0x2b, 0x00, 0xff, 0xe4, 0x16, 0x40, 0x14, 0xb7, 0xbd, 0x75, - 0xfe, 0x4b, 0xc8, 0x9c, 0x8f, 0x05, 0xe6, 0x62, 0x2c, 0x30, 0x3f, 0xc7, 0x02, 0xf3, 0xf1, 0x52, - 0xc8, 0x5c, 0x5c, 0x0a, 0x99, 0xef, 0x97, 0x42, 0xe6, 0xdd, 0x5a, 0x62, 0xf0, 0x74, 0x08, 0xb5, - 0xf6, 0xa3, 0x67, 0x5c, 0x97, 0x4f, 0x83, 0xe7, 0xdc, 0x1f, 0x3e, 0xbd, 0xbc, 0xff, 0x98, 0x3f, - 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xef, 0x6b, 0xa0, 0xa3, 0x4f, 0x08, 0x00, 0x00, + // 840 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x56, 0x4d, 0x6f, 0xe3, 0x44, + 0x18, 0x8e, 0x1b, 0xe7, 0xeb, 0x6d, 0x58, 0x22, 0x93, 0x4d, 0xbd, 0x06, 0x39, 0x91, 0x41, 0x8b, + 0x91, 0xc0, 0x6e, 0x82, 0xc4, 0xbd, 0xc9, 0x72, 0xe8, 0x4a, 0x06, 0xe4, 0x6a, 0xa9, 0xe0, 0x12, + 0x4d, 0xec, 0x89, 0xd7, 0xda, 0xd8, 0x13, 0x3c, 0x93, 0x26, 0xfd, 0x13, 0x88, 0x1b, 0xff, 0x81, + 0xdf, 0xc0, 0x05, 0x89, 0x43, 0x8f, 0x7b, 0x41, 0xe2, 0x14, 0x20, 0xfd, 0x17, 0x9c, 0x90, 0x3f, + 0xeb, 0xcd, 0x3a, 0x69, 0x00, 0x71, 0xe2, 0x92, 0xcc, 0xeb, 0x79, 0xde, 0xaf, 0x67, 0x9e, 0x77, + 0x6c, 0x78, 0x64, 0x11, 0xea, 0x2d, 0x11, 0xf5, 0xf4, 0xe8, 0xe7, 0xaa, 0xaf, 0xb3, 0x95, 0x36, + 0x0f, 0x08, 0x23, 0x42, 0x2b, 0xdd, 0xd2, 0xa2, 0x9f, 0xab, 0xbe, 0x24, 0x87, 0x4f, 0x08, 0xd5, + 0x27, 0x88, 0x62, 0xfd, 0xaa, 0x3f, 0xc1, 0x0c, 0xf5, 0x75, 0x8b, 0xb8, 0x7e, 0xec, 0x21, 0xb5, + 0x1d, 0xe2, 0x90, 0x68, 0xa9, 0x87, 0xab, 0xe4, 0xe9, 0x3b, 0xaf, 0xa7, 0xb8, 0x9e, 0x63, 0x1a, + 0xef, 0x2a, 0x3f, 0x71, 0xd0, 0x34, 0xa8, 0x73, 0xc1, 0x48, 0x80, 0x47, 0xc4, 0xc6, 0x42, 0x07, + 0xaa, 0x14, 0xfb, 0x36, 0x0e, 0x44, 0xae, 0xc7, 0xa9, 0x0d, 0x33, 0xb1, 0x84, 0x4f, 0xe0, 0x41, + 0xe8, 0x3f, 0x9e, 0x5c, 0x33, 0x3c, 0xb6, 0x88, 0x8d, 0xc5, 0xa3, 0x1e, 0xa7, 0x36, 0x87, 0xad, + 0xcd, 0xba, 0xdb, 0xbc, 0x3c, 0xbb, 0x30, 0x86, 0xd7, 0x2c, 0x8a, 0x60, 0x36, 0x43, 0x5c, 0x6a, + 0x09, 0xcf, 0xa0, 0xe3, 0xfa, 0x94, 0x21, 0x9f, 0xb9, 0x88, 0xe1, 0xf1, 0x1c, 0x07, 0x9e, 0x4b, + 0xa9, 0x4b, 0x7c, 0xb1, 0xd2, 0xe3, 0xd4, 0xe3, 0x81, 0xac, 0x6d, 0xf7, 0xa9, 0x9d, 0x59, 0x16, + 0xa6, 0x74, 0x44, 0xfc, 0xa9, 0xeb, 0x98, 0x0f, 0x73, 0xde, 0x5f, 0x64, 0xce, 0x4f, 0xf9, 0x7a, + 0xb9, 0xc5, 0x3f, 0xe5, 0xeb, 0x7c, 0xab, 0xa2, 0x5c, 0x42, 0x3b, 0xdf, 0x82, 0x89, 0xe9, 0x9c, + 0xf8, 0x14, 0x0b, 0xef, 0x42, 0x2d, 0x2c, 0x74, 0xec, 0xda, 0x51, 0x2f, 0xfc, 0x10, 0x36, 0xeb, + 0x6e, 0x35, 0x84, 0x9c, 0x3f, 0x31, 0xab, 0xe1, 0xd6, 0xb9, 0x2d, 0x48, 0x50, 0xb7, 0x9e, 0x63, + 0xeb, 0x05, 0x5d, 0x78, 0x71, 0x47, 0x66, 0x66, 0x2b, 0xdf, 0x1e, 0x41, 0xc7, 0xa0, 0xce, 0xf9, + 0x5d, 0x05, 0x23, 0xe2, 0xb3, 0x00, 0x59, 0x6c, 0x27, 0x4d, 0x6d, 0xa8, 0x20, 0xdb, 0x73, 0xfd, + 0x28, 0x56, 0xc3, 0x8c, 0x8d, 0x7c, 0x25, 0xe5, 0x9d, 0x95, 0xb4, 0xa1, 0x32, 0x43, 0x13, 0x3c, + 0x13, 0xf9, 0xd8, 0x35, 0x32, 0x04, 0x15, 0xca, 0x1e, 0x75, 0x22, 0xb2, 0x9a, 0xc3, 0xce, 0x9f, + 0xeb, 0xae, 0x60, 0xa2, 0x65, 0x5a, 0x86, 0x81, 0x29, 0x45, 0x0e, 0x36, 0x43, 0x88, 0x80, 0xa0, + 0x32, 0x5d, 0xf8, 0x36, 0x15, 0xab, 0xbd, 0xb2, 0x7a, 0x3c, 0x78, 0xa4, 0xc5, 0x72, 0xd1, 0x42, + 0xb9, 0x68, 0x89, 0x5c, 0xb4, 0x11, 0x71, 0xfd, 0xe1, 0xe9, 0xcd, 0xba, 0x5b, 0xfa, 0xe1, 0xb7, + 0xae, 0xea, 0xb8, 0xec, 0xf9, 0x62, 0xa2, 0x59, 0xc4, 0xd3, 0x13, 0x6d, 0xc5, 0x7f, 0x1f, 0x51, + 0xfb, 0x45, 0x22, 0x93, 0xd0, 0x81, 0x9a, 0x71, 0x64, 0xe5, 0xc7, 0x23, 0x38, 0x29, 0x26, 0x64, + 0xf0, 0xff, 0x64, 0x44, 0x10, 0x80, 0xa7, 0x68, 0xc6, 0xc4, 0x5a, 0x24, 0x9d, 0x68, 0x2d, 0x9c, + 0x40, 0x6d, 0xea, 0xae, 0xc6, 0x61, 0x91, 0xf5, 0x1e, 0xa7, 0xd6, 0xcd, 0xea, 0xd4, 0x5d, 0x19, + 0xd4, 0x51, 0x3e, 0x03, 0xb9, 0x98, 0xbd, 0x4c, 0xb2, 0x22, 0xd4, 0x90, 0x6d, 0x07, 0x98, 0xd2, + 0x84, 0xc5, 0xd4, 0x0c, 0x13, 0xd9, 0x88, 0xa1, 0x44, 0xa3, 0xd1, 0x5a, 0xf9, 0x1c, 0xba, 0x3b, + 0x4e, 0xe3, 0x1f, 0x06, 0xfc, 0x85, 0x03, 0xc1, 0xa0, 0xce, 0xa7, 0x2b, 0x6c, 0x2d, 0x0e, 0x10, + 0x7b, 0x38, 0x3b, 0x09, 0x26, 0x39, 0xdd, 0xcc, 0x4e, 0x4f, 0xa9, 0xfc, 0x37, 0x4e, 0xa9, 0xf2, + 0x9f, 0xe9, 0xf6, 0x14, 0xa4, 0xd7, 0xdb, 0xca, 0x38, 0x4a, 0x99, 0xe0, 0x72, 0x4c, 0x7c, 0x1f, + 0x33, 0x61, 0xb8, 0x4e, 0x80, 0xfe, 0x25, 0x13, 0x07, 0x49, 0x3d, 0xa1, 0x8b, 0xbf, 0x97, 0xae, + 0xa4, 0x97, 0xad, 0xc2, 0xf6, 0xf6, 0x82, 0xe0, 0x81, 0x41, 0x9d, 0x67, 0x73, 0x1b, 0x31, 0x7c, + 0x16, 0x4d, 0xdf, 0xae, 0x36, 0xde, 0x86, 0x86, 0x8f, 0x97, 0xe3, 0xfc, 0xbc, 0xd6, 0x7d, 0xbc, + 0x8c, 0x9d, 0xf2, 0x3d, 0x96, 0x5f, 0xed, 0x51, 0x11, 0xa3, 0x8b, 0x32, 0x97, 0x22, 0x2d, 0x48, + 0x19, 0xc1, 0x1b, 0x06, 0x75, 0x46, 0x33, 0x8c, 0x82, 0xfd, 0xb9, 0xf7, 0x85, 0x3f, 0x81, 0x87, + 0xaf, 0x04, 0x49, 0xa3, 0x0f, 0x7e, 0xae, 0x40, 0xd9, 0xa0, 0x8e, 0x70, 0x01, 0x8d, 0xbb, 0x57, + 0x58, 0xc1, 0x2b, 0x25, 0xff, 0x7e, 0x90, 0x1e, 0xef, 0xdf, 0xcf, 0xb8, 0xfc, 0x06, 0xde, 0x2a, + 0xba, 0xfa, 0xd5, 0x42, 0xf7, 0x02, 0xa4, 0x74, 0x7a, 0x28, 0x32, 0x4b, 0xc9, 0xa0, 0x5d, 0x78, + 0xb9, 0x7e, 0x70, 0x68, 0xa4, 0x81, 0xd4, 0x3f, 0x18, 0x9a, 0x65, 0xc5, 0xf0, 0xe6, 0xf6, 0xc8, + 0xbf, 0x57, 0x18, 0x65, 0x0b, 0x25, 0x7d, 0x78, 0x08, 0x2a, 0x9f, 0x66, 0x7b, 0x9e, 0x8a, 0xd3, + 0x6c, 0xa1, 0x76, 0xa4, 0xd9, 0x35, 0x02, 0x5f, 0xc1, 0x71, 0x5e, 0xeb, 0xbd, 0x42, 0xe7, 0x1c, + 0x42, 0x52, 0xef, 0x43, 0x64, 0xa1, 0xbf, 0x04, 0xc8, 0x29, 0xb9, 0x5b, 0xe8, 0x77, 0x07, 0x90, + 0xde, 0xbf, 0x07, 0x90, 0xc6, 0x1d, 0x3e, 0xb9, 0xf9, 0x43, 0x2e, 0xdd, 0x6c, 0x64, 0xee, 0xe5, + 0x46, 0xe6, 0x7e, 0xdf, 0xc8, 0xdc, 0x77, 0xb7, 0x72, 0xe9, 0xe5, 0xad, 0x5c, 0xfa, 0xf5, 0x56, + 0x2e, 0x7d, 0xfd, 0x38, 0x77, 0xdd, 0x8d, 0x08, 0xf5, 0x2e, 0xd3, 0x8f, 0x39, 0x5b, 0x5f, 0xc5, + 0x1f, 0x75, 0xd1, 0x95, 0x37, 0xa9, 0x46, 0x9f, 0x74, 0x1f, 0xff, 0x15, 0x00, 0x00, 0xff, 0xff, + 0x1a, 0x2c, 0xa2, 0xcd, 0x55, 0x0a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -678,8 +791,12 @@ const _ = grpc.SupportPackageIsVersion4 type MsgClient interface { // StoreCode to submit Wasm code to the system StoreCode(ctx context.Context, in *MsgStoreCode, opts ...grpc.CallOption) (*MsgStoreCodeResponse, error) - // Instantiate creates a new smart contract instance for the given code id. + // InstantiateContract creates a new smart contract instance for the given + // code id. InstantiateContract(ctx context.Context, in *MsgInstantiateContract, opts ...grpc.CallOption) (*MsgInstantiateContractResponse, error) + // InstantiateContract2 creates a new smart contract instance for the given + // code id with a predictable address + InstantiateContract2(ctx context.Context, in *MsgInstantiateContract2, opts ...grpc.CallOption) (*MsgInstantiateContract2Response, error) // Execute submits the given message data to a smart contract ExecuteContract(ctx context.Context, in *MsgExecuteContract, opts ...grpc.CallOption) (*MsgExecuteContractResponse, error) // Migrate runs a code upgrade/ downgrade for a smart contract @@ -716,6 +833,15 @@ func (c *msgClient) InstantiateContract(ctx context.Context, in *MsgInstantiateC return out, nil } +func (c *msgClient) InstantiateContract2(ctx context.Context, in *MsgInstantiateContract2, opts ...grpc.CallOption) (*MsgInstantiateContract2Response, error) { + out := new(MsgInstantiateContract2Response) + err := c.cc.Invoke(ctx, "/cosmwasm.wasm.v1.Msg/InstantiateContract2", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *msgClient) ExecuteContract(ctx context.Context, in *MsgExecuteContract, opts ...grpc.CallOption) (*MsgExecuteContractResponse, error) { out := new(MsgExecuteContractResponse) err := c.cc.Invoke(ctx, "/cosmwasm.wasm.v1.Msg/ExecuteContract", in, out, opts...) @@ -756,8 +882,12 @@ func (c *msgClient) ClearAdmin(ctx context.Context, in *MsgClearAdmin, opts ...g type MsgServer interface { // StoreCode to submit Wasm code to the system StoreCode(context.Context, *MsgStoreCode) (*MsgStoreCodeResponse, error) - // Instantiate creates a new smart contract instance for the given code id. + // InstantiateContract creates a new smart contract instance for the given + // code id. InstantiateContract(context.Context, *MsgInstantiateContract) (*MsgInstantiateContractResponse, error) + // InstantiateContract2 creates a new smart contract instance for the given + // code id with a predictable address + InstantiateContract2(context.Context, *MsgInstantiateContract2) (*MsgInstantiateContract2Response, error) // Execute submits the given message data to a smart contract ExecuteContract(context.Context, *MsgExecuteContract) (*MsgExecuteContractResponse, error) // Migrate runs a code upgrade/ downgrade for a smart contract @@ -779,6 +909,10 @@ func (*UnimplementedMsgServer) InstantiateContract(ctx context.Context, req *Msg return nil, status.Errorf(codes.Unimplemented, "method InstantiateContract not implemented") } +func (*UnimplementedMsgServer) InstantiateContract2(ctx context.Context, req *MsgInstantiateContract2) (*MsgInstantiateContract2Response, error) { + return nil, status.Errorf(codes.Unimplemented, "method InstantiateContract2 not implemented") +} + func (*UnimplementedMsgServer) ExecuteContract(ctx context.Context, req *MsgExecuteContract) (*MsgExecuteContractResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ExecuteContract not implemented") } @@ -835,6 +969,24 @@ func _Msg_InstantiateContract_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Msg_InstantiateContract2_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgInstantiateContract2) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).InstantiateContract2(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosmwasm.wasm.v1.Msg/InstantiateContract2", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).InstantiateContract2(ctx, req.(*MsgInstantiateContract2)) + } + return interceptor(ctx, in, info, handler) +} + func _Msg_ExecuteContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MsgExecuteContract) if err := dec(in); err != nil { @@ -919,6 +1071,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "InstantiateContract", Handler: _Msg_InstantiateContract_Handler, }, + { + MethodName: "InstantiateContract2", + Handler: _Msg_InstantiateContract2_Handler, + }, { MethodName: "ExecuteContract", Handler: _Msg_ExecuteContract_Handler, @@ -1094,6 +1250,93 @@ func (m *MsgInstantiateContract) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *MsgInstantiateContract2) 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 *MsgInstantiateContract2) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgInstantiateContract2) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.FixMsg { + i-- + if m.FixMsg { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } + if len(m.Salt) > 0 { + i -= len(m.Salt) + copy(dAtA[i:], m.Salt) + i = encodeVarintTx(dAtA, i, uint64(len(m.Salt))) + i-- + dAtA[i] = 0x3a + } + if len(m.Funds) > 0 { + for iNdEx := len(m.Funds) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Funds[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if len(m.Msg) > 0 { + i -= len(m.Msg) + copy(dAtA[i:], m.Msg) + i = encodeVarintTx(dAtA, i, uint64(len(m.Msg))) + i-- + dAtA[i] = 0x2a + } + if len(m.Label) > 0 { + i -= len(m.Label) + copy(dAtA[i:], m.Label) + i = encodeVarintTx(dAtA, i, uint64(len(m.Label))) + i-- + dAtA[i] = 0x22 + } + if m.CodeID != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.CodeID)) + i-- + dAtA[i] = 0x18 + } + if len(m.Admin) > 0 { + i -= len(m.Admin) + copy(dAtA[i:], m.Admin) + i = encodeVarintTx(dAtA, i, uint64(len(m.Admin))) + i-- + dAtA[i] = 0x12 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *MsgInstantiateContractResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1131,6 +1374,43 @@ func (m *MsgInstantiateContractResponse) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *MsgInstantiateContract2Response) 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 *MsgInstantiateContract2Response) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgInstantiateContract2Response) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTx(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x12 + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTx(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *MsgExecuteContract) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1508,34 +1788,24 @@ func (m *MsgInstantiateContract) Size() (n int) { return n } -func (m *MsgInstantiateContractResponse) Size() (n int) { +func (m *MsgInstantiateContract2) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Address) + l = len(m.Sender) if l > 0 { n += 1 + l + sovTx(uint64(l)) } - l = len(m.Data) + l = len(m.Admin) if l > 0 { n += 1 + l + sovTx(uint64(l)) } - return n -} - -func (m *MsgExecuteContract) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) + if m.CodeID != 0 { + n += 1 + sovTx(uint64(m.CodeID)) } - l = len(m.Contract) + l = len(m.Label) if l > 0 { n += 1 + l + sovTx(uint64(l)) } @@ -1549,15 +1819,26 @@ func (m *MsgExecuteContract) Size() (n int) { n += 1 + l + sovTx(uint64(l)) } } + l = len(m.Salt) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.FixMsg { + n += 2 + } return n } -func (m *MsgExecuteContractResponse) Size() (n int) { +func (m *MsgInstantiateContractResponse) Size() (n int) { if m == nil { return 0 } var l int _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } l = len(m.Data) if l > 0 { n += 1 + l + sovTx(uint64(l)) @@ -1565,25 +1846,82 @@ func (m *MsgExecuteContractResponse) Size() (n int) { return n } -func (m *MsgMigrateContract) Size() (n int) { +func (m *MsgInstantiateContract2Response) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Sender) + l = len(m.Address) if l > 0 { n += 1 + l + sovTx(uint64(l)) } - l = len(m.Contract) + l = len(m.Data) if l > 0 { n += 1 + l + sovTx(uint64(l)) } - if m.CodeID != 0 { - n += 1 + sovTx(uint64(m.CodeID)) - } - l = len(m.Msg) - if l > 0 { + return n +} + +func (m *MsgExecuteContract) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Contract) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Msg) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Funds) > 0 { + for _, e := range m.Funds { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgExecuteContractResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgMigrateContract) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Contract) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.CodeID != 0 { + n += 1 + sovTx(uint64(m.CodeID)) + } + l = len(m.Msg) + if l > 0 { n += 1 + l + sovTx(uint64(l)) } return n @@ -2157,6 +2495,294 @@ func (m *MsgInstantiateContract) Unmarshal(dAtA []byte) error { return nil } +func (m *MsgInstantiateContract2) 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 ErrIntOverflowTx + } + 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: MsgInstantiateContract2: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgInstantiateContract2: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Admin", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Admin = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CodeID", wireType) + } + m.CodeID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CodeID |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Label", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Label = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Msg = append(m.Msg[:0], dAtA[iNdEx:postIndex]...) + if m.Msg == nil { + m.Msg = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Funds", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Funds = append(m.Funds, types.Coin{}) + if err := m.Funds[len(m.Funds)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Salt", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Salt = append(m.Salt[:0], dAtA[iNdEx:postIndex]...) + if m.Salt == nil { + m.Salt = []byte{} + } + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FixMsg", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.FixMsg = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} + func (m *MsgInstantiateContractResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2274,6 +2900,123 @@ func (m *MsgInstantiateContractResponse) Unmarshal(dAtA []byte) error { return nil } +func (m *MsgInstantiateContract2Response) 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 ErrIntOverflowTx + } + 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: MsgInstantiateContract2Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgInstantiateContract2Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} + func (m *MsgExecuteContract) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/wasm/types/tx_test.go b/x/wasm/types/tx_test.go index b59ad7ce40..a3c29b4f8b 100644 --- a/x/wasm/types/tx_test.go +++ b/x/wasm/types/tx_test.go @@ -186,6 +186,142 @@ func TestInstantiateContractValidation(t *testing.T) { } } +func TestInstantiateContract2Validation(t *testing.T) { + bad, err := sdk.AccAddressFromHex("012345") + require.NoError(t, err) + badAddress := bad.String() + // proper address size + goodAddress := sdk.AccAddress(make([]byte, 20)).String() + sdk.GetConfig().SetAddressVerifier(VerifyAddressLen()) + + cases := map[string]struct { + msg MsgInstantiateContract2 + valid bool + }{ + "empty": { + msg: MsgInstantiateContract2{}, + valid: false, + }, + "correct minimal": { + msg: MsgInstantiateContract2{ + Sender: goodAddress, + CodeID: firstCodeID, + Label: "foo", + Msg: []byte("{}"), + Salt: []byte{0}, + }, + valid: true, + }, + "missing code": { + msg: MsgInstantiateContract2{ + Sender: goodAddress, + Label: "foo", + Msg: []byte("{}"), + Salt: []byte{0}, + }, + valid: false, + }, + "missing label": { + msg: MsgInstantiateContract2{ + Sender: goodAddress, + Msg: []byte("{}"), + Salt: []byte{0}, + }, + valid: false, + }, + "label too long": { + msg: MsgInstantiateContract2{ + Sender: goodAddress, + Label: strings.Repeat("food", 33), + Salt: []byte{0}, + }, + valid: false, + }, + "bad sender minimal": { + msg: MsgInstantiateContract2{ + Sender: badAddress, + CodeID: firstCodeID, + Label: "foo", + Msg: []byte("{}"), + Salt: []byte{0}, + }, + valid: false, + }, + "correct maximal": { + msg: MsgInstantiateContract2{ + Sender: goodAddress, + CodeID: firstCodeID, + Label: strings.Repeat("a", MaxLabelSize), + Msg: []byte(`{"some": "data"}`), + Funds: sdk.Coins{sdk.Coin{Denom: "foobar", Amount: sdk.NewInt(200)}}, + Salt: bytes.Repeat([]byte{0}, MaxSaltSize), + FixMsg: true, + }, + valid: true, + }, + "negative funds": { + msg: MsgInstantiateContract2{ + Sender: goodAddress, + CodeID: firstCodeID, + Label: "foo", + Msg: []byte(`{"some": "data"}`), + // we cannot use sdk.NewCoin() constructors as they panic on creating invalid data (before we can test) + Funds: sdk.Coins{sdk.Coin{Denom: "foobar", Amount: sdk.NewInt(-200)}}, + Salt: []byte{0}, + }, + valid: false, + }, + "non json init msg": { + msg: MsgInstantiateContract2{ + Sender: goodAddress, + CodeID: firstCodeID, + Label: "foo", + Msg: []byte("invalid-json"), + Salt: []byte{0}, + }, + valid: false, + }, + "empty init msg": { + msg: MsgInstantiateContract2{ + Sender: goodAddress, + CodeID: firstCodeID, + Label: "foo", + Salt: []byte{0}, + }, + valid: false, + }, + "empty salt": { + msg: MsgInstantiateContract2{ + Sender: goodAddress, + CodeID: firstCodeID, + Label: "foo", + Msg: []byte(`{"some": "data"}`), + }, + valid: false, + }, + "salt too long": { + msg: MsgInstantiateContract2{ + Sender: goodAddress, + CodeID: firstCodeID, + Label: "foo", + Msg: []byte(`{"some": "data"}`), + Salt: bytes.Repeat([]byte{0}, 65), + }, + valid: false, + }, + } + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + err := tc.msg.ValidateBasic() + if tc.valid { + assert.NoError(t, err) + } else { + assert.Error(t, err) + } + }) + } +} + func TestExecuteContractValidation(t *testing.T) { bad, err := sdk.AccAddressFromHex("012345") require.NoError(t, err) diff --git a/x/wasm/types/validation.go b/x/wasm/types/validation.go index 0619c7f082..908c525524 100644 --- a/x/wasm/types/validation.go +++ b/x/wasm/types/validation.go @@ -4,8 +4,11 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) +// MaxSaltSize is the longest salt that can be used when instantiating a contract +const MaxSaltSize = 64 + var ( - // MaxLabelSize is the longest label that can be used when Instantiating a contract + // MaxLabelSize is the longest label that can be used when instantiating a contract MaxLabelSize = 128 // extension point for chains to customize via compile flag. // MaxWasmSize is the largest a compiled contract code can be when storing code on chain @@ -28,7 +31,18 @@ func ValidateLabel(label string) error { return sdkerrors.Wrap(ErrEmpty, "is required") } if len(label) > MaxLabelSize { - return sdkerrors.Wrap(ErrLimit, "cannot be longer than 128 characters") + return ErrLimit.Wrapf("cannot be longer than %d characters", MaxLabelSize) + } + return nil +} + +// ValidateSalt ensure salt constraints +func ValidateSalt(salt []byte) error { + switch n := len(salt); { + case n == 0: + return sdkerrors.Wrap(ErrEmpty, "is required") + case n > MaxSaltSize: + return ErrLimit.Wrapf("cannot be longer than %d characters", MaxSaltSize) } return nil } From a76999a1d7c3ed3570a5f319940667a5e5b61eaf Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Thu, 22 Sep 2022 18:23:06 +0200 Subject: [PATCH 81/94] Changelog for v0.29.0-rc1 (#1018) * Update changelog * Update CHANGELOG.md Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> --- CHANGELOG.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52676a23a5..176b032eed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,19 @@ ## [Unreleased](https://github.com/CosmWasm/wasmd/tree/HEAD) +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.29.0...HEAD) + +## [v0.29.0-rc1](https://github.com/CosmWasm/wasmd/tree/v0.29.0-rc1) (2022-09-22) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.28.0...v0.29.0-rc1) + - Allow AccessConfig to use a list of addresses instead of just a single address [\#945](https://github.com/CosmWasm/wasmd/issues/945) - Make contract addresses predictable \("deterministic"\) [\#942](https://github.com/CosmWasm/wasmd/issues/942) - Add query for the total supply of a coin [\#903](https://github.com/CosmWasm/wasmd/pull/903) ([larry0x](https://github.com/larry0x)) - Upgrade go to v1.18 [\#866]https://github.com/CosmWasm/wasmd/pull/866/) ([faddat](https://github.com/faddat)) -- Upgrade to ibc-go v3.2.0 REQUIRES [MIGRATION](https://github.com/cosmos/ibc-go/blob/v3.2.0/docs/migrations/support-denoms-with-slashes.md) [\#937](https://github.com/CosmWasm/wasmd/pull/937) ([faddat](https://github.com/faddat)) +- Upgrade to ibc-go v3.3.0 REQUIRES [MIGRATION](https://github.com/cosmos/ibc-go/blob/v3.2.3/docs/migrations/support-denoms-with-slashes.md) [\#1016](https://github.com/CosmWasm/wasmd/pull/1016) - Upgrade to cosmos-sdk v0.45.8 [\#964](https://github.com/CosmWasm/wasmd/pull/964/) ([faddat](https://github.com/faddat)) -- Upgrade wasmvm to v1.1.0 [\#984](https://github.com/CosmWasm/wasmd/pull/984), see [wasmvm v1.1.0](https://github.com/CosmWasm/wasmvm/releases/tag/v1.1.0) +- Upgrade wasmvm to v1.1.1 [\#1012](https://github.com/CosmWasm/wasmd/pull/1012), see [wasmvm v1.1.1](https://github.com/CosmWasm/wasmvm/releases/tag/v1.1.1) - Add documentation how to add x/wasm to a new Cosmos SDK chain [\#876](https://github.com/CosmWasm/wasmd/issues/876) - Upgrade keyring / go-keychain dependencies (removes deprecate warning) [\#957](https://github.com/CosmWasm/wasmd/issues/957) - Make contract pinning an optional field in StoreCode proposals [\#972](https://github.com/CosmWasm/wasmd/issues/972) @@ -19,10 +25,15 @@ - Prevent migration to a restricted code [\#900](https://github.com/CosmWasm/wasmd/pull/900) ([alpe](https://github.com/alpe)) - Charge gas to unzip wasm code [\#898](https://github.com/CosmWasm/wasmd/pull/898) ([alpe](https://github.com/alpe)) -Migration notes: -- See ibc-go [migration notes](https://github.com/cosmos/ibc-go/blob/v3.2.0/docs/migrations/support-denoms-with-slashes.md) [\#937](https://github.com/CosmWasm/wasmd/pull/937) +### Notable changes: +- BaseAccount and pruned vesting account types can be re-used for contracts addresses +- A new [MsgInstantiateContract2](https://github.com/CosmWasm/wasmd/pull/1014/files#diff-bf58b9da4b674719f07dd5421c532c1ead13a15f8896b59c1f724215d2064b73R75) was introduced which is an additional value for `message` type events +- Store event contains new attribute with code checksum now +- New `wasmd tx wasm instantiate2` CLI command for predictable addresses on instantiation + +### Migration notes: +- See ibc-go [migration notes](https://github.com/cosmos/ibc-go/blob/v3.3.0/docs/migrations/support-denoms-with-slashes.md) -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.28.0...HEAD) ## [v0.28.0](https://github.com/CosmWasm/wasmd/tree/v0.28.0) (2022-07-29) From aa968fd13d9cdf85cb83379d3559c521a256492e Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Thu, 29 Sep 2022 13:37:10 +0200 Subject: [PATCH 82/94] Fix: typos Fix: typos --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ca44b55d11..e5c24f1d81 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ It will also run contracts compiled with 1.x assuming they don't opt into any ne The 1.x cosmwasm_vm will support all contracts with 1.0 <= version <= 1.x. Note that `cosmwasm-std` version defines which contracts are compatible with this system. The wasm code uploaded must -have been compiled with one of the supported `cosmwasm-std` versions, or will be rejeted upon upload (with some error +have been compiled with one of the supported `cosmwasm-std` versions, or will be rejected upon upload (with some error message about "contract too old?" or "contract too new?"). `cosmwasm-vm` version defines the runtime used. It is a breaking change to switch runtimes (you will need to organize a chain upgrade). As of `cosmwasm-vm 0.13` we are using [wasmer](https://github.com/wasmerio/wasmer/) 1.0, which is significantly more performant than the older versions. @@ -97,9 +97,9 @@ The used cosmos-sdk version is in transition migrating from amino encoding to pr We use standard cosmos-sdk encoding (amino) for all sdk Messages. However, the message body sent to all contracts, as well as the internal state is encoded using JSON. Cosmwasm allows arbitrary bytes with the contract itself -responsible for decodng. For better UX, we often use `json.RawMessage` to contain these bytes, which enforces that it is +responsible for decoding. For better UX, we often use `json.RawMessage` to contain these bytes, which enforces that it is valid json, but also give a much more readable interface. If you want to use another encoding in the contracts, that is -a relatively minor change to wasmd but would currently require a fork. Please open in issue if this is important for +a relatively minor change to wasmd but would currently require a fork. Please open an issue if this is important for your use case. ## Quick Start From 24daffd57839e8058f2706a5feeee41b177ad2ec Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 30 Sep 2022 12:30:13 +0200 Subject: [PATCH 83/94] Doc ante handler --- INTEGRATION.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/INTEGRATION.md b/INTEGRATION.md index b336ab9085..b01d1e4229 100644 --- a/INTEGRATION.md +++ b/INTEGRATION.md @@ -67,9 +67,12 @@ from the Cosmos SDK, and enabled them in `app.go`. If so, you can just look at [`wasmd/app/app.go`](https://github.com/CosmWasm/wasmd/blob/master/app/app.go#) for how to do so (just search there for lines with `wasm`). -`wasmd` also comes with a custom `ante handler` that adds the TX position in the block into the context -and passes it to the contracts. In order to support this feature you would need to add our custom -ante handler into the `ante handler chain` as in: [`app/ante.go`](https://github.com/CosmWasm/wasmd/blob/master/app/ante.go) +`wasmd` also comes with 2 custom `ante handlers`: +* `CountTXDecorator` adds the TX position in the block into the context and passes it to the contracts +* `LimitSimulationGasDecorator` prevents an "infinite gas" query + +In order to support these features you would need to add our custom +ante handlers into the `ante handler chain` as in: [`app/ante.go`](https://github.com/CosmWasm/wasmd/blob/master/app/ante.go) ### Copied into your app From 016e3bc06b0e2a7c680dc1c9f78104ec931dde41 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Tue, 4 Oct 2022 09:50:31 +0200 Subject: [PATCH 84/94] Revert module version to 1 as there is no migration --- app/app.go | 12 +++++++++++- x/wasm/module.go | 2 +- x/wasm/module_integration_test.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 x/wasm/module_integration_test.go diff --git a/app/app.go b/app/app.go index ea10c348eb..5d62f67e1e 100644 --- a/app/app.go +++ b/app/app.go @@ -773,7 +773,17 @@ func NewWasmApp( // Name returns the name of the App func (app *WasmApp) Name() string { return app.BaseApp.Name() } -// application updates every begin block +// ModuleManager returns instance +func (app *WasmApp) ModuleManager() module.Manager { + return *app.mm +} + +// ModuleConfigurator returns instance +func (app *WasmApp) ModuleConfigurator() module.Configurator { + return app.configurator +} + +// BeginBlocker application updates every begin block func (app *WasmApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { return app.mm.BeginBlock(ctx, req) } diff --git a/x/wasm/module.go b/x/wasm/module.go index c7ea6339c0..a237a910d4 100644 --- a/x/wasm/module.go +++ b/x/wasm/module.go @@ -111,7 +111,7 @@ type AppModule struct { // 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 2 } +func (AppModule) ConsensusVersion() uint64 { return 1 } // NewAppModule creates a new AppModule object func NewAppModule( diff --git a/x/wasm/module_integration_test.go b/x/wasm/module_integration_test.go new file mode 100644 index 0000000000..0cbec6641f --- /dev/null +++ b/x/wasm/module_integration_test.go @@ -0,0 +1,31 @@ +package wasm_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + "github.com/CosmWasm/wasmd/app" + "github.com/CosmWasm/wasmd/x/wasm" +) + +func TestModuleMigrations(t *testing.T) { + wasmApp := app.Setup(false) + ctx := wasmApp.BaseApp.NewContext(false, tmproto.Header{}) + upgradeHandler := func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return wasmApp.ModuleManager().RunMigrations(ctx, wasmApp.ModuleConfigurator(), fromVM) + } + fromVM := wasmApp.UpgradeKeeper.GetModuleVersionMap(ctx) + fromVM[wasm.ModuleName] = 1 // start with initial version + upgradeHandler(ctx, upgradetypes.Plan{Name: "testing"}, fromVM) + // when + gotVM, err := wasmApp.ModuleManager().RunMigrations(ctx, wasmApp.ModuleConfigurator(), fromVM) + // then + require.NoError(t, err) + assert.Equal(t, uint64(1), gotVM[wasm.ModuleName]) +} From 7cb0015c236d9b51c9574e2ab7b525caaae2296d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Oct 2022 09:57:21 +0000 Subject: [PATCH 85/94] Bump actions/checkout from 3.0.2 to 3.1.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.2 to 3.1.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3.0.2...v3.1.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analizer.yml | 2 +- .github/workflows/proto-buf-publisher.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analizer.yml b/.github/workflows/codeql-analizer.yml index dd4a9c542b..67b8a1a44c 100644 --- a/.github/workflows/codeql-analizer.yml +++ b/.github/workflows/codeql-analizer.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3.0.2 + uses: actions/checkout@v3.1.0 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/proto-buf-publisher.yml b/.github/workflows/proto-buf-publisher.yml index 454e49dda5..fb7e64aabf 100644 --- a/.github/workflows/proto-buf-publisher.yml +++ b/.github/workflows/proto-buf-publisher.yml @@ -16,7 +16,7 @@ jobs: push: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3.0.2 + - uses: actions/checkout@v3.1.0 - uses: bufbuild/buf-setup-action@v1.7.0 # lint checks From 5d21ad91f086e31813821f0c98458b90949e8ed1 Mon Sep 17 00:00:00 2001 From: Pino' Surace Date: Thu, 6 Oct 2022 12:46:50 +0200 Subject: [PATCH 86/94] Make SenderPrivKey field public --- x/wasm/ibctesting/chain.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x/wasm/ibctesting/chain.go b/x/wasm/ibctesting/chain.go index b5e99f962a..c2f6f142a9 100644 --- a/x/wasm/ibctesting/chain.go +++ b/x/wasm/ibctesting/chain.go @@ -60,7 +60,7 @@ type TestChain struct { Vals *tmtypes.ValidatorSet Signers []tmtypes.PrivValidator - senderPrivKey cryptotypes.PrivKey + SenderPrivKey cryptotypes.PrivKey SenderAccount authtypes.AccountI PendingSendPackets []channeltypes.Packet @@ -125,7 +125,7 @@ func NewTestChain(t *testing.T, coord *Coordinator, chainID string, opts ...wasm Codec: wasmApp.AppCodec(), Vals: valSet, Signers: signers, - senderPrivKey: senderPrivKey, + SenderPrivKey: senderPrivKey, SenderAccount: acc, } @@ -251,7 +251,7 @@ func (chain *TestChain) SendMsgs(msgs ...sdk.Msg) (*sdk.Result, error) { chain.ChainID, []uint64{chain.SenderAccount.GetAccountNumber()}, []uint64{chain.SenderAccount.GetSequence()}, - true, true, chain.senderPrivKey, + true, true, chain.SenderPrivKey, ) if err != nil { return nil, err From 2fe81b9ea971ed100287b2525f8f0774bafa7475 Mon Sep 17 00:00:00 2001 From: GNaD13 <89174180+GNaD13@users.noreply.github.com> Date: Fri, 7 Oct 2022 13:22:13 +0700 Subject: [PATCH 87/94] Add check version wasm (#1029) * add check version wasm * add check wasmExpectedVersion * update on nit --- x/wasm/module.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/x/wasm/module.go b/x/wasm/module.go index a237a910d4..d03fdeb02f 100644 --- a/x/wasm/module.go +++ b/x/wasm/module.go @@ -3,7 +3,10 @@ package wasm import ( "context" "encoding/json" + "fmt" "math/rand" + "runtime/debug" + "strings" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" @@ -24,6 +27,7 @@ import ( "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/CosmWasm/wasmd/x/wasm/simulation" "github.com/CosmWasm/wasmd/x/wasm/types" + wasmvm "github.com/CosmWasm/wasmvm" ) var ( @@ -217,6 +221,8 @@ func AddModuleInitFlags(startCmd *cobra.Command) { startCmd.Flags().Uint32(flagWasmMemoryCacheSize, defaults.MemoryCacheSize, "Sets the size in MiB (NOT bytes) of an in-memory cache for Wasm modules. Set to 0 to disable.") startCmd.Flags().Uint64(flagWasmQueryGasLimit, defaults.SmartQueryGasLimit, "Set the max gas that can be spent on executing a query with a Wasm contract") startCmd.Flags().String(flagWasmSimulationGasLimit, "", "Set the max gas that can be spent when executing a simulation TX") + + startCmd.PreRunE = chainPreRuns(checkLibwasmVersion, startCmd.PreRunE) } // ReadWasmConfig reads the wasm specifig configuration @@ -250,3 +256,50 @@ func ReadWasmConfig(opts servertypes.AppOptions) (types.WasmConfig, error) { } return cfg, nil } + +func getExpectedLibwasmVersion() string { + buildInfo, ok := debug.ReadBuildInfo() + if !ok { + panic("can't read build info") + } + for _, d := range buildInfo.Deps { + if d.Path != "github.com/CosmWasm/wasmvm" { + continue + } + if d.Replace != nil { + return d.Replace.Version + } + return d.Version + } + return "" +} + +func checkLibwasmVersion(cmd *cobra.Command, args []string) error { + wasmVersion, err := wasmvm.LibwasmvmVersion() + if err != nil { + return fmt.Errorf("unable to retrieve libwasmversion %w", err) + } + wasmExpectedVersion := getExpectedLibwasmVersion() + if wasmExpectedVersion == "" { + return fmt.Errorf("wasmvm module not exist") + } + if !strings.Contains(wasmExpectedVersion, wasmVersion) { + return fmt.Errorf("libwasmversion mismatch. got: %s; expected: %s", wasmVersion, wasmExpectedVersion) + } + return nil +} + +type preRunFn func(cmd *cobra.Command, args []string) error + +func chainPreRuns(pfns ...preRunFn) preRunFn { + return func(cmd *cobra.Command, args []string) error { + for _, pfn := range pfns { + if pfn != nil { + if err := pfn(cmd, args); err != nil { + return err + } + } + } + return nil + } +} From 79dbbe3e259bdc050b4c764e406b9a90c9bd6baf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Oct 2022 08:23:24 +0200 Subject: [PATCH 88/94] Bump bufbuild/buf-setup-action from 1.7.0 to 1.8.0 (#1006) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.7.0 to 1.8.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.7.0...v1.8.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/proto-buf-publisher.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/proto-buf-publisher.yml b/.github/workflows/proto-buf-publisher.yml index fb7e64aabf..281eb4fc6e 100644 --- a/.github/workflows/proto-buf-publisher.yml +++ b/.github/workflows/proto-buf-publisher.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3.1.0 - - uses: bufbuild/buf-setup-action@v1.7.0 + - uses: bufbuild/buf-setup-action@v1.8.0 # lint checks - uses: bufbuild/buf-lint-action@v1 From 51931206dbe09529c1819a8a2863d291035a2549 Mon Sep 17 00:00:00 2001 From: pinosu <95283998+pinosu@users.noreply.github.com> Date: Mon, 10 Oct 2022 13:07:18 +0200 Subject: [PATCH 89/94] Add dependencies for protobuf and remove third_party forlder (#1030) * Add dependencies for proto files and remove third_party forlder * Pin cosmos-sdk dependency to v0.46.x * Run "make proto-all" and generate new types files. --- Makefile | 4 +- buf.work.yaml | 1 - go.mod | 6 +- go.sum | 7 + proto/buf.gen.doc.yml | 5 + proto/buf.gen.gogo.yml | 8 + proto/buf.lock | 19 + proto/buf.yaml | 4 + scripts/protocgen.sh | 46 +- third_party/proto/buf.yaml | 40 - third_party/proto/confio/README.md | 1 - third_party/proto/confio/proofs.proto | 234 - .../proto/cosmos/auth/v1beta1/auth.proto | 50 - .../proto/cosmos/auth/v1beta1/genesis.proto | 17 - .../proto/cosmos/auth/v1beta1/query.proto | 74 - .../proto/cosmos/authz/v1beta1/authz.proto | 39 - .../proto/cosmos/authz/v1beta1/event.proto | 25 - .../proto/cosmos/authz/v1beta1/genesis.proto | 13 - .../proto/cosmos/authz/v1beta1/query.proto | 81 - .../proto/cosmos/authz/v1beta1/tx.proto | 70 - .../proto/cosmos/bank/v1beta1/authz.proto | 19 - .../proto/cosmos/bank/v1beta1/bank.proto | 96 - .../proto/cosmos/bank/v1beta1/genesis.proto | 39 - .../proto/cosmos/bank/v1beta1/query.proto | 193 - .../proto/cosmos/bank/v1beta1/tx.proto | 42 - .../proto/cosmos/base/abci/v1beta1/abci.proto | 144 - .../proto/cosmos/base/kv/v1beta1/kv.proto | 17 - .../base/query/v1beta1/pagination.proto | 55 - .../base/reflection/v1beta1/reflection.proto | 44 - .../base/reflection/v2alpha1/reflection.proto | 218 - .../base/snapshots/v1beta1/snapshot.proto | 57 - .../base/store/v1beta1/commit_info.proto | 29 - .../cosmos/base/store/v1beta1/listening.proto | 16 - .../base/tendermint/v1beta1/query.proto | 138 - .../proto/cosmos/base/v1beta1/coin.proto | 40 - .../capability/v1beta1/capability.proto | 30 - .../cosmos/capability/v1beta1/genesis.proto | 26 - .../proto/cosmos/crisis/v1beta1/genesis.proto | 15 - .../proto/cosmos/crisis/v1beta1/tx.proto | 25 - .../proto/cosmos/crypto/ed25519/keys.proto | 23 - .../proto/cosmos/crypto/multisig/keys.proto | 18 - .../crypto/multisig/v1beta1/multisig.proto | 25 - .../proto/cosmos/crypto/secp256k1/keys.proto | 22 - .../proto/cosmos/crypto/secp256r1/keys.proto | 23 - .../distribution/v1beta1/distribution.proto | 157 - .../cosmos/distribution/v1beta1/genesis.proto | 155 - .../cosmos/distribution/v1beta1/query.proto | 218 - .../cosmos/distribution/v1beta1/tx.proto | 79 - .../cosmos/evidence/v1beta1/evidence.proto | 21 - .../cosmos/evidence/v1beta1/genesis.proto | 12 - .../proto/cosmos/evidence/v1beta1/query.proto | 51 - .../proto/cosmos/evidence/v1beta1/tx.proto | 32 - .../cosmos/feegrant/v1beta1/feegrant.proto | 78 - .../cosmos/feegrant/v1beta1/genesis.proto | 13 - .../proto/cosmos/feegrant/v1beta1/query.proto | 78 - .../proto/cosmos/feegrant/v1beta1/tx.proto | 49 - .../cosmos/genutil/v1beta1/genesis.proto | 16 - .../proto/cosmos/gov/v1beta1/genesis.proto | 26 - .../proto/cosmos/gov/v1beta1/gov.proto | 200 - .../proto/cosmos/gov/v1beta1/query.proto | 190 - third_party/proto/cosmos/gov/v1beta1/tx.proto | 99 - .../proto/cosmos/mint/v1beta1/genesis.proto | 16 - .../proto/cosmos/mint/v1beta1/mint.proto | 53 - .../proto/cosmos/mint/v1beta1/query.proto | 57 - .../proto/cosmos/params/v1beta1/params.proto | 27 - .../proto/cosmos/params/v1beta1/query.proto | 32 - .../cosmos/slashing/v1beta1/genesis.proto | 50 - .../proto/cosmos/slashing/v1beta1/query.proto | 63 - .../cosmos/slashing/v1beta1/slashing.proto | 58 - .../proto/cosmos/slashing/v1beta1/tx.proto | 26 - .../proto/cosmos/staking/v1beta1/authz.proto | 47 - .../cosmos/staking/v1beta1/genesis.proto | 53 - .../proto/cosmos/staking/v1beta1/query.proto | 348 -- .../cosmos/staking/v1beta1/staking.proto | 334 -- .../proto/cosmos/staking/v1beta1/tx.proto | 126 - .../cosmos/tx/signing/v1beta1/signing.proto | 91 - .../proto/cosmos/tx/v1beta1/service.proto | 165 - third_party/proto/cosmos/tx/v1beta1/tx.proto | 183 - .../proto/cosmos/upgrade/v1beta1/query.proto | 104 - .../cosmos/upgrade/v1beta1/upgrade.proto | 78 - .../proto/cosmos/vesting/v1beta1/tx.proto | 31 - .../cosmos/vesting/v1beta1/vesting.proto | 85 - third_party/proto/cosmos_proto/cosmos.proto | 16 - third_party/proto/gogoproto/gogo.proto | 145 - .../proto/google/api/annotations.proto | 31 - third_party/proto/google/api/http.proto | 318 -- third_party/proto/google/api/httpbody.proto | 78 - third_party/proto/google/protobuf/any.proto | 164 - .../controller/v1/controller.proto | 14 - .../controller/v1/query.proto | 25 - .../interchain_accounts/host/v1/host.proto | 16 - .../interchain_accounts/host/v1/query.proto | 25 - .../interchain_accounts/v1/account.proto | 20 - .../interchain_accounts/v1/genesis.proto | 51 - .../interchain_accounts/v1/metadata.proto | 25 - .../interchain_accounts/v1/packet.proto | 31 - .../applications/transfer/v1/genesis.proto | 19 - .../ibc/applications/transfer/v1/query.proto | 105 - .../applications/transfer/v1/transfer.proto | 30 - .../ibc/applications/transfer/v1/tx.proto | 44 - .../ibc/applications/transfer/v2/packet.proto | 19 - .../proto/ibc/core/channel/v1/channel.proto | 148 - .../proto/ibc/core/channel/v1/genesis.proto | 32 - .../proto/ibc/core/channel/v1/query.proto | 376 -- .../proto/ibc/core/channel/v1/tx.proto | 246 - .../proto/ibc/core/client/v1/client.proto | 103 - .../proto/ibc/core/client/v1/genesis.proto | 48 - .../proto/ibc/core/client/v1/query.proto | 207 - third_party/proto/ibc/core/client/v1/tx.proto | 99 - .../ibc/core/commitment/v1/commitment.proto | 41 - .../ibc/core/connection/v1/connection.proto | 114 - .../ibc/core/connection/v1/genesis.proto | 18 - .../proto/ibc/core/connection/v1/query.proto | 138 - .../proto/ibc/core/connection/v1/tx.proto | 119 - .../proto/ibc/core/types/v1/genesis.proto | 23 - .../lightclients/localhost/v1/localhost.proto | 18 - .../solomachine/v1/solomachine.proto | 189 - .../solomachine/v2/solomachine.proto | 189 - .../tendermint/v1/tendermint.proto | 114 - third_party/proto/tendermint/abci/types.proto | 413 -- .../proto/tendermint/blockchain/types.pb.go | 1570 ------ .../proto/tendermint/blockchain/types.proto | 41 - .../proto/tendermint/consensus/types.pb.go | 3509 ------------- .../proto/tendermint/consensus/types.proto | 92 - .../proto/tendermint/consensus/wal.pb.go | 1585 ------ .../proto/tendermint/consensus/wal.proto | 46 - .../proto/tendermint/crypto/keys.pb.go | 677 --- .../proto/tendermint/crypto/keys.proto | 17 - .../proto/tendermint/crypto/proof.pb.go | 1458 ------ .../proto/tendermint/crypto/proof.proto | 41 - .../proto/tendermint/libs/bits/types.pb.go | 421 -- .../proto/tendermint/libs/bits/types.proto | 9 - .../proto/tendermint/mempool/types.pb.go | 576 -- .../proto/tendermint/mempool/types.proto | 14 - third_party/proto/tendermint/p2p/conn.pb.go | 1310 ----- third_party/proto/tendermint/p2p/conn.proto | 30 - third_party/proto/tendermint/p2p/pex.pb.go | 796 --- third_party/proto/tendermint/p2p/pex.proto | 20 - third_party/proto/tendermint/p2p/types.pb.go | 1430 ----- third_party/proto/tendermint/p2p/types.proto | 34 - .../proto/tendermint/privval/types.pb.go | 2882 ---------- .../proto/tendermint/privval/types.proto | 76 - .../proto/tendermint/rpc/grpc/types.pb.go | 953 ---- .../proto/tendermint/rpc/grpc/types.proto | 32 - .../proto/tendermint/state/types.pb.go | 2218 -------- .../proto/tendermint/state/types.proto | 80 - .../proto/tendermint/statesync/types.pb.go | 1672 ------ .../proto/tendermint/statesync/types.proto | 37 - .../proto/tendermint/store/types.pb.go | 347 -- .../proto/tendermint/store/types.proto | 9 - .../proto/tendermint/types/block.pb.go | 503 -- .../proto/tendermint/types/block.proto | 15 - .../proto/tendermint/types/canonical.pb.go | 1409 ----- .../proto/tendermint/types/canonical.proto | 37 - .../proto/tendermint/types/events.pb.go | 399 -- .../proto/tendermint/types/events.proto | 10 - .../proto/tendermint/types/evidence.pb.go | 1429 ----- .../proto/tendermint/types/evidence.proto | 38 - .../proto/tendermint/types/params.pb.go | 1834 ------- .../proto/tendermint/types/params.proto | 80 - .../proto/tendermint/types/types.pb.go | 4657 ----------------- .../proto/tendermint/types/types.proto | 157 - .../proto/tendermint/types/validator.pb.go | 969 ---- .../proto/tendermint/types/validator.proto | 25 - .../proto/tendermint/version/types.pb.go | 596 --- .../proto/tendermint/version/types.proto | 24 - x/wasm/types/genesis.pb.go | 2 +- x/wasm/types/ibc.pb.go | 2 +- x/wasm/types/proposal.pb.go | 2 +- x/wasm/types/query.pb.go | 2 +- x/wasm/types/query.pb.gw.go | 54 +- x/wasm/types/tx.pb.go | 2 +- x/wasm/types/types.pb.go | 4 +- 173 files changed, 119 insertions(+), 43523 deletions(-) create mode 100644 proto/buf.gen.doc.yml create mode 100644 proto/buf.gen.gogo.yml create mode 100644 proto/buf.lock delete mode 100644 third_party/proto/buf.yaml delete mode 100644 third_party/proto/confio/README.md delete mode 100644 third_party/proto/confio/proofs.proto delete mode 100644 third_party/proto/cosmos/auth/v1beta1/auth.proto delete mode 100644 third_party/proto/cosmos/auth/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/auth/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/authz/v1beta1/authz.proto delete mode 100644 third_party/proto/cosmos/authz/v1beta1/event.proto delete mode 100644 third_party/proto/cosmos/authz/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/authz/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/authz/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/bank/v1beta1/authz.proto delete mode 100644 third_party/proto/cosmos/bank/v1beta1/bank.proto delete mode 100644 third_party/proto/cosmos/bank/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/bank/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/bank/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/base/abci/v1beta1/abci.proto delete mode 100644 third_party/proto/cosmos/base/kv/v1beta1/kv.proto delete mode 100644 third_party/proto/cosmos/base/query/v1beta1/pagination.proto delete mode 100644 third_party/proto/cosmos/base/reflection/v1beta1/reflection.proto delete mode 100644 third_party/proto/cosmos/base/reflection/v2alpha1/reflection.proto delete mode 100644 third_party/proto/cosmos/base/snapshots/v1beta1/snapshot.proto delete mode 100644 third_party/proto/cosmos/base/store/v1beta1/commit_info.proto delete mode 100644 third_party/proto/cosmos/base/store/v1beta1/listening.proto delete mode 100644 third_party/proto/cosmos/base/tendermint/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/base/v1beta1/coin.proto delete mode 100644 third_party/proto/cosmos/capability/v1beta1/capability.proto delete mode 100644 third_party/proto/cosmos/capability/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/crisis/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/crisis/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/crypto/ed25519/keys.proto delete mode 100644 third_party/proto/cosmos/crypto/multisig/keys.proto delete mode 100644 third_party/proto/cosmos/crypto/multisig/v1beta1/multisig.proto delete mode 100644 third_party/proto/cosmos/crypto/secp256k1/keys.proto delete mode 100644 third_party/proto/cosmos/crypto/secp256r1/keys.proto delete mode 100644 third_party/proto/cosmos/distribution/v1beta1/distribution.proto delete mode 100644 third_party/proto/cosmos/distribution/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/distribution/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/distribution/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/evidence/v1beta1/evidence.proto delete mode 100644 third_party/proto/cosmos/evidence/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/evidence/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/evidence/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/feegrant/v1beta1/feegrant.proto delete mode 100644 third_party/proto/cosmos/feegrant/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/feegrant/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/feegrant/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/genutil/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/gov/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/gov/v1beta1/gov.proto delete mode 100644 third_party/proto/cosmos/gov/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/gov/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/mint/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/mint/v1beta1/mint.proto delete mode 100644 third_party/proto/cosmos/mint/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/params/v1beta1/params.proto delete mode 100644 third_party/proto/cosmos/params/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/slashing/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/slashing/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/slashing/v1beta1/slashing.proto delete mode 100644 third_party/proto/cosmos/slashing/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/staking/v1beta1/authz.proto delete mode 100644 third_party/proto/cosmos/staking/v1beta1/genesis.proto delete mode 100644 third_party/proto/cosmos/staking/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/staking/v1beta1/staking.proto delete mode 100644 third_party/proto/cosmos/staking/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/tx/signing/v1beta1/signing.proto delete mode 100644 third_party/proto/cosmos/tx/v1beta1/service.proto delete mode 100644 third_party/proto/cosmos/tx/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/upgrade/v1beta1/query.proto delete mode 100644 third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto delete mode 100644 third_party/proto/cosmos/vesting/v1beta1/tx.proto delete mode 100644 third_party/proto/cosmos/vesting/v1beta1/vesting.proto delete mode 100644 third_party/proto/cosmos_proto/cosmos.proto delete mode 100644 third_party/proto/gogoproto/gogo.proto delete mode 100644 third_party/proto/google/api/annotations.proto delete mode 100644 third_party/proto/google/api/http.proto delete mode 100644 third_party/proto/google/api/httpbody.proto delete mode 100644 third_party/proto/google/protobuf/any.proto delete mode 100644 third_party/proto/ibc/applications/interchain_accounts/controller/v1/controller.proto delete mode 100644 third_party/proto/ibc/applications/interchain_accounts/controller/v1/query.proto delete mode 100644 third_party/proto/ibc/applications/interchain_accounts/host/v1/host.proto delete mode 100644 third_party/proto/ibc/applications/interchain_accounts/host/v1/query.proto delete mode 100644 third_party/proto/ibc/applications/interchain_accounts/v1/account.proto delete mode 100644 third_party/proto/ibc/applications/interchain_accounts/v1/genesis.proto delete mode 100644 third_party/proto/ibc/applications/interchain_accounts/v1/metadata.proto delete mode 100644 third_party/proto/ibc/applications/interchain_accounts/v1/packet.proto delete mode 100644 third_party/proto/ibc/applications/transfer/v1/genesis.proto delete mode 100644 third_party/proto/ibc/applications/transfer/v1/query.proto delete mode 100644 third_party/proto/ibc/applications/transfer/v1/transfer.proto delete mode 100644 third_party/proto/ibc/applications/transfer/v1/tx.proto delete mode 100644 third_party/proto/ibc/applications/transfer/v2/packet.proto delete mode 100644 third_party/proto/ibc/core/channel/v1/channel.proto delete mode 100644 third_party/proto/ibc/core/channel/v1/genesis.proto delete mode 100644 third_party/proto/ibc/core/channel/v1/query.proto delete mode 100644 third_party/proto/ibc/core/channel/v1/tx.proto delete mode 100644 third_party/proto/ibc/core/client/v1/client.proto delete mode 100644 third_party/proto/ibc/core/client/v1/genesis.proto delete mode 100644 third_party/proto/ibc/core/client/v1/query.proto delete mode 100644 third_party/proto/ibc/core/client/v1/tx.proto delete mode 100644 third_party/proto/ibc/core/commitment/v1/commitment.proto delete mode 100644 third_party/proto/ibc/core/connection/v1/connection.proto delete mode 100644 third_party/proto/ibc/core/connection/v1/genesis.proto delete mode 100644 third_party/proto/ibc/core/connection/v1/query.proto delete mode 100644 third_party/proto/ibc/core/connection/v1/tx.proto delete mode 100644 third_party/proto/ibc/core/types/v1/genesis.proto delete mode 100644 third_party/proto/ibc/lightclients/localhost/v1/localhost.proto delete mode 100644 third_party/proto/ibc/lightclients/solomachine/v1/solomachine.proto delete mode 100644 third_party/proto/ibc/lightclients/solomachine/v2/solomachine.proto delete mode 100644 third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto delete mode 100644 third_party/proto/tendermint/abci/types.proto delete mode 100644 third_party/proto/tendermint/blockchain/types.pb.go delete mode 100644 third_party/proto/tendermint/blockchain/types.proto delete mode 100644 third_party/proto/tendermint/consensus/types.pb.go delete mode 100644 third_party/proto/tendermint/consensus/types.proto delete mode 100644 third_party/proto/tendermint/consensus/wal.pb.go delete mode 100644 third_party/proto/tendermint/consensus/wal.proto delete mode 100644 third_party/proto/tendermint/crypto/keys.pb.go delete mode 100644 third_party/proto/tendermint/crypto/keys.proto delete mode 100644 third_party/proto/tendermint/crypto/proof.pb.go delete mode 100644 third_party/proto/tendermint/crypto/proof.proto delete mode 100644 third_party/proto/tendermint/libs/bits/types.pb.go delete mode 100644 third_party/proto/tendermint/libs/bits/types.proto delete mode 100644 third_party/proto/tendermint/mempool/types.pb.go delete mode 100644 third_party/proto/tendermint/mempool/types.proto delete mode 100644 third_party/proto/tendermint/p2p/conn.pb.go delete mode 100644 third_party/proto/tendermint/p2p/conn.proto delete mode 100644 third_party/proto/tendermint/p2p/pex.pb.go delete mode 100644 third_party/proto/tendermint/p2p/pex.proto delete mode 100644 third_party/proto/tendermint/p2p/types.pb.go delete mode 100644 third_party/proto/tendermint/p2p/types.proto delete mode 100644 third_party/proto/tendermint/privval/types.pb.go delete mode 100644 third_party/proto/tendermint/privval/types.proto delete mode 100644 third_party/proto/tendermint/rpc/grpc/types.pb.go delete mode 100644 third_party/proto/tendermint/rpc/grpc/types.proto delete mode 100644 third_party/proto/tendermint/state/types.pb.go delete mode 100644 third_party/proto/tendermint/state/types.proto delete mode 100644 third_party/proto/tendermint/statesync/types.pb.go delete mode 100644 third_party/proto/tendermint/statesync/types.proto delete mode 100644 third_party/proto/tendermint/store/types.pb.go delete mode 100644 third_party/proto/tendermint/store/types.proto delete mode 100644 third_party/proto/tendermint/types/block.pb.go delete mode 100644 third_party/proto/tendermint/types/block.proto delete mode 100644 third_party/proto/tendermint/types/canonical.pb.go delete mode 100644 third_party/proto/tendermint/types/canonical.proto delete mode 100644 third_party/proto/tendermint/types/events.pb.go delete mode 100644 third_party/proto/tendermint/types/events.proto delete mode 100644 third_party/proto/tendermint/types/evidence.pb.go delete mode 100644 third_party/proto/tendermint/types/evidence.proto delete mode 100644 third_party/proto/tendermint/types/params.pb.go delete mode 100644 third_party/proto/tendermint/types/params.proto delete mode 100644 third_party/proto/tendermint/types/types.pb.go delete mode 100644 third_party/proto/tendermint/types/types.proto delete mode 100644 third_party/proto/tendermint/types/validator.pb.go delete mode 100644 third_party/proto/tendermint/types/validator.proto delete mode 100644 third_party/proto/tendermint/version/types.pb.go delete mode 100644 third_party/proto/tendermint/version/types.proto diff --git a/Makefile b/Makefile index aea212d4f6..6ca03f3e38 100644 --- a/Makefile +++ b/Makefile @@ -165,7 +165,7 @@ format: format-tools ############################################################################### ### Protobuf ### ############################################################################### -PROTO_BUILDER_IMAGE=tendermintdev/sdk-proto-gen:v0.2 +PROTO_BUILDER_IMAGE=tendermintdev/sdk-proto-gen:v0.7 PROTO_FORMATTER_IMAGE=tendermintdev/docker-build-proto@sha256:aabcfe2fc19c31c0f198d4cd26393f5e5ca9502d7ea3feafbfe972448fee7cae proto-all: proto-format proto-lint proto-gen format @@ -178,7 +178,7 @@ proto-format: @echo "Formatting Protobuf files" $(DOCKER) run --rm -v $(CURDIR):/workspace \ --workdir /workspace $(PROTO_FORMATTER_IMAGE) \ - find ./ -not -path "./third_party/*" -name *.proto -exec clang-format -i {} \; + find ./ -name *.proto -exec clang-format -i {} \; proto-swagger-gen: @./scripts/protoc-swagger-gen.sh diff --git a/buf.work.yaml b/buf.work.yaml index 98094695ff..1b4a0d95c2 100644 --- a/buf.work.yaml +++ b/buf.work.yaml @@ -6,4 +6,3 @@ version: v1 directories: - proto - - third_party/proto diff --git a/go.mod b/go.mod index aed1e1aede..2ada37be67 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,9 @@ go 1.18 require ( github.com/CosmWasm/wasmvm v1.1.1 + github.com/cosmos/cosmos-proto v1.0.0-alpha7 github.com/cosmos/cosmos-sdk v0.45.8 + github.com/cosmos/gogoproto v1.4.2 github.com/cosmos/iavl v0.19.1 github.com/cosmos/ibc-go/v3 v3.3.0 github.com/cosmos/interchain-accounts v0.1.0 @@ -17,7 +19,6 @@ require ( github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.13.0 github.com/rakyll/statik v0.1.7 - github.com/regen-network/cosmos-proto v0.3.1 github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa github.com/spf13/cast v1.5.0 github.com/spf13/cobra v1.5.0 @@ -28,7 +29,7 @@ require ( github.com/tendermint/tendermint v0.34.21 github.com/tendermint/tm-db v0.6.7 google.golang.org/genproto v0.0.0-20220725144611-272f38e5d71b - google.golang.org/grpc v1.48.0 + google.golang.org/grpc v1.49.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -102,6 +103,7 @@ require ( github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect + github.com/regen-network/cosmos-proto v0.3.1 // indirect github.com/rs/cors v1.8.2 // indirect github.com/rs/zerolog v1.27.0 // indirect github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa // indirect diff --git a/go.sum b/go.sum index b9ed8af879..7d6e085333 100644 --- a/go.sum +++ b/go.sum @@ -162,11 +162,15 @@ github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= +github.com/cosmos/cosmos-proto v1.0.0-alpha7 h1:yqYUOHF2jopwZh4dVQp3xgqwftE5/2hkrwIV6vkUbO0= +github.com/cosmos/cosmos-proto v1.0.0-alpha7/go.mod h1:dosO4pSAbJF8zWCzCoTWP7nNsjcvSUBQmniFxDg5daw= github.com/cosmos/cosmos-sdk v0.45.8 h1:UHO5LTkOYLK1pvu9WELCxnp8zw/YcjoNGqqcYiLQ4pE= github.com/cosmos/cosmos-sdk v0.45.8/go.mod h1:+OKZMhLj+Y6LCzCDsyIvpul/xk7n9lVUn8sikLWD0Jo= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogoproto v1.4.2 h1:UeGRcmFW41l0G0MiefWhkPEVEwvu78SZsHBvI78dAYw= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cosmos/iavl v0.19.1 h1:3gaq9b6SjiB0KBTygRnAvEGml2pQlu1TH8uma5g63Ys= @@ -340,6 +344,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= 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= @@ -1171,6 +1176,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -1216,6 +1222,7 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 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 v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= 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= diff --git a/proto/buf.gen.doc.yml b/proto/buf.gen.doc.yml new file mode 100644 index 0000000000..43c1f10f2a --- /dev/null +++ b/proto/buf.gen.doc.yml @@ -0,0 +1,5 @@ +version: v1 +plugins: + - name: doc + out: ../docs/proto + opt: ../docs/proto/protodoc-markdown.tmpl,proto-docs.md \ No newline at end of file diff --git a/proto/buf.gen.gogo.yml b/proto/buf.gen.gogo.yml new file mode 100644 index 0000000000..855ea251ad --- /dev/null +++ b/proto/buf.gen.gogo.yml @@ -0,0 +1,8 @@ +version: v1 +plugins: + - name: gocosmos + out: .. + opt: plugins=grpc,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types + - name: grpc-gateway + out: .. + opt: logtostderr=true,allow_colon_final_segments=true \ No newline at end of file diff --git a/proto/buf.lock b/proto/buf.lock new file mode 100644 index 0000000000..3d4ba2f161 --- /dev/null +++ b/proto/buf.lock @@ -0,0 +1,19 @@ +# Generated by buf. DO NOT EDIT. +version: v1 +deps: + - remote: buf.build + owner: cosmos + repository: cosmos-proto + commit: 1935555c206d4afb9e94615dfd0fad31 + - remote: buf.build + owner: cosmos + repository: cosmos-sdk + commit: 8cb30a2c4de74dc9bd8d260b1e75e176 + - remote: buf.build + owner: cosmos + repository: gogo-proto + commit: 6652e3443c3b4504bb3bf82e73a7e409 + - remote: buf.build + owner: googleapis + repository: googleapis + commit: 8d7204855ec14631a499bd7393ce1970 diff --git a/proto/buf.yaml b/proto/buf.yaml index cf215e6829..9c12bd28b7 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -5,6 +5,10 @@ # the previous configuration. version: v1 name: buf.build/cosmwasm/wasmd +deps: + - buf.build/cosmos/cosmos-proto + - buf.build/cosmos/cosmos-sdk:8cb30a2c4de74dc9bd8d260b1e75e176 #v0.46.x + - buf.build/cosmos/gogo-proto breaking: use: - FILE diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index f9d5572f1e..b33d0a49fd 100755 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -2,37 +2,31 @@ set -eo pipefail -protoc_gen_gocosmos() { - if ! grep "github.com/gogo/protobuf => github.com/regen-network/protobuf" go.mod &>/dev/null ; then - echo -e "\tPlease run this command from somewhere inside the cosmos-sdk folder." - return 1 - fi - - go get github.com/regen-network/cosmos-proto/protoc-gen-gocosmos@latest 2>/dev/null +protoc_install_proto_gen_doc() { + echo "Installing protobuf protoc-gen-doc plugin" + (go install github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc@latest 2> /dev/null) } -protoc_gen_gocosmos - -proto_dirs=$(find ./proto -path -prune -o -name '*.proto' -print0 | xargs -0 -n1 dirname | sort | uniq) +echo "Generating gogo proto code" +cd proto +proto_dirs=$(find ./cosmwasm -path -prune -o -name '*.proto' -print0 | xargs -0 -n1 dirname | sort | uniq) for dir in $proto_dirs; do - buf protoc \ - -I "proto" \ - -I "third_party/proto" \ - --gocosmos_out=plugins=interfacetype+grpc,\ -Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types:. \ - --grpc-gateway_out=logtostderr=true:. \ - $(find "${dir}" -maxdepth 1 -name '*.proto') - + for file in $(find "${dir}" -maxdepth 1 -name '*.proto'); do + if grep "option go_package" $file &> /dev/null ; then + buf generate --template buf.gen.gogo.yml $file + fi + done done -# -## command to generate docs using protoc-gen-doc -buf protoc \ --I "proto" \ --I "third_party/proto" \ ---doc_out=./docs/proto \ ---doc_opt=./docs/proto/protodoc-markdown.tmpl,proto-docs.md \ -$(find "$(pwd)/proto" -maxdepth 5 -name '*.proto') + +protoc_install_proto_gen_doc + +echo "Generating proto docs" +buf generate --template buf.gen.doc.yml + +cd .. # move proto files to the right places cp -r github.com/CosmWasm/wasmd/* ./ rm -rf github.com + +go mod tidy diff --git a/third_party/proto/buf.yaml b/third_party/proto/buf.yaml deleted file mode 100644 index d0638a2426..0000000000 --- a/third_party/proto/buf.yaml +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by "buf config migrate-v1beta1". Edit as necessary, and -# remove this comment when you're finished. -# -# This module represents the "third_party/proto" root found in -# the previous configuration. -version: v1 -build: - excludes: - - google/protobuf -breaking: - use: - - FILE - ignore: - - confio - - cosmos - - cosmos_proto - - gogoproto - - google - - ibc - - tendermint -lint: - use: - - DEFAULT - - COMMENTS - - FILE_LOWER_SNAKE_CASE - except: - - UNARY_RPC - - COMMENT_FIELD - - SERVICE_SUFFIX - - PACKAGE_VERSION_SUFFIX - - RPC_REQUEST_STANDARD_NAME - - PACKAGE_DIRECTORY_MATCH - ignore: - - confio - - cosmos - - cosmos_proto - - gogoproto - - google - - ibc - - tendermint diff --git a/third_party/proto/confio/README.md b/third_party/proto/confio/README.md deleted file mode 100644 index c57da2e224..0000000000 --- a/third_party/proto/confio/README.md +++ /dev/null @@ -1 +0,0 @@ -This project can be found at: https://github.com/confio/ics23 diff --git a/third_party/proto/confio/proofs.proto b/third_party/proto/confio/proofs.proto deleted file mode 100644 index 12d9e2da69..0000000000 --- a/third_party/proto/confio/proofs.proto +++ /dev/null @@ -1,234 +0,0 @@ -syntax = "proto3"; - -package ics23; - -enum HashOp { - // NO_HASH is the default if no data passed. Note this is an illegal argument some places. - NO_HASH = 0; - SHA256 = 1; - SHA512 = 2; - KECCAK = 3; - RIPEMD160 = 4; - BITCOIN = 5; // ripemd160(sha256(x)) - SHA512_256 = 6; -} - -/** -LengthOp defines how to process the key and value of the LeafOp -to include length information. After encoding the length with the given -algorithm, the length will be prepended to the key and value bytes. -(Each one with it's own encoded length) -*/ -enum LengthOp { - // NO_PREFIX don't include any length info - NO_PREFIX = 0; - // VAR_PROTO uses protobuf (and go-amino) varint encoding of the length - VAR_PROTO = 1; - // VAR_RLP uses rlp int encoding of the length - VAR_RLP = 2; - // FIXED32_BIG uses big-endian encoding of the length as a 32 bit integer - FIXED32_BIG = 3; - // FIXED32_LITTLE uses little-endian encoding of the length as a 32 bit integer - FIXED32_LITTLE = 4; - // FIXED64_BIG uses big-endian encoding of the length as a 64 bit integer - FIXED64_BIG = 5; - // FIXED64_LITTLE uses little-endian encoding of the length as a 64 bit integer - FIXED64_LITTLE = 6; - // REQUIRE_32_BYTES is like NONE, but will fail if the input is not exactly 32 bytes (sha256 output) - REQUIRE_32_BYTES = 7; - // REQUIRE_64_BYTES is like NONE, but will fail if the input is not exactly 64 bytes (sha512 output) - REQUIRE_64_BYTES = 8; -} - -/** -ExistenceProof takes a key and a value and a set of steps to perform on it. -The result of peforming all these steps will provide a "root hash", which can -be compared to the value in a header. - -Since it is computationally infeasible to produce a hash collission for any of the used -cryptographic hash functions, if someone can provide a series of operations to transform -a given key and value into a root hash that matches some trusted root, these key and values -must be in the referenced merkle tree. - -The only possible issue is maliablity in LeafOp, such as providing extra prefix data, -which should be controlled by a spec. Eg. with lengthOp as NONE, - prefix = FOO, key = BAR, value = CHOICE -and - prefix = F, key = OOBAR, value = CHOICE -would produce the same value. - -With LengthOp this is tricker but not impossible. Which is why the "leafPrefixEqual" field -in the ProofSpec is valuable to prevent this mutability. And why all trees should -length-prefix the data before hashing it. -*/ -message ExistenceProof { - bytes key = 1; - bytes value = 2; - LeafOp leaf = 3; - repeated InnerOp path = 4; -} - -/* -NonExistenceProof takes a proof of two neighbors, one left of the desired key, -one right of the desired key. If both proofs are valid AND they are neighbors, -then there is no valid proof for the given key. -*/ -message NonExistenceProof { - bytes key = 1; // TODO: remove this as unnecessary??? we prove a range - ExistenceProof left = 2; - ExistenceProof right = 3; -} - -/* -CommitmentProof is either an ExistenceProof or a NonExistenceProof, or a Batch of such messages -*/ -message CommitmentProof { - oneof proof { - ExistenceProof exist = 1; - NonExistenceProof nonexist = 2; - BatchProof batch = 3; - CompressedBatchProof compressed = 4; - } -} - -/** -LeafOp represents the raw key-value data we wish to prove, and -must be flexible to represent the internal transformation from -the original key-value pairs into the basis hash, for many existing -merkle trees. - -key and value are passed in. So that the signature of this operation is: - leafOp(key, value) -> output - -To process this, first prehash the keys and values if needed (ANY means no hash in this case): - hkey = prehashKey(key) - hvalue = prehashValue(value) - -Then combine the bytes, and hash it - output = hash(prefix || length(hkey) || hkey || length(hvalue) || hvalue) -*/ -message LeafOp { - HashOp hash = 1; - HashOp prehash_key = 2; - HashOp prehash_value = 3; - LengthOp length = 4; - // prefix is a fixed bytes that may optionally be included at the beginning to differentiate - // a leaf node from an inner node. - bytes prefix = 5; -} - -/** -InnerOp represents a merkle-proof step that is not a leaf. -It represents concatenating two children and hashing them to provide the next result. - -The result of the previous step is passed in, so the signature of this op is: - innerOp(child) -> output - -The result of applying InnerOp should be: - output = op.hash(op.prefix || child || op.suffix) - - where the || operator is concatenation of binary data, -and child is the result of hashing all the tree below this step. - -Any special data, like prepending child with the length, or prepending the entire operation with -some value to differentiate from leaf nodes, should be included in prefix and suffix. -If either of prefix or suffix is empty, we just treat it as an empty string -*/ -message InnerOp { - HashOp hash = 1; - bytes prefix = 2; - bytes suffix = 3; -} - - -/** -ProofSpec defines what the expected parameters are for a given proof type. -This can be stored in the client and used to validate any incoming proofs. - - verify(ProofSpec, Proof) -> Proof | Error - -As demonstrated in tests, if we don't fix the algorithm used to calculate the -LeafHash for a given tree, there are many possible key-value pairs that can -generate a given hash (by interpretting the preimage differently). -We need this for proper security, requires client knows a priori what -tree format server uses. But not in code, rather a configuration object. -*/ -message ProofSpec { - // any field in the ExistenceProof must be the same as in this spec. - // except Prefix, which is just the first bytes of prefix (spec can be longer) - LeafOp leaf_spec = 1; - InnerSpec inner_spec = 2; - // max_depth (if > 0) is the maximum number of InnerOps allowed (mainly for fixed-depth tries) - int32 max_depth = 3; - // min_depth (if > 0) is the minimum number of InnerOps allowed (mainly for fixed-depth tries) - int32 min_depth = 4; -} - -/* -InnerSpec contains all store-specific structure info to determine if two proofs from a -given store are neighbors. - -This enables: - - isLeftMost(spec: InnerSpec, op: InnerOp) - isRightMost(spec: InnerSpec, op: InnerOp) - isLeftNeighbor(spec: InnerSpec, left: InnerOp, right: InnerOp) -*/ -message InnerSpec { - // Child order is the ordering of the children node, must count from 0 - // iavl tree is [0, 1] (left then right) - // merk is [0, 2, 1] (left, right, here) - repeated int32 child_order = 1; - int32 child_size = 2; - int32 min_prefix_length = 3; - int32 max_prefix_length = 4; - // empty child is the prehash image that is used when one child is nil (eg. 20 bytes of 0) - bytes empty_child = 5; - // hash is the algorithm that must be used for each InnerOp - HashOp hash = 6; -} - -/* -BatchProof is a group of multiple proof types than can be compressed -*/ -message BatchProof { - repeated BatchEntry entries = 1; -} - -// Use BatchEntry not CommitmentProof, to avoid recursion -message BatchEntry { - oneof proof { - ExistenceProof exist = 1; - NonExistenceProof nonexist = 2; - } -} - - -/****** all items here are compressed forms *******/ - -message CompressedBatchProof { - repeated CompressedBatchEntry entries = 1; - repeated InnerOp lookup_inners = 2; -} - -// Use BatchEntry not CommitmentProof, to avoid recursion -message CompressedBatchEntry { - oneof proof { - CompressedExistenceProof exist = 1; - CompressedNonExistenceProof nonexist = 2; - } -} - -message CompressedExistenceProof { - bytes key = 1; - bytes value = 2; - LeafOp leaf = 3; - // these are indexes into the lookup_inners table in CompressedBatchProof - repeated int32 path = 4; -} - -message CompressedNonExistenceProof { - bytes key = 1; // TODO: remove this as unnecessary??? we prove a range - CompressedExistenceProof left = 2; - CompressedExistenceProof right = 3; -} diff --git a/third_party/proto/cosmos/auth/v1beta1/auth.proto b/third_party/proto/cosmos/auth/v1beta1/auth.proto deleted file mode 100644 index 72e1d9ec28..0000000000 --- a/third_party/proto/cosmos/auth/v1beta1/auth.proto +++ /dev/null @@ -1,50 +0,0 @@ -syntax = "proto3"; -package cosmos.auth.v1beta1; - -import "cosmos_proto/cosmos.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/auth/types"; - -// BaseAccount defines a base account type. It contains all the necessary fields -// for basic account functionality. Any custom account type should extend this -// type for additional functionality (e.g. vesting). -message BaseAccount { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.equal) = false; - - option (cosmos_proto.implements_interface) = "AccountI"; - - string address = 1; - google.protobuf.Any pub_key = 2 - [(gogoproto.jsontag) = "public_key,omitempty", (gogoproto.moretags) = "yaml:\"public_key\""]; - uint64 account_number = 3 [(gogoproto.moretags) = "yaml:\"account_number\""]; - uint64 sequence = 4; -} - -// ModuleAccount defines an account for modules that holds coins on a pool. -message ModuleAccount { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - option (cosmos_proto.implements_interface) = "ModuleAccountI"; - - BaseAccount base_account = 1 [(gogoproto.embed) = true, (gogoproto.moretags) = "yaml:\"base_account\""]; - string name = 2; - repeated string permissions = 3; -} - -// Params defines the parameters for the auth module. -message Params { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - uint64 max_memo_characters = 1 [(gogoproto.moretags) = "yaml:\"max_memo_characters\""]; - uint64 tx_sig_limit = 2 [(gogoproto.moretags) = "yaml:\"tx_sig_limit\""]; - uint64 tx_size_cost_per_byte = 3 [(gogoproto.moretags) = "yaml:\"tx_size_cost_per_byte\""]; - uint64 sig_verify_cost_ed25519 = 4 - [(gogoproto.customname) = "SigVerifyCostED25519", (gogoproto.moretags) = "yaml:\"sig_verify_cost_ed25519\""]; - uint64 sig_verify_cost_secp256k1 = 5 - [(gogoproto.customname) = "SigVerifyCostSecp256k1", (gogoproto.moretags) = "yaml:\"sig_verify_cost_secp256k1\""]; -} diff --git a/third_party/proto/cosmos/auth/v1beta1/genesis.proto b/third_party/proto/cosmos/auth/v1beta1/genesis.proto deleted file mode 100644 index c88b94ee4e..0000000000 --- a/third_party/proto/cosmos/auth/v1beta1/genesis.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; -package cosmos.auth.v1beta1; - -import "google/protobuf/any.proto"; -import "gogoproto/gogo.proto"; -import "cosmos/auth/v1beta1/auth.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/auth/types"; - -// GenesisState defines the auth module's genesis state. -message GenesisState { - // params defines all the paramaters of the module. - Params params = 1 [(gogoproto.nullable) = false]; - - // accounts are the accounts present at genesis. - repeated google.protobuf.Any accounts = 2; -} diff --git a/third_party/proto/cosmos/auth/v1beta1/query.proto b/third_party/proto/cosmos/auth/v1beta1/query.proto deleted file mode 100644 index 4d9759cada..0000000000 --- a/third_party/proto/cosmos/auth/v1beta1/query.proto +++ /dev/null @@ -1,74 +0,0 @@ -syntax = "proto3"; -package cosmos.auth.v1beta1; - -import "cosmos/base/query/v1beta1/pagination.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "google/api/annotations.proto"; -import "cosmos/auth/v1beta1/auth.proto"; -import "cosmos_proto/cosmos.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/auth/types"; - -// Query defines the gRPC querier service. -service Query { - // Accounts returns all the existing accounts - // - // Since: cosmos-sdk 0.43 - rpc Accounts(QueryAccountsRequest) returns (QueryAccountsResponse) { - option (google.api.http).get = "/cosmos/auth/v1beta1/accounts"; - } - - // Account returns account details based on address. - rpc Account(QueryAccountRequest) returns (QueryAccountResponse) { - option (google.api.http).get = "/cosmos/auth/v1beta1/accounts/{address}"; - } - - // Params queries all parameters. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/cosmos/auth/v1beta1/params"; - } -} - -// QueryAccountsRequest is the request type for the Query/Accounts RPC method. -// -// Since: cosmos-sdk 0.43 -message QueryAccountsRequest { - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryAccountsResponse is the response type for the Query/Accounts RPC method. -// -// Since: cosmos-sdk 0.43 -message QueryAccountsResponse { - // accounts are the existing accounts - repeated google.protobuf.Any accounts = 1 [(cosmos_proto.accepts_interface) = "AccountI"]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryAccountRequest is the request type for the Query/Account RPC method. -message QueryAccountRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // address defines the address to query for. - string address = 1; -} - -// QueryAccountResponse is the response type for the Query/Account RPC method. -message QueryAccountResponse { - // account defines the account of the corresponding address. - google.protobuf.Any account = 1 [(cosmos_proto.accepts_interface) = "AccountI"]; -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is the response type for the Query/Params RPC method. -message QueryParamsResponse { - // params defines the parameters of the module. - Params params = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/authz/v1beta1/authz.proto b/third_party/proto/cosmos/authz/v1beta1/authz.proto deleted file mode 100644 index 05b1feefa4..0000000000 --- a/third_party/proto/cosmos/authz/v1beta1/authz.proto +++ /dev/null @@ -1,39 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.authz.v1beta1; - -import "cosmos_proto/cosmos.proto"; -import "google/protobuf/timestamp.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/authz"; -option (gogoproto.goproto_getters_all) = false; - -// GenericAuthorization gives the grantee unrestricted permissions to execute -// the provided method on behalf of the granter's account. -message GenericAuthorization { - option (cosmos_proto.implements_interface) = "Authorization"; - - // Msg, identified by it's type URL, to grant unrestricted permissions to execute - string msg = 1; -} - -// Grant gives permissions to execute -// the provide method with expiration time. -message Grant { - google.protobuf.Any authorization = 1 [(cosmos_proto.accepts_interface) = "Authorization"]; - google.protobuf.Timestamp expiration = 2 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; -} - -// GrantAuthorization extends a grant with both the addresses of the grantee and granter. -// It is used in genesis.proto and query.proto -// -// Since: cosmos-sdk 0.45.2 -message GrantAuthorization { - string granter = 1; - string grantee = 2; - - google.protobuf.Any authorization = 3 [(cosmos_proto.accepts_interface) = "Authorization"]; - google.protobuf.Timestamp expiration = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; -} diff --git a/third_party/proto/cosmos/authz/v1beta1/event.proto b/third_party/proto/cosmos/authz/v1beta1/event.proto deleted file mode 100644 index 7a3cf7c8cf..0000000000 --- a/third_party/proto/cosmos/authz/v1beta1/event.proto +++ /dev/null @@ -1,25 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.authz.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/authz"; - -// EventGrant is emitted on Msg/Grant -message EventGrant { - // Msg type URL for which an autorization is granted - string msg_type_url = 2; - // Granter account address - string granter = 3; - // Grantee account address - string grantee = 4; -} - -// EventRevoke is emitted on Msg/Revoke -message EventRevoke { - // Msg type URL for which an autorization is revoked - string msg_type_url = 2; - // Granter account address - string granter = 3; - // Grantee account address - string grantee = 4; -} diff --git a/third_party/proto/cosmos/authz/v1beta1/genesis.proto b/third_party/proto/cosmos/authz/v1beta1/genesis.proto deleted file mode 100644 index 310f62656f..0000000000 --- a/third_party/proto/cosmos/authz/v1beta1/genesis.proto +++ /dev/null @@ -1,13 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.authz.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos/authz/v1beta1/authz.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/authz"; - -// GenesisState defines the authz module's genesis state. -message GenesisState { - repeated GrantAuthorization authorization = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/authz/v1beta1/query.proto b/third_party/proto/cosmos/authz/v1beta1/query.proto deleted file mode 100644 index f668309bed..0000000000 --- a/third_party/proto/cosmos/authz/v1beta1/query.proto +++ /dev/null @@ -1,81 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.authz.v1beta1; - -import "google/api/annotations.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; -import "cosmos/authz/v1beta1/authz.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/authz"; - -// Query defines the gRPC querier service. -service Query { - // Returns list of `Authorization`, granted to the grantee by the granter. - rpc Grants(QueryGrantsRequest) returns (QueryGrantsResponse) { - option (google.api.http).get = "/cosmos/authz/v1beta1/grants"; - } - - // GranterGrants returns list of `GrantAuthorization`, granted by granter. - // - // Since: cosmos-sdk 0.45.2 - rpc GranterGrants(QueryGranterGrantsRequest) returns (QueryGranterGrantsResponse) { - option (google.api.http).get = "/cosmos/authz/v1beta1/grants/granter/{granter}"; - } - - // GranteeGrants returns a list of `GrantAuthorization` by grantee. - // - // Since: cosmos-sdk 0.45.2 - rpc GranteeGrants(QueryGranteeGrantsRequest) returns (QueryGranteeGrantsResponse) { - option (google.api.http).get = "/cosmos/authz/v1beta1/grants/grantee/{grantee}"; - } -} - -// QueryGrantsRequest is the request type for the Query/Grants RPC method. -message QueryGrantsRequest { - string granter = 1; - string grantee = 2; - // Optional, msg_type_url, when set, will query only grants matching given msg type. - string msg_type_url = 3; - // pagination defines an pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 4; -} - -// QueryGrantsResponse is the response type for the Query/Authorizations RPC method. -message QueryGrantsResponse { - // authorizations is a list of grants granted for grantee by granter. - repeated Grant grants = 1; - // pagination defines an pagination for the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryGranterGrantsRequest is the request type for the Query/GranterGrants RPC method. -message QueryGranterGrantsRequest { - string granter = 1; - - // pagination defines an pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryGranterGrantsResponse is the response type for the Query/GranterGrants RPC method. -message QueryGranterGrantsResponse { - // grants is a list of grants granted by the granter. - repeated GrantAuthorization grants = 1; - // pagination defines an pagination for the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryGranteeGrantsRequest is the request type for the Query/IssuedGrants RPC method. -message QueryGranteeGrantsRequest { - string grantee = 1; - - // pagination defines an pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryGranteeGrantsResponse is the response type for the Query/GranteeGrants RPC method. -message QueryGranteeGrantsResponse { - // grants is a list of grants granted to the grantee. - repeated GrantAuthorization grants = 1; - // pagination defines an pagination for the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} diff --git a/third_party/proto/cosmos/authz/v1beta1/tx.proto b/third_party/proto/cosmos/authz/v1beta1/tx.proto deleted file mode 100644 index 457f0d662a..0000000000 --- a/third_party/proto/cosmos/authz/v1beta1/tx.proto +++ /dev/null @@ -1,70 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.authz.v1beta1; - -import "cosmos_proto/cosmos.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/timestamp.proto"; -import "google/protobuf/any.proto"; -import "cosmos/base/abci/v1beta1/abci.proto"; -import "cosmos/authz/v1beta1/authz.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/authz"; -option (gogoproto.goproto_getters_all) = false; - -// Msg defines the authz Msg service. -service Msg { - // Grant grants the provided authorization to the grantee on the granter's - // account with the provided expiration time. If there is already a grant - // for the given (granter, grantee, Authorization) triple, then the grant - // will be overwritten. - rpc Grant(MsgGrant) returns (MsgGrantResponse); - - // Exec attempts to execute the provided messages using - // authorizations granted to the grantee. Each message should have only - // one signer corresponding to the granter of the authorization. - rpc Exec(MsgExec) returns (MsgExecResponse); - - // Revoke revokes any authorization corresponding to the provided method name on the - // granter's account that has been granted to the grantee. - rpc Revoke(MsgRevoke) returns (MsgRevokeResponse); -} - -// MsgGrant is a request type for Grant method. It declares authorization to the grantee -// on behalf of the granter with the provided expiration time. -message MsgGrant { - string granter = 1; - string grantee = 2; - - cosmos.authz.v1beta1.Grant grant = 3 [(gogoproto.nullable) = false]; -} - -// MsgExecResponse defines the Msg/MsgExecResponse response type. -message MsgExecResponse { - repeated bytes results = 1; -} - -// MsgExec attempts to execute the provided messages using -// authorizations granted to the grantee. Each message should have only -// one signer corresponding to the granter of the authorization. -message MsgExec { - string grantee = 1; - // Authorization Msg requests to execute. Each msg must implement Authorization interface - // The x/authz will try to find a grant matching (msg.signers[0], grantee, MsgTypeURL(msg)) - // triple and validate it. - repeated google.protobuf.Any msgs = 2 [(cosmos_proto.accepts_interface) = "sdk.Msg, authz.Authorization"]; -} - -// MsgGrantResponse defines the Msg/MsgGrant response type. -message MsgGrantResponse {} - -// MsgRevoke revokes any authorization with the provided sdk.Msg type on the -// granter's account with that has been granted to the grantee. -message MsgRevoke { - string granter = 1; - string grantee = 2; - string msg_type_url = 3; -} - -// MsgRevokeResponse defines the Msg/MsgRevokeResponse response type. -message MsgRevokeResponse {} diff --git a/third_party/proto/cosmos/bank/v1beta1/authz.proto b/third_party/proto/cosmos/bank/v1beta1/authz.proto deleted file mode 100644 index 4f58b15e49..0000000000 --- a/third_party/proto/cosmos/bank/v1beta1/authz.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; -package cosmos.bank.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos_proto/cosmos.proto"; -import "cosmos/base/v1beta1/coin.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/bank/types"; - -// SendAuthorization allows the grantee to spend up to spend_limit coins from -// the granter's account. -// -// Since: cosmos-sdk 0.43 -message SendAuthorization { - option (cosmos_proto.implements_interface) = "Authorization"; - - repeated cosmos.base.v1beta1.Coin spend_limit = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; -} diff --git a/third_party/proto/cosmos/bank/v1beta1/bank.proto b/third_party/proto/cosmos/bank/v1beta1/bank.proto deleted file mode 100644 index df91008df6..0000000000 --- a/third_party/proto/cosmos/bank/v1beta1/bank.proto +++ /dev/null @@ -1,96 +0,0 @@ -syntax = "proto3"; -package cosmos.bank.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos_proto/cosmos.proto"; -import "cosmos/base/v1beta1/coin.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/bank/types"; - -// Params defines the parameters for the bank module. -message Params { - option (gogoproto.goproto_stringer) = false; - repeated SendEnabled send_enabled = 1 [(gogoproto.moretags) = "yaml:\"send_enabled,omitempty\""]; - bool default_send_enabled = 2 [(gogoproto.moretags) = "yaml:\"default_send_enabled,omitempty\""]; -} - -// SendEnabled maps coin denom to a send_enabled status (whether a denom is -// sendable). -message SendEnabled { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - string denom = 1; - bool enabled = 2; -} - -// Input models transaction input. -message Input { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string address = 1; - repeated cosmos.base.v1beta1.Coin coins = 2 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; -} - -// Output models transaction outputs. -message Output { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string address = 1; - repeated cosmos.base.v1beta1.Coin coins = 2 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; -} - -// Supply represents a struct that passively keeps track of the total supply -// amounts in the network. -// This message is deprecated now that supply is indexed by denom. -message Supply { - option deprecated = true; - - option (gogoproto.equal) = true; - option (gogoproto.goproto_getters) = false; - - option (cosmos_proto.implements_interface) = "*github.com/cosmos/cosmos-sdk/x/bank/legacy/v040.SupplyI"; - - repeated cosmos.base.v1beta1.Coin total = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; -} - -// DenomUnit represents a struct that describes a given -// denomination unit of the basic token. -message DenomUnit { - // denom represents the string name of the given denom unit (e.g uatom). - string denom = 1; - // exponent represents power of 10 exponent that one must - // raise the base_denom to in order to equal the given DenomUnit's denom - // 1 denom = 1^exponent base_denom - // (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with - // exponent = 6, thus: 1 atom = 10^6 uatom). - uint32 exponent = 2; - // aliases is a list of string aliases for the given denom - repeated string aliases = 3; -} - -// Metadata represents a struct that describes -// a basic token. -message Metadata { - string description = 1; - // denom_units represents the list of DenomUnit's for a given coin - repeated DenomUnit denom_units = 2; - // base represents the base denom (should be the DenomUnit with exponent = 0). - string base = 3; - // display indicates the suggested denom that should be - // displayed in clients. - string display = 4; - // name defines the name of the token (eg: Cosmos Atom) - // - // Since: cosmos-sdk 0.43 - string name = 5; - // symbol is the token symbol usually shown on exchanges (eg: ATOM). This can - // be the same as the display. - // - // Since: cosmos-sdk 0.43 - string symbol = 6; -} diff --git a/third_party/proto/cosmos/bank/v1beta1/genesis.proto b/third_party/proto/cosmos/bank/v1beta1/genesis.proto deleted file mode 100644 index 8fd7329a0a..0000000000 --- a/third_party/proto/cosmos/bank/v1beta1/genesis.proto +++ /dev/null @@ -1,39 +0,0 @@ -syntax = "proto3"; -package cosmos.bank.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos/bank/v1beta1/bank.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/bank/types"; - -// GenesisState defines the bank module's genesis state. -message GenesisState { - // params defines all the paramaters of the module. - Params params = 1 [(gogoproto.nullable) = false]; - - // balances is an array containing the balances of all the accounts. - repeated Balance balances = 2 [(gogoproto.nullable) = false]; - - // supply represents the total supply. If it is left empty, then supply will be calculated based on the provided - // balances. Otherwise, it will be used to validate that the sum of the balances equals this amount. - repeated cosmos.base.v1beta1.Coin supply = 3 - [(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", (gogoproto.nullable) = false]; - - // denom_metadata defines the metadata of the differents coins. - repeated Metadata denom_metadata = 4 [(gogoproto.moretags) = "yaml:\"denom_metadata\"", (gogoproto.nullable) = false]; -} - -// Balance defines an account address and balance pair used in the bank module's -// genesis state. -message Balance { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // address is the address of the balance holder. - string address = 1; - - // coins defines the different coins this balance holds. - repeated cosmos.base.v1beta1.Coin coins = 2 - [(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", (gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/bank/v1beta1/query.proto b/third_party/proto/cosmos/bank/v1beta1/query.proto deleted file mode 100644 index a567e073f3..0000000000 --- a/third_party/proto/cosmos/bank/v1beta1/query.proto +++ /dev/null @@ -1,193 +0,0 @@ -syntax = "proto3"; -package cosmos.bank.v1beta1; - -import "cosmos/base/query/v1beta1/pagination.proto"; -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos/bank/v1beta1/bank.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/bank/types"; - -// Query defines the gRPC querier service. -service Query { - // Balance queries the balance of a single coin for a single account. - rpc Balance(QueryBalanceRequest) returns (QueryBalanceResponse) { - option (google.api.http).get = "/cosmos/bank/v1beta1/balances/{address}/by_denom"; - } - - // AllBalances queries the balance of all coins for a single account. - rpc AllBalances(QueryAllBalancesRequest) returns (QueryAllBalancesResponse) { - option (google.api.http).get = "/cosmos/bank/v1beta1/balances/{address}"; - } - - // SpendableBalances queries the spenable balance of all coins for a single - // account. - rpc SpendableBalances(QuerySpendableBalancesRequest) returns (QuerySpendableBalancesResponse) { - option (google.api.http).get = "/cosmos/bank/v1beta1/spendable_balances/{address}"; - } - - // TotalSupply queries the total supply of all coins. - rpc TotalSupply(QueryTotalSupplyRequest) returns (QueryTotalSupplyResponse) { - option (google.api.http).get = "/cosmos/bank/v1beta1/supply"; - } - - // SupplyOf queries the supply of a single coin. - rpc SupplyOf(QuerySupplyOfRequest) returns (QuerySupplyOfResponse) { - option (google.api.http).get = "/cosmos/bank/v1beta1/supply/{denom}"; - } - - // Params queries the parameters of x/bank module. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/cosmos/bank/v1beta1/params"; - } - - // DenomsMetadata queries the client metadata of a given coin denomination. - rpc DenomMetadata(QueryDenomMetadataRequest) returns (QueryDenomMetadataResponse) { - option (google.api.http).get = "/cosmos/bank/v1beta1/denoms_metadata/{denom}"; - } - - // DenomsMetadata queries the client metadata for all registered coin denominations. - rpc DenomsMetadata(QueryDenomsMetadataRequest) returns (QueryDenomsMetadataResponse) { - option (google.api.http).get = "/cosmos/bank/v1beta1/denoms_metadata"; - } -} - -// QueryBalanceRequest is the request type for the Query/Balance RPC method. -message QueryBalanceRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // address is the address to query balances for. - string address = 1; - - // denom is the coin denom to query balances for. - string denom = 2; -} - -// QueryBalanceResponse is the response type for the Query/Balance RPC method. -message QueryBalanceResponse { - // balance is the balance of the coin. - cosmos.base.v1beta1.Coin balance = 1; -} - -// QueryBalanceRequest is the request type for the Query/AllBalances RPC method. -message QueryAllBalancesRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // address is the address to query balances for. - string address = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryAllBalancesResponse is the response type for the Query/AllBalances RPC -// method. -message QueryAllBalancesResponse { - // balances is the balances of all the coins. - repeated cosmos.base.v1beta1.Coin balances = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QuerySpendableBalancesRequest defines the gRPC request structure for querying -// an account's spendable balances. -message QuerySpendableBalancesRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // address is the address to query spendable balances for. - string address = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QuerySpendableBalancesResponse defines the gRPC response structure for querying -// an account's spendable balances. -message QuerySpendableBalancesResponse { - // balances is the spendable balances of all the coins. - repeated cosmos.base.v1beta1.Coin balances = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryTotalSupplyRequest is the request type for the Query/TotalSupply RPC -// method. -message QueryTotalSupplyRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // pagination defines an optional pagination for the request. - // - // Since: cosmos-sdk 0.43 - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryTotalSupplyResponse is the response type for the Query/TotalSupply RPC -// method -message QueryTotalSupplyResponse { - // supply is the supply of the coins - repeated cosmos.base.v1beta1.Coin supply = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; - - // pagination defines the pagination in the response. - // - // Since: cosmos-sdk 0.43 - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QuerySupplyOfRequest is the request type for the Query/SupplyOf RPC method. -message QuerySupplyOfRequest { - // denom is the coin denom to query balances for. - string denom = 1; -} - -// QuerySupplyOfResponse is the response type for the Query/SupplyOf RPC method. -message QuerySupplyOfResponse { - // amount is the supply of the coin. - cosmos.base.v1beta1.Coin amount = 1 [(gogoproto.nullable) = false]; -} - -// QueryParamsRequest defines the request type for querying x/bank parameters. -message QueryParamsRequest {} - -// QueryParamsResponse defines the response type for querying x/bank parameters. -message QueryParamsResponse { - Params params = 1 [(gogoproto.nullable) = false]; -} - -// QueryDenomsMetadataRequest is the request type for the Query/DenomsMetadata RPC method. -message QueryDenomsMetadataRequest { - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryDenomsMetadataResponse is the response type for the Query/DenomsMetadata RPC -// method. -message QueryDenomsMetadataResponse { - // metadata provides the client information for all the registered tokens. - repeated Metadata metadatas = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryDenomMetadataRequest is the request type for the Query/DenomMetadata RPC method. -message QueryDenomMetadataRequest { - // denom is the coin denom to query the metadata for. - string denom = 1; -} - -// QueryDenomMetadataResponse is the response type for the Query/DenomMetadata RPC -// method. -message QueryDenomMetadataResponse { - // metadata describes and provides all the client information for the requested token. - Metadata metadata = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/bank/v1beta1/tx.proto b/third_party/proto/cosmos/bank/v1beta1/tx.proto deleted file mode 100644 index 26b2ab41f4..0000000000 --- a/third_party/proto/cosmos/bank/v1beta1/tx.proto +++ /dev/null @@ -1,42 +0,0 @@ -syntax = "proto3"; -package cosmos.bank.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos/bank/v1beta1/bank.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/bank/types"; - -// Msg defines the bank Msg service. -service Msg { - // Send defines a method for sending coins from one account to another account. - rpc Send(MsgSend) returns (MsgSendResponse); - - // MultiSend defines a method for sending coins from some accounts to other accounts. - rpc MultiSend(MsgMultiSend) returns (MsgMultiSendResponse); -} - -// MsgSend represents a message to send coins from one account to another. -message MsgSend { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string from_address = 1 [(gogoproto.moretags) = "yaml:\"from_address\""]; - string to_address = 2 [(gogoproto.moretags) = "yaml:\"to_address\""]; - repeated cosmos.base.v1beta1.Coin amount = 3 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; -} - -// MsgSendResponse defines the Msg/Send response type. -message MsgSendResponse {} - -// MsgMultiSend represents an arbitrary multi-in, multi-out send message. -message MsgMultiSend { - option (gogoproto.equal) = false; - - repeated Input inputs = 1 [(gogoproto.nullable) = false]; - repeated Output outputs = 2 [(gogoproto.nullable) = false]; -} - -// MsgMultiSendResponse defines the Msg/MultiSend response type. -message MsgMultiSendResponse {} diff --git a/third_party/proto/cosmos/base/abci/v1beta1/abci.proto b/third_party/proto/cosmos/base/abci/v1beta1/abci.proto deleted file mode 100644 index e24ae7bd5e..0000000000 --- a/third_party/proto/cosmos/base/abci/v1beta1/abci.proto +++ /dev/null @@ -1,144 +0,0 @@ -syntax = "proto3"; -package cosmos.base.abci.v1beta1; - -import "gogoproto/gogo.proto"; -import "tendermint/abci/types.proto"; -import "google/protobuf/any.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/types"; -option (gogoproto.goproto_stringer_all) = false; - -// TxResponse defines a structure containing relevant tx data and metadata. The -// tags are stringified and the log is JSON decoded. -message TxResponse { - option (gogoproto.goproto_getters) = false; - // The block height - int64 height = 1; - // The transaction hash. - string txhash = 2 [(gogoproto.customname) = "TxHash"]; - // Namespace for the Code - string codespace = 3; - // Response code. - uint32 code = 4; - // Result bytes, if any. - string data = 5; - // The output of the application's logger (raw string). May be - // non-deterministic. - string raw_log = 6; - // The output of the application's logger (typed). May be non-deterministic. - repeated ABCIMessageLog logs = 7 [(gogoproto.castrepeated) = "ABCIMessageLogs", (gogoproto.nullable) = false]; - // Additional information. May be non-deterministic. - string info = 8; - // Amount of gas requested for transaction. - int64 gas_wanted = 9; - // Amount of gas consumed by transaction. - int64 gas_used = 10; - // The request transaction bytes. - google.protobuf.Any tx = 11; - // Time of the previous block. For heights > 1, it's the weighted median of - // the timestamps of the valid votes in the block.LastCommit. For height == 1, - // it's genesis time. - string timestamp = 12; - // Events defines all the events emitted by processing a transaction. Note, - // these events include those emitted by processing all the messages and those - // emitted from the ante handler. Whereas Logs contains the events, with - // additional metadata, emitted only by processing the messages. - // - // Since: cosmos-sdk 0.42.11, 0.44.5, 0.45 - repeated tendermint.abci.Event events = 13 [(gogoproto.nullable) = false]; -} - -// ABCIMessageLog defines a structure containing an indexed tx ABCI message log. -message ABCIMessageLog { - option (gogoproto.stringer) = true; - - uint32 msg_index = 1; - string log = 2; - - // Events contains a slice of Event objects that were emitted during some - // execution. - repeated StringEvent events = 3 [(gogoproto.castrepeated) = "StringEvents", (gogoproto.nullable) = false]; -} - -// StringEvent defines en Event object wrapper where all the attributes -// contain key/value pairs that are strings instead of raw bytes. -message StringEvent { - option (gogoproto.stringer) = true; - - string type = 1; - repeated Attribute attributes = 2 [(gogoproto.nullable) = false]; -} - -// Attribute defines an attribute wrapper where the key and value are -// strings instead of raw bytes. -message Attribute { - string key = 1; - string value = 2; -} - -// GasInfo defines tx execution gas context. -message GasInfo { - // GasWanted is the maximum units of work we allow this tx to perform. - uint64 gas_wanted = 1 [(gogoproto.moretags) = "yaml:\"gas_wanted\""]; - - // GasUsed is the amount of gas actually consumed. - uint64 gas_used = 2 [(gogoproto.moretags) = "yaml:\"gas_used\""]; -} - -// Result is the union of ResponseFormat and ResponseCheckTx. -message Result { - option (gogoproto.goproto_getters) = false; - - // Data is any data returned from message or handler execution. It MUST be - // length prefixed in order to separate data from multiple message executions. - bytes data = 1; - - // Log contains the log information from message or handler execution. - string log = 2; - - // Events contains a slice of Event objects that were emitted during message - // or handler execution. - repeated tendermint.abci.Event events = 3 [(gogoproto.nullable) = false]; -} - -// SimulationResponse defines the response generated when a transaction is -// successfully simulated. -message SimulationResponse { - GasInfo gas_info = 1 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - Result result = 2; -} - -// MsgData defines the data returned in a Result object during message -// execution. -message MsgData { - option (gogoproto.stringer) = true; - - string msg_type = 1; - bytes data = 2; -} - -// TxMsgData defines a list of MsgData. A transaction will have a MsgData object -// for each message. -message TxMsgData { - option (gogoproto.stringer) = true; - - repeated MsgData data = 1; -} - -// SearchTxsResult defines a structure for querying txs pageable -message SearchTxsResult { - option (gogoproto.stringer) = true; - - // Count of all txs - uint64 total_count = 1 [(gogoproto.moretags) = "yaml:\"total_count\"", (gogoproto.jsontag) = "total_count"]; - // Count of txs in current page - uint64 count = 2; - // Index of current page, start from 1 - uint64 page_number = 3 [(gogoproto.moretags) = "yaml:\"page_number\"", (gogoproto.jsontag) = "page_number"]; - // Count of total pages - uint64 page_total = 4 [(gogoproto.moretags) = "yaml:\"page_total\"", (gogoproto.jsontag) = "page_total"]; - // Max count txs per page - uint64 limit = 5; - // List of txs in current page - repeated TxResponse txs = 6; -} diff --git a/third_party/proto/cosmos/base/kv/v1beta1/kv.proto b/third_party/proto/cosmos/base/kv/v1beta1/kv.proto deleted file mode 100644 index 4e9b8d2850..0000000000 --- a/third_party/proto/cosmos/base/kv/v1beta1/kv.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; -package cosmos.base.kv.v1beta1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/types/kv"; - -// Pairs defines a repeated slice of Pair objects. -message Pairs { - repeated Pair pairs = 1 [(gogoproto.nullable) = false]; -} - -// Pair defines a key/value bytes tuple. -message Pair { - bytes key = 1; - bytes value = 2; -} diff --git a/third_party/proto/cosmos/base/query/v1beta1/pagination.proto b/third_party/proto/cosmos/base/query/v1beta1/pagination.proto deleted file mode 100644 index cd5eb066d3..0000000000 --- a/third_party/proto/cosmos/base/query/v1beta1/pagination.proto +++ /dev/null @@ -1,55 +0,0 @@ -syntax = "proto3"; -package cosmos.base.query.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/types/query"; - -// PageRequest is to be embedded in gRPC request messages for efficient -// pagination. Ex: -// -// message SomeRequest { -// Foo some_parameter = 1; -// PageRequest pagination = 2; -// } -message PageRequest { - // key is a value returned in PageResponse.next_key to begin - // querying the next page most efficiently. Only one of offset or key - // should be set. - bytes key = 1; - - // offset is a numeric offset that can be used when key is unavailable. - // It is less efficient than using key. Only one of offset or key should - // be set. - uint64 offset = 2; - - // limit is the total number of results to be returned in the result page. - // If left empty it will default to a value to be set by each app. - uint64 limit = 3; - - // count_total is set to true to indicate that the result set should include - // a count of the total number of items available for pagination in UIs. - // count_total is only respected when offset is used. It is ignored when key - // is set. - bool count_total = 4; - - // reverse is set to true if results are to be returned in the descending order. - // - // Since: cosmos-sdk 0.43 - bool reverse = 5; -} - -// PageResponse is to be embedded in gRPC response messages where the -// corresponding request message has used PageRequest. -// -// message SomeResponse { -// repeated Bar results = 1; -// PageResponse page = 2; -// } -message PageResponse { - // next_key is the key to be passed to PageRequest.key to - // query the next page most efficiently - bytes next_key = 1; - - // total is total number of results available if PageRequest.count_total - // was set, its value is undefined otherwise - uint64 total = 2; -} diff --git a/third_party/proto/cosmos/base/reflection/v1beta1/reflection.proto b/third_party/proto/cosmos/base/reflection/v1beta1/reflection.proto deleted file mode 100644 index 22670e72b8..0000000000 --- a/third_party/proto/cosmos/base/reflection/v1beta1/reflection.proto +++ /dev/null @@ -1,44 +0,0 @@ -syntax = "proto3"; -package cosmos.base.reflection.v1beta1; - -import "google/api/annotations.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/client/grpc/reflection"; - -// ReflectionService defines a service for interface reflection. -service ReflectionService { - // ListAllInterfaces lists all the interfaces registered in the interface - // registry. - rpc ListAllInterfaces(ListAllInterfacesRequest) returns (ListAllInterfacesResponse) { - option (google.api.http).get = "/cosmos/base/reflection/v1beta1/interfaces"; - }; - - // ListImplementations list all the concrete types that implement a given - // interface. - rpc ListImplementations(ListImplementationsRequest) returns (ListImplementationsResponse) { - option (google.api.http).get = "/cosmos/base/reflection/v1beta1/interfaces/" - "{interface_name}/implementations"; - }; -} - -// ListAllInterfacesRequest is the request type of the ListAllInterfaces RPC. -message ListAllInterfacesRequest {} - -// ListAllInterfacesResponse is the response type of the ListAllInterfaces RPC. -message ListAllInterfacesResponse { - // interface_names is an array of all the registered interfaces. - repeated string interface_names = 1; -} - -// ListImplementationsRequest is the request type of the ListImplementations -// RPC. -message ListImplementationsRequest { - // interface_name defines the interface to query the implementations for. - string interface_name = 1; -} - -// ListImplementationsResponse is the response type of the ListImplementations -// RPC. -message ListImplementationsResponse { - repeated string implementation_message_names = 1; -} diff --git a/third_party/proto/cosmos/base/reflection/v2alpha1/reflection.proto b/third_party/proto/cosmos/base/reflection/v2alpha1/reflection.proto deleted file mode 100644 index d5b048558f..0000000000 --- a/third_party/proto/cosmos/base/reflection/v2alpha1/reflection.proto +++ /dev/null @@ -1,218 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.base.reflection.v2alpha1; - -import "google/api/annotations.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/server/grpc/reflection/v2alpha1"; - -// AppDescriptor describes a cosmos-sdk based application -message AppDescriptor { - // AuthnDescriptor provides information on how to authenticate transactions on the application - // NOTE: experimental and subject to change in future releases. - AuthnDescriptor authn = 1; - // chain provides the chain descriptor - ChainDescriptor chain = 2; - // codec provides metadata information regarding codec related types - CodecDescriptor codec = 3; - // configuration provides metadata information regarding the sdk.Config type - ConfigurationDescriptor configuration = 4; - // query_services provides metadata information regarding the available queriable endpoints - QueryServicesDescriptor query_services = 5; - // tx provides metadata information regarding how to send transactions to the given application - TxDescriptor tx = 6; -} - -// TxDescriptor describes the accepted transaction type -message TxDescriptor { - // fullname is the protobuf fullname of the raw transaction type (for instance the tx.Tx type) - // it is not meant to support polymorphism of transaction types, it is supposed to be used by - // reflection clients to understand if they can handle a specific transaction type in an application. - string fullname = 1; - // msgs lists the accepted application messages (sdk.Msg) - repeated MsgDescriptor msgs = 2; -} - -// AuthnDescriptor provides information on how to sign transactions without relying -// on the online RPCs GetTxMetadata and CombineUnsignedTxAndSignatures -message AuthnDescriptor { - // sign_modes defines the supported signature algorithm - repeated SigningModeDescriptor sign_modes = 1; -} - -// SigningModeDescriptor provides information on a signing flow of the application -// NOTE(fdymylja): here we could go as far as providing an entire flow on how -// to sign a message given a SigningModeDescriptor, but it's better to think about -// this another time -message SigningModeDescriptor { - // name defines the unique name of the signing mode - string name = 1; - // number is the unique int32 identifier for the sign_mode enum - int32 number = 2; - // authn_info_provider_method_fullname defines the fullname of the method to call to get - // the metadata required to authenticate using the provided sign_modes - string authn_info_provider_method_fullname = 3; -} - -// ChainDescriptor describes chain information of the application -message ChainDescriptor { - // id is the chain id - string id = 1; -} - -// CodecDescriptor describes the registered interfaces and provides metadata information on the types -message CodecDescriptor { - // interfaces is a list of the registerted interfaces descriptors - repeated InterfaceDescriptor interfaces = 1; -} - -// InterfaceDescriptor describes the implementation of an interface -message InterfaceDescriptor { - // fullname is the name of the interface - string fullname = 1; - // interface_accepting_messages contains information regarding the proto messages which contain the interface as - // google.protobuf.Any field - repeated InterfaceAcceptingMessageDescriptor interface_accepting_messages = 2; - // interface_implementers is a list of the descriptors of the interface implementers - repeated InterfaceImplementerDescriptor interface_implementers = 3; -} - -// InterfaceImplementerDescriptor describes an interface implementer -message InterfaceImplementerDescriptor { - // fullname is the protobuf queryable name of the interface implementer - string fullname = 1; - // type_url defines the type URL used when marshalling the type as any - // this is required so we can provide type safe google.protobuf.Any marshalling and - // unmarshalling, making sure that we don't accept just 'any' type - // in our interface fields - string type_url = 2; -} - -// InterfaceAcceptingMessageDescriptor describes a protobuf message which contains -// an interface represented as a google.protobuf.Any -message InterfaceAcceptingMessageDescriptor { - // fullname is the protobuf fullname of the type containing the interface - string fullname = 1; - // field_descriptor_names is a list of the protobuf name (not fullname) of the field - // which contains the interface as google.protobuf.Any (the interface is the same, but - // it can be in multiple fields of the same proto message) - repeated string field_descriptor_names = 2; -} - -// ConfigurationDescriptor contains metadata information on the sdk.Config -message ConfigurationDescriptor { - // bech32_account_address_prefix is the account address prefix - string bech32_account_address_prefix = 1; -} - -// MsgDescriptor describes a cosmos-sdk message that can be delivered with a transaction -message MsgDescriptor { - // msg_type_url contains the TypeURL of a sdk.Msg. - string msg_type_url = 1; -} - -// ReflectionService defines a service for application reflection. -service ReflectionService { - // GetAuthnDescriptor returns information on how to authenticate transactions in the application - // NOTE: this RPC is still experimental and might be subject to breaking changes or removal in - // future releases of the cosmos-sdk. - rpc GetAuthnDescriptor(GetAuthnDescriptorRequest) returns (GetAuthnDescriptorResponse) { - option (google.api.http).get = "/cosmos/base/reflection/v1beta1/app_descriptor/authn"; - } - // GetChainDescriptor returns the description of the chain - rpc GetChainDescriptor(GetChainDescriptorRequest) returns (GetChainDescriptorResponse) { - option (google.api.http).get = "/cosmos/base/reflection/v1beta1/app_descriptor/chain"; - }; - // GetCodecDescriptor returns the descriptor of the codec of the application - rpc GetCodecDescriptor(GetCodecDescriptorRequest) returns (GetCodecDescriptorResponse) { - option (google.api.http).get = "/cosmos/base/reflection/v1beta1/app_descriptor/codec"; - } - // GetConfigurationDescriptor returns the descriptor for the sdk.Config of the application - rpc GetConfigurationDescriptor(GetConfigurationDescriptorRequest) returns (GetConfigurationDescriptorResponse) { - option (google.api.http).get = "/cosmos/base/reflection/v1beta1/app_descriptor/configuration"; - } - // GetQueryServicesDescriptor returns the available gRPC queryable services of the application - rpc GetQueryServicesDescriptor(GetQueryServicesDescriptorRequest) returns (GetQueryServicesDescriptorResponse) { - option (google.api.http).get = "/cosmos/base/reflection/v1beta1/app_descriptor/query_services"; - } - // GetTxDescriptor returns information on the used transaction object and available msgs that can be used - rpc GetTxDescriptor(GetTxDescriptorRequest) returns (GetTxDescriptorResponse) { - option (google.api.http).get = "/cosmos/base/reflection/v1beta1/app_descriptor/tx_descriptor"; - } -} - -// GetAuthnDescriptorRequest is the request used for the GetAuthnDescriptor RPC -message GetAuthnDescriptorRequest {} -// GetAuthnDescriptorResponse is the response returned by the GetAuthnDescriptor RPC -message GetAuthnDescriptorResponse { - // authn describes how to authenticate to the application when sending transactions - AuthnDescriptor authn = 1; -} - -// GetChainDescriptorRequest is the request used for the GetChainDescriptor RPC -message GetChainDescriptorRequest {} -// GetChainDescriptorResponse is the response returned by the GetChainDescriptor RPC -message GetChainDescriptorResponse { - // chain describes application chain information - ChainDescriptor chain = 1; -} - -// GetCodecDescriptorRequest is the request used for the GetCodecDescriptor RPC -message GetCodecDescriptorRequest {} -// GetCodecDescriptorResponse is the response returned by the GetCodecDescriptor RPC -message GetCodecDescriptorResponse { - // codec describes the application codec such as registered interfaces and implementations - CodecDescriptor codec = 1; -} - -// GetConfigurationDescriptorRequest is the request used for the GetConfigurationDescriptor RPC -message GetConfigurationDescriptorRequest {} -// GetConfigurationDescriptorResponse is the response returned by the GetConfigurationDescriptor RPC -message GetConfigurationDescriptorResponse { - // config describes the application's sdk.Config - ConfigurationDescriptor config = 1; -} - -// GetQueryServicesDescriptorRequest is the request used for the GetQueryServicesDescriptor RPC -message GetQueryServicesDescriptorRequest {} -// GetQueryServicesDescriptorResponse is the response returned by the GetQueryServicesDescriptor RPC -message GetQueryServicesDescriptorResponse { - // queries provides information on the available queryable services - QueryServicesDescriptor queries = 1; -} - -// GetTxDescriptorRequest is the request used for the GetTxDescriptor RPC -message GetTxDescriptorRequest {} -// GetTxDescriptorResponse is the response returned by the GetTxDescriptor RPC -message GetTxDescriptorResponse { - // tx provides information on msgs that can be forwarded to the application - // alongside the accepted transaction protobuf type - TxDescriptor tx = 1; -} - -// QueryServicesDescriptor contains the list of cosmos-sdk queriable services -message QueryServicesDescriptor { - // query_services is a list of cosmos-sdk QueryServiceDescriptor - repeated QueryServiceDescriptor query_services = 1; -} - -// QueryServiceDescriptor describes a cosmos-sdk queryable service -message QueryServiceDescriptor { - // fullname is the protobuf fullname of the service descriptor - string fullname = 1; - // is_module describes if this service is actually exposed by an application's module - bool is_module = 2; - // methods provides a list of query service methods - repeated QueryMethodDescriptor methods = 3; -} - -// QueryMethodDescriptor describes a queryable method of a query service -// no other info is provided beside method name and tendermint queryable path -// because it would be redundant with the grpc reflection service -message QueryMethodDescriptor { - // name is the protobuf name (not fullname) of the method - string name = 1; - // full_query_path is the path that can be used to query - // this method via tendermint abci.Query - string full_query_path = 2; -} diff --git a/third_party/proto/cosmos/base/snapshots/v1beta1/snapshot.proto b/third_party/proto/cosmos/base/snapshots/v1beta1/snapshot.proto deleted file mode 100644 index 6dcc4a933a..0000000000 --- a/third_party/proto/cosmos/base/snapshots/v1beta1/snapshot.proto +++ /dev/null @@ -1,57 +0,0 @@ -syntax = "proto3"; -package cosmos.base.snapshots.v1beta1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/snapshots/types"; - -// Snapshot contains Tendermint state sync snapshot info. -message Snapshot { - uint64 height = 1; - uint32 format = 2; - uint32 chunks = 3; - bytes hash = 4; - Metadata metadata = 5 [(gogoproto.nullable) = false]; -} - -// Metadata contains SDK-specific snapshot metadata. -message Metadata { - repeated bytes chunk_hashes = 1; // SHA-256 chunk hashes -} - -// SnapshotItem is an item contained in a rootmulti.Store snapshot. -message SnapshotItem { - // item is the specific type of snapshot item. - oneof item { - SnapshotStoreItem store = 1; - SnapshotIAVLItem iavl = 2 [(gogoproto.customname) = "IAVL"]; - SnapshotExtensionMeta extension = 3; - SnapshotExtensionPayload extension_payload = 4; - } -} - -// SnapshotStoreItem contains metadata about a snapshotted store. -message SnapshotStoreItem { - string name = 1; -} - -// SnapshotIAVLItem is an exported IAVL node. -message SnapshotIAVLItem { - bytes key = 1; - bytes value = 2; - // version is block height - int64 version = 3; - // height is depth of the tree. - int32 height = 4; -} - -// SnapshotExtensionMeta contains metadata about an external snapshotter. -message SnapshotExtensionMeta { - string name = 1; - uint32 format = 2; -} - -// SnapshotExtensionPayload contains payloads of an external snapshotter. -message SnapshotExtensionPayload { - bytes payload = 1; -} diff --git a/third_party/proto/cosmos/base/store/v1beta1/commit_info.proto b/third_party/proto/cosmos/base/store/v1beta1/commit_info.proto deleted file mode 100644 index 98a33d30e7..0000000000 --- a/third_party/proto/cosmos/base/store/v1beta1/commit_info.proto +++ /dev/null @@ -1,29 +0,0 @@ -syntax = "proto3"; -package cosmos.base.store.v1beta1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/store/types"; - -// CommitInfo defines commit information used by the multi-store when committing -// a version/height. -message CommitInfo { - int64 version = 1; - repeated StoreInfo store_infos = 2 [(gogoproto.nullable) = false]; -} - -// StoreInfo defines store-specific commit information. It contains a reference -// between a store name and the commit ID. -message StoreInfo { - string name = 1; - CommitID commit_id = 2 [(gogoproto.nullable) = false]; -} - -// CommitID defines the committment information when a specific store is -// committed. -message CommitID { - option (gogoproto.goproto_stringer) = false; - - int64 version = 1; - bytes hash = 2; -} diff --git a/third_party/proto/cosmos/base/store/v1beta1/listening.proto b/third_party/proto/cosmos/base/store/v1beta1/listening.proto deleted file mode 100644 index 359997109c..0000000000 --- a/third_party/proto/cosmos/base/store/v1beta1/listening.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; -package cosmos.base.store.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/store/types"; - -// StoreKVPair is a KVStore KVPair used for listening to state changes (Sets and Deletes) -// It optionally includes the StoreKey for the originating KVStore and a Boolean flag to distinguish between Sets and -// Deletes -// -// Since: cosmos-sdk 0.43 -message StoreKVPair { - string store_key = 1; // the store key for the KVStore this pair originates from - bool delete = 2; // true indicates a delete operation, false indicates a set operation - bytes key = 3; - bytes value = 4; -} diff --git a/third_party/proto/cosmos/base/tendermint/v1beta1/query.proto b/third_party/proto/cosmos/base/tendermint/v1beta1/query.proto deleted file mode 100644 index 98542d23db..0000000000 --- a/third_party/proto/cosmos/base/tendermint/v1beta1/query.proto +++ /dev/null @@ -1,138 +0,0 @@ -syntax = "proto3"; -package cosmos.base.tendermint.v1beta1; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "google/api/annotations.proto"; -import "tendermint/p2p/types.proto"; -import "tendermint/types/block.proto"; -import "tendermint/types/types.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/client/grpc/tmservice"; - -// Service defines the gRPC querier service for tendermint queries. -service Service { - // GetNodeInfo queries the current node info. - rpc GetNodeInfo(GetNodeInfoRequest) returns (GetNodeInfoResponse) { - option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/node_info"; - } - // GetSyncing queries node syncing. - rpc GetSyncing(GetSyncingRequest) returns (GetSyncingResponse) { - option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/syncing"; - } - // GetLatestBlock returns the latest block. - rpc GetLatestBlock(GetLatestBlockRequest) returns (GetLatestBlockResponse) { - option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/blocks/latest"; - } - // GetBlockByHeight queries block for given height. - rpc GetBlockByHeight(GetBlockByHeightRequest) returns (GetBlockByHeightResponse) { - option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/blocks/{height}"; - } - - // GetLatestValidatorSet queries latest validator-set. - rpc GetLatestValidatorSet(GetLatestValidatorSetRequest) returns (GetLatestValidatorSetResponse) { - option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/validatorsets/latest"; - } - // GetValidatorSetByHeight queries validator-set at a given height. - rpc GetValidatorSetByHeight(GetValidatorSetByHeightRequest) returns (GetValidatorSetByHeightResponse) { - option (google.api.http).get = "/cosmos/base/tendermint/v1beta1/validatorsets/{height}"; - } -} - -// GetValidatorSetByHeightRequest is the request type for the Query/GetValidatorSetByHeight RPC method. -message GetValidatorSetByHeightRequest { - int64 height = 1; - // pagination defines an pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// GetValidatorSetByHeightResponse is the response type for the Query/GetValidatorSetByHeight RPC method. -message GetValidatorSetByHeightResponse { - int64 block_height = 1; - repeated Validator validators = 2; - // pagination defines an pagination for the response. - cosmos.base.query.v1beta1.PageResponse pagination = 3; -} - -// GetLatestValidatorSetRequest is the request type for the Query/GetValidatorSetByHeight RPC method. -message GetLatestValidatorSetRequest { - // pagination defines an pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// GetLatestValidatorSetResponse is the response type for the Query/GetValidatorSetByHeight RPC method. -message GetLatestValidatorSetResponse { - int64 block_height = 1; - repeated Validator validators = 2; - // pagination defines an pagination for the response. - cosmos.base.query.v1beta1.PageResponse pagination = 3; -} - -// Validator is the type for the validator-set. -message Validator { - string address = 1; - google.protobuf.Any pub_key = 2; - int64 voting_power = 3; - int64 proposer_priority = 4; -} - -// GetBlockByHeightRequest is the request type for the Query/GetBlockByHeight RPC method. -message GetBlockByHeightRequest { - int64 height = 1; -} - -// GetBlockByHeightResponse is the response type for the Query/GetBlockByHeight RPC method. -message GetBlockByHeightResponse { - .tendermint.types.BlockID block_id = 1; - .tendermint.types.Block block = 2; -} - -// GetLatestBlockRequest is the request type for the Query/GetLatestBlock RPC method. -message GetLatestBlockRequest {} - -// GetLatestBlockResponse is the response type for the Query/GetLatestBlock RPC method. -message GetLatestBlockResponse { - .tendermint.types.BlockID block_id = 1; - .tendermint.types.Block block = 2; -} - -// GetSyncingRequest is the request type for the Query/GetSyncing RPC method. -message GetSyncingRequest {} - -// GetSyncingResponse is the response type for the Query/GetSyncing RPC method. -message GetSyncingResponse { - bool syncing = 1; -} - -// GetNodeInfoRequest is the request type for the Query/GetNodeInfo RPC method. -message GetNodeInfoRequest {} - -// GetNodeInfoResponse is the request type for the Query/GetNodeInfo RPC method. -message GetNodeInfoResponse { - .tendermint.p2p.DefaultNodeInfo default_node_info = 1; - VersionInfo application_version = 2; -} - -// VersionInfo is the type for the GetNodeInfoResponse message. -message VersionInfo { - string name = 1; - string app_name = 2; - string version = 3; - string git_commit = 4; - string build_tags = 5; - string go_version = 6; - repeated Module build_deps = 7; - // Since: cosmos-sdk 0.43 - string cosmos_sdk_version = 8; -} - -// Module is the type for VersionInfo -message Module { - // module path - string path = 1; - // module version - string version = 2; - // checksum - string sum = 3; -} diff --git a/third_party/proto/cosmos/base/v1beta1/coin.proto b/third_party/proto/cosmos/base/v1beta1/coin.proto deleted file mode 100644 index fab75284b7..0000000000 --- a/third_party/proto/cosmos/base/v1beta1/coin.proto +++ /dev/null @@ -1,40 +0,0 @@ -syntax = "proto3"; -package cosmos.base.v1beta1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/types"; -option (gogoproto.goproto_stringer_all) = false; -option (gogoproto.stringer_all) = false; - -// Coin defines a token with a denomination and an amount. -// -// NOTE: The amount field is an Int which implements the custom method -// signatures required by gogoproto. -message Coin { - option (gogoproto.equal) = true; - - string denom = 1; - string amount = 2 [(gogoproto.customtype) = "Int", (gogoproto.nullable) = false]; -} - -// DecCoin defines a token with a denomination and a decimal amount. -// -// NOTE: The amount field is an Dec which implements the custom method -// signatures required by gogoproto. -message DecCoin { - option (gogoproto.equal) = true; - - string denom = 1; - string amount = 2 [(gogoproto.customtype) = "Dec", (gogoproto.nullable) = false]; -} - -// IntProto defines a Protobuf wrapper around an Int object. -message IntProto { - string int = 1 [(gogoproto.customtype) = "Int", (gogoproto.nullable) = false]; -} - -// DecProto defines a Protobuf wrapper around a Dec object. -message DecProto { - string dec = 1 [(gogoproto.customtype) = "Dec", (gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/capability/v1beta1/capability.proto b/third_party/proto/cosmos/capability/v1beta1/capability.proto deleted file mode 100644 index 1c8332f341..0000000000 --- a/third_party/proto/cosmos/capability/v1beta1/capability.proto +++ /dev/null @@ -1,30 +0,0 @@ -syntax = "proto3"; -package cosmos.capability.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/capability/types"; - -import "gogoproto/gogo.proto"; - -// Capability defines an implementation of an object capability. The index -// provided to a Capability must be globally unique. -message Capability { - option (gogoproto.goproto_stringer) = false; - - uint64 index = 1 [(gogoproto.moretags) = "yaml:\"index\""]; -} - -// Owner defines a single capability owner. An owner is defined by the name of -// capability and the module name. -message Owner { - option (gogoproto.goproto_stringer) = false; - option (gogoproto.goproto_getters) = false; - - string module = 1 [(gogoproto.moretags) = "yaml:\"module\""]; - string name = 2 [(gogoproto.moretags) = "yaml:\"name\""]; -} - -// CapabilityOwners defines a set of owners of a single Capability. The set of -// owners must be unique. -message CapabilityOwners { - repeated Owner owners = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/capability/v1beta1/genesis.proto b/third_party/proto/cosmos/capability/v1beta1/genesis.proto deleted file mode 100644 index 05bb0afc4a..0000000000 --- a/third_party/proto/cosmos/capability/v1beta1/genesis.proto +++ /dev/null @@ -1,26 +0,0 @@ -syntax = "proto3"; -package cosmos.capability.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos/capability/v1beta1/capability.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/capability/types"; - -// GenesisOwners defines the capability owners with their corresponding index. -message GenesisOwners { - // index is the index of the capability owner. - uint64 index = 1; - - // index_owners are the owners at the given index. - CapabilityOwners index_owners = 2 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"index_owners\""]; -} - -// GenesisState defines the capability module's genesis state. -message GenesisState { - // index is the capability global index. - uint64 index = 1; - - // owners represents a map from index to owners of the capability index - // index key is string to allow amino marshalling. - repeated GenesisOwners owners = 2 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/crisis/v1beta1/genesis.proto b/third_party/proto/cosmos/crisis/v1beta1/genesis.proto deleted file mode 100644 index 5b0ff7ec72..0000000000 --- a/third_party/proto/cosmos/crisis/v1beta1/genesis.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; -package cosmos.crisis.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/crisis/types"; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; - -// GenesisState defines the crisis module's genesis state. -message GenesisState { - // constant_fee is the fee used to verify the invariant in the crisis - // module. - cosmos.base.v1beta1.Coin constant_fee = 3 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"constant_fee\""]; -} diff --git a/third_party/proto/cosmos/crisis/v1beta1/tx.proto b/third_party/proto/cosmos/crisis/v1beta1/tx.proto deleted file mode 100644 index 26457ad6d5..0000000000 --- a/third_party/proto/cosmos/crisis/v1beta1/tx.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; -package cosmos.crisis.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/crisis/types"; - -import "gogoproto/gogo.proto"; - -// Msg defines the bank Msg service. -service Msg { - // VerifyInvariant defines a method to verify a particular invariance. - rpc VerifyInvariant(MsgVerifyInvariant) returns (MsgVerifyInvariantResponse); -} - -// MsgVerifyInvariant represents a message to verify a particular invariance. -message MsgVerifyInvariant { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string sender = 1; - string invariant_module_name = 2 [(gogoproto.moretags) = "yaml:\"invariant_module_name\""]; - string invariant_route = 3 [(gogoproto.moretags) = "yaml:\"invariant_route\""]; -} - -// MsgVerifyInvariantResponse defines the Msg/VerifyInvariant response type. -message MsgVerifyInvariantResponse {} diff --git a/third_party/proto/cosmos/crypto/ed25519/keys.proto b/third_party/proto/cosmos/crypto/ed25519/keys.proto deleted file mode 100644 index 6ffec34483..0000000000 --- a/third_party/proto/cosmos/crypto/ed25519/keys.proto +++ /dev/null @@ -1,23 +0,0 @@ -syntax = "proto3"; -package cosmos.crypto.ed25519; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"; - -// PubKey is an ed25519 public key for handling Tendermint keys in SDK. -// It's needed for Any serialization and SDK compatibility. -// It must not be used in a non Tendermint key context because it doesn't implement -// ADR-28. Nevertheless, you will like to use ed25519 in app user level -// then you must create a new proto message and follow ADR-28 for Address construction. -message PubKey { - option (gogoproto.goproto_stringer) = false; - - bytes key = 1 [(gogoproto.casttype) = "crypto/ed25519.PublicKey"]; -} - -// Deprecated: PrivKey defines a ed25519 private key. -// NOTE: ed25519 keys must not be used in SDK apps except in a tendermint validator context. -message PrivKey { - bytes key = 1 [(gogoproto.casttype) = "crypto/ed25519.PrivateKey"]; -} diff --git a/third_party/proto/cosmos/crypto/multisig/keys.proto b/third_party/proto/cosmos/crypto/multisig/keys.proto deleted file mode 100644 index f8398e8052..0000000000 --- a/third_party/proto/cosmos/crypto/multisig/keys.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto3"; -package cosmos.crypto.multisig; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/multisig"; - -// LegacyAminoPubKey specifies a public key type -// which nests multiple public keys and a threshold, -// it uses legacy amino address rules. -message LegacyAminoPubKey { - option (gogoproto.goproto_getters) = false; - - uint32 threshold = 1 [(gogoproto.moretags) = "yaml:\"threshold\""]; - repeated google.protobuf.Any public_keys = 2 - [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; -} diff --git a/third_party/proto/cosmos/crypto/multisig/v1beta1/multisig.proto b/third_party/proto/cosmos/crypto/multisig/v1beta1/multisig.proto deleted file mode 100644 index bf671f1711..0000000000 --- a/third_party/proto/cosmos/crypto/multisig/v1beta1/multisig.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; -package cosmos.crypto.multisig.v1beta1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/crypto/types"; - -// MultiSignature wraps the signatures from a multisig.LegacyAminoPubKey. -// See cosmos.tx.v1betata1.ModeInfo.Multi for how to specify which signers -// signed and with which modes. -message MultiSignature { - option (gogoproto.goproto_unrecognized) = true; - repeated bytes signatures = 1; -} - -// CompactBitArray is an implementation of a space efficient bit array. -// This is used to ensure that the encoded data takes up a minimal amount of -// space after proto encoding. -// This is not thread safe, and is not intended for concurrent usage. -message CompactBitArray { - option (gogoproto.goproto_stringer) = false; - - uint32 extra_bits_stored = 1; - bytes elems = 2; -} diff --git a/third_party/proto/cosmos/crypto/secp256k1/keys.proto b/third_party/proto/cosmos/crypto/secp256k1/keys.proto deleted file mode 100644 index a22725713a..0000000000 --- a/third_party/proto/cosmos/crypto/secp256k1/keys.proto +++ /dev/null @@ -1,22 +0,0 @@ -syntax = "proto3"; -package cosmos.crypto.secp256k1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"; - -// PubKey defines a secp256k1 public key -// Key is the compressed form of the pubkey. The first byte depends is a 0x02 byte -// if the y-coordinate is the lexicographically largest of the two associated with -// the x-coordinate. Otherwise the first byte is a 0x03. -// This prefix is followed with the x-coordinate. -message PubKey { - option (gogoproto.goproto_stringer) = false; - - bytes key = 1; -} - -// PrivKey defines a secp256k1 private key. -message PrivKey { - bytes key = 1; -} diff --git a/third_party/proto/cosmos/crypto/secp256r1/keys.proto b/third_party/proto/cosmos/crypto/secp256r1/keys.proto deleted file mode 100644 index 2e96c6e3c6..0000000000 --- a/third_party/proto/cosmos/crypto/secp256r1/keys.proto +++ /dev/null @@ -1,23 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.crypto.secp256r1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256r1"; -option (gogoproto.messagename_all) = true; -option (gogoproto.goproto_stringer_all) = false; -option (gogoproto.goproto_getters_all) = false; - -// PubKey defines a secp256r1 ECDSA public key. -message PubKey { - // Point on secp256r1 curve in a compressed representation as specified in section - // 4.3.6 of ANSI X9.62: https://webstore.ansi.org/standards/ascx9/ansix9621998 - bytes key = 1 [(gogoproto.customtype) = "ecdsaPK"]; -} - -// PrivKey defines a secp256r1 ECDSA private key. -message PrivKey { - // secret number serialized using big-endian encoding - bytes secret = 1 [(gogoproto.customtype) = "ecdsaSK"]; -} diff --git a/third_party/proto/cosmos/distribution/v1beta1/distribution.proto b/third_party/proto/cosmos/distribution/v1beta1/distribution.proto deleted file mode 100644 index ae98ec0b98..0000000000 --- a/third_party/proto/cosmos/distribution/v1beta1/distribution.proto +++ /dev/null @@ -1,157 +0,0 @@ -syntax = "proto3"; -package cosmos.distribution.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/distribution/types"; -option (gogoproto.equal_all) = true; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; - -// Params defines the set of params for the distribution module. -message Params { - option (gogoproto.goproto_stringer) = false; - string community_tax = 1 [ - (gogoproto.moretags) = "yaml:\"community_tax\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - string base_proposer_reward = 2 [ - (gogoproto.moretags) = "yaml:\"base_proposer_reward\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - string bonus_proposer_reward = 3 [ - (gogoproto.moretags) = "yaml:\"bonus_proposer_reward\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - bool withdraw_addr_enabled = 4 [(gogoproto.moretags) = "yaml:\"withdraw_addr_enabled\""]; -} - -// ValidatorHistoricalRewards represents historical rewards for a validator. -// Height is implicit within the store key. -// Cumulative reward ratio is the sum from the zeroeth period -// until this period of rewards / tokens, per the spec. -// The reference count indicates the number of objects -// which might need to reference this historical entry at any point. -// ReferenceCount = -// number of outstanding delegations which ended the associated period (and -// might need to read that record) -// + number of slashes which ended the associated period (and might need to -// read that record) -// + one per validator for the zeroeth period, set on initialization -message ValidatorHistoricalRewards { - repeated cosmos.base.v1beta1.DecCoin cumulative_reward_ratio = 1 [ - (gogoproto.moretags) = "yaml:\"cumulative_reward_ratio\"", - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", - (gogoproto.nullable) = false - ]; - uint32 reference_count = 2 [(gogoproto.moretags) = "yaml:\"reference_count\""]; -} - -// ValidatorCurrentRewards represents current rewards and current -// period for a validator kept as a running counter and incremented -// each block as long as the validator's tokens remain constant. -message ValidatorCurrentRewards { - repeated cosmos.base.v1beta1.DecCoin rewards = 1 - [(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", (gogoproto.nullable) = false]; - uint64 period = 2; -} - -// ValidatorAccumulatedCommission represents accumulated commission -// for a validator kept as a running counter, can be withdrawn at any time. -message ValidatorAccumulatedCommission { - repeated cosmos.base.v1beta1.DecCoin commission = 1 - [(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", (gogoproto.nullable) = false]; -} - -// ValidatorOutstandingRewards represents outstanding (un-withdrawn) rewards -// for a validator inexpensive to track, allows simple sanity checks. -message ValidatorOutstandingRewards { - repeated cosmos.base.v1beta1.DecCoin rewards = 1 [ - (gogoproto.moretags) = "yaml:\"rewards\"", - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", - (gogoproto.nullable) = false - ]; -} - -// ValidatorSlashEvent represents a validator slash event. -// Height is implicit within the store key. -// This is needed to calculate appropriate amount of staking tokens -// for delegations which are withdrawn after a slash has occurred. -message ValidatorSlashEvent { - uint64 validator_period = 1 [(gogoproto.moretags) = "yaml:\"validator_period\""]; - string fraction = 2 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; -} - -// ValidatorSlashEvents is a collection of ValidatorSlashEvent messages. -message ValidatorSlashEvents { - option (gogoproto.goproto_stringer) = false; - repeated ValidatorSlashEvent validator_slash_events = 1 - [(gogoproto.moretags) = "yaml:\"validator_slash_events\"", (gogoproto.nullable) = false]; -} - -// FeePool is the global fee pool for distribution. -message FeePool { - repeated cosmos.base.v1beta1.DecCoin community_pool = 1 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", - (gogoproto.moretags) = "yaml:\"community_pool\"" - ]; -} - -// CommunityPoolSpendProposal details a proposal for use of community funds, -// together with how many coins are proposed to be spent, and to which -// recipient account. -message CommunityPoolSpendProposal { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - string title = 1; - string description = 2; - string recipient = 3; - repeated cosmos.base.v1beta1.Coin amount = 4 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; -} - -// DelegatorStartingInfo represents the starting info for a delegator reward -// period. It tracks the previous validator period, the delegation's amount of -// staking token, and the creation height (to check later on if any slashes have -// occurred). NOTE: Even though validators are slashed to whole staking tokens, -// the delegators within the validator may be left with less than a full token, -// thus sdk.Dec is used. -message DelegatorStartingInfo { - uint64 previous_period = 1 [(gogoproto.moretags) = "yaml:\"previous_period\""]; - string stake = 2 [ - (gogoproto.moretags) = "yaml:\"stake\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - uint64 height = 3 [(gogoproto.moretags) = "yaml:\"creation_height\"", (gogoproto.jsontag) = "creation_height"]; -} - -// DelegationDelegatorReward represents the properties -// of a delegator's delegation reward. -message DelegationDelegatorReward { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = true; - - string validator_address = 1 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - - repeated cosmos.base.v1beta1.DecCoin reward = 2 - [(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", (gogoproto.nullable) = false]; -} - -// CommunityPoolSpendProposalWithDeposit defines a CommunityPoolSpendProposal -// with a deposit -message CommunityPoolSpendProposalWithDeposit { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = true; - - string title = 1 [(gogoproto.moretags) = "yaml:\"title\""]; - string description = 2 [(gogoproto.moretags) = "yaml:\"description\""]; - string recipient = 3 [(gogoproto.moretags) = "yaml:\"recipient\""]; - string amount = 4 [(gogoproto.moretags) = "yaml:\"amount\""]; - string deposit = 5 [(gogoproto.moretags) = "yaml:\"deposit\""]; -} diff --git a/third_party/proto/cosmos/distribution/v1beta1/genesis.proto b/third_party/proto/cosmos/distribution/v1beta1/genesis.proto deleted file mode 100644 index c0b17cdf11..0000000000 --- a/third_party/proto/cosmos/distribution/v1beta1/genesis.proto +++ /dev/null @@ -1,155 +0,0 @@ -syntax = "proto3"; -package cosmos.distribution.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/distribution/types"; -option (gogoproto.equal_all) = true; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos/distribution/v1beta1/distribution.proto"; - -// DelegatorWithdrawInfo is the address for where distributions rewards are -// withdrawn to by default this struct is only used at genesis to feed in -// default withdraw addresses. -message DelegatorWithdrawInfo { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_address is the address of the delegator. - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - - // withdraw_address is the address to withdraw the delegation rewards to. - string withdraw_address = 2 [(gogoproto.moretags) = "yaml:\"withdraw_address\""]; -} - -// ValidatorOutstandingRewardsRecord is used for import/export via genesis json. -message ValidatorOutstandingRewardsRecord { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // validator_address is the address of the validator. - string validator_address = 1 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - - // outstanding_rewards represents the oustanding rewards of a validator. - repeated cosmos.base.v1beta1.DecCoin outstanding_rewards = 2 [ - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", - (gogoproto.nullable) = false, - (gogoproto.moretags) = "yaml:\"outstanding_rewards\"" - ]; -} - -// ValidatorAccumulatedCommissionRecord is used for import / export via genesis -// json. -message ValidatorAccumulatedCommissionRecord { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // validator_address is the address of the validator. - string validator_address = 1 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - - // accumulated is the accumulated commission of a validator. - ValidatorAccumulatedCommission accumulated = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"accumulated\""]; -} - -// ValidatorHistoricalRewardsRecord is used for import / export via genesis -// json. -message ValidatorHistoricalRewardsRecord { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // validator_address is the address of the validator. - string validator_address = 1 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - - // period defines the period the historical rewards apply to. - uint64 period = 2; - - // rewards defines the historical rewards of a validator. - ValidatorHistoricalRewards rewards = 3 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"rewards\""]; -} - -// ValidatorCurrentRewardsRecord is used for import / export via genesis json. -message ValidatorCurrentRewardsRecord { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // validator_address is the address of the validator. - string validator_address = 1 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - - // rewards defines the current rewards of a validator. - ValidatorCurrentRewards rewards = 2 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"rewards\""]; -} - -// DelegatorStartingInfoRecord used for import / export via genesis json. -message DelegatorStartingInfoRecord { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_address is the address of the delegator. - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - - // validator_address is the address of the validator. - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - - // starting_info defines the starting info of a delegator. - DelegatorStartingInfo starting_info = 3 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"starting_info\""]; -} - -// ValidatorSlashEventRecord is used for import / export via genesis json. -message ValidatorSlashEventRecord { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // validator_address is the address of the validator. - string validator_address = 1 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - // height defines the block height at which the slash event occured. - uint64 height = 2; - // period is the period of the slash event. - uint64 period = 3; - // validator_slash_event describes the slash event. - ValidatorSlashEvent validator_slash_event = 4 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"event\""]; -} - -// GenesisState defines the distribution module's genesis state. -message GenesisState { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // params defines all the paramaters of the module. - Params params = 1 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"params\""]; - - // fee_pool defines the fee pool at genesis. - FeePool fee_pool = 2 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"fee_pool\""]; - - // fee_pool defines the delegator withdraw infos at genesis. - repeated DelegatorWithdrawInfo delegator_withdraw_infos = 3 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"delegator_withdraw_infos\""]; - - // fee_pool defines the previous proposer at genesis. - string previous_proposer = 4 [(gogoproto.moretags) = "yaml:\"previous_proposer\""]; - - // fee_pool defines the outstanding rewards of all validators at genesis. - repeated ValidatorOutstandingRewardsRecord outstanding_rewards = 5 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"outstanding_rewards\""]; - - // fee_pool defines the accumulated commisions of all validators at genesis. - repeated ValidatorAccumulatedCommissionRecord validator_accumulated_commissions = 6 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"validator_accumulated_commissions\""]; - - // fee_pool defines the historical rewards of all validators at genesis. - repeated ValidatorHistoricalRewardsRecord validator_historical_rewards = 7 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"validator_historical_rewards\""]; - - // fee_pool defines the current rewards of all validators at genesis. - repeated ValidatorCurrentRewardsRecord validator_current_rewards = 8 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"validator_current_rewards\""]; - - // fee_pool defines the delegator starting infos at genesis. - repeated DelegatorStartingInfoRecord delegator_starting_infos = 9 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"delegator_starting_infos\""]; - - // fee_pool defines the validator slash events at genesis. - repeated ValidatorSlashEventRecord validator_slash_events = 10 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"validator_slash_events\""]; -} diff --git a/third_party/proto/cosmos/distribution/v1beta1/query.proto b/third_party/proto/cosmos/distribution/v1beta1/query.proto deleted file mode 100644 index 2991218d80..0000000000 --- a/third_party/proto/cosmos/distribution/v1beta1/query.proto +++ /dev/null @@ -1,218 +0,0 @@ -syntax = "proto3"; -package cosmos.distribution.v1beta1; - -import "cosmos/base/query/v1beta1/pagination.proto"; -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos/distribution/v1beta1/distribution.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/distribution/types"; - -// Query defines the gRPC querier service for distribution module. -service Query { - // Params queries params of the distribution module. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/params"; - } - - // ValidatorOutstandingRewards queries rewards of a validator address. - rpc ValidatorOutstandingRewards(QueryValidatorOutstandingRewardsRequest) - returns (QueryValidatorOutstandingRewardsResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/validators/" - "{validator_address}/outstanding_rewards"; - } - - // ValidatorCommission queries accumulated commission for a validator. - rpc ValidatorCommission(QueryValidatorCommissionRequest) returns (QueryValidatorCommissionResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/validators/" - "{validator_address}/commission"; - } - - // ValidatorSlashes queries slash events of a validator. - rpc ValidatorSlashes(QueryValidatorSlashesRequest) returns (QueryValidatorSlashesResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/validators/{validator_address}/slashes"; - } - - // DelegationRewards queries the total rewards accrued by a delegation. - rpc DelegationRewards(QueryDelegationRewardsRequest) returns (QueryDelegationRewardsResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards/" - "{validator_address}"; - } - - // DelegationTotalRewards queries the total rewards accrued by a each - // validator. - rpc DelegationTotalRewards(QueryDelegationTotalRewardsRequest) returns (QueryDelegationTotalRewardsResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards"; - } - - // DelegatorValidators queries the validators of a delegator. - rpc DelegatorValidators(QueryDelegatorValidatorsRequest) returns (QueryDelegatorValidatorsResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/delegators/" - "{delegator_address}/validators"; - } - - // DelegatorWithdrawAddress queries withdraw address of a delegator. - rpc DelegatorWithdrawAddress(QueryDelegatorWithdrawAddressRequest) returns (QueryDelegatorWithdrawAddressResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/delegators/" - "{delegator_address}/withdraw_address"; - } - - // CommunityPool queries the community pool coins. - rpc CommunityPool(QueryCommunityPoolRequest) returns (QueryCommunityPoolResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/community_pool"; - } -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is the response type for the Query/Params RPC method. -message QueryParamsResponse { - // params defines the parameters of the module. - Params params = 1 [(gogoproto.nullable) = false]; -} - -// QueryValidatorOutstandingRewardsRequest is the request type for the -// Query/ValidatorOutstandingRewards RPC method. -message QueryValidatorOutstandingRewardsRequest { - // validator_address defines the validator address to query for. - string validator_address = 1; -} - -// QueryValidatorOutstandingRewardsResponse is the response type for the -// Query/ValidatorOutstandingRewards RPC method. -message QueryValidatorOutstandingRewardsResponse { - ValidatorOutstandingRewards rewards = 1 [(gogoproto.nullable) = false]; -} - -// QueryValidatorCommissionRequest is the request type for the -// Query/ValidatorCommission RPC method -message QueryValidatorCommissionRequest { - // validator_address defines the validator address to query for. - string validator_address = 1; -} - -// QueryValidatorCommissionResponse is the response type for the -// Query/ValidatorCommission RPC method -message QueryValidatorCommissionResponse { - // commission defines the commision the validator received. - ValidatorAccumulatedCommission commission = 1 [(gogoproto.nullable) = false]; -} - -// QueryValidatorSlashesRequest is the request type for the -// Query/ValidatorSlashes RPC method -message QueryValidatorSlashesRequest { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = true; - - // validator_address defines the validator address to query for. - string validator_address = 1; - // starting_height defines the optional starting height to query the slashes. - uint64 starting_height = 2; - // starting_height defines the optional ending height to query the slashes. - uint64 ending_height = 3; - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 4; -} - -// QueryValidatorSlashesResponse is the response type for the -// Query/ValidatorSlashes RPC method. -message QueryValidatorSlashesResponse { - // slashes defines the slashes the validator received. - repeated ValidatorSlashEvent slashes = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryDelegationRewardsRequest is the request type for the -// Query/DelegationRewards RPC method. -message QueryDelegationRewardsRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_address defines the delegator address to query for. - string delegator_address = 1; - // validator_address defines the validator address to query for. - string validator_address = 2; -} - -// QueryDelegationRewardsResponse is the response type for the -// Query/DelegationRewards RPC method. -message QueryDelegationRewardsResponse { - // rewards defines the rewards accrued by a delegation. - repeated cosmos.base.v1beta1.DecCoin rewards = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins"]; -} - -// QueryDelegationTotalRewardsRequest is the request type for the -// Query/DelegationTotalRewards RPC method. -message QueryDelegationTotalRewardsRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - // delegator_address defines the delegator address to query for. - string delegator_address = 1; -} - -// QueryDelegationTotalRewardsResponse is the response type for the -// Query/DelegationTotalRewards RPC method. -message QueryDelegationTotalRewardsResponse { - // rewards defines all the rewards accrued by a delegator. - repeated DelegationDelegatorReward rewards = 1 [(gogoproto.nullable) = false]; - // total defines the sum of all the rewards. - repeated cosmos.base.v1beta1.DecCoin total = 2 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins"]; -} - -// QueryDelegatorValidatorsRequest is the request type for the -// Query/DelegatorValidators RPC method. -message QueryDelegatorValidatorsRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_address defines the delegator address to query for. - string delegator_address = 1; -} - -// QueryDelegatorValidatorsResponse is the response type for the -// Query/DelegatorValidators RPC method. -message QueryDelegatorValidatorsResponse { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // validators defines the validators a delegator is delegating for. - repeated string validators = 1; -} - -// QueryDelegatorWithdrawAddressRequest is the request type for the -// Query/DelegatorWithdrawAddress RPC method. -message QueryDelegatorWithdrawAddressRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_address defines the delegator address to query for. - string delegator_address = 1; -} - -// QueryDelegatorWithdrawAddressResponse is the response type for the -// Query/DelegatorWithdrawAddress RPC method. -message QueryDelegatorWithdrawAddressResponse { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // withdraw_address defines the delegator address to query for. - string withdraw_address = 1; -} - -// QueryCommunityPoolRequest is the request type for the Query/CommunityPool RPC -// method. -message QueryCommunityPoolRequest {} - -// QueryCommunityPoolResponse is the response type for the Query/CommunityPool -// RPC method. -message QueryCommunityPoolResponse { - // pool defines community pool's coins. - repeated cosmos.base.v1beta1.DecCoin pool = 1 - [(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", (gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/distribution/v1beta1/tx.proto b/third_party/proto/cosmos/distribution/v1beta1/tx.proto deleted file mode 100644 index e6ce478bcd..0000000000 --- a/third_party/proto/cosmos/distribution/v1beta1/tx.proto +++ /dev/null @@ -1,79 +0,0 @@ -syntax = "proto3"; -package cosmos.distribution.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/distribution/types"; -option (gogoproto.equal_all) = true; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; - -// Msg defines the distribution Msg service. -service Msg { - // SetWithdrawAddress defines a method to change the withdraw address - // for a delegator (or validator self-delegation). - rpc SetWithdrawAddress(MsgSetWithdrawAddress) returns (MsgSetWithdrawAddressResponse); - - // WithdrawDelegatorReward defines a method to withdraw rewards of delegator - // from a single validator. - rpc WithdrawDelegatorReward(MsgWithdrawDelegatorReward) returns (MsgWithdrawDelegatorRewardResponse); - - // WithdrawValidatorCommission defines a method to withdraw the - // full commission to the validator address. - rpc WithdrawValidatorCommission(MsgWithdrawValidatorCommission) returns (MsgWithdrawValidatorCommissionResponse); - - // FundCommunityPool defines a method to allow an account to directly - // fund the community pool. - rpc FundCommunityPool(MsgFundCommunityPool) returns (MsgFundCommunityPoolResponse); -} - -// MsgSetWithdrawAddress sets the withdraw address for -// a delegator (or validator self-delegation). -message MsgSetWithdrawAddress { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string withdraw_address = 2 [(gogoproto.moretags) = "yaml:\"withdraw_address\""]; -} - -// MsgSetWithdrawAddressResponse defines the Msg/SetWithdrawAddress response type. -message MsgSetWithdrawAddressResponse {} - -// MsgWithdrawDelegatorReward represents delegation withdrawal to a delegator -// from a single validator. -message MsgWithdrawDelegatorReward { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; -} - -// MsgWithdrawDelegatorRewardResponse defines the Msg/WithdrawDelegatorReward response type. -message MsgWithdrawDelegatorRewardResponse {} - -// MsgWithdrawValidatorCommission withdraws the full commission to the validator -// address. -message MsgWithdrawValidatorCommission { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string validator_address = 1 [(gogoproto.moretags) = "yaml:\"validator_address\""]; -} - -// MsgWithdrawValidatorCommissionResponse defines the Msg/WithdrawValidatorCommission response type. -message MsgWithdrawValidatorCommissionResponse {} - -// MsgFundCommunityPool allows an account to directly -// fund the community pool. -message MsgFundCommunityPool { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - repeated cosmos.base.v1beta1.Coin amount = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; - string depositor = 2; -} - -// MsgFundCommunityPoolResponse defines the Msg/FundCommunityPool response type. -message MsgFundCommunityPoolResponse {} diff --git a/third_party/proto/cosmos/evidence/v1beta1/evidence.proto b/third_party/proto/cosmos/evidence/v1beta1/evidence.proto deleted file mode 100644 index 14612c314f..0000000000 --- a/third_party/proto/cosmos/evidence/v1beta1/evidence.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; -package cosmos.evidence.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/evidence/types"; -option (gogoproto.equal_all) = true; - -import "gogoproto/gogo.proto"; -import "google/protobuf/timestamp.proto"; - -// Equivocation implements the Evidence interface and defines evidence of double -// signing misbehavior. -message Equivocation { - option (gogoproto.goproto_stringer) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.equal) = false; - - int64 height = 1; - google.protobuf.Timestamp time = 2 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - int64 power = 3; - string consensus_address = 4 [(gogoproto.moretags) = "yaml:\"consensus_address\""]; -} \ No newline at end of file diff --git a/third_party/proto/cosmos/evidence/v1beta1/genesis.proto b/third_party/proto/cosmos/evidence/v1beta1/genesis.proto deleted file mode 100644 index 199f446f7e..0000000000 --- a/third_party/proto/cosmos/evidence/v1beta1/genesis.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; -package cosmos.evidence.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/evidence/types"; - -import "google/protobuf/any.proto"; - -// GenesisState defines the evidence module's genesis state. -message GenesisState { - // evidence defines all the evidence at genesis. - repeated google.protobuf.Any evidence = 1; -} diff --git a/third_party/proto/cosmos/evidence/v1beta1/query.proto b/third_party/proto/cosmos/evidence/v1beta1/query.proto deleted file mode 100644 index eda00544c7..0000000000 --- a/third_party/proto/cosmos/evidence/v1beta1/query.proto +++ /dev/null @@ -1,51 +0,0 @@ -syntax = "proto3"; -package cosmos.evidence.v1beta1; - -import "cosmos/base/query/v1beta1/pagination.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "google/api/annotations.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/evidence/types"; - -// Query defines the gRPC querier service. -service Query { - // Evidence queries evidence based on evidence hash. - rpc Evidence(QueryEvidenceRequest) returns (QueryEvidenceResponse) { - option (google.api.http).get = "/cosmos/evidence/v1beta1/evidence/{evidence_hash}"; - } - - // AllEvidence queries all evidence. - rpc AllEvidence(QueryAllEvidenceRequest) returns (QueryAllEvidenceResponse) { - option (google.api.http).get = "/cosmos/evidence/v1beta1/evidence"; - } -} - -// QueryEvidenceRequest is the request type for the Query/Evidence RPC method. -message QueryEvidenceRequest { - // evidence_hash defines the hash of the requested evidence. - bytes evidence_hash = 1 [(gogoproto.casttype) = "github.com/tendermint/tendermint/libs/bytes.HexBytes"]; -} - -// QueryEvidenceResponse is the response type for the Query/Evidence RPC method. -message QueryEvidenceResponse { - // evidence returns the requested evidence. - google.protobuf.Any evidence = 1; -} - -// QueryEvidenceRequest is the request type for the Query/AllEvidence RPC -// method. -message QueryAllEvidenceRequest { - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryAllEvidenceResponse is the response type for the Query/AllEvidence RPC -// method. -message QueryAllEvidenceResponse { - // evidence returns all evidences. - repeated google.protobuf.Any evidence = 1; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} diff --git a/third_party/proto/cosmos/evidence/v1beta1/tx.proto b/third_party/proto/cosmos/evidence/v1beta1/tx.proto deleted file mode 100644 index 38795f25d4..0000000000 --- a/third_party/proto/cosmos/evidence/v1beta1/tx.proto +++ /dev/null @@ -1,32 +0,0 @@ -syntax = "proto3"; -package cosmos.evidence.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/evidence/types"; -option (gogoproto.equal_all) = true; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "cosmos_proto/cosmos.proto"; - -// Msg defines the evidence Msg service. -service Msg { - // SubmitEvidence submits an arbitrary Evidence of misbehavior such as equivocation or - // counterfactual signing. - rpc SubmitEvidence(MsgSubmitEvidence) returns (MsgSubmitEvidenceResponse); -} - -// MsgSubmitEvidence represents a message that supports submitting arbitrary -// Evidence of misbehavior such as equivocation or counterfactual signing. -message MsgSubmitEvidence { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string submitter = 1; - google.protobuf.Any evidence = 2 [(cosmos_proto.accepts_interface) = "Evidence"]; -} - -// MsgSubmitEvidenceResponse defines the Msg/SubmitEvidence response type. -message MsgSubmitEvidenceResponse { - // hash defines the hash of the evidence. - bytes hash = 4; -} diff --git a/third_party/proto/cosmos/feegrant/v1beta1/feegrant.proto b/third_party/proto/cosmos/feegrant/v1beta1/feegrant.proto deleted file mode 100644 index a86691f912..0000000000 --- a/third_party/proto/cosmos/feegrant/v1beta1/feegrant.proto +++ /dev/null @@ -1,78 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.feegrant.v1beta1; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "cosmos_proto/cosmos.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "google/protobuf/timestamp.proto"; -import "google/protobuf/duration.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/feegrant"; - -// BasicAllowance implements Allowance with a one-time grant of tokens -// that optionally expires. The grantee can use up to SpendLimit to cover fees. -message BasicAllowance { - option (cosmos_proto.implements_interface) = "FeeAllowanceI"; - - // spend_limit specifies the maximum amount of tokens that can be spent - // by this allowance and will be updated as tokens are spent. If it is - // empty, there is no spend limit and any amount of coins can be spent. - repeated cosmos.base.v1beta1.Coin spend_limit = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; - - // expiration specifies an optional time when this allowance expires - google.protobuf.Timestamp expiration = 2 [(gogoproto.stdtime) = true]; -} - -// PeriodicAllowance extends Allowance to allow for both a maximum cap, -// as well as a limit per time period. -message PeriodicAllowance { - option (cosmos_proto.implements_interface) = "FeeAllowanceI"; - - // basic specifies a struct of `BasicAllowance` - BasicAllowance basic = 1 [(gogoproto.nullable) = false]; - - // period specifies the time duration in which period_spend_limit coins can - // be spent before that allowance is reset - google.protobuf.Duration period = 2 [(gogoproto.stdduration) = true, (gogoproto.nullable) = false]; - - // period_spend_limit specifies the maximum number of coins that can be spent - // in the period - repeated cosmos.base.v1beta1.Coin period_spend_limit = 3 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; - - // period_can_spend is the number of coins left to be spent before the period_reset time - repeated cosmos.base.v1beta1.Coin period_can_spend = 4 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; - - // period_reset is the time at which this period resets and a new one begins, - // it is calculated from the start time of the first transaction after the - // last period ended - google.protobuf.Timestamp period_reset = 5 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; -} - -// AllowedMsgAllowance creates allowance only for specified message types. -message AllowedMsgAllowance { - option (gogoproto.goproto_getters) = false; - option (cosmos_proto.implements_interface) = "FeeAllowanceI"; - - // allowance can be any of basic and filtered fee allowance. - google.protobuf.Any allowance = 1 [(cosmos_proto.accepts_interface) = "FeeAllowanceI"]; - - // allowed_messages are the messages for which the grantee has the access. - repeated string allowed_messages = 2; -} - -// Grant is stored in the KVStore to record a grant with full context -message Grant { - // granter is the address of the user granting an allowance of their funds. - string granter = 1; - - // grantee is the address of the user being granted an allowance of another user's funds. - string grantee = 2; - - // allowance can be any of basic and filtered fee allowance. - google.protobuf.Any allowance = 3 [(cosmos_proto.accepts_interface) = "FeeAllowanceI"]; -} diff --git a/third_party/proto/cosmos/feegrant/v1beta1/genesis.proto b/third_party/proto/cosmos/feegrant/v1beta1/genesis.proto deleted file mode 100644 index 5b1ac4ca55..0000000000 --- a/third_party/proto/cosmos/feegrant/v1beta1/genesis.proto +++ /dev/null @@ -1,13 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.feegrant.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos/feegrant/v1beta1/feegrant.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/feegrant"; - -// GenesisState contains a set of fee allowances, persisted from the store -message GenesisState { - repeated Grant allowances = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/feegrant/v1beta1/query.proto b/third_party/proto/cosmos/feegrant/v1beta1/query.proto deleted file mode 100644 index 42d7a842de..0000000000 --- a/third_party/proto/cosmos/feegrant/v1beta1/query.proto +++ /dev/null @@ -1,78 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.feegrant.v1beta1; - -import "cosmos/feegrant/v1beta1/feegrant.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; -import "google/api/annotations.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/feegrant"; - -// Query defines the gRPC querier service. -service Query { - - // Allowance returns fee granted to the grantee by the granter. - rpc Allowance(QueryAllowanceRequest) returns (QueryAllowanceResponse) { - option (google.api.http).get = "/cosmos/feegrant/v1beta1/allowance/{granter}/{grantee}"; - } - - // Allowances returns all the grants for address. - rpc Allowances(QueryAllowancesRequest) returns (QueryAllowancesResponse) { - option (google.api.http).get = "/cosmos/feegrant/v1beta1/allowances/{grantee}"; - } - - // AllowancesByGranter returns all the grants given by an address - // Since v0.46 - rpc AllowancesByGranter(QueryAllowancesByGranterRequest) returns (QueryAllowancesByGranterResponse) { - option (google.api.http).get = "/cosmos/feegrant/v1beta1/issued/{granter}"; - } -} - -// QueryAllowanceRequest is the request type for the Query/Allowance RPC method. -message QueryAllowanceRequest { - // granter is the address of the user granting an allowance of their funds. - string granter = 1; - - // grantee is the address of the user being granted an allowance of another user's funds. - string grantee = 2; -} - -// QueryAllowanceResponse is the response type for the Query/Allowance RPC method. -message QueryAllowanceResponse { - // allowance is a allowance granted for grantee by granter. - cosmos.feegrant.v1beta1.Grant allowance = 1; -} - -// QueryAllowancesRequest is the request type for the Query/Allowances RPC method. -message QueryAllowancesRequest { - string grantee = 1; - - // pagination defines an pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryAllowancesResponse is the response type for the Query/Allowances RPC method. -message QueryAllowancesResponse { - // allowances are allowance's granted for grantee by granter. - repeated cosmos.feegrant.v1beta1.Grant allowances = 1; - - // pagination defines an pagination for the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryAllowancesByGranterRequest is the request type for the Query/AllowancesByGranter RPC method. -message QueryAllowancesByGranterRequest { - string granter = 1; - - // pagination defines an pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryAllowancesByGranterResponse is the response type for the Query/AllowancesByGranter RPC method. -message QueryAllowancesByGranterResponse { - // allowances that have been issued by the granter. - repeated cosmos.feegrant.v1beta1.Grant allowances = 1; - - // pagination defines an pagination for the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} diff --git a/third_party/proto/cosmos/feegrant/v1beta1/tx.proto b/third_party/proto/cosmos/feegrant/v1beta1/tx.proto deleted file mode 100644 index 2d875e9224..0000000000 --- a/third_party/proto/cosmos/feegrant/v1beta1/tx.proto +++ /dev/null @@ -1,49 +0,0 @@ -// Since: cosmos-sdk 0.43 -syntax = "proto3"; -package cosmos.feegrant.v1beta1; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "cosmos_proto/cosmos.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/feegrant"; - -// Msg defines the feegrant msg service. -service Msg { - - // GrantAllowance grants fee allowance to the grantee on the granter's - // account with the provided expiration time. - rpc GrantAllowance(MsgGrantAllowance) returns (MsgGrantAllowanceResponse); - - // RevokeAllowance revokes any fee allowance of granter's account that - // has been granted to the grantee. - rpc RevokeAllowance(MsgRevokeAllowance) returns (MsgRevokeAllowanceResponse); -} - -// MsgGrantAllowance adds permission for Grantee to spend up to Allowance -// of fees from the account of Granter. -message MsgGrantAllowance { - // granter is the address of the user granting an allowance of their funds. - string granter = 1; - - // grantee is the address of the user being granted an allowance of another user's funds. - string grantee = 2; - - // allowance can be any of basic and filtered fee allowance. - google.protobuf.Any allowance = 3 [(cosmos_proto.accepts_interface) = "FeeAllowanceI"]; -} - -// MsgGrantAllowanceResponse defines the Msg/GrantAllowanceResponse response type. -message MsgGrantAllowanceResponse {} - -// MsgRevokeAllowance removes any existing Allowance from Granter to Grantee. -message MsgRevokeAllowance { - // granter is the address of the user granting an allowance of their funds. - string granter = 1; - - // grantee is the address of the user being granted an allowance of another user's funds. - string grantee = 2; -} - -// MsgRevokeAllowanceResponse defines the Msg/RevokeAllowanceResponse response type. -message MsgRevokeAllowanceResponse {} diff --git a/third_party/proto/cosmos/genutil/v1beta1/genesis.proto b/third_party/proto/cosmos/genutil/v1beta1/genesis.proto deleted file mode 100644 index a0207793d9..0000000000 --- a/third_party/proto/cosmos/genutil/v1beta1/genesis.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; -package cosmos.genutil.v1beta1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/genutil/types"; - -// GenesisState defines the raw genesis transaction in JSON. -message GenesisState { - // gen_txs defines the genesis transactions. - repeated bytes gen_txs = 1 [ - (gogoproto.casttype) = "encoding/json.RawMessage", - (gogoproto.jsontag) = "gentxs", - (gogoproto.moretags) = "yaml:\"gentxs\"" - ]; -} diff --git a/third_party/proto/cosmos/gov/v1beta1/genesis.proto b/third_party/proto/cosmos/gov/v1beta1/genesis.proto deleted file mode 100644 index a999500449..0000000000 --- a/third_party/proto/cosmos/gov/v1beta1/genesis.proto +++ /dev/null @@ -1,26 +0,0 @@ -syntax = "proto3"; - -package cosmos.gov.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos/gov/v1beta1/gov.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/gov/types"; - -// GenesisState defines the gov module's genesis state. -message GenesisState { - // starting_proposal_id is the ID of the starting proposal. - uint64 starting_proposal_id = 1 [(gogoproto.moretags) = "yaml:\"starting_proposal_id\""]; - // deposits defines all the deposits present at genesis. - repeated Deposit deposits = 2 [(gogoproto.castrepeated) = "Deposits", (gogoproto.nullable) = false]; - // votes defines all the votes present at genesis. - repeated Vote votes = 3 [(gogoproto.castrepeated) = "Votes", (gogoproto.nullable) = false]; - // proposals defines all the proposals present at genesis. - repeated Proposal proposals = 4 [(gogoproto.castrepeated) = "Proposals", (gogoproto.nullable) = false]; - // params defines all the paramaters of related to deposit. - DepositParams deposit_params = 5 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"deposit_params\""]; - // params defines all the paramaters of related to voting. - VotingParams voting_params = 6 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"voting_params\""]; - // params defines all the paramaters of related to tally. - TallyParams tally_params = 7 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"tally_params\""]; -} diff --git a/third_party/proto/cosmos/gov/v1beta1/gov.proto b/third_party/proto/cosmos/gov/v1beta1/gov.proto deleted file mode 100644 index 01aebf950c..0000000000 --- a/third_party/proto/cosmos/gov/v1beta1/gov.proto +++ /dev/null @@ -1,200 +0,0 @@ -syntax = "proto3"; -package cosmos.gov.v1beta1; - -import "cosmos/base/v1beta1/coin.proto"; -import "gogoproto/gogo.proto"; -import "cosmos_proto/cosmos.proto"; -import "google/protobuf/timestamp.proto"; -import "google/protobuf/any.proto"; -import "google/protobuf/duration.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/gov/types"; -option (gogoproto.goproto_stringer_all) = false; -option (gogoproto.stringer_all) = false; -option (gogoproto.goproto_getters_all) = false; - -// VoteOption enumerates the valid vote options for a given governance proposal. -enum VoteOption { - option (gogoproto.goproto_enum_prefix) = false; - - // VOTE_OPTION_UNSPECIFIED defines a no-op vote option. - VOTE_OPTION_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "OptionEmpty"]; - // VOTE_OPTION_YES defines a yes vote option. - VOTE_OPTION_YES = 1 [(gogoproto.enumvalue_customname) = "OptionYes"]; - // VOTE_OPTION_ABSTAIN defines an abstain vote option. - VOTE_OPTION_ABSTAIN = 2 [(gogoproto.enumvalue_customname) = "OptionAbstain"]; - // VOTE_OPTION_NO defines a no vote option. - VOTE_OPTION_NO = 3 [(gogoproto.enumvalue_customname) = "OptionNo"]; - // VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option. - VOTE_OPTION_NO_WITH_VETO = 4 [(gogoproto.enumvalue_customname) = "OptionNoWithVeto"]; -} - -// WeightedVoteOption defines a unit of vote for vote split. -// -// Since: cosmos-sdk 0.43 -message WeightedVoteOption { - VoteOption option = 1; - string weight = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false, - (gogoproto.moretags) = "yaml:\"weight\"" - ]; -} - -// TextProposal defines a standard text proposal whose changes need to be -// manually updated in case of approval. -message TextProposal { - option (cosmos_proto.implements_interface) = "Content"; - - option (gogoproto.equal) = true; - - string title = 1; - string description = 2; -} - -// Deposit defines an amount deposited by an account address to an active -// proposal. -message Deposit { - option (gogoproto.goproto_getters) = false; - option (gogoproto.equal) = false; - - uint64 proposal_id = 1 [(gogoproto.moretags) = "yaml:\"proposal_id\""]; - string depositor = 2; - repeated cosmos.base.v1beta1.Coin amount = 3 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; -} - -// Proposal defines the core field members of a governance proposal. -message Proposal { - option (gogoproto.equal) = true; - - uint64 proposal_id = 1 [(gogoproto.jsontag) = "id", (gogoproto.moretags) = "yaml:\"id\""]; - google.protobuf.Any content = 2 [(cosmos_proto.accepts_interface) = "Content"]; - ProposalStatus status = 3 [(gogoproto.moretags) = "yaml:\"proposal_status\""]; - TallyResult final_tally_result = 4 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"final_tally_result\""]; - google.protobuf.Timestamp submit_time = 5 - [(gogoproto.stdtime) = true, (gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"submit_time\""]; - google.protobuf.Timestamp deposit_end_time = 6 - [(gogoproto.stdtime) = true, (gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"deposit_end_time\""]; - repeated cosmos.base.v1beta1.Coin total_deposit = 7 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"total_deposit\"" - ]; - google.protobuf.Timestamp voting_start_time = 8 - [(gogoproto.stdtime) = true, (gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"voting_start_time\""]; - google.protobuf.Timestamp voting_end_time = 9 - [(gogoproto.stdtime) = true, (gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"voting_end_time\""]; -} - -// ProposalStatus enumerates the valid statuses of a proposal. -enum ProposalStatus { - option (gogoproto.goproto_enum_prefix) = false; - - // PROPOSAL_STATUS_UNSPECIFIED defines the default propopsal status. - PROPOSAL_STATUS_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "StatusNil"]; - // PROPOSAL_STATUS_DEPOSIT_PERIOD defines a proposal status during the deposit - // period. - PROPOSAL_STATUS_DEPOSIT_PERIOD = 1 [(gogoproto.enumvalue_customname) = "StatusDepositPeriod"]; - // PROPOSAL_STATUS_VOTING_PERIOD defines a proposal status during the voting - // period. - PROPOSAL_STATUS_VOTING_PERIOD = 2 [(gogoproto.enumvalue_customname) = "StatusVotingPeriod"]; - // PROPOSAL_STATUS_PASSED defines a proposal status of a proposal that has - // passed. - PROPOSAL_STATUS_PASSED = 3 [(gogoproto.enumvalue_customname) = "StatusPassed"]; - // PROPOSAL_STATUS_REJECTED defines a proposal status of a proposal that has - // been rejected. - PROPOSAL_STATUS_REJECTED = 4 [(gogoproto.enumvalue_customname) = "StatusRejected"]; - // PROPOSAL_STATUS_FAILED defines a proposal status of a proposal that has - // failed. - PROPOSAL_STATUS_FAILED = 5 [(gogoproto.enumvalue_customname) = "StatusFailed"]; -} - -// TallyResult defines a standard tally for a governance proposal. -message TallyResult { - option (gogoproto.equal) = true; - - string yes = 1 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; - string abstain = 2 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; - string no = 3 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; - string no_with_veto = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false, - (gogoproto.moretags) = "yaml:\"no_with_veto\"" - ]; -} - -// Vote defines a vote on a governance proposal. -// A Vote consists of a proposal ID, the voter, and the vote option. -message Vote { - option (gogoproto.goproto_stringer) = false; - option (gogoproto.equal) = false; - - uint64 proposal_id = 1 [(gogoproto.moretags) = "yaml:\"proposal_id\""]; - string voter = 2; - // Deprecated: Prefer to use `options` instead. This field is set in queries - // if and only if `len(options) == 1` and that option has weight 1. In all - // other cases, this field will default to VOTE_OPTION_UNSPECIFIED. - VoteOption option = 3 [deprecated = true]; - // Since: cosmos-sdk 0.43 - repeated WeightedVoteOption options = 4 [(gogoproto.nullable) = false]; -} - -// DepositParams defines the params for deposits on governance proposals. -message DepositParams { - // Minimum deposit for a proposal to enter voting period. - repeated cosmos.base.v1beta1.Coin min_deposit = 1 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"min_deposit\"", - (gogoproto.jsontag) = "min_deposit,omitempty" - ]; - - // Maximum period for Atom holders to deposit on a proposal. Initial value: 2 - // months. - google.protobuf.Duration max_deposit_period = 2 [ - (gogoproto.nullable) = false, - (gogoproto.stdduration) = true, - (gogoproto.jsontag) = "max_deposit_period,omitempty", - (gogoproto.moretags) = "yaml:\"max_deposit_period\"" - ]; -} - -// VotingParams defines the params for voting on governance proposals. -message VotingParams { - // Length of the voting period. - google.protobuf.Duration voting_period = 1 [ - (gogoproto.nullable) = false, - (gogoproto.stdduration) = true, - (gogoproto.jsontag) = "voting_period,omitempty", - (gogoproto.moretags) = "yaml:\"voting_period\"" - ]; -} - -// TallyParams defines the params for tallying votes on governance proposals. -message TallyParams { - // Minimum percentage of total stake needed to vote for a result to be - // considered valid. - bytes quorum = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false, - (gogoproto.jsontag) = "quorum,omitempty" - ]; - - // Minimum proportion of Yes votes for proposal to pass. Default value: 0.5. - bytes threshold = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false, - (gogoproto.jsontag) = "threshold,omitempty" - ]; - - // Minimum value of Veto votes to Total votes ratio for proposal to be - // vetoed. Default value: 1/3. - bytes veto_threshold = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false, - (gogoproto.jsontag) = "veto_threshold,omitempty", - (gogoproto.moretags) = "yaml:\"veto_threshold\"" - ]; -} diff --git a/third_party/proto/cosmos/gov/v1beta1/query.proto b/third_party/proto/cosmos/gov/v1beta1/query.proto deleted file mode 100644 index da62bdbad1..0000000000 --- a/third_party/proto/cosmos/gov/v1beta1/query.proto +++ /dev/null @@ -1,190 +0,0 @@ -syntax = "proto3"; -package cosmos.gov.v1beta1; - -import "cosmos/base/query/v1beta1/pagination.proto"; -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "cosmos/gov/v1beta1/gov.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/gov/types"; - -// Query defines the gRPC querier service for gov module -service Query { - // Proposal queries proposal details based on ProposalID. - rpc Proposal(QueryProposalRequest) returns (QueryProposalResponse) { - option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}"; - } - - // Proposals queries all proposals based on given status. - rpc Proposals(QueryProposalsRequest) returns (QueryProposalsResponse) { - option (google.api.http).get = "/cosmos/gov/v1beta1/proposals"; - } - - // Vote queries voted information based on proposalID, voterAddr. - rpc Vote(QueryVoteRequest) returns (QueryVoteResponse) { - option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes/{voter}"; - } - - // Votes queries votes of a given proposal. - rpc Votes(QueryVotesRequest) returns (QueryVotesResponse) { - option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}/votes"; - } - - // Params queries all parameters of the gov module. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/cosmos/gov/v1beta1/params/{params_type}"; - } - - // Deposit queries single deposit information based proposalID, depositAddr. - rpc Deposit(QueryDepositRequest) returns (QueryDepositResponse) { - option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits/{depositor}"; - } - - // Deposits queries all deposits of a single proposal. - rpc Deposits(QueryDepositsRequest) returns (QueryDepositsResponse) { - option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits"; - } - - // TallyResult queries the tally of a proposal vote. - rpc TallyResult(QueryTallyResultRequest) returns (QueryTallyResultResponse) { - option (google.api.http).get = "/cosmos/gov/v1beta1/proposals/{proposal_id}/tally"; - } -} - -// QueryProposalRequest is the request type for the Query/Proposal RPC method. -message QueryProposalRequest { - // proposal_id defines the unique id of the proposal. - uint64 proposal_id = 1; -} - -// QueryProposalResponse is the response type for the Query/Proposal RPC method. -message QueryProposalResponse { - Proposal proposal = 1 [(gogoproto.nullable) = false]; -} - -// QueryProposalsRequest is the request type for the Query/Proposals RPC method. -message QueryProposalsRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // proposal_status defines the status of the proposals. - ProposalStatus proposal_status = 1; - - // voter defines the voter address for the proposals. - string voter = 2; - - // depositor defines the deposit addresses from the proposals. - string depositor = 3; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 4; -} - -// QueryProposalsResponse is the response type for the Query/Proposals RPC -// method. -message QueryProposalsResponse { - repeated Proposal proposals = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryVoteRequest is the request type for the Query/Vote RPC method. -message QueryVoteRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // proposal_id defines the unique id of the proposal. - uint64 proposal_id = 1; - - // voter defines the oter address for the proposals. - string voter = 2; -} - -// QueryVoteResponse is the response type for the Query/Vote RPC method. -message QueryVoteResponse { - // vote defined the queried vote. - Vote vote = 1 [(gogoproto.nullable) = false]; -} - -// QueryVotesRequest is the request type for the Query/Votes RPC method. -message QueryVotesRequest { - // proposal_id defines the unique id of the proposal. - uint64 proposal_id = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryVotesResponse is the response type for the Query/Votes RPC method. -message QueryVotesResponse { - // votes defined the queried votes. - repeated Vote votes = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -message QueryParamsRequest { - // params_type defines which parameters to query for, can be one of "voting", - // "tallying" or "deposit". - string params_type = 1; -} - -// QueryParamsResponse is the response type for the Query/Params RPC method. -message QueryParamsResponse { - // voting_params defines the parameters related to voting. - VotingParams voting_params = 1 [(gogoproto.nullable) = false]; - // deposit_params defines the parameters related to deposit. - DepositParams deposit_params = 2 [(gogoproto.nullable) = false]; - // tally_params defines the parameters related to tally. - TallyParams tally_params = 3 [(gogoproto.nullable) = false]; -} - -// QueryDepositRequest is the request type for the Query/Deposit RPC method. -message QueryDepositRequest { - option (gogoproto.goproto_getters) = false; - option (gogoproto.equal) = false; - - // proposal_id defines the unique id of the proposal. - uint64 proposal_id = 1; - - // depositor defines the deposit addresses from the proposals. - string depositor = 2; -} - -// QueryDepositResponse is the response type for the Query/Deposit RPC method. -message QueryDepositResponse { - // deposit defines the requested deposit. - Deposit deposit = 1 [(gogoproto.nullable) = false]; -} - -// QueryDepositsRequest is the request type for the Query/Deposits RPC method. -message QueryDepositsRequest { - // proposal_id defines the unique id of the proposal. - uint64 proposal_id = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryDepositsResponse is the response type for the Query/Deposits RPC method. -message QueryDepositsResponse { - repeated Deposit deposits = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryTallyResultRequest is the request type for the Query/Tally RPC method. -message QueryTallyResultRequest { - // proposal_id defines the unique id of the proposal. - uint64 proposal_id = 1; -} - -// QueryTallyResultResponse is the response type for the Query/Tally RPC method. -message QueryTallyResultResponse { - // tally defines the requested tally. - TallyResult tally = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/gov/v1beta1/tx.proto b/third_party/proto/cosmos/gov/v1beta1/tx.proto deleted file mode 100644 index 36c0a95d27..0000000000 --- a/third_party/proto/cosmos/gov/v1beta1/tx.proto +++ /dev/null @@ -1,99 +0,0 @@ -syntax = "proto3"; -package cosmos.gov.v1beta1; - -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos/gov/v1beta1/gov.proto"; -import "cosmos_proto/cosmos.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/gov/types"; - -// Msg defines the bank Msg service. -service Msg { - // SubmitProposal defines a method to create new proposal given a content. - rpc SubmitProposal(MsgSubmitProposal) returns (MsgSubmitProposalResponse); - - // Vote defines a method to add a vote on a specific proposal. - rpc Vote(MsgVote) returns (MsgVoteResponse); - - // VoteWeighted defines a method to add a weighted vote on a specific proposal. - // - // Since: cosmos-sdk 0.43 - rpc VoteWeighted(MsgVoteWeighted) returns (MsgVoteWeightedResponse); - - // Deposit defines a method to add deposit on a specific proposal. - rpc Deposit(MsgDeposit) returns (MsgDepositResponse); -} - -// MsgSubmitProposal defines an sdk.Msg type that supports submitting arbitrary -// proposal Content. -message MsgSubmitProposal { - option (gogoproto.equal) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.stringer) = false; - option (gogoproto.goproto_getters) = false; - - google.protobuf.Any content = 1 [(cosmos_proto.accepts_interface) = "Content"]; - repeated cosmos.base.v1beta1.Coin initial_deposit = 2 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"initial_deposit\"" - ]; - string proposer = 3; -} - -// MsgSubmitProposalResponse defines the Msg/SubmitProposal response type. -message MsgSubmitProposalResponse { - uint64 proposal_id = 1 [(gogoproto.jsontag) = "proposal_id", (gogoproto.moretags) = "yaml:\"proposal_id\""]; -} - -// MsgVote defines a message to cast a vote. -message MsgVote { - option (gogoproto.equal) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.stringer) = false; - option (gogoproto.goproto_getters) = false; - - uint64 proposal_id = 1 [(gogoproto.jsontag) = "proposal_id", (gogoproto.moretags) = "yaml:\"proposal_id\""]; - string voter = 2; - VoteOption option = 3; -} - -// MsgVoteResponse defines the Msg/Vote response type. -message MsgVoteResponse {} - -// MsgVoteWeighted defines a message to cast a vote. -// -// Since: cosmos-sdk 0.43 -message MsgVoteWeighted { - option (gogoproto.equal) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.stringer) = false; - option (gogoproto.goproto_getters) = false; - - uint64 proposal_id = 1 [(gogoproto.moretags) = "yaml:\"proposal_id\""]; - string voter = 2; - repeated WeightedVoteOption options = 3 [(gogoproto.nullable) = false]; -} - -// MsgVoteWeightedResponse defines the Msg/VoteWeighted response type. -// -// Since: cosmos-sdk 0.43 -message MsgVoteWeightedResponse {} - -// MsgDeposit defines a message to submit a deposit to an existing proposal. -message MsgDeposit { - option (gogoproto.equal) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.stringer) = false; - option (gogoproto.goproto_getters) = false; - - uint64 proposal_id = 1 [(gogoproto.jsontag) = "proposal_id", (gogoproto.moretags) = "yaml:\"proposal_id\""]; - string depositor = 2; - repeated cosmos.base.v1beta1.Coin amount = 3 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; -} - -// MsgDepositResponse defines the Msg/Deposit response type. -message MsgDepositResponse {} diff --git a/third_party/proto/cosmos/mint/v1beta1/genesis.proto b/third_party/proto/cosmos/mint/v1beta1/genesis.proto deleted file mode 100644 index 4e783fb544..0000000000 --- a/third_party/proto/cosmos/mint/v1beta1/genesis.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; -package cosmos.mint.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos/mint/v1beta1/mint.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/mint/types"; - -// GenesisState defines the mint module's genesis state. -message GenesisState { - // minter is a space for holding current inflation information. - Minter minter = 1 [(gogoproto.nullable) = false]; - - // params defines all the paramaters of the module. - Params params = 2 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/mint/v1beta1/mint.proto b/third_party/proto/cosmos/mint/v1beta1/mint.proto deleted file mode 100644 index f94d4ae2e8..0000000000 --- a/third_party/proto/cosmos/mint/v1beta1/mint.proto +++ /dev/null @@ -1,53 +0,0 @@ -syntax = "proto3"; -package cosmos.mint.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/mint/types"; - -import "gogoproto/gogo.proto"; - -// Minter represents the minting state. -message Minter { - // current annual inflation rate - string inflation = 1 - [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; - // current annual expected provisions - string annual_provisions = 2 [ - (gogoproto.moretags) = "yaml:\"annual_provisions\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// Params holds parameters for the mint module. -message Params { - option (gogoproto.goproto_stringer) = false; - - // type of coin to mint - string mint_denom = 1; - // maximum annual change in inflation rate - string inflation_rate_change = 2 [ - (gogoproto.moretags) = "yaml:\"inflation_rate_change\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // maximum inflation rate - string inflation_max = 3 [ - (gogoproto.moretags) = "yaml:\"inflation_max\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // minimum inflation rate - string inflation_min = 4 [ - (gogoproto.moretags) = "yaml:\"inflation_min\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // goal of percent bonded atoms - string goal_bonded = 5 [ - (gogoproto.moretags) = "yaml:\"goal_bonded\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // expected blocks per year - uint64 blocks_per_year = 6 [(gogoproto.moretags) = "yaml:\"blocks_per_year\""]; -} diff --git a/third_party/proto/cosmos/mint/v1beta1/query.proto b/third_party/proto/cosmos/mint/v1beta1/query.proto deleted file mode 100644 index acd341d777..0000000000 --- a/third_party/proto/cosmos/mint/v1beta1/query.proto +++ /dev/null @@ -1,57 +0,0 @@ -syntax = "proto3"; -package cosmos.mint.v1beta1; - -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "cosmos/mint/v1beta1/mint.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/mint/types"; - -// Query provides defines the gRPC querier service. -service Query { - // Params returns the total set of minting parameters. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/cosmos/mint/v1beta1/params"; - } - - // Inflation returns the current minting inflation value. - rpc Inflation(QueryInflationRequest) returns (QueryInflationResponse) { - option (google.api.http).get = "/cosmos/mint/v1beta1/inflation"; - } - - // AnnualProvisions current minting annual provisions value. - rpc AnnualProvisions(QueryAnnualProvisionsRequest) returns (QueryAnnualProvisionsResponse) { - option (google.api.http).get = "/cosmos/mint/v1beta1/annual_provisions"; - } -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is the response type for the Query/Params RPC method. -message QueryParamsResponse { - // params defines the parameters of the module. - Params params = 1 [(gogoproto.nullable) = false]; -} - -// QueryInflationRequest is the request type for the Query/Inflation RPC method. -message QueryInflationRequest {} - -// QueryInflationResponse is the response type for the Query/Inflation RPC -// method. -message QueryInflationResponse { - // inflation is the current minting inflation value. - bytes inflation = 1 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; -} - -// QueryAnnualProvisionsRequest is the request type for the -// Query/AnnualProvisions RPC method. -message QueryAnnualProvisionsRequest {} - -// QueryAnnualProvisionsResponse is the response type for the -// Query/AnnualProvisions RPC method. -message QueryAnnualProvisionsResponse { - // annual_provisions is the current minting annual provisions value. - bytes annual_provisions = 1 - [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/params/v1beta1/params.proto b/third_party/proto/cosmos/params/v1beta1/params.proto deleted file mode 100644 index 5382fd7999..0000000000 --- a/third_party/proto/cosmos/params/v1beta1/params.proto +++ /dev/null @@ -1,27 +0,0 @@ -syntax = "proto3"; -package cosmos.params.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/params/types/proposal"; -option (gogoproto.equal_all) = true; - -import "gogoproto/gogo.proto"; - -// ParameterChangeProposal defines a proposal to change one or more parameters. -message ParameterChangeProposal { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - string title = 1; - string description = 2; - repeated ParamChange changes = 3 [(gogoproto.nullable) = false]; -} - -// ParamChange defines an individual parameter change, for use in -// ParameterChangeProposal. -message ParamChange { - option (gogoproto.goproto_stringer) = false; - - string subspace = 1; - string key = 2; - string value = 3; -} diff --git a/third_party/proto/cosmos/params/v1beta1/query.proto b/third_party/proto/cosmos/params/v1beta1/query.proto deleted file mode 100644 index 1078e02ae3..0000000000 --- a/third_party/proto/cosmos/params/v1beta1/query.proto +++ /dev/null @@ -1,32 +0,0 @@ -syntax = "proto3"; -package cosmos.params.v1beta1; - -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "cosmos/params/v1beta1/params.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/params/types/proposal"; - -// Query defines the gRPC querier service. -service Query { - // Params queries a specific parameter of a module, given its subspace and - // key. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/cosmos/params/v1beta1/params"; - } -} - -// QueryParamsRequest is request type for the Query/Params RPC method. -message QueryParamsRequest { - // subspace defines the module to query the parameter for. - string subspace = 1; - - // key defines the key of the parameter in the subspace. - string key = 2; -} - -// QueryParamsResponse is response type for the Query/Params RPC method. -message QueryParamsResponse { - // param defines the queried parameter. - ParamChange param = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/slashing/v1beta1/genesis.proto b/third_party/proto/cosmos/slashing/v1beta1/genesis.proto deleted file mode 100644 index a7aebcfbad..0000000000 --- a/third_party/proto/cosmos/slashing/v1beta1/genesis.proto +++ /dev/null @@ -1,50 +0,0 @@ -syntax = "proto3"; -package cosmos.slashing.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/slashing/types"; - -import "gogoproto/gogo.proto"; -import "cosmos/slashing/v1beta1/slashing.proto"; - -// GenesisState defines the slashing module's genesis state. -message GenesisState { - // params defines all the paramaters of related to deposit. - Params params = 1 [(gogoproto.nullable) = false]; - - // signing_infos represents a map between validator addresses and their - // signing infos. - repeated SigningInfo signing_infos = 2 - [(gogoproto.moretags) = "yaml:\"signing_infos\"", (gogoproto.nullable) = false]; - - // missed_blocks represents a map between validator addresses and their - // missed blocks. - repeated ValidatorMissedBlocks missed_blocks = 3 - [(gogoproto.moretags) = "yaml:\"missed_blocks\"", (gogoproto.nullable) = false]; -} - -// SigningInfo stores validator signing info of corresponding address. -message SigningInfo { - // address is the validator address. - string address = 1; - // validator_signing_info represents the signing info of this validator. - ValidatorSigningInfo validator_signing_info = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"validator_signing_info\""]; -} - -// ValidatorMissedBlocks contains array of missed blocks of corresponding -// address. -message ValidatorMissedBlocks { - // address is the validator address. - string address = 1; - // missed_blocks is an array of missed blocks by the validator. - repeated MissedBlock missed_blocks = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"missed_blocks\""]; -} - -// MissedBlock contains height and missed status as boolean. -message MissedBlock { - // index is the height at which the block was missed. - int64 index = 1; - // missed is the missed status. - bool missed = 2; -} diff --git a/third_party/proto/cosmos/slashing/v1beta1/query.proto b/third_party/proto/cosmos/slashing/v1beta1/query.proto deleted file mode 100644 index 869049a0ed..0000000000 --- a/third_party/proto/cosmos/slashing/v1beta1/query.proto +++ /dev/null @@ -1,63 +0,0 @@ -syntax = "proto3"; -package cosmos.slashing.v1beta1; - -import "cosmos/base/query/v1beta1/pagination.proto"; -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "cosmos/slashing/v1beta1/slashing.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/slashing/types"; - -// Query provides defines the gRPC querier service -service Query { - // Params queries the parameters of slashing module - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/cosmos/slashing/v1beta1/params"; - } - - // SigningInfo queries the signing info of given cons address - rpc SigningInfo(QuerySigningInfoRequest) returns (QuerySigningInfoResponse) { - option (google.api.http).get = "/cosmos/slashing/v1beta1/signing_infos/{cons_address}"; - } - - // SigningInfos queries signing info of all validators - rpc SigningInfos(QuerySigningInfosRequest) returns (QuerySigningInfosResponse) { - option (google.api.http).get = "/cosmos/slashing/v1beta1/signing_infos"; - } -} - -// QueryParamsRequest is the request type for the Query/Params RPC method -message QueryParamsRequest {} - -// QueryParamsResponse is the response type for the Query/Params RPC method -message QueryParamsResponse { - Params params = 1 [(gogoproto.nullable) = false]; -} - -// QuerySigningInfoRequest is the request type for the Query/SigningInfo RPC -// method -message QuerySigningInfoRequest { - // cons_address is the address to query signing info of - string cons_address = 1; -} - -// QuerySigningInfoResponse is the response type for the Query/SigningInfo RPC -// method -message QuerySigningInfoResponse { - // val_signing_info is the signing info of requested val cons address - ValidatorSigningInfo val_signing_info = 1 [(gogoproto.nullable) = false]; -} - -// QuerySigningInfosRequest is the request type for the Query/SigningInfos RPC -// method -message QuerySigningInfosRequest { - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QuerySigningInfosResponse is the response type for the Query/SigningInfos RPC -// method -message QuerySigningInfosResponse { - // info is the signing info of all validators - repeated cosmos.slashing.v1beta1.ValidatorSigningInfo info = 1 [(gogoproto.nullable) = false]; - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} diff --git a/third_party/proto/cosmos/slashing/v1beta1/slashing.proto b/third_party/proto/cosmos/slashing/v1beta1/slashing.proto deleted file mode 100644 index 882a0fb60c..0000000000 --- a/third_party/proto/cosmos/slashing/v1beta1/slashing.proto +++ /dev/null @@ -1,58 +0,0 @@ -syntax = "proto3"; -package cosmos.slashing.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/slashing/types"; -option (gogoproto.equal_all) = true; - -import "gogoproto/gogo.proto"; -import "google/protobuf/duration.proto"; -import "google/protobuf/timestamp.proto"; - -// ValidatorSigningInfo defines a validator's signing info for monitoring their -// liveness activity. -message ValidatorSigningInfo { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - string address = 1; - // Height at which validator was first a candidate OR was unjailed - int64 start_height = 2 [(gogoproto.moretags) = "yaml:\"start_height\""]; - // Index which is incremented each time the validator was a bonded - // in a block and may have signed a precommit or not. This in conjunction with the - // `SignedBlocksWindow` param determines the index in the `MissedBlocksBitArray`. - int64 index_offset = 3 [(gogoproto.moretags) = "yaml:\"index_offset\""]; - // Timestamp until which the validator is jailed due to liveness downtime. - google.protobuf.Timestamp jailed_until = 4 - [(gogoproto.moretags) = "yaml:\"jailed_until\"", (gogoproto.stdtime) = true, (gogoproto.nullable) = false]; - // Whether or not a validator has been tombstoned (killed out of validator set). It is set - // once the validator commits an equivocation or for any other configured misbehiavor. - bool tombstoned = 5; - // A counter kept to avoid unnecessary array reads. - // Note that `Sum(MissedBlocksBitArray)` always equals `MissedBlocksCounter`. - int64 missed_blocks_counter = 6 [(gogoproto.moretags) = "yaml:\"missed_blocks_counter\""]; -} - -// Params represents the parameters used for by the slashing module. -message Params { - int64 signed_blocks_window = 1 [(gogoproto.moretags) = "yaml:\"signed_blocks_window\""]; - bytes min_signed_per_window = 2 [ - (gogoproto.moretags) = "yaml:\"min_signed_per_window\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - google.protobuf.Duration downtime_jail_duration = 3 [ - (gogoproto.nullable) = false, - (gogoproto.stdduration) = true, - (gogoproto.moretags) = "yaml:\"downtime_jail_duration\"" - ]; - bytes slash_fraction_double_sign = 4 [ - (gogoproto.moretags) = "yaml:\"slash_fraction_double_sign\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - bytes slash_fraction_downtime = 5 [ - (gogoproto.moretags) = "yaml:\"slash_fraction_downtime\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} diff --git a/third_party/proto/cosmos/slashing/v1beta1/tx.proto b/third_party/proto/cosmos/slashing/v1beta1/tx.proto deleted file mode 100644 index 4d63370ecc..0000000000 --- a/third_party/proto/cosmos/slashing/v1beta1/tx.proto +++ /dev/null @@ -1,26 +0,0 @@ -syntax = "proto3"; -package cosmos.slashing.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/slashing/types"; -option (gogoproto.equal_all) = true; - -import "gogoproto/gogo.proto"; - -// Msg defines the slashing Msg service. -service Msg { - // Unjail defines a method for unjailing a jailed validator, thus returning - // them into the bonded validator set, so they can begin receiving provisions - // and rewards again. - rpc Unjail(MsgUnjail) returns (MsgUnjailResponse); -} - -// MsgUnjail defines the Msg/Unjail request type -message MsgUnjail { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = true; - - string validator_addr = 1 [(gogoproto.moretags) = "yaml:\"address\"", (gogoproto.jsontag) = "address"]; -} - -// MsgUnjailResponse defines the Msg/Unjail response type -message MsgUnjailResponse {} \ No newline at end of file diff --git a/third_party/proto/cosmos/staking/v1beta1/authz.proto b/third_party/proto/cosmos/staking/v1beta1/authz.proto deleted file mode 100644 index d50c329c91..0000000000 --- a/third_party/proto/cosmos/staking/v1beta1/authz.proto +++ /dev/null @@ -1,47 +0,0 @@ -syntax = "proto3"; -package cosmos.staking.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos_proto/cosmos.proto"; -import "cosmos/base/v1beta1/coin.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; - -// StakeAuthorization defines authorization for delegate/undelegate/redelegate. -// -// Since: cosmos-sdk 0.43 -message StakeAuthorization { - option (cosmos_proto.implements_interface) = "Authorization"; - - // max_tokens specifies the maximum amount of tokens can be delegate to a validator. If it is - // empty, there is no spend limit and any amount of coins can be delegated. - cosmos.base.v1beta1.Coin max_tokens = 1 [(gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coin"]; - // validators is the oneof that represents either allow_list or deny_list - oneof validators { - // allow_list specifies list of validator addresses to whom grantee can delegate tokens on behalf of granter's - // account. - Validators allow_list = 2; - // deny_list specifies list of validator addresses to whom grantee can not delegate tokens. - Validators deny_list = 3; - } - // Validators defines list of validator addresses. - message Validators { - repeated string address = 1; - } - // authorization_type defines one of AuthorizationType. - AuthorizationType authorization_type = 4; -} - -// AuthorizationType defines the type of staking module authorization type -// -// Since: cosmos-sdk 0.43 -enum AuthorizationType { - // AUTHORIZATION_TYPE_UNSPECIFIED specifies an unknown authorization type - AUTHORIZATION_TYPE_UNSPECIFIED = 0; - // AUTHORIZATION_TYPE_DELEGATE defines an authorization type for Msg/Delegate - AUTHORIZATION_TYPE_DELEGATE = 1; - // AUTHORIZATION_TYPE_UNDELEGATE defines an authorization type for Msg/Undelegate - AUTHORIZATION_TYPE_UNDELEGATE = 2; - // AUTHORIZATION_TYPE_REDELEGATE defines an authorization type for Msg/BeginRedelegate - AUTHORIZATION_TYPE_REDELEGATE = 3; -} diff --git a/third_party/proto/cosmos/staking/v1beta1/genesis.proto b/third_party/proto/cosmos/staking/v1beta1/genesis.proto deleted file mode 100644 index d1563dbc54..0000000000 --- a/third_party/proto/cosmos/staking/v1beta1/genesis.proto +++ /dev/null @@ -1,53 +0,0 @@ -syntax = "proto3"; -package cosmos.staking.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; - -import "gogoproto/gogo.proto"; -import "cosmos/staking/v1beta1/staking.proto"; - -// GenesisState defines the staking module's genesis state. -message GenesisState { - // params defines all the paramaters of related to deposit. - Params params = 1 [(gogoproto.nullable) = false]; - - // last_total_power tracks the total amounts of bonded tokens recorded during - // the previous end block. - bytes last_total_power = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"last_total_power\"", - (gogoproto.nullable) = false - ]; - - // last_validator_powers is a special index that provides a historical list - // of the last-block's bonded validators. - repeated LastValidatorPower last_validator_powers = 3 - [(gogoproto.moretags) = "yaml:\"last_validator_powers\"", (gogoproto.nullable) = false]; - - // delegations defines the validator set at genesis. - repeated Validator validators = 4 [(gogoproto.nullable) = false]; - - // delegations defines the delegations active at genesis. - repeated Delegation delegations = 5 [(gogoproto.nullable) = false]; - - // unbonding_delegations defines the unbonding delegations active at genesis. - repeated UnbondingDelegation unbonding_delegations = 6 - [(gogoproto.moretags) = "yaml:\"unbonding_delegations\"", (gogoproto.nullable) = false]; - - // redelegations defines the redelegations active at genesis. - repeated Redelegation redelegations = 7 [(gogoproto.nullable) = false]; - - bool exported = 8; -} - -// LastValidatorPower required for validator set update logic. -message LastValidatorPower { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // address is the address of the validator. - string address = 1; - - // power defines the power of the validator. - int64 power = 2; -} diff --git a/third_party/proto/cosmos/staking/v1beta1/query.proto b/third_party/proto/cosmos/staking/v1beta1/query.proto deleted file mode 100644 index 4852c53535..0000000000 --- a/third_party/proto/cosmos/staking/v1beta1/query.proto +++ /dev/null @@ -1,348 +0,0 @@ -syntax = "proto3"; -package cosmos.staking.v1beta1; - -import "cosmos/base/query/v1beta1/pagination.proto"; -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "cosmos/staking/v1beta1/staking.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; - -// Query defines the gRPC querier service. -service Query { - // Validators queries all validators that match the given status. - rpc Validators(QueryValidatorsRequest) returns (QueryValidatorsResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/validators"; - } - - // Validator queries validator info for given validator address. - rpc Validator(QueryValidatorRequest) returns (QueryValidatorResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/validators/{validator_addr}"; - } - - // ValidatorDelegations queries delegate info for given validator. - rpc ValidatorDelegations(QueryValidatorDelegationsRequest) returns (QueryValidatorDelegationsResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations"; - } - - // ValidatorUnbondingDelegations queries unbonding delegations of a validator. - rpc ValidatorUnbondingDelegations(QueryValidatorUnbondingDelegationsRequest) - returns (QueryValidatorUnbondingDelegationsResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/validators/" - "{validator_addr}/unbonding_delegations"; - } - - // Delegation queries delegate info for given validator delegator pair. - rpc Delegation(QueryDelegationRequest) returns (QueryDelegationResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/" - "{delegator_addr}"; - } - - // UnbondingDelegation queries unbonding info for given validator delegator - // pair. - rpc UnbondingDelegation(QueryUnbondingDelegationRequest) returns (QueryUnbondingDelegationResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/validators/{validator_addr}/delegations/" - "{delegator_addr}/unbonding_delegation"; - } - - // DelegatorDelegations queries all delegations of a given delegator address. - rpc DelegatorDelegations(QueryDelegatorDelegationsRequest) returns (QueryDelegatorDelegationsResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/delegations/{delegator_addr}"; - } - - // DelegatorUnbondingDelegations queries all unbonding delegations of a given - // delegator address. - rpc DelegatorUnbondingDelegations(QueryDelegatorUnbondingDelegationsRequest) - returns (QueryDelegatorUnbondingDelegationsResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/delegators/" - "{delegator_addr}/unbonding_delegations"; - } - - // Redelegations queries redelegations of given address. - rpc Redelegations(QueryRedelegationsRequest) returns (QueryRedelegationsResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/delegators/{delegator_addr}/redelegations"; - } - - // DelegatorValidators queries all validators info for given delegator - // address. - rpc DelegatorValidators(QueryDelegatorValidatorsRequest) returns (QueryDelegatorValidatorsResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators"; - } - - // DelegatorValidator queries validator info for given delegator validator - // pair. - rpc DelegatorValidator(QueryDelegatorValidatorRequest) returns (QueryDelegatorValidatorResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/delegators/{delegator_addr}/validators/" - "{validator_addr}"; - } - - // HistoricalInfo queries the historical info for given height. - rpc HistoricalInfo(QueryHistoricalInfoRequest) returns (QueryHistoricalInfoResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/historical_info/{height}"; - } - - // Pool queries the pool info. - rpc Pool(QueryPoolRequest) returns (QueryPoolResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/pool"; - } - - // Parameters queries the staking parameters. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/cosmos/staking/v1beta1/params"; - } -} - -// QueryValidatorsRequest is request type for Query/Validators RPC method. -message QueryValidatorsRequest { - // status enables to query for validators matching a given status. - string status = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryValidatorsResponse is response type for the Query/Validators RPC method -message QueryValidatorsResponse { - // validators contains all the queried validators. - repeated Validator validators = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryValidatorRequest is response type for the Query/Validator RPC method -message QueryValidatorRequest { - // validator_addr defines the validator address to query for. - string validator_addr = 1; -} - -// QueryValidatorResponse is response type for the Query/Validator RPC method -message QueryValidatorResponse { - // validator defines the the validator info. - Validator validator = 1 [(gogoproto.nullable) = false]; -} - -// QueryValidatorDelegationsRequest is request type for the -// Query/ValidatorDelegations RPC method -message QueryValidatorDelegationsRequest { - // validator_addr defines the validator address to query for. - string validator_addr = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryValidatorDelegationsResponse is response type for the -// Query/ValidatorDelegations RPC method -message QueryValidatorDelegationsResponse { - repeated DelegationResponse delegation_responses = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "DelegationResponses"]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryValidatorUnbondingDelegationsRequest is required type for the -// Query/ValidatorUnbondingDelegations RPC method -message QueryValidatorUnbondingDelegationsRequest { - // validator_addr defines the validator address to query for. - string validator_addr = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryValidatorUnbondingDelegationsResponse is response type for the -// Query/ValidatorUnbondingDelegations RPC method. -message QueryValidatorUnbondingDelegationsResponse { - repeated UnbondingDelegation unbonding_responses = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryDelegationRequest is request type for the Query/Delegation RPC method. -message QueryDelegationRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_addr defines the delegator address to query for. - string delegator_addr = 1; - - // validator_addr defines the validator address to query for. - string validator_addr = 2; -} - -// QueryDelegationResponse is response type for the Query/Delegation RPC method. -message QueryDelegationResponse { - // delegation_responses defines the delegation info of a delegation. - DelegationResponse delegation_response = 1; -} - -// QueryUnbondingDelegationRequest is request type for the -// Query/UnbondingDelegation RPC method. -message QueryUnbondingDelegationRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_addr defines the delegator address to query for. - string delegator_addr = 1; - - // validator_addr defines the validator address to query for. - string validator_addr = 2; -} - -// QueryDelegationResponse is response type for the Query/UnbondingDelegation -// RPC method. -message QueryUnbondingDelegationResponse { - // unbond defines the unbonding information of a delegation. - UnbondingDelegation unbond = 1 [(gogoproto.nullable) = false]; -} - -// QueryDelegatorDelegationsRequest is request type for the -// Query/DelegatorDelegations RPC method. -message QueryDelegatorDelegationsRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_addr defines the delegator address to query for. - string delegator_addr = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryDelegatorDelegationsResponse is response type for the -// Query/DelegatorDelegations RPC method. -message QueryDelegatorDelegationsResponse { - // delegation_responses defines all the delegations' info of a delegator. - repeated DelegationResponse delegation_responses = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryDelegatorUnbondingDelegationsRequest is request type for the -// Query/DelegatorUnbondingDelegations RPC method. -message QueryDelegatorUnbondingDelegationsRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_addr defines the delegator address to query for. - string delegator_addr = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryUnbondingDelegatorDelegationsResponse is response type for the -// Query/UnbondingDelegatorDelegations RPC method. -message QueryDelegatorUnbondingDelegationsResponse { - repeated UnbondingDelegation unbonding_responses = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryRedelegationsRequest is request type for the Query/Redelegations RPC -// method. -message QueryRedelegationsRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_addr defines the delegator address to query for. - string delegator_addr = 1; - - // src_validator_addr defines the validator address to redelegate from. - string src_validator_addr = 2; - - // dst_validator_addr defines the validator address to redelegate to. - string dst_validator_addr = 3; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 4; -} - -// QueryRedelegationsResponse is response type for the Query/Redelegations RPC -// method. -message QueryRedelegationsResponse { - repeated RedelegationResponse redelegation_responses = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryDelegatorValidatorsRequest is request type for the -// Query/DelegatorValidators RPC method. -message QueryDelegatorValidatorsRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_addr defines the delegator address to query for. - string delegator_addr = 1; - - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryDelegatorValidatorsResponse is response type for the -// Query/DelegatorValidators RPC method. -message QueryDelegatorValidatorsResponse { - // validators defines the the validators' info of a delegator. - repeated Validator validators = 1 [(gogoproto.nullable) = false]; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryDelegatorValidatorRequest is request type for the -// Query/DelegatorValidator RPC method. -message QueryDelegatorValidatorRequest { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // delegator_addr defines the delegator address to query for. - string delegator_addr = 1; - - // validator_addr defines the validator address to query for. - string validator_addr = 2; -} - -// QueryDelegatorValidatorResponse response type for the -// Query/DelegatorValidator RPC method. -message QueryDelegatorValidatorResponse { - // validator defines the the validator info. - Validator validator = 1 [(gogoproto.nullable) = false]; -} - -// QueryHistoricalInfoRequest is request type for the Query/HistoricalInfo RPC -// method. -message QueryHistoricalInfoRequest { - // height defines at which height to query the historical info. - int64 height = 1; -} - -// QueryHistoricalInfoResponse is response type for the Query/HistoricalInfo RPC -// method. -message QueryHistoricalInfoResponse { - // hist defines the historical info at the given height. - HistoricalInfo hist = 1; -} - -// QueryPoolRequest is request type for the Query/Pool RPC method. -message QueryPoolRequest {} - -// QueryPoolResponse is response type for the Query/Pool RPC method. -message QueryPoolResponse { - // pool defines the pool info. - Pool pool = 1 [(gogoproto.nullable) = false]; -} - -// QueryParamsRequest is request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is response type for the Query/Params RPC method. -message QueryParamsResponse { - // params holds all the parameters of this module. - Params params = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/staking/v1beta1/staking.proto b/third_party/proto/cosmos/staking/v1beta1/staking.proto deleted file mode 100644 index 76e9599e2d..0000000000 --- a/third_party/proto/cosmos/staking/v1beta1/staking.proto +++ /dev/null @@ -1,334 +0,0 @@ -syntax = "proto3"; -package cosmos.staking.v1beta1; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "google/protobuf/duration.proto"; -import "google/protobuf/timestamp.proto"; - -import "cosmos_proto/cosmos.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "tendermint/types/types.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; - -// HistoricalInfo contains header and validator information for a given block. -// It is stored as part of staking module's state, which persists the `n` most -// recent HistoricalInfo -// (`n` is set by the staking module's `historical_entries` parameter). -message HistoricalInfo { - tendermint.types.Header header = 1 [(gogoproto.nullable) = false]; - repeated Validator valset = 2 [(gogoproto.nullable) = false]; -} - -// CommissionRates defines the initial commission rates to be used for creating -// a validator. -message CommissionRates { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // rate is the commission rate charged to delegators, as a fraction. - string rate = 1 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; - // max_rate defines the maximum commission rate which validator can ever charge, as a fraction. - string max_rate = 2 [ - (gogoproto.moretags) = "yaml:\"max_rate\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // max_change_rate defines the maximum daily increase of the validator commission, as a fraction. - string max_change_rate = 3 [ - (gogoproto.moretags) = "yaml:\"max_change_rate\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// Commission defines commission parameters for a given validator. -message Commission { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // commission_rates defines the initial commission rates to be used for creating a validator. - CommissionRates commission_rates = 1 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // update_time is the last time the commission rate was changed. - google.protobuf.Timestamp update_time = 2 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"update_time\""]; -} - -// Description defines a validator description. -message Description { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // moniker defines a human-readable name for the validator. - string moniker = 1; - // identity defines an optional identity signature (ex. UPort or Keybase). - string identity = 2; - // website defines an optional website link. - string website = 3; - // security_contact defines an optional email for security contact. - string security_contact = 4 [(gogoproto.moretags) = "yaml:\"security_contact\""]; - // details define other optional details. - string details = 5; -} - -// Validator defines a validator, together with the total amount of the -// Validator's bond shares and their exchange rate to coins. Slashing results in -// a decrease in the exchange rate, allowing correct calculation of future -// undelegations without iterating over delegators. When coins are delegated to -// this validator, the validator is credited with a delegation whose number of -// bond shares is based on the amount of coins delegated divided by the current -// exchange rate. Voting power can be calculated as total bonded shares -// multiplied by exchange rate. -message Validator { - option (gogoproto.equal) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.goproto_getters) = false; - - // operator_address defines the address of the validator's operator; bech encoded in JSON. - string operator_address = 1 [(gogoproto.moretags) = "yaml:\"operator_address\""]; - // consensus_pubkey is the consensus public key of the validator, as a Protobuf Any. - google.protobuf.Any consensus_pubkey = 2 - [(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey", (gogoproto.moretags) = "yaml:\"consensus_pubkey\""]; - // jailed defined whether the validator has been jailed from bonded status or not. - bool jailed = 3; - // status is the validator status (bonded/unbonding/unbonded). - BondStatus status = 4; - // tokens define the delegated tokens (incl. self-delegation). - string tokens = 5 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; - // delegator_shares defines total shares issued to a validator's delegators. - string delegator_shares = 6 [ - (gogoproto.moretags) = "yaml:\"delegator_shares\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // description defines the description terms for the validator. - Description description = 7 [(gogoproto.nullable) = false]; - // unbonding_height defines, if unbonding, the height at which this validator has begun unbonding. - int64 unbonding_height = 8 [(gogoproto.moretags) = "yaml:\"unbonding_height\""]; - // unbonding_time defines, if unbonding, the min time for the validator to complete unbonding. - google.protobuf.Timestamp unbonding_time = 9 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"unbonding_time\""]; - // commission defines the commission parameters. - Commission commission = 10 [(gogoproto.nullable) = false]; - // min_self_delegation is the validator's self declared minimum self delegation. - string min_self_delegation = 11 [ - (gogoproto.moretags) = "yaml:\"min_self_delegation\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false - ]; -} - -// BondStatus is the status of a validator. -enum BondStatus { - option (gogoproto.goproto_enum_prefix) = false; - - // UNSPECIFIED defines an invalid validator status. - BOND_STATUS_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "Unspecified"]; - // UNBONDED defines a validator that is not bonded. - BOND_STATUS_UNBONDED = 1 [(gogoproto.enumvalue_customname) = "Unbonded"]; - // UNBONDING defines a validator that is unbonding. - BOND_STATUS_UNBONDING = 2 [(gogoproto.enumvalue_customname) = "Unbonding"]; - // BONDED defines a validator that is bonded. - BOND_STATUS_BONDED = 3 [(gogoproto.enumvalue_customname) = "Bonded"]; -} - -// ValAddresses defines a repeated set of validator addresses. -message ValAddresses { - option (gogoproto.goproto_stringer) = false; - option (gogoproto.stringer) = true; - - repeated string addresses = 1; -} - -// DVPair is struct that just has a delegator-validator pair with no other data. -// It is intended to be used as a marshalable pointer. For example, a DVPair can -// be used to construct the key to getting an UnbondingDelegation from state. -message DVPair { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; -} - -// DVPairs defines an array of DVPair objects. -message DVPairs { - repeated DVPair pairs = 1 [(gogoproto.nullable) = false]; -} - -// DVVTriplet is struct that just has a delegator-validator-validator triplet -// with no other data. It is intended to be used as a marshalable pointer. For -// example, a DVVTriplet can be used to construct the key to getting a -// Redelegation from state. -message DVVTriplet { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string validator_src_address = 2 [(gogoproto.moretags) = "yaml:\"validator_src_address\""]; - string validator_dst_address = 3 [(gogoproto.moretags) = "yaml:\"validator_dst_address\""]; -} - -// DVVTriplets defines an array of DVVTriplet objects. -message DVVTriplets { - repeated DVVTriplet triplets = 1 [(gogoproto.nullable) = false]; -} - -// Delegation represents the bond with tokens held by an account. It is -// owned by one delegator, and is associated with the voting power of one -// validator. -message Delegation { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - // delegator_address is the bech32-encoded address of the delegator. - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - // validator_address is the bech32-encoded address of the validator. - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - // shares define the delegation shares received. - string shares = 3 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; -} - -// UnbondingDelegation stores all of a single delegator's unbonding bonds -// for a single validator in an time-ordered list. -message UnbondingDelegation { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - // delegator_address is the bech32-encoded address of the delegator. - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - // validator_address is the bech32-encoded address of the validator. - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - // entries are the unbonding delegation entries. - repeated UnbondingDelegationEntry entries = 3 [(gogoproto.nullable) = false]; // unbonding delegation entries -} - -// UnbondingDelegationEntry defines an unbonding object with relevant metadata. -message UnbondingDelegationEntry { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // creation_height is the height which the unbonding took place. - int64 creation_height = 1 [(gogoproto.moretags) = "yaml:\"creation_height\""]; - // completion_time is the unix time for unbonding completion. - google.protobuf.Timestamp completion_time = 2 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"completion_time\""]; - // initial_balance defines the tokens initially scheduled to receive at completion. - string initial_balance = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false, - (gogoproto.moretags) = "yaml:\"initial_balance\"" - ]; - // balance defines the tokens to receive at completion. - string balance = 4 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; -} - -// RedelegationEntry defines a redelegation object with relevant metadata. -message RedelegationEntry { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // creation_height defines the height which the redelegation took place. - int64 creation_height = 1 [(gogoproto.moretags) = "yaml:\"creation_height\""]; - // completion_time defines the unix time for redelegation completion. - google.protobuf.Timestamp completion_time = 2 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"completion_time\""]; - // initial_balance defines the initial balance when redelegation started. - string initial_balance = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false, - (gogoproto.moretags) = "yaml:\"initial_balance\"" - ]; - // shares_dst is the amount of destination-validator shares created by redelegation. - string shares_dst = 4 - [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; -} - -// Redelegation contains the list of a particular delegator's redelegating bonds -// from a particular source validator to a particular destination validator. -message Redelegation { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - // delegator_address is the bech32-encoded address of the delegator. - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - // validator_src_address is the validator redelegation source operator address. - string validator_src_address = 2 [(gogoproto.moretags) = "yaml:\"validator_src_address\""]; - // validator_dst_address is the validator redelegation destination operator address. - string validator_dst_address = 3 [(gogoproto.moretags) = "yaml:\"validator_dst_address\""]; - // entries are the redelegation entries. - repeated RedelegationEntry entries = 4 [(gogoproto.nullable) = false]; // redelegation entries -} - -// Params defines the parameters for the staking module. -message Params { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // unbonding_time is the time duration of unbonding. - google.protobuf.Duration unbonding_time = 1 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true, (gogoproto.moretags) = "yaml:\"unbonding_time\""]; - // max_validators is the maximum number of validators. - uint32 max_validators = 2 [(gogoproto.moretags) = "yaml:\"max_validators\""]; - // max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio). - uint32 max_entries = 3 [(gogoproto.moretags) = "yaml:\"max_entries\""]; - // historical_entries is the number of historical entries to persist. - uint32 historical_entries = 4 [(gogoproto.moretags) = "yaml:\"historical_entries\""]; - // bond_denom defines the bondable coin denomination. - string bond_denom = 5 [(gogoproto.moretags) = "yaml:\"bond_denom\""]; -} - -// DelegationResponse is equivalent to Delegation except that it contains a -// balance in addition to shares which is more suitable for client responses. -message DelegationResponse { - option (gogoproto.equal) = false; - option (gogoproto.goproto_stringer) = false; - - Delegation delegation = 1 [(gogoproto.nullable) = false]; - - cosmos.base.v1beta1.Coin balance = 2 [(gogoproto.nullable) = false]; -} - -// RedelegationEntryResponse is equivalent to a RedelegationEntry except that it -// contains a balance in addition to shares which is more suitable for client -// responses. -message RedelegationEntryResponse { - option (gogoproto.equal) = true; - - RedelegationEntry redelegation_entry = 1 [(gogoproto.nullable) = false]; - string balance = 4 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; -} - -// RedelegationResponse is equivalent to a Redelegation except that its entries -// contain a balance in addition to shares which is more suitable for client -// responses. -message RedelegationResponse { - option (gogoproto.equal) = false; - - Redelegation redelegation = 1 [(gogoproto.nullable) = false]; - repeated RedelegationEntryResponse entries = 2 [(gogoproto.nullable) = false]; -} - -// Pool is used for tracking bonded and not-bonded token supply of the bond -// denomination. -message Pool { - option (gogoproto.description) = true; - option (gogoproto.equal) = true; - string not_bonded_tokens = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.jsontag) = "not_bonded_tokens", - (gogoproto.nullable) = false - ]; - string bonded_tokens = 2 [ - (gogoproto.jsontag) = "bonded_tokens", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false, - (gogoproto.moretags) = "yaml:\"bonded_tokens\"" - ]; -} diff --git a/third_party/proto/cosmos/staking/v1beta1/tx.proto b/third_party/proto/cosmos/staking/v1beta1/tx.proto deleted file mode 100644 index 7b05d89eea..0000000000 --- a/third_party/proto/cosmos/staking/v1beta1/tx.proto +++ /dev/null @@ -1,126 +0,0 @@ -syntax = "proto3"; -package cosmos.staking.v1beta1; - -import "google/protobuf/any.proto"; -import "google/protobuf/timestamp.proto"; -import "gogoproto/gogo.proto"; - -import "cosmos_proto/cosmos.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos/staking/v1beta1/staking.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; - -// Msg defines the staking Msg service. -service Msg { - // CreateValidator defines a method for creating a new validator. - rpc CreateValidator(MsgCreateValidator) returns (MsgCreateValidatorResponse); - - // EditValidator defines a method for editing an existing validator. - rpc EditValidator(MsgEditValidator) returns (MsgEditValidatorResponse); - - // Delegate defines a method for performing a delegation of coins - // from a delegator to a validator. - rpc Delegate(MsgDelegate) returns (MsgDelegateResponse); - - // BeginRedelegate defines a method for performing a redelegation - // of coins from a delegator and source validator to a destination validator. - rpc BeginRedelegate(MsgBeginRedelegate) returns (MsgBeginRedelegateResponse); - - // Undelegate defines a method for performing an undelegation from a - // delegate and a validator. - rpc Undelegate(MsgUndelegate) returns (MsgUndelegateResponse); -} - -// MsgCreateValidator defines a SDK message for creating a new validator. -message MsgCreateValidator { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - Description description = 1 [(gogoproto.nullable) = false]; - CommissionRates commission = 2 [(gogoproto.nullable) = false]; - string min_self_delegation = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"min_self_delegation\"", - (gogoproto.nullable) = false - ]; - string delegator_address = 4 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string validator_address = 5 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - google.protobuf.Any pubkey = 6 [(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey"]; - cosmos.base.v1beta1.Coin value = 7 [(gogoproto.nullable) = false]; -} - -// MsgCreateValidatorResponse defines the Msg/CreateValidator response type. -message MsgCreateValidatorResponse {} - -// MsgEditValidator defines a SDK message for editing an existing validator. -message MsgEditValidator { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - Description description = 1 [(gogoproto.nullable) = false]; - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"address\""]; - - // We pass a reference to the new commission rate and min self delegation as - // it's not mandatory to update. If not updated, the deserialized rate will be - // zero with no way to distinguish if an update was intended. - // REF: #2373 - string commission_rate = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.moretags) = "yaml:\"commission_rate\"" - ]; - string min_self_delegation = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"min_self_delegation\"" - ]; -} - -// MsgEditValidatorResponse defines the Msg/EditValidator response type. -message MsgEditValidatorResponse {} - -// MsgDelegate defines a SDK message for performing a delegation of coins -// from a delegator to a validator. -message MsgDelegate { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - cosmos.base.v1beta1.Coin amount = 3 [(gogoproto.nullable) = false]; -} - -// MsgDelegateResponse defines the Msg/Delegate response type. -message MsgDelegateResponse {} - -// MsgBeginRedelegate defines a SDK message for performing a redelegation -// of coins from a delegator and source validator to a destination validator. -message MsgBeginRedelegate { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string validator_src_address = 2 [(gogoproto.moretags) = "yaml:\"validator_src_address\""]; - string validator_dst_address = 3 [(gogoproto.moretags) = "yaml:\"validator_dst_address\""]; - cosmos.base.v1beta1.Coin amount = 4 [(gogoproto.nullable) = false]; -} - -// MsgBeginRedelegateResponse defines the Msg/BeginRedelegate response type. -message MsgBeginRedelegateResponse { - google.protobuf.Timestamp completion_time = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; -} - -// MsgUndelegate defines a SDK message for performing an undelegation from a -// delegate and a validator. -message MsgUndelegate { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - cosmos.base.v1beta1.Coin amount = 3 [(gogoproto.nullable) = false]; -} - -// MsgUndelegateResponse defines the Msg/Undelegate response type. -message MsgUndelegateResponse { - google.protobuf.Timestamp completion_time = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; -} diff --git a/third_party/proto/cosmos/tx/signing/v1beta1/signing.proto b/third_party/proto/cosmos/tx/signing/v1beta1/signing.proto deleted file mode 100644 index 50de89c8fc..0000000000 --- a/third_party/proto/cosmos/tx/signing/v1beta1/signing.proto +++ /dev/null @@ -1,91 +0,0 @@ -syntax = "proto3"; -package cosmos.tx.signing.v1beta1; - -import "cosmos/crypto/multisig/v1beta1/multisig.proto"; -import "google/protobuf/any.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/types/tx/signing"; - -// SignMode represents a signing mode with its own security guarantees. -enum SignMode { - // SIGN_MODE_UNSPECIFIED specifies an unknown signing mode and will be - // rejected - SIGN_MODE_UNSPECIFIED = 0; - - // SIGN_MODE_DIRECT specifies a signing mode which uses SignDoc and is - // verified with raw bytes from Tx - SIGN_MODE_DIRECT = 1; - - // SIGN_MODE_TEXTUAL is a future signing mode that will verify some - // human-readable textual representation on top of the binary representation - // from SIGN_MODE_DIRECT - SIGN_MODE_TEXTUAL = 2; - - // SIGN_MODE_LEGACY_AMINO_JSON is a backwards compatibility mode which uses - // Amino JSON and will be removed in the future - SIGN_MODE_LEGACY_AMINO_JSON = 127; - - // SIGN_MODE_EIP_191 specifies the sign mode for EIP 191 signing on the Cosmos - // SDK. Ref: https://eips.ethereum.org/EIPS/eip-191 - // - // Currently, SIGN_MODE_EIP_191 is registered as a SignMode enum variant, - // but is not implemented on the SDK by default. To enable EIP-191, you need - // to pass a custom `TxConfig` that has an implementation of - // `SignModeHandler` for EIP-191. The SDK may decide to fully support - // EIP-191 in the future. - // - // Since: cosmos-sdk 0.45.2 - SIGN_MODE_EIP_191 = 191; -} - -// SignatureDescriptors wraps multiple SignatureDescriptor's. -message SignatureDescriptors { - // signatures are the signature descriptors - repeated SignatureDescriptor signatures = 1; -} - -// SignatureDescriptor is a convenience type which represents the full data for -// a signature including the public key of the signer, signing modes and the -// signature itself. It is primarily used for coordinating signatures between -// clients. -message SignatureDescriptor { - // public_key is the public key of the signer - google.protobuf.Any public_key = 1; - - Data data = 2; - - // sequence is the sequence of the account, which describes the - // number of committed transactions signed by a given address. It is used to prevent - // replay attacks. - uint64 sequence = 3; - - // Data represents signature data - message Data { - // sum is the oneof that specifies whether this represents single or multi-signature data - oneof sum { - // single represents a single signer - Single single = 1; - - // multi represents a multisig signer - Multi multi = 2; - } - - // Single is the signature data for a single signer - message Single { - // mode is the signing mode of the single signer - SignMode mode = 1; - - // signature is the raw signature bytes - bytes signature = 2; - } - - // Multi is the signature data for a multisig public key - message Multi { - // bitarray specifies which keys within the multisig are signing - cosmos.crypto.multisig.v1beta1.CompactBitArray bitarray = 1; - - // signatures is the signatures of the multi-signature - repeated Data signatures = 2; - } - } -} diff --git a/third_party/proto/cosmos/tx/v1beta1/service.proto b/third_party/proto/cosmos/tx/v1beta1/service.proto deleted file mode 100644 index d9f828f763..0000000000 --- a/third_party/proto/cosmos/tx/v1beta1/service.proto +++ /dev/null @@ -1,165 +0,0 @@ -syntax = "proto3"; -package cosmos.tx.v1beta1; - -import "google/api/annotations.proto"; -import "cosmos/base/abci/v1beta1/abci.proto"; -import "cosmos/tx/v1beta1/tx.proto"; -import "gogoproto/gogo.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; -import "tendermint/types/block.proto"; -import "tendermint/types/types.proto"; - -option (gogoproto.goproto_registration) = true; -option go_package = "github.com/cosmos/cosmos-sdk/types/tx"; - -// Service defines a gRPC service for interacting with transactions. -service Service { - // Simulate simulates executing a transaction for estimating gas usage. - rpc Simulate(SimulateRequest) returns (SimulateResponse) { - option (google.api.http) = { - post: "/cosmos/tx/v1beta1/simulate" - body: "*" - }; - } - // GetTx fetches a tx by hash. - rpc GetTx(GetTxRequest) returns (GetTxResponse) { - option (google.api.http).get = "/cosmos/tx/v1beta1/txs/{hash}"; - } - // BroadcastTx broadcast transaction. - rpc BroadcastTx(BroadcastTxRequest) returns (BroadcastTxResponse) { - option (google.api.http) = { - post: "/cosmos/tx/v1beta1/txs" - body: "*" - }; - } - // GetTxsEvent fetches txs by event. - rpc GetTxsEvent(GetTxsEventRequest) returns (GetTxsEventResponse) { - option (google.api.http).get = "/cosmos/tx/v1beta1/txs"; - } - // GetBlockWithTxs fetches a block with decoded txs. - // - // Since: cosmos-sdk 0.45.2 - rpc GetBlockWithTxs(GetBlockWithTxsRequest) returns (GetBlockWithTxsResponse) { - option (google.api.http).get = "/cosmos/tx/v1beta1/txs/block/{height}"; - } -} - -// GetTxsEventRequest is the request type for the Service.TxsByEvents -// RPC method. -message GetTxsEventRequest { - // events is the list of transaction event type. - repeated string events = 1; - // pagination defines a pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; - OrderBy order_by = 3; -} - -// OrderBy defines the sorting order -enum OrderBy { - // ORDER_BY_UNSPECIFIED specifies an unknown sorting order. OrderBy defaults to ASC in this case. - ORDER_BY_UNSPECIFIED = 0; - // ORDER_BY_ASC defines ascending order - ORDER_BY_ASC = 1; - // ORDER_BY_DESC defines descending order - ORDER_BY_DESC = 2; -} - -// GetTxsEventResponse is the response type for the Service.TxsByEvents -// RPC method. -message GetTxsEventResponse { - // txs is the list of queried transactions. - repeated cosmos.tx.v1beta1.Tx txs = 1; - // tx_responses is the list of queried TxResponses. - repeated cosmos.base.abci.v1beta1.TxResponse tx_responses = 2; - // pagination defines a pagination for the response. - cosmos.base.query.v1beta1.PageResponse pagination = 3; -} - -// BroadcastTxRequest is the request type for the Service.BroadcastTxRequest -// RPC method. -message BroadcastTxRequest { - // tx_bytes is the raw transaction. - bytes tx_bytes = 1; - BroadcastMode mode = 2; -} - -// BroadcastMode specifies the broadcast mode for the TxService.Broadcast RPC method. -enum BroadcastMode { - // zero-value for mode ordering - BROADCAST_MODE_UNSPECIFIED = 0; - // BROADCAST_MODE_BLOCK defines a tx broadcasting mode where the client waits for - // the tx to be committed in a block. - BROADCAST_MODE_BLOCK = 1; - // BROADCAST_MODE_SYNC defines a tx broadcasting mode where the client waits for - // a CheckTx execution response only. - BROADCAST_MODE_SYNC = 2; - // BROADCAST_MODE_ASYNC defines a tx broadcasting mode where the client returns - // immediately. - BROADCAST_MODE_ASYNC = 3; -} - -// BroadcastTxResponse is the response type for the -// Service.BroadcastTx method. -message BroadcastTxResponse { - // tx_response is the queried TxResponses. - cosmos.base.abci.v1beta1.TxResponse tx_response = 1; -} - -// SimulateRequest is the request type for the Service.Simulate -// RPC method. -message SimulateRequest { - // tx is the transaction to simulate. - // Deprecated. Send raw tx bytes instead. - cosmos.tx.v1beta1.Tx tx = 1 [deprecated = true]; - // tx_bytes is the raw transaction. - // - // Since: cosmos-sdk 0.43 - bytes tx_bytes = 2; -} - -// SimulateResponse is the response type for the -// Service.SimulateRPC method. -message SimulateResponse { - // gas_info is the information about gas used in the simulation. - cosmos.base.abci.v1beta1.GasInfo gas_info = 1; - // result is the result of the simulation. - cosmos.base.abci.v1beta1.Result result = 2; -} - -// GetTxRequest is the request type for the Service.GetTx -// RPC method. -message GetTxRequest { - // hash is the tx hash to query, encoded as a hex string. - string hash = 1; -} - -// GetTxResponse is the response type for the Service.GetTx method. -message GetTxResponse { - // tx is the queried transaction. - cosmos.tx.v1beta1.Tx tx = 1; - // tx_response is the queried TxResponses. - cosmos.base.abci.v1beta1.TxResponse tx_response = 2; -} - -// GetBlockWithTxsRequest is the request type for the Service.GetBlockWithTxs -// RPC method. -// -// Since: cosmos-sdk 0.45.2 -message GetBlockWithTxsRequest { - // height is the height of the block to query. - int64 height = 1; - // pagination defines a pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// GetBlockWithTxsResponse is the response type for the Service.GetBlockWithTxs method. -// -// Since: cosmos-sdk 0.45.2 -message GetBlockWithTxsResponse { - // txs are the transactions in the block. - repeated cosmos.tx.v1beta1.Tx txs = 1; - .tendermint.types.BlockID block_id = 2; - .tendermint.types.Block block = 3; - // pagination defines a pagination for the response. - cosmos.base.query.v1beta1.PageResponse pagination = 4; -} \ No newline at end of file diff --git a/third_party/proto/cosmos/tx/v1beta1/tx.proto b/third_party/proto/cosmos/tx/v1beta1/tx.proto deleted file mode 100644 index 6d5caf12c7..0000000000 --- a/third_party/proto/cosmos/tx/v1beta1/tx.proto +++ /dev/null @@ -1,183 +0,0 @@ -syntax = "proto3"; -package cosmos.tx.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos/crypto/multisig/v1beta1/multisig.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos/tx/signing/v1beta1/signing.proto"; -import "google/protobuf/any.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/types/tx"; - -// Tx is the standard type used for broadcasting transactions. -message Tx { - // body is the processable content of the transaction - TxBody body = 1; - - // auth_info is the authorization related content of the transaction, - // specifically signers, signer modes and fee - AuthInfo auth_info = 2; - - // signatures is a list of signatures that matches the length and order of - // AuthInfo's signer_infos to allow connecting signature meta information like - // public key and signing mode by position. - repeated bytes signatures = 3; -} - -// TxRaw is a variant of Tx that pins the signer's exact binary representation -// of body and auth_info. This is used for signing, broadcasting and -// verification. The binary `serialize(tx: TxRaw)` is stored in Tendermint and -// the hash `sha256(serialize(tx: TxRaw))` becomes the "txhash", commonly used -// as the transaction ID. -message TxRaw { - // body_bytes is a protobuf serialization of a TxBody that matches the - // representation in SignDoc. - bytes body_bytes = 1; - - // auth_info_bytes is a protobuf serialization of an AuthInfo that matches the - // representation in SignDoc. - bytes auth_info_bytes = 2; - - // signatures is a list of signatures that matches the length and order of - // AuthInfo's signer_infos to allow connecting signature meta information like - // public key and signing mode by position. - repeated bytes signatures = 3; -} - -// SignDoc is the type used for generating sign bytes for SIGN_MODE_DIRECT. -message SignDoc { - // body_bytes is protobuf serialization of a TxBody that matches the - // representation in TxRaw. - bytes body_bytes = 1; - - // auth_info_bytes is a protobuf serialization of an AuthInfo that matches the - // representation in TxRaw. - bytes auth_info_bytes = 2; - - // chain_id is the unique identifier of the chain this transaction targets. - // It prevents signed transactions from being used on another chain by an - // attacker - string chain_id = 3; - - // account_number is the account number of the account in state - uint64 account_number = 4; -} - -// TxBody is the body of a transaction that all signers sign over. -message TxBody { - // messages is a list of messages to be executed. The required signers of - // those messages define the number and order of elements in AuthInfo's - // signer_infos and Tx's signatures. Each required signer address is added to - // the list only the first time it occurs. - // By convention, the first required signer (usually from the first message) - // is referred to as the primary signer and pays the fee for the whole - // transaction. - repeated google.protobuf.Any messages = 1; - - // memo is any arbitrary note/comment to be added to the transaction. - // WARNING: in clients, any publicly exposed text should not be called memo, - // but should be called `note` instead (see https://github.com/cosmos/cosmos-sdk/issues/9122). - string memo = 2; - - // timeout is the block height after which this transaction will not - // be processed by the chain - uint64 timeout_height = 3; - - // extension_options are arbitrary options that can be added by chains - // when the default options are not sufficient. If any of these are present - // and can't be handled, the transaction will be rejected - repeated google.protobuf.Any extension_options = 1023; - - // extension_options are arbitrary options that can be added by chains - // when the default options are not sufficient. If any of these are present - // and can't be handled, they will be ignored - repeated google.protobuf.Any non_critical_extension_options = 2047; -} - -// AuthInfo describes the fee and signer modes that are used to sign a -// transaction. -message AuthInfo { - // signer_infos defines the signing modes for the required signers. The number - // and order of elements must match the required signers from TxBody's - // messages. The first element is the primary signer and the one which pays - // the fee. - repeated SignerInfo signer_infos = 1; - - // Fee is the fee and gas limit for the transaction. The first signer is the - // primary signer and the one which pays the fee. The fee can be calculated - // based on the cost of evaluating the body and doing signature verification - // of the signers. This can be estimated via simulation. - Fee fee = 2; -} - -// SignerInfo describes the public key and signing mode of a single top-level -// signer. -message SignerInfo { - // public_key is the public key of the signer. It is optional for accounts - // that already exist in state. If unset, the verifier can use the required \ - // signer address for this position and lookup the public key. - google.protobuf.Any public_key = 1; - - // mode_info describes the signing mode of the signer and is a nested - // structure to support nested multisig pubkey's - ModeInfo mode_info = 2; - - // sequence is the sequence of the account, which describes the - // number of committed transactions signed by a given address. It is used to - // prevent replay attacks. - uint64 sequence = 3; -} - -// ModeInfo describes the signing mode of a single or nested multisig signer. -message ModeInfo { - // sum is the oneof that specifies whether this represents a single or nested - // multisig signer - oneof sum { - // single represents a single signer - Single single = 1; - - // multi represents a nested multisig signer - Multi multi = 2; - } - - // Single is the mode info for a single signer. It is structured as a message - // to allow for additional fields such as locale for SIGN_MODE_TEXTUAL in the - // future - message Single { - // mode is the signing mode of the single signer - cosmos.tx.signing.v1beta1.SignMode mode = 1; - } - - // Multi is the mode info for a multisig public key - message Multi { - // bitarray specifies which keys within the multisig are signing - cosmos.crypto.multisig.v1beta1.CompactBitArray bitarray = 1; - - // mode_infos is the corresponding modes of the signers of the multisig - // which could include nested multisig public keys - repeated ModeInfo mode_infos = 2; - } -} - -// Fee includes the amount of coins paid in fees and the maximum -// gas to be used by the transaction. The ratio yields an effective "gasprice", -// which must be above some miminum to be accepted into the mempool. -message Fee { - // amount is the amount of coins to be paid as a fee - repeated cosmos.base.v1beta1.Coin amount = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; - - // gas_limit is the maximum gas that can be used in transaction processing - // before an out of gas error occurs - uint64 gas_limit = 2; - - // if unset, the first signer is responsible for paying the fees. If set, the specified account must pay the fees. - // the payer must be a tx signer (and thus have signed this field in AuthInfo). - // setting this field does *not* change the ordering of required signers for the transaction. - string payer = 3; - - // if set, the fee payer (either the first signer or the value of the payer field) requests that a fee grant be used - // to pay fees instead of the fee payer's own balance. If an appropriate fee grant does not exist or the chain does - // not support fee grants, this will fail - string granter = 4; -} diff --git a/third_party/proto/cosmos/upgrade/v1beta1/query.proto b/third_party/proto/cosmos/upgrade/v1beta1/query.proto deleted file mode 100644 index dd14ba6401..0000000000 --- a/third_party/proto/cosmos/upgrade/v1beta1/query.proto +++ /dev/null @@ -1,104 +0,0 @@ -syntax = "proto3"; -package cosmos.upgrade.v1beta1; - -import "google/protobuf/any.proto"; -import "google/api/annotations.proto"; -import "cosmos/upgrade/v1beta1/upgrade.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/upgrade/types"; - -// Query defines the gRPC upgrade querier service. -service Query { - // CurrentPlan queries the current upgrade plan. - rpc CurrentPlan(QueryCurrentPlanRequest) returns (QueryCurrentPlanResponse) { - option (google.api.http).get = "/cosmos/upgrade/v1beta1/current_plan"; - } - - // AppliedPlan queries a previously applied upgrade plan by its name. - rpc AppliedPlan(QueryAppliedPlanRequest) returns (QueryAppliedPlanResponse) { - option (google.api.http).get = "/cosmos/upgrade/v1beta1/applied_plan/{name}"; - } - - // UpgradedConsensusState queries the consensus state that will serve - // as a trusted kernel for the next version of this chain. It will only be - // stored at the last height of this chain. - // UpgradedConsensusState RPC not supported with legacy querier - // This rpc is deprecated now that IBC has its own replacement - // (https://github.com/cosmos/ibc-go/blob/2c880a22e9f9cc75f62b527ca94aa75ce1106001/proto/ibc/core/client/v1/query.proto#L54) - rpc UpgradedConsensusState(QueryUpgradedConsensusStateRequest) returns (QueryUpgradedConsensusStateResponse) { - option deprecated = true; - option (google.api.http).get = "/cosmos/upgrade/v1beta1/upgraded_consensus_state/{last_height}"; - } - - // ModuleVersions queries the list of module versions from state. - // - // Since: cosmos-sdk 0.43 - rpc ModuleVersions(QueryModuleVersionsRequest) returns (QueryModuleVersionsResponse) { - option (google.api.http).get = "/cosmos/upgrade/v1beta1/module_versions"; - } -} - -// QueryCurrentPlanRequest is the request type for the Query/CurrentPlan RPC -// method. -message QueryCurrentPlanRequest {} - -// QueryCurrentPlanResponse is the response type for the Query/CurrentPlan RPC -// method. -message QueryCurrentPlanResponse { - // plan is the current upgrade plan. - Plan plan = 1; -} - -// QueryCurrentPlanRequest is the request type for the Query/AppliedPlan RPC -// method. -message QueryAppliedPlanRequest { - // name is the name of the applied plan to query for. - string name = 1; -} - -// QueryAppliedPlanResponse is the response type for the Query/AppliedPlan RPC -// method. -message QueryAppliedPlanResponse { - // height is the block height at which the plan was applied. - int64 height = 1; -} - -// QueryUpgradedConsensusStateRequest is the request type for the Query/UpgradedConsensusState -// RPC method. -message QueryUpgradedConsensusStateRequest { - option deprecated = true; - - // last height of the current chain must be sent in request - // as this is the height under which next consensus state is stored - int64 last_height = 1; -} - -// QueryUpgradedConsensusStateResponse is the response type for the Query/UpgradedConsensusState -// RPC method. -message QueryUpgradedConsensusStateResponse { - option deprecated = true; - reserved 1; - - // Since: cosmos-sdk 0.43 - bytes upgraded_consensus_state = 2; -} - -// QueryModuleVersionsRequest is the request type for the Query/ModuleVersions -// RPC method. -// -// Since: cosmos-sdk 0.43 -message QueryModuleVersionsRequest { - // module_name is a field to query a specific module - // consensus version from state. Leaving this empty will - // fetch the full list of module versions from state - string module_name = 1; -} - -// QueryModuleVersionsResponse is the response type for the Query/ModuleVersions -// RPC method. -// -// Since: cosmos-sdk 0.43 -message QueryModuleVersionsResponse { - // module_versions is a list of module names with their consensus versions. - repeated ModuleVersion module_versions = 1; -} diff --git a/third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto b/third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto deleted file mode 100644 index e888b393d6..0000000000 --- a/third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto +++ /dev/null @@ -1,78 +0,0 @@ -syntax = "proto3"; -package cosmos.upgrade.v1beta1; - -import "google/protobuf/any.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/timestamp.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/upgrade/types"; -option (gogoproto.goproto_getters_all) = false; - -// Plan specifies information about a planned upgrade and when it should occur. -message Plan { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // Sets the name for the upgrade. This name will be used by the upgraded - // version of the software to apply any special "on-upgrade" commands during - // the first BeginBlock method after the upgrade is applied. It is also used - // to detect whether a software version can handle a given upgrade. If no - // upgrade handler with this name has been set in the software, it will be - // assumed that the software is out-of-date when the upgrade Time or Height is - // reached and the software will exit. - string name = 1; - - // Deprecated: Time based upgrades have been deprecated. Time based upgrade logic - // has been removed from the SDK. - // If this field is not empty, an error will be thrown. - google.protobuf.Timestamp time = 2 [deprecated = true, (gogoproto.stdtime) = true, (gogoproto.nullable) = false]; - - // The height at which the upgrade must be performed. - // Only used if Time is not set. - int64 height = 3; - - // Any application specific upgrade info to be included on-chain - // such as a git commit that validators could automatically upgrade to - string info = 4; - - // Deprecated: UpgradedClientState field has been deprecated. IBC upgrade logic has been - // moved to the IBC module in the sub module 02-client. - // If this field is not empty, an error will be thrown. - google.protobuf.Any upgraded_client_state = 5 - [deprecated = true, (gogoproto.moretags) = "yaml:\"upgraded_client_state\""]; -} - -// SoftwareUpgradeProposal is a gov Content type for initiating a software -// upgrade. -message SoftwareUpgradeProposal { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - string title = 1; - string description = 2; - Plan plan = 3 [(gogoproto.nullable) = false]; -} - -// CancelSoftwareUpgradeProposal is a gov Content type for cancelling a software -// upgrade. -message CancelSoftwareUpgradeProposal { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - string title = 1; - string description = 2; -} - -// ModuleVersion specifies a module and its consensus version. -// -// Since: cosmos-sdk 0.43 -message ModuleVersion { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = true; - - // name of the app module - string name = 1; - - // consensus version of the app module - uint64 version = 2; -} diff --git a/third_party/proto/cosmos/vesting/v1beta1/tx.proto b/third_party/proto/cosmos/vesting/v1beta1/tx.proto deleted file mode 100644 index c49be802a7..0000000000 --- a/third_party/proto/cosmos/vesting/v1beta1/tx.proto +++ /dev/null @@ -1,31 +0,0 @@ -syntax = "proto3"; -package cosmos.vesting.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"; - -// Msg defines the bank Msg service. -service Msg { - // CreateVestingAccount defines a method that enables creating a vesting - // account. - rpc CreateVestingAccount(MsgCreateVestingAccount) returns (MsgCreateVestingAccountResponse); -} - -// MsgCreateVestingAccount defines a message that enables creating a vesting -// account. -message MsgCreateVestingAccount { - option (gogoproto.equal) = true; - - string from_address = 1 [(gogoproto.moretags) = "yaml:\"from_address\""]; - string to_address = 2 [(gogoproto.moretags) = "yaml:\"to_address\""]; - repeated cosmos.base.v1beta1.Coin amount = 3 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; - - int64 end_time = 4 [(gogoproto.moretags) = "yaml:\"end_time\""]; - bool delayed = 5; -} - -// MsgCreateVestingAccountResponse defines the Msg/CreateVestingAccount response type. -message MsgCreateVestingAccountResponse {} \ No newline at end of file diff --git a/third_party/proto/cosmos/vesting/v1beta1/vesting.proto b/third_party/proto/cosmos/vesting/v1beta1/vesting.proto deleted file mode 100644 index e9f661f93c..0000000000 --- a/third_party/proto/cosmos/vesting/v1beta1/vesting.proto +++ /dev/null @@ -1,85 +0,0 @@ -syntax = "proto3"; -package cosmos.vesting.v1beta1; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos/auth/v1beta1/auth.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"; - -// BaseVestingAccount implements the VestingAccount interface. It contains all -// the necessary fields needed for any vesting account implementation. -message BaseVestingAccount { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - cosmos.auth.v1beta1.BaseAccount base_account = 1 [(gogoproto.embed) = true]; - repeated cosmos.base.v1beta1.Coin original_vesting = 2 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"original_vesting\"" - ]; - repeated cosmos.base.v1beta1.Coin delegated_free = 3 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"delegated_free\"" - ]; - repeated cosmos.base.v1beta1.Coin delegated_vesting = 4 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"delegated_vesting\"" - ]; - int64 end_time = 5 [(gogoproto.moretags) = "yaml:\"end_time\""]; -} - -// ContinuousVestingAccount implements the VestingAccount interface. It -// continuously vests by unlocking coins linearly with respect to time. -message ContinuousVestingAccount { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - BaseVestingAccount base_vesting_account = 1 [(gogoproto.embed) = true]; - int64 start_time = 2 [(gogoproto.moretags) = "yaml:\"start_time\""]; -} - -// DelayedVestingAccount implements the VestingAccount interface. It vests all -// coins after a specific time, but non prior. In other words, it keeps them -// locked until a specified time. -message DelayedVestingAccount { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - BaseVestingAccount base_vesting_account = 1 [(gogoproto.embed) = true]; -} - -// Period defines a length of time and amount of coins that will vest. -message Period { - option (gogoproto.goproto_stringer) = false; - - int64 length = 1; - repeated cosmos.base.v1beta1.Coin amount = 2 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; -} - -// PeriodicVestingAccount implements the VestingAccount interface. It -// periodically vests by unlocking coins during each specified period. -message PeriodicVestingAccount { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - BaseVestingAccount base_vesting_account = 1 [(gogoproto.embed) = true]; - int64 start_time = 2 [(gogoproto.moretags) = "yaml:\"start_time\""]; - repeated Period vesting_periods = 3 [(gogoproto.moretags) = "yaml:\"vesting_periods\"", (gogoproto.nullable) = false]; -} - -// PermanentLockedAccount implements the VestingAccount interface. It does -// not ever release coins, locking them indefinitely. Coins in this account can -// still be used for delegating and for governance votes even while locked. -// -// Since: cosmos-sdk 0.43 -message PermanentLockedAccount { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - BaseVestingAccount base_vesting_account = 1 [(gogoproto.embed) = true]; -} diff --git a/third_party/proto/cosmos_proto/cosmos.proto b/third_party/proto/cosmos_proto/cosmos.proto deleted file mode 100644 index 167b170757..0000000000 --- a/third_party/proto/cosmos_proto/cosmos.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; -package cosmos_proto; - -import "google/protobuf/descriptor.proto"; - -option go_package = "github.com/regen-network/cosmos-proto"; - -extend google.protobuf.MessageOptions { - string interface_type = 93001; - - string implements_interface = 93002; -} - -extend google.protobuf.FieldOptions { - string accepts_interface = 93001; -} diff --git a/third_party/proto/gogoproto/gogo.proto b/third_party/proto/gogoproto/gogo.proto deleted file mode 100644 index 49e78f99fe..0000000000 --- a/third_party/proto/gogoproto/gogo.proto +++ /dev/null @@ -1,145 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto2"; -package gogoproto; - -import "google/protobuf/descriptor.proto"; - -option java_package = "com.google.protobuf"; -option java_outer_classname = "GoGoProtos"; -option go_package = "github.com/gogo/protobuf/gogoproto"; - -extend google.protobuf.EnumOptions { - optional bool goproto_enum_prefix = 62001; - optional bool goproto_enum_stringer = 62021; - optional bool enum_stringer = 62022; - optional string enum_customname = 62023; - optional bool enumdecl = 62024; -} - -extend google.protobuf.EnumValueOptions { - optional string enumvalue_customname = 66001; -} - -extend google.protobuf.FileOptions { - optional bool goproto_getters_all = 63001; - optional bool goproto_enum_prefix_all = 63002; - optional bool goproto_stringer_all = 63003; - optional bool verbose_equal_all = 63004; - optional bool face_all = 63005; - optional bool gostring_all = 63006; - optional bool populate_all = 63007; - optional bool stringer_all = 63008; - optional bool onlyone_all = 63009; - - optional bool equal_all = 63013; - optional bool description_all = 63014; - optional bool testgen_all = 63015; - optional bool benchgen_all = 63016; - optional bool marshaler_all = 63017; - optional bool unmarshaler_all = 63018; - optional bool stable_marshaler_all = 63019; - - optional bool sizer_all = 63020; - - optional bool goproto_enum_stringer_all = 63021; - optional bool enum_stringer_all = 63022; - - optional bool unsafe_marshaler_all = 63023; - optional bool unsafe_unmarshaler_all = 63024; - - optional bool goproto_extensions_map_all = 63025; - optional bool goproto_unrecognized_all = 63026; - optional bool gogoproto_import = 63027; - optional bool protosizer_all = 63028; - optional bool compare_all = 63029; - optional bool typedecl_all = 63030; - optional bool enumdecl_all = 63031; - - optional bool goproto_registration = 63032; - optional bool messagename_all = 63033; - - optional bool goproto_sizecache_all = 63034; - optional bool goproto_unkeyed_all = 63035; -} - -extend google.protobuf.MessageOptions { - optional bool goproto_getters = 64001; - optional bool goproto_stringer = 64003; - optional bool verbose_equal = 64004; - optional bool face = 64005; - optional bool gostring = 64006; - optional bool populate = 64007; - optional bool stringer = 67008; - optional bool onlyone = 64009; - - optional bool equal = 64013; - optional bool description = 64014; - optional bool testgen = 64015; - optional bool benchgen = 64016; - optional bool marshaler = 64017; - optional bool unmarshaler = 64018; - optional bool stable_marshaler = 64019; - - optional bool sizer = 64020; - - optional bool unsafe_marshaler = 64023; - optional bool unsafe_unmarshaler = 64024; - - optional bool goproto_extensions_map = 64025; - optional bool goproto_unrecognized = 64026; - - optional bool protosizer = 64028; - optional bool compare = 64029; - - optional bool typedecl = 64030; - - optional bool messagename = 64033; - - optional bool goproto_sizecache = 64034; - optional bool goproto_unkeyed = 64035; -} - -extend google.protobuf.FieldOptions { - optional bool nullable = 65001; - optional bool embed = 65002; - optional string customtype = 65003; - optional string customname = 65004; - optional string jsontag = 65005; - optional string moretags = 65006; - optional string casttype = 65007; - optional string castkey = 65008; - optional string castvalue = 65009; - - optional bool stdtime = 65010; - optional bool stdduration = 65011; - optional bool wktpointer = 65012; - - optional string castrepeated = 65013; -} diff --git a/third_party/proto/google/api/annotations.proto b/third_party/proto/google/api/annotations.proto deleted file mode 100644 index 85c361b47f..0000000000 --- a/third_party/proto/google/api/annotations.proto +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2015, Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.api; - -import "google/api/http.proto"; -import "google/protobuf/descriptor.proto"; - -option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; -option java_multiple_files = true; -option java_outer_classname = "AnnotationsProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - -extend google.protobuf.MethodOptions { - // See `HttpRule`. - HttpRule http = 72295728; -} diff --git a/third_party/proto/google/api/http.proto b/third_party/proto/google/api/http.proto deleted file mode 100644 index 2bd3a19bfa..0000000000 --- a/third_party/proto/google/api/http.proto +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.api; - -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; -option java_multiple_files = true; -option java_outer_classname = "HttpProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - - -// Defines the HTTP configuration for an API service. It contains a list of -// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method -// to one or more HTTP REST API methods. -message Http { - // A list of HTTP configuration rules that apply to individual API methods. - // - // **NOTE:** All service configuration rules follow "last one wins" order. - repeated HttpRule rules = 1; - - // When set to true, URL path parmeters will be fully URI-decoded except in - // cases of single segment matches in reserved expansion, where "%2F" will be - // left encoded. - // - // The default behavior is to not decode RFC 6570 reserved characters in multi - // segment matches. - bool fully_decode_reserved_expansion = 2; -} - -// `HttpRule` defines the mapping of an RPC method to one or more HTTP -// REST API methods. The mapping specifies how different portions of the RPC -// request message are mapped to URL path, URL query parameters, and -// HTTP request body. The mapping is typically specified as an -// `google.api.http` annotation on the RPC method, -// see "google/api/annotations.proto" for details. -// -// The mapping consists of a field specifying the path template and -// method kind. The path template can refer to fields in the request -// message, as in the example below which describes a REST GET -// operation on a resource collection of messages: -// -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}"; -// } -// } -// message GetMessageRequest { -// message SubMessage { -// string subfield = 1; -// } -// string message_id = 1; // mapped to the URL -// SubMessage sub = 2; // `sub.subfield` is url-mapped -// } -// message Message { -// string text = 1; // content of the resource -// } -// -// The same http annotation can alternatively be expressed inside the -// `GRPC API Configuration` YAML file. -// -// http: -// rules: -// - selector: .Messaging.GetMessage -// get: /v1/messages/{message_id}/{sub.subfield} -// -// This definition enables an automatic, bidrectional mapping of HTTP -// JSON to RPC. Example: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456/foo` | `GetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))` -// -// In general, not only fields but also field paths can be referenced -// from a path pattern. Fields mapped to the path pattern cannot be -// repeated and must have a primitive (non-message) type. -// -// Any fields in the request message which are not bound by the path -// pattern automatically become (optional) HTTP query -// parameters. Assume the following definition of the request message: -// -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http).get = "/v1/messages/{message_id}"; -// } -// } -// message GetMessageRequest { -// message SubMessage { -// string subfield = 1; -// } -// string message_id = 1; // mapped to the URL -// int64 revision = 2; // becomes a parameter -// SubMessage sub = 3; // `sub.subfield` becomes a parameter -// } -// -// -// This enables a HTTP JSON to RPC mapping as below: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))` -// -// Note that fields which are mapped to HTTP parameters must have a -// primitive type or a repeated primitive type. Message types are not -// allowed. In the case of a repeated type, the parameter can be -// repeated in the URL, as in `...?param=A¶m=B`. -// -// For HTTP method kinds which allow a request body, the `body` field -// specifies the mapping. Consider a REST update method on the -// message resource collection: -// -// -// service Messaging { -// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { -// option (google.api.http) = { -// put: "/v1/messages/{message_id}" -// body: "message" -// }; -// } -// } -// message UpdateMessageRequest { -// string message_id = 1; // mapped to the URL -// Message message = 2; // mapped to the body -// } -// -// -// The following HTTP JSON to RPC mapping is enabled, where the -// representation of the JSON in the request body is determined by -// protos JSON encoding: -// -// HTTP | RPC -// -----|----- -// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })` -// -// The special name `*` can be used in the body mapping to define that -// every field not bound by the path template should be mapped to the -// request body. This enables the following alternative definition of -// the update method: -// -// service Messaging { -// rpc UpdateMessage(Message) returns (Message) { -// option (google.api.http) = { -// put: "/v1/messages/{message_id}" -// body: "*" -// }; -// } -// } -// message Message { -// string message_id = 1; -// string text = 2; -// } -// -// -// The following HTTP JSON to RPC mapping is enabled: -// -// HTTP | RPC -// -----|----- -// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")` -// -// Note that when using `*` in the body mapping, it is not possible to -// have HTTP parameters, as all fields not bound by the path end in -// the body. This makes this option more rarely used in practice of -// defining REST APIs. The common usage of `*` is in custom methods -// which don't use the URL at all for transferring data. -// -// It is possible to define multiple HTTP methods for one RPC by using -// the `additional_bindings` option. Example: -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http) = { -// get: "/v1/messages/{message_id}" -// additional_bindings { -// get: "/v1/users/{user_id}/messages/{message_id}" -// } -// }; -// } -// } -// message GetMessageRequest { -// string message_id = 1; -// string user_id = 2; -// } -// -// -// This enables the following two alternative HTTP JSON to RPC -// mappings: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")` -// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")` -// -// # Rules for HTTP mapping -// -// The rules for mapping HTTP path, query parameters, and body fields -// to the request message are as follows: -// -// 1. The `body` field specifies either `*` or a field path, or is -// omitted. If omitted, it indicates there is no HTTP request body. -// 2. Leaf fields (recursive expansion of nested messages in the -// request) can be classified into three types: -// (a) Matched in the URL template. -// (b) Covered by body (if body is `*`, everything except (a) fields; -// else everything under the body field) -// (c) All other fields. -// 3. URL query parameters found in the HTTP request are mapped to (c) fields. -// 4. Any body sent with an HTTP request can contain only (b) fields. -// -// The syntax of the path template is as follows: -// -// Template = "/" Segments [ Verb ] ; -// Segments = Segment { "/" Segment } ; -// Segment = "*" | "**" | LITERAL | Variable ; -// Variable = "{" FieldPath [ "=" Segments ] "}" ; -// FieldPath = IDENT { "." IDENT } ; -// Verb = ":" LITERAL ; -// -// The syntax `*` matches a single path segment. The syntax `**` matches zero -// or more path segments, which must be the last part of the path except the -// `Verb`. The syntax `LITERAL` matches literal text in the path. -// -// The syntax `Variable` matches part of the URL path as specified by its -// template. A variable template must not contain other variables. If a variable -// matches a single path segment, its template may be omitted, e.g. `{var}` -// is equivalent to `{var=*}`. -// -// If a variable contains exactly one path segment, such as `"{var}"` or -// `"{var=*}"`, when such a variable is expanded into a URL path, all characters -// except `[-_.~0-9a-zA-Z]` are percent-encoded. Such variables show up in the -// Discovery Document as `{var}`. -// -// If a variable contains one or more path segments, such as `"{var=foo/*}"` -// or `"{var=**}"`, when such a variable is expanded into a URL path, all -// characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. Such variables -// show up in the Discovery Document as `{+var}`. -// -// NOTE: While the single segment variable matches the semantics of -// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 -// Simple String Expansion, the multi segment variable **does not** match -// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion -// does not expand special characters like `?` and `#`, which would lead -// to invalid URLs. -// -// NOTE: the field paths in variables and in the `body` must not refer to -// repeated fields or map fields. -message HttpRule { - // Selects methods to which this rule applies. - // - // Refer to [selector][google.api.DocumentationRule.selector] for syntax details. - string selector = 1; - - // Determines the URL pattern is matched by this rules. This pattern can be - // used with any of the {get|put|post|delete|patch} methods. A custom method - // can be defined using the 'custom' field. - oneof pattern { - // Used for listing and getting information about resources. - string get = 2; - - // Used for updating a resource. - string put = 3; - - // Used for creating a resource. - string post = 4; - - // Used for deleting a resource. - string delete = 5; - - // Used for updating a resource. - string patch = 6; - - // The custom pattern is used for specifying an HTTP method that is not - // included in the `pattern` field, such as HEAD, or "*" to leave the - // HTTP method unspecified for this rule. The wild-card rule is useful - // for services that provide content to Web (HTML) clients. - CustomHttpPattern custom = 8; - } - - // The name of the request field whose value is mapped to the HTTP body, or - // `*` for mapping all fields not captured by the path pattern to the HTTP - // body. NOTE: the referred field must not be a repeated field and must be - // present at the top-level of request message type. - string body = 7; - - // Optional. The name of the response field whose value is mapped to the HTTP - // body of response. Other response fields are ignored. When - // not set, the response message will be used as HTTP body of response. - string response_body = 12; - - // Additional HTTP bindings for the selector. Nested bindings must - // not contain an `additional_bindings` field themselves (that is, - // the nesting may only be one level deep). - repeated HttpRule additional_bindings = 11; -} - -// A custom pattern is used for defining custom HTTP verb. -message CustomHttpPattern { - // The name of this custom HTTP verb. - string kind = 1; - - // The path matched by this custom verb. - string path = 2; -} diff --git a/third_party/proto/google/api/httpbody.proto b/third_party/proto/google/api/httpbody.proto deleted file mode 100644 index 4428515c12..0000000000 --- a/third_party/proto/google/api/httpbody.proto +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2018 Google LLC. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -syntax = "proto3"; - -package google.api; - -import "google/protobuf/any.proto"; - -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/googleapis/api/httpbody;httpbody"; -option java_multiple_files = true; -option java_outer_classname = "HttpBodyProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - -// Message that represents an arbitrary HTTP body. It should only be used for -// payload formats that can't be represented as JSON, such as raw binary or -// an HTML page. -// -// -// This message can be used both in streaming and non-streaming API methods in -// the request as well as the response. -// -// It can be used as a top-level request field, which is convenient if one -// wants to extract parameters from either the URL or HTTP template into the -// request fields and also want access to the raw HTTP body. -// -// Example: -// -// message GetResourceRequest { -// // A unique request id. -// string request_id = 1; -// -// // The raw HTTP body is bound to this field. -// google.api.HttpBody http_body = 2; -// } -// -// service ResourceService { -// rpc GetResource(GetResourceRequest) returns (google.api.HttpBody); -// rpc UpdateResource(google.api.HttpBody) returns -// (google.protobuf.Empty); -// } -// -// Example with streaming methods: -// -// service CaldavService { -// rpc GetCalendar(stream google.api.HttpBody) -// returns (stream google.api.HttpBody); -// rpc UpdateCalendar(stream google.api.HttpBody) -// returns (stream google.api.HttpBody); -// } -// -// Use of this type only changes how the request and response bodies are -// handled, all other features will continue to work unchanged. -message HttpBody { - // The HTTP Content-Type header value specifying the content type of the body. - string content_type = 1; - - // The HTTP request/response body as raw binary. - bytes data = 2; - - // Application specific response metadata. Must be set in the first response - // for streaming APIs. - repeated google.protobuf.Any extensions = 3; -} \ No newline at end of file diff --git a/third_party/proto/google/protobuf/any.proto b/third_party/proto/google/protobuf/any.proto deleted file mode 100644 index 58b511583a..0000000000 --- a/third_party/proto/google/protobuf/any.proto +++ /dev/null @@ -1,164 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf; - -import "gogoproto/gogo.proto"; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option go_package = "types"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "AnyProto"; -option java_multiple_files = true; -option objc_class_prefix = "GPB"; - -// `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := ptypes.MarshalAny(foo) -// ... -// foo := &pb.Foo{} -// if err := ptypes.UnmarshalAny(any, foo); err != nil { -// ... -// } -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -// -message Any { - // A URL/resource name that uniquely identifies the type of the serialized - // protocol buffer message. This string must contain at least - // one "/" character. The last segment of the URL's path must represent - // the fully qualified name of the type (as in - // `path/google.protobuf.Duration`). The name should be in a canonical form - // (e.g., leading "." is not accepted). - // - // In practice, teams usually precompile into the binary all types that they - // expect it to use in the context of Any. However, for URLs which use the - // scheme `http`, `https`, or no scheme, one can optionally set up a type - // server that maps type URLs to message definitions as follows: - // - // * If no scheme is provided, `https` is assumed. - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Note: this functionality is not currently available in the official - // protobuf release, and it is not used for type URLs beginning with - // type.googleapis.com. - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - // - string type_url = 1; - - // Must be a valid serialized protocol buffer of the above specified type. - bytes value = 2; - - option (gogoproto.typedecl) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.gostring) = false; - option (gogoproto.stringer) = false; -} - -option (gogoproto.goproto_registration) = false; diff --git a/third_party/proto/ibc/applications/interchain_accounts/controller/v1/controller.proto b/third_party/proto/ibc/applications/interchain_accounts/controller/v1/controller.proto deleted file mode 100644 index 291f3e4fd9..0000000000 --- a/third_party/proto/ibc/applications/interchain_accounts/controller/v1/controller.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.interchain_accounts.controller.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/controller/types"; - -import "gogoproto/gogo.proto"; - -// Params defines the set of on-chain interchain accounts parameters. -// The following parameters may be used to disable the controller submodule. -message Params { - // controller_enabled enables or disables the controller submodule. - bool controller_enabled = 1 [(gogoproto.moretags) = "yaml:\"controller_enabled\""]; -} diff --git a/third_party/proto/ibc/applications/interchain_accounts/controller/v1/query.proto b/third_party/proto/ibc/applications/interchain_accounts/controller/v1/query.proto deleted file mode 100644 index d3960e9d14..0000000000 --- a/third_party/proto/ibc/applications/interchain_accounts/controller/v1/query.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.interchain_accounts.controller.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/controller/types"; - -import "ibc/applications/interchain_accounts/controller/v1/controller.proto"; -import "google/api/annotations.proto"; - -// Query provides defines the gRPC querier service. -service Query { - // Params queries all parameters of the ICA controller submodule. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/ibc/apps/interchain_accounts/controller/v1/params"; - } -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is the response type for the Query/Params RPC method. -message QueryParamsResponse { - // params defines the parameters of the module. - Params params = 1; -} diff --git a/third_party/proto/ibc/applications/interchain_accounts/host/v1/host.proto b/third_party/proto/ibc/applications/interchain_accounts/host/v1/host.proto deleted file mode 100644 index a9d951cef8..0000000000 --- a/third_party/proto/ibc/applications/interchain_accounts/host/v1/host.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.interchain_accounts.host.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/host/types"; - -import "gogoproto/gogo.proto"; - -// Params defines the set of on-chain interchain accounts parameters. -// The following parameters may be used to disable the host submodule. -message Params { - // host_enabled enables or disables the host submodule. - bool host_enabled = 1 [(gogoproto.moretags) = "yaml:\"host_enabled\""]; - // allow_messages defines a list of sdk message typeURLs allowed to be executed on a host chain. - repeated string allow_messages = 2 [(gogoproto.moretags) = "yaml:\"allow_messages\""]; -} diff --git a/third_party/proto/ibc/applications/interchain_accounts/host/v1/query.proto b/third_party/proto/ibc/applications/interchain_accounts/host/v1/query.proto deleted file mode 100644 index 5512d7b4fa..0000000000 --- a/third_party/proto/ibc/applications/interchain_accounts/host/v1/query.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.interchain_accounts.host.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/host/types"; - -import "google/api/annotations.proto"; -import "ibc/applications/interchain_accounts/host/v1/host.proto"; - -// Query provides defines the gRPC querier service. -service Query { - // Params queries all parameters of the ICA host submodule. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/ibc/apps/interchain_accounts/host/v1/params"; - } -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is the response type for the Query/Params RPC method. -message QueryParamsResponse { - // params defines the parameters of the module. - Params params = 1; -} diff --git a/third_party/proto/ibc/applications/interchain_accounts/v1/account.proto b/third_party/proto/ibc/applications/interchain_accounts/v1/account.proto deleted file mode 100644 index 75d2fbd89e..0000000000 --- a/third_party/proto/ibc/applications/interchain_accounts/v1/account.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.interchain_accounts.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/types"; - -import "cosmos_proto/cosmos.proto"; -import "gogoproto/gogo.proto"; -import "cosmos/auth/v1beta1/auth.proto"; - -// An InterchainAccount is defined as a BaseAccount & the address of the account owner on the controller chain -message InterchainAccount { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - option (cosmos_proto.implements_interface) = "InterchainAccountI"; - - cosmos.auth.v1beta1.BaseAccount base_account = 1 - [(gogoproto.embed) = true, (gogoproto.moretags) = "yaml:\"base_account\""]; - string account_owner = 2 [(gogoproto.moretags) = "yaml:\"account_owner\""]; -} diff --git a/third_party/proto/ibc/applications/interchain_accounts/v1/genesis.proto b/third_party/proto/ibc/applications/interchain_accounts/v1/genesis.proto deleted file mode 100644 index 3902f89070..0000000000 --- a/third_party/proto/ibc/applications/interchain_accounts/v1/genesis.proto +++ /dev/null @@ -1,51 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.interchain_accounts.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/types"; - -import "gogoproto/gogo.proto"; -import "ibc/applications/interchain_accounts/controller/v1/controller.proto"; -import "ibc/applications/interchain_accounts/host/v1/host.proto"; - -// GenesisState defines the interchain accounts genesis state -message GenesisState { - ControllerGenesisState controller_genesis_state = 1 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"controller_genesis_state\""]; - HostGenesisState host_genesis_state = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"host_genesis_state\""]; -} - -// ControllerGenesisState defines the interchain accounts controller genesis state -message ControllerGenesisState { - repeated ActiveChannel active_channels = 1 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"active_channels\""]; - repeated RegisteredInterchainAccount interchain_accounts = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"interchain_accounts\""]; - repeated string ports = 3; - ibc.applications.interchain_accounts.controller.v1.Params params = 4 [(gogoproto.nullable) = false]; -} - -// HostGenesisState defines the interchain accounts host genesis state -message HostGenesisState { - repeated ActiveChannel active_channels = 1 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"active_channels\""]; - repeated RegisteredInterchainAccount interchain_accounts = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"interchain_accounts\""]; - string port = 3; - ibc.applications.interchain_accounts.host.v1.Params params = 4 [(gogoproto.nullable) = false]; -} - -// ActiveChannel contains a connection ID, port ID and associated active channel ID -message ActiveChannel { - string connection_id = 1 [(gogoproto.moretags) = "yaml:\"connection_id\""]; - string port_id = 2 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 3 [(gogoproto.moretags) = "yaml:\"channel_id\""]; -} - -// RegisteredInterchainAccount contains a connection ID, port ID and associated interchain account address -message RegisteredInterchainAccount { - string connection_id = 1 [(gogoproto.moretags) = "yaml:\"connection_id\""]; - string port_id = 2 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string account_address = 3 [(gogoproto.moretags) = "yaml:\"account_address\""]; -} \ No newline at end of file diff --git a/third_party/proto/ibc/applications/interchain_accounts/v1/metadata.proto b/third_party/proto/ibc/applications/interchain_accounts/v1/metadata.proto deleted file mode 100644 index 3eab1d04a6..0000000000 --- a/third_party/proto/ibc/applications/interchain_accounts/v1/metadata.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.interchain_accounts.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/types"; - -import "gogoproto/gogo.proto"; - -// Metadata defines a set of protocol specific data encoded into the ICS27 channel version bytestring -// See ICS004: https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#Versioning -message Metadata { - // version defines the ICS27 protocol version - string version = 1; - // controller_connection_id is the connection identifier associated with the controller chain - string controller_connection_id = 2 [(gogoproto.moretags) = "yaml:\"controller_connection_id\""]; - // host_connection_id is the connection identifier associated with the host chain - string host_connection_id = 3 [(gogoproto.moretags) = "yaml:\"host_connection_id\""]; - // address defines the interchain account address to be fulfilled upon the OnChanOpenTry handshake step - // NOTE: the address field is empty on the OnChanOpenInit handshake step - string address = 4; - // encoding defines the supported codec format - string encoding = 5; - // tx_type defines the type of transactions the interchain account can execute - string tx_type = 6; -} diff --git a/third_party/proto/ibc/applications/interchain_accounts/v1/packet.proto b/third_party/proto/ibc/applications/interchain_accounts/v1/packet.proto deleted file mode 100644 index 51ff4279ae..0000000000 --- a/third_party/proto/ibc/applications/interchain_accounts/v1/packet.proto +++ /dev/null @@ -1,31 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.interchain_accounts.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/types"; - -import "google/protobuf/any.proto"; -import "gogoproto/gogo.proto"; - -// Type defines a classification of message issued from a controller chain to its associated interchain accounts -// host -enum Type { - option (gogoproto.goproto_enum_prefix) = false; - - // Default zero value enumeration - TYPE_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNSPECIFIED"]; - // Execute a transaction on an interchain accounts host chain - TYPE_EXECUTE_TX = 1 [(gogoproto.enumvalue_customname) = "EXECUTE_TX"]; -} - -// InterchainAccountPacketData is comprised of a raw transaction, type of transaction and optional memo field. -message InterchainAccountPacketData { - Type type = 1; - bytes data = 2; - string memo = 3; -} - -// CosmosTx contains a list of sdk.Msg's. It should be used when sending transactions to an SDK host chain. -message CosmosTx { - repeated google.protobuf.Any messages = 1; -} diff --git a/third_party/proto/ibc/applications/transfer/v1/genesis.proto b/third_party/proto/ibc/applications/transfer/v1/genesis.proto deleted file mode 100644 index 0b5c0e0d12..0000000000 --- a/third_party/proto/ibc/applications/transfer/v1/genesis.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.transfer.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types"; - -import "ibc/applications/transfer/v1/transfer.proto"; -import "gogoproto/gogo.proto"; - -// GenesisState defines the ibc-transfer genesis state -message GenesisState { - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - repeated DenomTrace denom_traces = 2 [ - (gogoproto.castrepeated) = "Traces", - (gogoproto.nullable) = false, - (gogoproto.moretags) = "yaml:\"denom_traces\"" - ]; - Params params = 3 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/ibc/applications/transfer/v1/query.proto b/third_party/proto/ibc/applications/transfer/v1/query.proto deleted file mode 100644 index 5298338c10..0000000000 --- a/third_party/proto/ibc/applications/transfer/v1/query.proto +++ /dev/null @@ -1,105 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.transfer.v1; - -import "gogoproto/gogo.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; -import "ibc/applications/transfer/v1/transfer.proto"; -import "google/api/annotations.proto"; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types"; - -// Query provides defines the gRPC querier service. -service Query { - // DenomTrace queries a denomination trace information. - rpc DenomTrace(QueryDenomTraceRequest) returns (QueryDenomTraceResponse) { - option (google.api.http).get = "/ibc/apps/transfer/v1/denom_traces/{hash}"; - } - - // DenomTraces queries all denomination traces. - rpc DenomTraces(QueryDenomTracesRequest) returns (QueryDenomTracesResponse) { - option (google.api.http).get = "/ibc/apps/transfer/v1/denom_traces"; - } - - // Params queries all parameters of the ibc-transfer module. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/ibc/apps/transfer/v1/params"; - } - - // DenomHash queries a denomination hash information. - rpc DenomHash(QueryDenomHashRequest) returns (QueryDenomHashResponse) { - option (google.api.http).get = "/ibc/apps/transfer/v1/denom_hashes/{trace}"; - } - - // EscrowAddress returns the escrow address for a particular port and channel id. - rpc EscrowAddress(QueryEscrowAddressRequest) returns (QueryEscrowAddressResponse) { - option (google.api.http).get = "/ibc/apps/transfer/v1/channels/{channel_id}/ports/{port_id}/escrow_address"; - } -} - -// QueryDenomTraceRequest is the request type for the Query/DenomTrace RPC -// method -message QueryDenomTraceRequest { - // hash (in hex format) or denom (full denom with ibc prefix) of the denomination trace information. - string hash = 1; -} - -// QueryDenomTraceResponse is the response type for the Query/DenomTrace RPC -// method. -message QueryDenomTraceResponse { - // denom_trace returns the requested denomination trace information. - DenomTrace denom_trace = 1; -} - -// QueryConnectionsRequest is the request type for the Query/DenomTraces RPC -// method -message QueryDenomTracesRequest { - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryConnectionsResponse is the response type for the Query/DenomTraces RPC -// method. -message QueryDenomTracesResponse { - // denom_traces returns all denominations trace information. - repeated DenomTrace denom_traces = 1 [(gogoproto.castrepeated) = "Traces", (gogoproto.nullable) = false]; - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is the response type for the Query/Params RPC method. -message QueryParamsResponse { - // params defines the parameters of the module. - Params params = 1; -} - -// QueryDenomHashRequest is the request type for the Query/DenomHash RPC -// method -message QueryDenomHashRequest { - // The denomination trace ([port_id]/[channel_id])+/[denom] - string trace = 1; -} - -// QueryDenomHashResponse is the response type for the Query/DenomHash RPC -// method. -message QueryDenomHashResponse { - // hash (in hex format) of the denomination trace information. - string hash = 1; -} - -// QueryEscrowAddressRequest is the request type for the EscrowAddress RPC method. -message QueryEscrowAddressRequest { - // unique port identifier - string port_id = 1; - // unique channel identifier - string channel_id = 2; -} - -// QueryEscrowAddressResponse is the response type of the EscrowAddress RPC method. -message QueryEscrowAddressResponse { - // the escrow account address - string escrow_address = 1; -} \ No newline at end of file diff --git a/third_party/proto/ibc/applications/transfer/v1/transfer.proto b/third_party/proto/ibc/applications/transfer/v1/transfer.proto deleted file mode 100644 index 7a99485c58..0000000000 --- a/third_party/proto/ibc/applications/transfer/v1/transfer.proto +++ /dev/null @@ -1,30 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.transfer.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types"; - -import "gogoproto/gogo.proto"; - -// DenomTrace contains the base denomination for ICS20 fungible tokens and the -// source tracing information path. -message DenomTrace { - // path defines the chain of port/channel identifiers used for tracing the - // source of the fungible token. - string path = 1; - // base denomination of the relayed fungible token. - string base_denom = 2; -} - -// Params defines the set of IBC transfer parameters. -// NOTE: To prevent a single token from being transferred, set the -// TransfersEnabled parameter to true and then set the bank module's SendEnabled -// parameter for the denomination to false. -message Params { - // send_enabled enables or disables all cross-chain token transfers from this - // chain. - bool send_enabled = 1 [(gogoproto.moretags) = "yaml:\"send_enabled\""]; - // receive_enabled enables or disables all cross-chain token transfers to this - // chain. - bool receive_enabled = 2 [(gogoproto.moretags) = "yaml:\"receive_enabled\""]; -} diff --git a/third_party/proto/ibc/applications/transfer/v1/tx.proto b/third_party/proto/ibc/applications/transfer/v1/tx.proto deleted file mode 100644 index 8f1392b0cf..0000000000 --- a/third_party/proto/ibc/applications/transfer/v1/tx.proto +++ /dev/null @@ -1,44 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.transfer.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types"; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "ibc/core/client/v1/client.proto"; - -// Msg defines the ibc/transfer Msg service. -service Msg { - // Transfer defines a rpc handler method for MsgTransfer. - rpc Transfer(MsgTransfer) returns (MsgTransferResponse); -} - -// MsgTransfer defines a msg to transfer fungible tokens (i.e Coins) between -// ICS20 enabled chains. See ICS Spec here: -// https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures -message MsgTransfer { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // the port on which the packet will be sent - string source_port = 1 [(gogoproto.moretags) = "yaml:\"source_port\""]; - // the channel by which the packet will be sent - string source_channel = 2 [(gogoproto.moretags) = "yaml:\"source_channel\""]; - // the tokens to be transferred - cosmos.base.v1beta1.Coin token = 3 [(gogoproto.nullable) = false]; - // the sender address - string sender = 4; - // the recipient address on the destination chain - string receiver = 5; - // Timeout height relative to the current block height. - // The timeout is disabled when set to 0. - ibc.core.client.v1.Height timeout_height = 6 - [(gogoproto.moretags) = "yaml:\"timeout_height\"", (gogoproto.nullable) = false]; - // Timeout timestamp in absolute nanoseconds since unix epoch. - // The timeout is disabled when set to 0. - uint64 timeout_timestamp = 7 [(gogoproto.moretags) = "yaml:\"timeout_timestamp\""]; -} - -// MsgTransferResponse defines the Msg/Transfer response type. -message MsgTransferResponse {} diff --git a/third_party/proto/ibc/applications/transfer/v2/packet.proto b/third_party/proto/ibc/applications/transfer/v2/packet.proto deleted file mode 100644 index 850320df34..0000000000 --- a/third_party/proto/ibc/applications/transfer/v2/packet.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; - -package ibc.applications.transfer.v2; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types"; - -// FungibleTokenPacketData defines a struct for the packet payload -// See FungibleTokenPacketData spec: -// https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures -message FungibleTokenPacketData { - // the token denomination to be transferred - string denom = 1; - // the token amount to be transferred - string amount = 2; - // the sender address - string sender = 3; - // the recipient address on the destination chain - string receiver = 4; -} diff --git a/third_party/proto/ibc/core/channel/v1/channel.proto b/third_party/proto/ibc/core/channel/v1/channel.proto deleted file mode 100644 index 68c6ec17b1..0000000000 --- a/third_party/proto/ibc/core/channel/v1/channel.proto +++ /dev/null @@ -1,148 +0,0 @@ -syntax = "proto3"; - -package ibc.core.channel.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/client/v1/client.proto"; - -// Channel defines pipeline for exactly-once packet delivery between specific -// modules on separate blockchains, which has at least one end capable of -// sending packets and one end capable of receiving packets. -message Channel { - option (gogoproto.goproto_getters) = false; - - // current state of the channel end - State state = 1; - // whether the channel is ordered or unordered - Order ordering = 2; - // counterparty channel end - Counterparty counterparty = 3 [(gogoproto.nullable) = false]; - // list of connection identifiers, in order, along which packets sent on - // this channel will travel - repeated string connection_hops = 4 [(gogoproto.moretags) = "yaml:\"connection_hops\""]; - // opaque channel version, which is agreed upon during the handshake - string version = 5; -} - -// IdentifiedChannel defines a channel with additional port and channel -// identifier fields. -message IdentifiedChannel { - option (gogoproto.goproto_getters) = false; - - // current state of the channel end - State state = 1; - // whether the channel is ordered or unordered - Order ordering = 2; - // counterparty channel end - Counterparty counterparty = 3 [(gogoproto.nullable) = false]; - // list of connection identifiers, in order, along which packets sent on - // this channel will travel - repeated string connection_hops = 4 [(gogoproto.moretags) = "yaml:\"connection_hops\""]; - // opaque channel version, which is agreed upon during the handshake - string version = 5; - // port identifier - string port_id = 6; - // channel identifier - string channel_id = 7; -} - -// State defines if a channel is in one of the following states: -// CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. -enum State { - option (gogoproto.goproto_enum_prefix) = false; - - // Default State - STATE_UNINITIALIZED_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNINITIALIZED"]; - // A channel has just started the opening handshake. - STATE_INIT = 1 [(gogoproto.enumvalue_customname) = "INIT"]; - // A channel has acknowledged the handshake step on the counterparty chain. - STATE_TRYOPEN = 2 [(gogoproto.enumvalue_customname) = "TRYOPEN"]; - // A channel has completed the handshake. Open channels are - // ready to send and receive packets. - STATE_OPEN = 3 [(gogoproto.enumvalue_customname) = "OPEN"]; - // A channel has been closed and can no longer be used to send or receive - // packets. - STATE_CLOSED = 4 [(gogoproto.enumvalue_customname) = "CLOSED"]; -} - -// Order defines if a channel is ORDERED or UNORDERED -enum Order { - option (gogoproto.goproto_enum_prefix) = false; - - // zero-value for channel ordering - ORDER_NONE_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "NONE"]; - // packets can be delivered in any order, which may differ from the order in - // which they were sent. - ORDER_UNORDERED = 1 [(gogoproto.enumvalue_customname) = "UNORDERED"]; - // packets are delivered exactly in the order which they were sent - ORDER_ORDERED = 2 [(gogoproto.enumvalue_customname) = "ORDERED"]; -} - -// Counterparty defines a channel end counterparty -message Counterparty { - option (gogoproto.goproto_getters) = false; - - // port on the counterparty chain which owns the other end of the channel. - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - // channel end on the counterparty chain - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; -} - -// Packet defines a type that carries data across different chains through IBC -message Packet { - option (gogoproto.goproto_getters) = false; - - // number corresponds to the order of sends and receives, where a Packet - // with an earlier sequence number must be sent and received before a Packet - // with a later sequence number. - uint64 sequence = 1; - // identifies the port on the sending chain. - string source_port = 2 [(gogoproto.moretags) = "yaml:\"source_port\""]; - // identifies the channel end on the sending chain. - string source_channel = 3 [(gogoproto.moretags) = "yaml:\"source_channel\""]; - // identifies the port on the receiving chain. - string destination_port = 4 [(gogoproto.moretags) = "yaml:\"destination_port\""]; - // identifies the channel end on the receiving chain. - string destination_channel = 5 [(gogoproto.moretags) = "yaml:\"destination_channel\""]; - // actual opaque bytes transferred directly to the application module - bytes data = 6; - // block height after which the packet times out - ibc.core.client.v1.Height timeout_height = 7 - [(gogoproto.moretags) = "yaml:\"timeout_height\"", (gogoproto.nullable) = false]; - // block timestamp (in nanoseconds) after which the packet times out - uint64 timeout_timestamp = 8 [(gogoproto.moretags) = "yaml:\"timeout_timestamp\""]; -} - -// PacketState defines the generic type necessary to retrieve and store -// packet commitments, acknowledgements, and receipts. -// Caller is responsible for knowing the context necessary to interpret this -// state as a commitment, acknowledgement, or a receipt. -message PacketState { - option (gogoproto.goproto_getters) = false; - - // channel port identifier. - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - // channel unique identifier. - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - // packet sequence. - uint64 sequence = 3; - // embedded data that represents packet state. - bytes data = 4; -} - -// Acknowledgement is the recommended acknowledgement format to be used by -// app-specific protocols. -// NOTE: The field numbers 21 and 22 were explicitly chosen to avoid accidental -// conflicts with other protobuf message formats used for acknowledgements. -// The first byte of any message with this format will be the non-ASCII values -// `0xaa` (result) or `0xb2` (error). Implemented as defined by ICS: -// https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#acknowledgement-envelope -message Acknowledgement { - // response contains either a result or an error and must be non-empty - oneof response { - bytes result = 21; - string error = 22; - } -} diff --git a/third_party/proto/ibc/core/channel/v1/genesis.proto b/third_party/proto/ibc/core/channel/v1/genesis.proto deleted file mode 100644 index d95c891b6c..0000000000 --- a/third_party/proto/ibc/core/channel/v1/genesis.proto +++ /dev/null @@ -1,32 +0,0 @@ -syntax = "proto3"; - -package ibc.core.channel.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/channel/v1/channel.proto"; - -// GenesisState defines the ibc channel submodule's genesis state. -message GenesisState { - repeated IdentifiedChannel channels = 1 [(gogoproto.casttype) = "IdentifiedChannel", (gogoproto.nullable) = false]; - repeated PacketState acknowledgements = 2 [(gogoproto.nullable) = false]; - repeated PacketState commitments = 3 [(gogoproto.nullable) = false]; - repeated PacketState receipts = 4 [(gogoproto.nullable) = false]; - repeated PacketSequence send_sequences = 5 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"send_sequences\""]; - repeated PacketSequence recv_sequences = 6 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"recv_sequences\""]; - repeated PacketSequence ack_sequences = 7 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"ack_sequences\""]; - // the sequence for the next generated channel identifier - uint64 next_channel_sequence = 8 [(gogoproto.moretags) = "yaml:\"next_channel_sequence\""]; -} - -// PacketSequence defines the genesis type necessary to retrieve and store -// next send and receive sequences. -message PacketSequence { - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - uint64 sequence = 3; -} diff --git a/third_party/proto/ibc/core/channel/v1/query.proto b/third_party/proto/ibc/core/channel/v1/query.proto deleted file mode 100644 index ceb13d0009..0000000000 --- a/third_party/proto/ibc/core/channel/v1/query.proto +++ /dev/null @@ -1,376 +0,0 @@ -syntax = "proto3"; - -package ibc.core.channel.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types"; - -import "ibc/core/client/v1/client.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; -import "ibc/core/channel/v1/channel.proto"; -import "google/api/annotations.proto"; -import "google/protobuf/any.proto"; -import "gogoproto/gogo.proto"; - -// Query provides defines the gRPC querier service -service Query { - // Channel queries an IBC Channel. - rpc Channel(QueryChannelRequest) returns (QueryChannelResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}"; - } - - // Channels queries all the IBC channels of a chain. - rpc Channels(QueryChannelsRequest) returns (QueryChannelsResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels"; - } - - // ConnectionChannels queries all the channels associated with a connection - // end. - rpc ConnectionChannels(QueryConnectionChannelsRequest) returns (QueryConnectionChannelsResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/connections/{connection}/channels"; - } - - // ChannelClientState queries for the client state for the channel associated - // with the provided channel identifiers. - rpc ChannelClientState(QueryChannelClientStateRequest) returns (QueryChannelClientStateResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/client_state"; - } - - // ChannelConsensusState queries for the consensus state for the channel - // associated with the provided channel identifiers. - rpc ChannelConsensusState(QueryChannelConsensusStateRequest) returns (QueryChannelConsensusStateResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/consensus_state/revision/" - "{revision_number}/height/{revision_height}"; - } - - // PacketCommitment queries a stored packet commitment hash. - rpc PacketCommitment(QueryPacketCommitmentRequest) returns (QueryPacketCommitmentResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/" - "packet_commitments/{sequence}"; - } - - // PacketCommitments returns all the packet commitments hashes associated - // with a channel. - rpc PacketCommitments(QueryPacketCommitmentsRequest) returns (QueryPacketCommitmentsResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/packet_commitments"; - } - - // PacketReceipt queries if a given packet sequence has been received on the - // queried chain - rpc PacketReceipt(QueryPacketReceiptRequest) returns (QueryPacketReceiptResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/packet_receipts/{sequence}"; - } - - // PacketAcknowledgement queries a stored packet acknowledgement hash. - rpc PacketAcknowledgement(QueryPacketAcknowledgementRequest) returns (QueryPacketAcknowledgementResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/packet_acks/{sequence}"; - } - - // PacketAcknowledgements returns all the packet acknowledgements associated - // with a channel. - rpc PacketAcknowledgements(QueryPacketAcknowledgementsRequest) returns (QueryPacketAcknowledgementsResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/packet_acknowledgements"; - } - - // UnreceivedPackets returns all the unreceived IBC packets associated with a - // channel and sequences. - rpc UnreceivedPackets(QueryUnreceivedPacketsRequest) returns (QueryUnreceivedPacketsResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/" - "packet_commitments/" - "{packet_commitment_sequences}/unreceived_packets"; - } - - // UnreceivedAcks returns all the unreceived IBC acknowledgements associated - // with a channel and sequences. - rpc UnreceivedAcks(QueryUnreceivedAcksRequest) returns (QueryUnreceivedAcksResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/packet_commitments/" - "{packet_ack_sequences}/unreceived_acks"; - } - - // NextSequenceReceive returns the next receive sequence for a given channel. - rpc NextSequenceReceive(QueryNextSequenceReceiveRequest) returns (QueryNextSequenceReceiveResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/next_sequence"; - } -} - -// QueryChannelRequest is the request type for the Query/Channel RPC method -message QueryChannelRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; -} - -// QueryChannelResponse is the response type for the Query/Channel RPC method. -// Besides the Channel end, it includes a proof and the height from which the -// proof was retrieved. -message QueryChannelResponse { - // channel associated with the request identifiers - ibc.core.channel.v1.Channel channel = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryChannelsRequest is the request type for the Query/Channels RPC method -message QueryChannelsRequest { - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryChannelsResponse is the response type for the Query/Channels RPC method. -message QueryChannelsResponse { - // list of stored channels of the chain. - repeated ibc.core.channel.v1.IdentifiedChannel channels = 1; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; - // query block height - ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false]; -} - -// QueryConnectionChannelsRequest is the request type for the -// Query/QueryConnectionChannels RPC method -message QueryConnectionChannelsRequest { - // connection unique identifier - string connection = 1; - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryConnectionChannelsResponse is the Response type for the -// Query/QueryConnectionChannels RPC method -message QueryConnectionChannelsResponse { - // list of channels associated with a connection. - repeated ibc.core.channel.v1.IdentifiedChannel channels = 1; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; - // query block height - ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false]; -} - -// QueryChannelClientStateRequest is the request type for the Query/ClientState -// RPC method -message QueryChannelClientStateRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; -} - -// QueryChannelClientStateResponse is the Response type for the -// Query/QueryChannelClientState RPC method -message QueryChannelClientStateResponse { - // client state associated with the channel - ibc.core.client.v1.IdentifiedClientState identified_client_state = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryChannelConsensusStateRequest is the request type for the -// Query/ConsensusState RPC method -message QueryChannelConsensusStateRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // revision number of the consensus state - uint64 revision_number = 3; - // revision height of the consensus state - uint64 revision_height = 4; -} - -// QueryChannelClientStateResponse is the Response type for the -// Query/QueryChannelClientState RPC method -message QueryChannelConsensusStateResponse { - // consensus state associated with the channel - google.protobuf.Any consensus_state = 1; - // client ID associated with the consensus state - string client_id = 2; - // merkle proof of existence - bytes proof = 3; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false]; -} - -// QueryPacketCommitmentRequest is the request type for the -// Query/PacketCommitment RPC method -message QueryPacketCommitmentRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // packet sequence - uint64 sequence = 3; -} - -// QueryPacketCommitmentResponse defines the client query response for a packet -// which also includes a proof and the height from which the proof was -// retrieved -message QueryPacketCommitmentResponse { - // packet associated with the request fields - bytes commitment = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryPacketCommitmentsRequest is the request type for the -// Query/QueryPacketCommitments RPC method -message QueryPacketCommitmentsRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 3; -} - -// QueryPacketCommitmentsResponse is the request type for the -// Query/QueryPacketCommitments RPC method -message QueryPacketCommitmentsResponse { - repeated ibc.core.channel.v1.PacketState commitments = 1; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; - // query block height - ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false]; -} - -// QueryPacketReceiptRequest is the request type for the -// Query/PacketReceipt RPC method -message QueryPacketReceiptRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // packet sequence - uint64 sequence = 3; -} - -// QueryPacketReceiptResponse defines the client query response for a packet -// receipt which also includes a proof, and the height from which the proof was -// retrieved -message QueryPacketReceiptResponse { - // success flag for if receipt exists - bool received = 2; - // merkle proof of existence - bytes proof = 3; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false]; -} - -// QueryPacketAcknowledgementRequest is the request type for the -// Query/PacketAcknowledgement RPC method -message QueryPacketAcknowledgementRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // packet sequence - uint64 sequence = 3; -} - -// QueryPacketAcknowledgementResponse defines the client query response for a -// packet which also includes a proof and the height from which the -// proof was retrieved -message QueryPacketAcknowledgementResponse { - // packet associated with the request fields - bytes acknowledgement = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryPacketAcknowledgementsRequest is the request type for the -// Query/QueryPacketCommitments RPC method -message QueryPacketAcknowledgementsRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 3; - // list of packet sequences - repeated uint64 packet_commitment_sequences = 4; -} - -// QueryPacketAcknowledgemetsResponse is the request type for the -// Query/QueryPacketAcknowledgements RPC method -message QueryPacketAcknowledgementsResponse { - repeated ibc.core.channel.v1.PacketState acknowledgements = 1; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; - // query block height - ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false]; -} - -// QueryUnreceivedPacketsRequest is the request type for the -// Query/UnreceivedPackets RPC method -message QueryUnreceivedPacketsRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // list of packet sequences - repeated uint64 packet_commitment_sequences = 3; -} - -// QueryUnreceivedPacketsResponse is the response type for the -// Query/UnreceivedPacketCommitments RPC method -message QueryUnreceivedPacketsResponse { - // list of unreceived packet sequences - repeated uint64 sequences = 1; - // query block height - ibc.core.client.v1.Height height = 2 [(gogoproto.nullable) = false]; -} - -// QueryUnreceivedAcks is the request type for the -// Query/UnreceivedAcks RPC method -message QueryUnreceivedAcksRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // list of acknowledgement sequences - repeated uint64 packet_ack_sequences = 3; -} - -// QueryUnreceivedAcksResponse is the response type for the -// Query/UnreceivedAcks RPC method -message QueryUnreceivedAcksResponse { - // list of unreceived acknowledgement sequences - repeated uint64 sequences = 1; - // query block height - ibc.core.client.v1.Height height = 2 [(gogoproto.nullable) = false]; -} - -// QueryNextSequenceReceiveRequest is the request type for the -// Query/QueryNextSequenceReceiveRequest RPC method -message QueryNextSequenceReceiveRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; -} - -// QuerySequenceResponse is the request type for the -// Query/QueryNextSequenceReceiveResponse RPC method -message QueryNextSequenceReceiveResponse { - // next sequence receive number - uint64 next_sequence_receive = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/ibc/core/channel/v1/tx.proto b/third_party/proto/ibc/core/channel/v1/tx.proto deleted file mode 100644 index d34b00e912..0000000000 --- a/third_party/proto/ibc/core/channel/v1/tx.proto +++ /dev/null @@ -1,246 +0,0 @@ -syntax = "proto3"; - -package ibc.core.channel.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/client/v1/client.proto"; -import "ibc/core/channel/v1/channel.proto"; - -// Msg defines the ibc/channel Msg service. -service Msg { - // ChannelOpenInit defines a rpc handler method for MsgChannelOpenInit. - rpc ChannelOpenInit(MsgChannelOpenInit) returns (MsgChannelOpenInitResponse); - - // ChannelOpenTry defines a rpc handler method for MsgChannelOpenTry. - rpc ChannelOpenTry(MsgChannelOpenTry) returns (MsgChannelOpenTryResponse); - - // ChannelOpenAck defines a rpc handler method for MsgChannelOpenAck. - rpc ChannelOpenAck(MsgChannelOpenAck) returns (MsgChannelOpenAckResponse); - - // ChannelOpenConfirm defines a rpc handler method for MsgChannelOpenConfirm. - rpc ChannelOpenConfirm(MsgChannelOpenConfirm) returns (MsgChannelOpenConfirmResponse); - - // ChannelCloseInit defines a rpc handler method for MsgChannelCloseInit. - rpc ChannelCloseInit(MsgChannelCloseInit) returns (MsgChannelCloseInitResponse); - - // ChannelCloseConfirm defines a rpc handler method for - // MsgChannelCloseConfirm. - rpc ChannelCloseConfirm(MsgChannelCloseConfirm) returns (MsgChannelCloseConfirmResponse); - - // RecvPacket defines a rpc handler method for MsgRecvPacket. - rpc RecvPacket(MsgRecvPacket) returns (MsgRecvPacketResponse); - - // Timeout defines a rpc handler method for MsgTimeout. - rpc Timeout(MsgTimeout) returns (MsgTimeoutResponse); - - // TimeoutOnClose defines a rpc handler method for MsgTimeoutOnClose. - rpc TimeoutOnClose(MsgTimeoutOnClose) returns (MsgTimeoutOnCloseResponse); - - // Acknowledgement defines a rpc handler method for MsgAcknowledgement. - rpc Acknowledgement(MsgAcknowledgement) returns (MsgAcknowledgementResponse); -} - -// ResponseResultType defines the possible outcomes of the execution of a message -enum ResponseResultType { - option (gogoproto.goproto_enum_prefix) = false; - - // Default zero value enumeration - RESPONSE_RESULT_TYPE_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNSPECIFIED"]; - // The message did not call the IBC application callbacks (because, for example, the packet had already been relayed) - RESPONSE_RESULT_TYPE_NOOP = 1 [(gogoproto.enumvalue_customname) = "NOOP"]; - // The message was executed successfully - RESPONSE_RESULT_TYPE_SUCCESS = 2 [(gogoproto.enumvalue_customname) = "SUCCESS"]; -} - -// MsgChannelOpenInit defines an sdk.Msg to initialize a channel handshake. It -// is called by a relayer on Chain A. -message MsgChannelOpenInit { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - Channel channel = 2 [(gogoproto.nullable) = false]; - string signer = 3; -} - -// MsgChannelOpenInitResponse defines the Msg/ChannelOpenInit response type. -message MsgChannelOpenInitResponse { - string channel_id = 1 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - string version = 2; -} - -// MsgChannelOpenInit defines a msg sent by a Relayer to try to open a channel -// on Chain B. The version field within the Channel field has been deprecated. Its -// value will be ignored by core IBC. -message MsgChannelOpenTry { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - // in the case of crossing hello's, when both chains call OpenInit, we need - // the channel identifier of the previous channel in state INIT - string previous_channel_id = 2 [(gogoproto.moretags) = "yaml:\"previous_channel_id\""]; - // NOTE: the version field within the channel has been deprecated. Its value will be ignored by core IBC. - Channel channel = 3 [(gogoproto.nullable) = false]; - string counterparty_version = 4 [(gogoproto.moretags) = "yaml:\"counterparty_version\""]; - bytes proof_init = 5 [(gogoproto.moretags) = "yaml:\"proof_init\""]; - ibc.core.client.v1.Height proof_height = 6 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 7; -} - -// MsgChannelOpenTryResponse defines the Msg/ChannelOpenTry response type. -message MsgChannelOpenTryResponse { - string version = 1; -} - -// MsgChannelOpenAck defines a msg sent by a Relayer to Chain A to acknowledge -// the change of channel state to TRYOPEN on Chain B. -message MsgChannelOpenAck { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - string counterparty_channel_id = 3 [(gogoproto.moretags) = "yaml:\"counterparty_channel_id\""]; - string counterparty_version = 4 [(gogoproto.moretags) = "yaml:\"counterparty_version\""]; - bytes proof_try = 5 [(gogoproto.moretags) = "yaml:\"proof_try\""]; - ibc.core.client.v1.Height proof_height = 6 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 7; -} - -// MsgChannelOpenAckResponse defines the Msg/ChannelOpenAck response type. -message MsgChannelOpenAckResponse {} - -// MsgChannelOpenConfirm defines a msg sent by a Relayer to Chain B to -// acknowledge the change of channel state to OPEN on Chain A. -message MsgChannelOpenConfirm { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - bytes proof_ack = 3 [(gogoproto.moretags) = "yaml:\"proof_ack\""]; - ibc.core.client.v1.Height proof_height = 4 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 5; -} - -// MsgChannelOpenConfirmResponse defines the Msg/ChannelOpenConfirm response -// type. -message MsgChannelOpenConfirmResponse {} - -// MsgChannelCloseInit defines a msg sent by a Relayer to Chain A -// to close a channel with Chain B. -message MsgChannelCloseInit { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - string signer = 3; -} - -// MsgChannelCloseInitResponse defines the Msg/ChannelCloseInit response type. -message MsgChannelCloseInitResponse {} - -// MsgChannelCloseConfirm defines a msg sent by a Relayer to Chain B -// to acknowledge the change of channel state to CLOSED on Chain A. -message MsgChannelCloseConfirm { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - bytes proof_init = 3 [(gogoproto.moretags) = "yaml:\"proof_init\""]; - ibc.core.client.v1.Height proof_height = 4 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 5; -} - -// MsgChannelCloseConfirmResponse defines the Msg/ChannelCloseConfirm response -// type. -message MsgChannelCloseConfirmResponse {} - -// MsgRecvPacket receives incoming IBC packet -message MsgRecvPacket { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - Packet packet = 1 [(gogoproto.nullable) = false]; - bytes proof_commitment = 2 [(gogoproto.moretags) = "yaml:\"proof_commitment\""]; - ibc.core.client.v1.Height proof_height = 3 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 4; -} - -// MsgRecvPacketResponse defines the Msg/RecvPacket response type. -message MsgRecvPacketResponse { - option (gogoproto.goproto_getters) = false; - - ResponseResultType result = 1; -} - -// MsgTimeout receives timed-out packet -message MsgTimeout { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - Packet packet = 1 [(gogoproto.nullable) = false]; - bytes proof_unreceived = 2 [(gogoproto.moretags) = "yaml:\"proof_unreceived\""]; - ibc.core.client.v1.Height proof_height = 3 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - uint64 next_sequence_recv = 4 [(gogoproto.moretags) = "yaml:\"next_sequence_recv\""]; - string signer = 5; -} - -// MsgTimeoutResponse defines the Msg/Timeout response type. -message MsgTimeoutResponse { - option (gogoproto.goproto_getters) = false; - - ResponseResultType result = 1; -} - -// MsgTimeoutOnClose timed-out packet upon counterparty channel closure. -message MsgTimeoutOnClose { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - Packet packet = 1 [(gogoproto.nullable) = false]; - bytes proof_unreceived = 2 [(gogoproto.moretags) = "yaml:\"proof_unreceived\""]; - bytes proof_close = 3 [(gogoproto.moretags) = "yaml:\"proof_close\""]; - ibc.core.client.v1.Height proof_height = 4 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - uint64 next_sequence_recv = 5 [(gogoproto.moretags) = "yaml:\"next_sequence_recv\""]; - string signer = 6; -} - -// MsgTimeoutOnCloseResponse defines the Msg/TimeoutOnClose response type. -message MsgTimeoutOnCloseResponse { - option (gogoproto.goproto_getters) = false; - - ResponseResultType result = 1; -} - -// MsgAcknowledgement receives incoming IBC acknowledgement -message MsgAcknowledgement { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - Packet packet = 1 [(gogoproto.nullable) = false]; - bytes acknowledgement = 2; - bytes proof_acked = 3 [(gogoproto.moretags) = "yaml:\"proof_acked\""]; - ibc.core.client.v1.Height proof_height = 4 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 5; -} - -// MsgAcknowledgementResponse defines the Msg/Acknowledgement response type. -message MsgAcknowledgementResponse { - option (gogoproto.goproto_getters) = false; - - ResponseResultType result = 1; -} diff --git a/third_party/proto/ibc/core/client/v1/client.proto b/third_party/proto/ibc/core/client/v1/client.proto deleted file mode 100644 index f97263c4fc..0000000000 --- a/third_party/proto/ibc/core/client/v1/client.proto +++ /dev/null @@ -1,103 +0,0 @@ -syntax = "proto3"; - -package ibc.core.client.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/02-client/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "cosmos/upgrade/v1beta1/upgrade.proto"; -import "cosmos_proto/cosmos.proto"; - -// IdentifiedClientState defines a client state with an additional client -// identifier field. -message IdentifiedClientState { - // client identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // client state - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; -} - -// ConsensusStateWithHeight defines a consensus state with an additional height -// field. -message ConsensusStateWithHeight { - // consensus state height - Height height = 1 [(gogoproto.nullable) = false]; - // consensus state - google.protobuf.Any consensus_state = 2 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; -} - -// ClientConsensusStates defines all the stored consensus states for a given -// client. -message ClientConsensusStates { - // client identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // consensus states and their heights associated with the client - repeated ConsensusStateWithHeight consensus_states = 2 - [(gogoproto.moretags) = "yaml:\"consensus_states\"", (gogoproto.nullable) = false]; -} - -// ClientUpdateProposal is a governance proposal. If it passes, the substitute -// client's latest consensus state is copied over to the subject client. The proposal -// handler may fail if the subject and the substitute do not match in client and -// chain parameters (with exception to latest height, frozen height, and chain-id). -message ClientUpdateProposal { - option (gogoproto.goproto_getters) = false; - option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content"; - // the title of the update proposal - string title = 1; - // the description of the proposal - string description = 2; - // the client identifier for the client to be updated if the proposal passes - string subject_client_id = 3 [(gogoproto.moretags) = "yaml:\"subject_client_id\""]; - // the substitute client identifier for the client standing in for the subject - // client - string substitute_client_id = 4 [(gogoproto.moretags) = "yaml:\"substitute_client_id\""]; -} - -// UpgradeProposal is a gov Content type for initiating an IBC breaking -// upgrade. -message UpgradeProposal { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.equal) = true; - option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content"; - - string title = 1; - string description = 2; - cosmos.upgrade.v1beta1.Plan plan = 3 [(gogoproto.nullable) = false]; - - // An UpgradedClientState must be provided to perform an IBC breaking upgrade. - // This will make the chain commit to the correct upgraded (self) client state - // before the upgrade occurs, so that connecting chains can verify that the - // new upgraded client is valid by verifying a proof on the previous version - // of the chain. This will allow IBC connections to persist smoothly across - // planned chain upgrades - google.protobuf.Any upgraded_client_state = 4 [(gogoproto.moretags) = "yaml:\"upgraded_client_state\""]; -} - -// Height is a monotonically increasing data type -// that can be compared against another Height for the purposes of updating and -// freezing clients -// -// Normally the RevisionHeight is incremented at each height while keeping -// RevisionNumber the same. However some consensus algorithms may choose to -// reset the height in certain conditions e.g. hard forks, state-machine -// breaking changes In these cases, the RevisionNumber is incremented so that -// height continues to be monitonically increasing even as the RevisionHeight -// gets reset -message Height { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - // the revision that the client is currently on - uint64 revision_number = 1 [(gogoproto.moretags) = "yaml:\"revision_number\""]; - // the height within the given revision - uint64 revision_height = 2 [(gogoproto.moretags) = "yaml:\"revision_height\""]; -} - -// Params defines the set of IBC light client parameters. -message Params { - // allowed_clients defines the list of allowed client state types. - repeated string allowed_clients = 1 [(gogoproto.moretags) = "yaml:\"allowed_clients\""]; -} diff --git a/third_party/proto/ibc/core/client/v1/genesis.proto b/third_party/proto/ibc/core/client/v1/genesis.proto deleted file mode 100644 index 0ca29d224b..0000000000 --- a/third_party/proto/ibc/core/client/v1/genesis.proto +++ /dev/null @@ -1,48 +0,0 @@ -syntax = "proto3"; - -package ibc.core.client.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/02-client/types"; - -import "ibc/core/client/v1/client.proto"; -import "gogoproto/gogo.proto"; - -// GenesisState defines the ibc client submodule's genesis state. -message GenesisState { - // client states with their corresponding identifiers - repeated IdentifiedClientState clients = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "IdentifiedClientStates"]; - // consensus states from each client - repeated ClientConsensusStates clients_consensus = 2 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "ClientsConsensusStates", - (gogoproto.moretags) = "yaml:\"clients_consensus\"" - ]; - // metadata from each client - repeated IdentifiedGenesisMetadata clients_metadata = 3 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"clients_metadata\""]; - Params params = 4 [(gogoproto.nullable) = false]; - // create localhost on initialization - bool create_localhost = 5 [(gogoproto.moretags) = "yaml:\"create_localhost\""]; - // the sequence for the next generated client identifier - uint64 next_client_sequence = 6 [(gogoproto.moretags) = "yaml:\"next_client_sequence\""]; -} - -// GenesisMetadata defines the genesis type for metadata that clients may return -// with ExportMetadata -message GenesisMetadata { - option (gogoproto.goproto_getters) = false; - - // store key of metadata without clientID-prefix - bytes key = 1; - // metadata value - bytes value = 2; -} - -// IdentifiedGenesisMetadata has the client metadata with the corresponding -// client id. -message IdentifiedGenesisMetadata { - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - repeated GenesisMetadata client_metadata = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"client_metadata\""]; -} diff --git a/third_party/proto/ibc/core/client/v1/query.proto b/third_party/proto/ibc/core/client/v1/query.proto deleted file mode 100644 index 33a4191cd0..0000000000 --- a/third_party/proto/ibc/core/client/v1/query.proto +++ /dev/null @@ -1,207 +0,0 @@ -syntax = "proto3"; - -package ibc.core.client.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/02-client/types"; - -import "cosmos/base/query/v1beta1/pagination.proto"; -import "ibc/core/client/v1/client.proto"; -import "google/protobuf/any.proto"; -import "google/api/annotations.proto"; -import "gogoproto/gogo.proto"; - -// Query provides defines the gRPC querier service -service Query { - // ClientState queries an IBC light client. - rpc ClientState(QueryClientStateRequest) returns (QueryClientStateResponse) { - option (google.api.http).get = "/ibc/core/client/v1/client_states/{client_id}"; - } - - // ClientStates queries all the IBC light clients of a chain. - rpc ClientStates(QueryClientStatesRequest) returns (QueryClientStatesResponse) { - option (google.api.http).get = "/ibc/core/client/v1/client_states"; - } - - // ConsensusState queries a consensus state associated with a client state at - // a given height. - rpc ConsensusState(QueryConsensusStateRequest) returns (QueryConsensusStateResponse) { - option (google.api.http).get = "/ibc/core/client/v1/consensus_states/" - "{client_id}/revision/{revision_number}/" - "height/{revision_height}"; - } - - // ConsensusStates queries all the consensus state associated with a given - // client. - rpc ConsensusStates(QueryConsensusStatesRequest) returns (QueryConsensusStatesResponse) { - option (google.api.http).get = "/ibc/core/client/v1/consensus_states/{client_id}"; - } - - // ConsensusStateHeights queries the height of every consensus states associated with a given client. - rpc ConsensusStateHeights(QueryConsensusStateHeightsRequest) returns (QueryConsensusStateHeightsResponse) { - option (google.api.http).get = "/ibc/core/client/v1/consensus_states/{client_id}/heights"; - } - - // Status queries the status of an IBC client. - rpc ClientStatus(QueryClientStatusRequest) returns (QueryClientStatusResponse) { - option (google.api.http).get = "/ibc/core/client/v1/client_status/{client_id}"; - } - - // ClientParams queries all parameters of the ibc client. - rpc ClientParams(QueryClientParamsRequest) returns (QueryClientParamsResponse) { - option (google.api.http).get = "/ibc/client/v1/params"; - } - - // UpgradedClientState queries an Upgraded IBC light client. - rpc UpgradedClientState(QueryUpgradedClientStateRequest) returns (QueryUpgradedClientStateResponse) { - option (google.api.http).get = "/ibc/core/client/v1/upgraded_client_states"; - } - - // UpgradedConsensusState queries an Upgraded IBC consensus state. - rpc UpgradedConsensusState(QueryUpgradedConsensusStateRequest) returns (QueryUpgradedConsensusStateResponse) { - option (google.api.http).get = "/ibc/core/client/v1/upgraded_consensus_states"; - } -} - -// QueryClientStateRequest is the request type for the Query/ClientState RPC -// method -message QueryClientStateRequest { - // client state unique identifier - string client_id = 1; -} - -// QueryClientStateResponse is the response type for the Query/ClientState RPC -// method. Besides the client state, it includes a proof and the height from -// which the proof was retrieved. -message QueryClientStateResponse { - // client state associated with the request identifier - google.protobuf.Any client_state = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryClientStatesRequest is the request type for the Query/ClientStates RPC -// method -message QueryClientStatesRequest { - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryClientStatesResponse is the response type for the Query/ClientStates RPC -// method. -message QueryClientStatesResponse { - // list of stored ClientStates of the chain. - repeated IdentifiedClientState client_states = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "IdentifiedClientStates"]; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryConsensusStateRequest is the request type for the Query/ConsensusState -// RPC method. Besides the consensus state, it includes a proof and the height -// from which the proof was retrieved. -message QueryConsensusStateRequest { - // client identifier - string client_id = 1; - // consensus state revision number - uint64 revision_number = 2; - // consensus state revision height - uint64 revision_height = 3; - // latest_height overrrides the height field and queries the latest stored - // ConsensusState - bool latest_height = 4; -} - -// QueryConsensusStateResponse is the response type for the Query/ConsensusState -// RPC method -message QueryConsensusStateResponse { - // consensus state associated with the client identifier at the given height - google.protobuf.Any consensus_state = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryConsensusStatesRequest is the request type for the Query/ConsensusStates -// RPC method. -message QueryConsensusStatesRequest { - // client identifier - string client_id = 1; - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryConsensusStatesResponse is the response type for the -// Query/ConsensusStates RPC method -message QueryConsensusStatesResponse { - // consensus states associated with the identifier - repeated ConsensusStateWithHeight consensus_states = 1 [(gogoproto.nullable) = false]; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryConsensusStateHeightsRequest is the request type for Query/ConsensusStateHeights -// RPC method. -message QueryConsensusStateHeightsRequest { - // client identifier - string client_id = 1; - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryConsensusStateHeightsResponse is the response type for the -// Query/ConsensusStateHeights RPC method -message QueryConsensusStateHeightsResponse { - // consensus state heights - repeated Height consensus_state_heights = 1 [(gogoproto.nullable) = false]; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryClientStatusRequest is the request type for the Query/ClientStatus RPC -// method -message QueryClientStatusRequest { - // client unique identifier - string client_id = 1; -} - -// QueryClientStatusResponse is the response type for the Query/ClientStatus RPC -// method. It returns the current status of the IBC client. -message QueryClientStatusResponse { - string status = 1; -} - -// QueryClientParamsRequest is the request type for the Query/ClientParams RPC -// method. -message QueryClientParamsRequest {} - -// QueryClientParamsResponse is the response type for the Query/ClientParams RPC -// method. -message QueryClientParamsResponse { - // params defines the parameters of the module. - Params params = 1; -} - -// QueryUpgradedClientStateRequest is the request type for the -// Query/UpgradedClientState RPC method -message QueryUpgradedClientStateRequest {} - -// QueryUpgradedClientStateResponse is the response type for the -// Query/UpgradedClientState RPC method. -message QueryUpgradedClientStateResponse { - // client state associated with the request identifier - google.protobuf.Any upgraded_client_state = 1; -} - -// QueryUpgradedConsensusStateRequest is the request type for the -// Query/UpgradedConsensusState RPC method -message QueryUpgradedConsensusStateRequest {} - -// QueryUpgradedConsensusStateResponse is the response type for the -// Query/UpgradedConsensusState RPC method. -message QueryUpgradedConsensusStateResponse { - // Consensus state associated with the request identifier - google.protobuf.Any upgraded_consensus_state = 1; -} diff --git a/third_party/proto/ibc/core/client/v1/tx.proto b/third_party/proto/ibc/core/client/v1/tx.proto deleted file mode 100644 index 06dbfbd0df..0000000000 --- a/third_party/proto/ibc/core/client/v1/tx.proto +++ /dev/null @@ -1,99 +0,0 @@ -syntax = "proto3"; - -package ibc.core.client.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/02-client/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; - -// Msg defines the ibc/client Msg service. -service Msg { - // CreateClient defines a rpc handler method for MsgCreateClient. - rpc CreateClient(MsgCreateClient) returns (MsgCreateClientResponse); - - // UpdateClient defines a rpc handler method for MsgUpdateClient. - rpc UpdateClient(MsgUpdateClient) returns (MsgUpdateClientResponse); - - // UpgradeClient defines a rpc handler method for MsgUpgradeClient. - rpc UpgradeClient(MsgUpgradeClient) returns (MsgUpgradeClientResponse); - - // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. - rpc SubmitMisbehaviour(MsgSubmitMisbehaviour) returns (MsgSubmitMisbehaviourResponse); -} - -// MsgCreateClient defines a message to create an IBC client -message MsgCreateClient { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // light client state - google.protobuf.Any client_state = 1 [(gogoproto.moretags) = "yaml:\"client_state\""]; - // consensus state associated with the client that corresponds to a given - // height. - google.protobuf.Any consensus_state = 2 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; - // signer address - string signer = 3; -} - -// MsgCreateClientResponse defines the Msg/CreateClient response type. -message MsgCreateClientResponse {} - -// MsgUpdateClient defines an sdk.Msg to update a IBC client state using -// the given header. -message MsgUpdateClient { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // header to update the light client - google.protobuf.Any header = 2; - // signer address - string signer = 3; -} - -// MsgUpdateClientResponse defines the Msg/UpdateClient response type. -message MsgUpdateClientResponse {} - -// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client -// state -message MsgUpgradeClient { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // upgraded client state - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; - // upgraded consensus state, only contains enough information to serve as a - // basis of trust in update logic - google.protobuf.Any consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; - // proof that old chain committed to new client - bytes proof_upgrade_client = 4 [(gogoproto.moretags) = "yaml:\"proof_upgrade_client\""]; - // proof that old chain committed to new consensus state - bytes proof_upgrade_consensus_state = 5 [(gogoproto.moretags) = "yaml:\"proof_upgrade_consensus_state\""]; - // signer address - string signer = 6; -} - -// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. -message MsgUpgradeClientResponse {} - -// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for -// light client misbehaviour. -message MsgSubmitMisbehaviour { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // misbehaviour used for freezing the light client - google.protobuf.Any misbehaviour = 2; - // signer address - string signer = 3; -} - -// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response -// type. -message MsgSubmitMisbehaviourResponse {} diff --git a/third_party/proto/ibc/core/commitment/v1/commitment.proto b/third_party/proto/ibc/core/commitment/v1/commitment.proto deleted file mode 100644 index f0118b7165..0000000000 --- a/third_party/proto/ibc/core/commitment/v1/commitment.proto +++ /dev/null @@ -1,41 +0,0 @@ -syntax = "proto3"; - -package ibc.core.commitment.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/23-commitment/types"; - -import "gogoproto/gogo.proto"; -import "confio/proofs.proto"; - -// MerkleRoot defines a merkle root hash. -// In the Cosmos SDK, the AppHash of a block header becomes the root. -message MerkleRoot { - option (gogoproto.goproto_getters) = false; - - bytes hash = 1; -} - -// MerklePrefix is merkle path prefixed to the key. -// The constructed key from the Path and the key will be append(Path.KeyPath, -// append(Path.KeyPrefix, key...)) -message MerklePrefix { - bytes key_prefix = 1 [(gogoproto.moretags) = "yaml:\"key_prefix\""]; -} - -// MerklePath is the path used to verify commitment proofs, which can be an -// arbitrary structured object (defined by a commitment type). -// MerklePath is represented from root-to-leaf -message MerklePath { - option (gogoproto.goproto_stringer) = false; - - repeated string key_path = 1 [(gogoproto.moretags) = "yaml:\"key_path\""]; -} - -// MerkleProof is a wrapper type over a chain of CommitmentProofs. -// It demonstrates membership or non-membership for an element or set of -// elements, verifiable in conjunction with a known commitment root. Proofs -// should be succinct. -// MerkleProofs are ordered from leaf-to-root -message MerkleProof { - repeated ics23.CommitmentProof proofs = 1; -} diff --git a/third_party/proto/ibc/core/connection/v1/connection.proto b/third_party/proto/ibc/core/connection/v1/connection.proto deleted file mode 100644 index 7fd2a6909a..0000000000 --- a/third_party/proto/ibc/core/connection/v1/connection.proto +++ /dev/null @@ -1,114 +0,0 @@ -syntax = "proto3"; - -package ibc.core.connection.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/commitment/v1/commitment.proto"; - -// ICS03 - Connection Data Structures as defined in -// https://github.com/cosmos/ibc/blob/master/spec/core/ics-003-connection-semantics#data-structures - -// ConnectionEnd defines a stateful object on a chain connected to another -// separate one. -// NOTE: there must only be 2 defined ConnectionEnds to establish -// a connection between two chains. -message ConnectionEnd { - option (gogoproto.goproto_getters) = false; - // client associated with this connection. - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // IBC version which can be utilised to determine encodings or protocols for - // channels or packets utilising this connection. - repeated Version versions = 2; - // current state of the connection end. - State state = 3; - // counterparty chain associated with this connection. - Counterparty counterparty = 4 [(gogoproto.nullable) = false]; - // delay period that must pass before a consensus state can be used for - // packet-verification NOTE: delay period logic is only implemented by some - // clients. - uint64 delay_period = 5 [(gogoproto.moretags) = "yaml:\"delay_period\""]; -} - -// IdentifiedConnection defines a connection with additional connection -// identifier field. -message IdentifiedConnection { - option (gogoproto.goproto_getters) = false; - // connection identifier. - string id = 1 [(gogoproto.moretags) = "yaml:\"id\""]; - // client associated with this connection. - string client_id = 2 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // IBC version which can be utilised to determine encodings or protocols for - // channels or packets utilising this connection - repeated Version versions = 3; - // current state of the connection end. - State state = 4; - // counterparty chain associated with this connection. - Counterparty counterparty = 5 [(gogoproto.nullable) = false]; - // delay period associated with this connection. - uint64 delay_period = 6 [(gogoproto.moretags) = "yaml:\"delay_period\""]; -} - -// State defines if a connection is in one of the following states: -// INIT, TRYOPEN, OPEN or UNINITIALIZED. -enum State { - option (gogoproto.goproto_enum_prefix) = false; - - // Default State - STATE_UNINITIALIZED_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNINITIALIZED"]; - // A connection end has just started the opening handshake. - STATE_INIT = 1 [(gogoproto.enumvalue_customname) = "INIT"]; - // A connection end has acknowledged the handshake step on the counterparty - // chain. - STATE_TRYOPEN = 2 [(gogoproto.enumvalue_customname) = "TRYOPEN"]; - // A connection end has completed the handshake. - STATE_OPEN = 3 [(gogoproto.enumvalue_customname) = "OPEN"]; -} - -// Counterparty defines the counterparty chain associated with a connection end. -message Counterparty { - option (gogoproto.goproto_getters) = false; - - // identifies the client on the counterparty chain associated with a given - // connection. - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // identifies the connection end on the counterparty chain associated with a - // given connection. - string connection_id = 2 [(gogoproto.moretags) = "yaml:\"connection_id\""]; - // commitment merkle prefix of the counterparty chain. - ibc.core.commitment.v1.MerklePrefix prefix = 3 [(gogoproto.nullable) = false]; -} - -// ClientPaths define all the connection paths for a client state. -message ClientPaths { - // list of connection paths - repeated string paths = 1; -} - -// ConnectionPaths define all the connection paths for a given client state. -message ConnectionPaths { - // client state unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // list of connection paths - repeated string paths = 2; -} - -// Version defines the versioning scheme used to negotiate the IBC verison in -// the connection handshake. -message Version { - option (gogoproto.goproto_getters) = false; - - // unique version identifier - string identifier = 1; - // list of features compatible with the specified identifier - repeated string features = 2; -} - -// Params defines the set of Connection parameters. -message Params { - // maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the - // largest amount of time that the chain might reasonably take to produce the next block under normal operating - // conditions. A safe choice is 3-5x the expected time per block. - uint64 max_expected_time_per_block = 1 [(gogoproto.moretags) = "yaml:\"max_expected_time_per_block\""]; -} diff --git a/third_party/proto/ibc/core/connection/v1/genesis.proto b/third_party/proto/ibc/core/connection/v1/genesis.proto deleted file mode 100644 index 1a53422c94..0000000000 --- a/third_party/proto/ibc/core/connection/v1/genesis.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto3"; - -package ibc.core.connection.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/connection/v1/connection.proto"; - -// GenesisState defines the ibc connection submodule's genesis state. -message GenesisState { - repeated IdentifiedConnection connections = 1 [(gogoproto.nullable) = false]; - repeated ConnectionPaths client_connection_paths = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"client_connection_paths\""]; - // the sequence for the next generated connection identifier - uint64 next_connection_sequence = 3 [(gogoproto.moretags) = "yaml:\"next_connection_sequence\""]; - Params params = 4 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/ibc/core/connection/v1/query.proto b/third_party/proto/ibc/core/connection/v1/query.proto deleted file mode 100644 index f28578f5fc..0000000000 --- a/third_party/proto/ibc/core/connection/v1/query.proto +++ /dev/null @@ -1,138 +0,0 @@ -syntax = "proto3"; - -package ibc.core.connection.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types"; - -import "gogoproto/gogo.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; -import "ibc/core/client/v1/client.proto"; -import "ibc/core/connection/v1/connection.proto"; -import "google/api/annotations.proto"; -import "google/protobuf/any.proto"; - -// Query provides defines the gRPC querier service -service Query { - // Connection queries an IBC connection end. - rpc Connection(QueryConnectionRequest) returns (QueryConnectionResponse) { - option (google.api.http).get = "/ibc/core/connection/v1/connections/{connection_id}"; - } - - // Connections queries all the IBC connections of a chain. - rpc Connections(QueryConnectionsRequest) returns (QueryConnectionsResponse) { - option (google.api.http).get = "/ibc/core/connection/v1/connections"; - } - - // ClientConnections queries the connection paths associated with a client - // state. - rpc ClientConnections(QueryClientConnectionsRequest) returns (QueryClientConnectionsResponse) { - option (google.api.http).get = "/ibc/core/connection/v1/client_connections/{client_id}"; - } - - // ConnectionClientState queries the client state associated with the - // connection. - rpc ConnectionClientState(QueryConnectionClientStateRequest) returns (QueryConnectionClientStateResponse) { - option (google.api.http).get = "/ibc/core/connection/v1/connections/{connection_id}/client_state"; - } - - // ConnectionConsensusState queries the consensus state associated with the - // connection. - rpc ConnectionConsensusState(QueryConnectionConsensusStateRequest) returns (QueryConnectionConsensusStateResponse) { - option (google.api.http).get = "/ibc/core/connection/v1/connections/{connection_id}/consensus_state/" - "revision/{revision_number}/height/{revision_height}"; - } -} - -// QueryConnectionRequest is the request type for the Query/Connection RPC -// method -message QueryConnectionRequest { - // connection unique identifier - string connection_id = 1; -} - -// QueryConnectionResponse is the response type for the Query/Connection RPC -// method. Besides the connection end, it includes a proof and the height from -// which the proof was retrieved. -message QueryConnectionResponse { - // connection associated with the request identifier - ibc.core.connection.v1.ConnectionEnd connection = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryConnectionsRequest is the request type for the Query/Connections RPC -// method -message QueryConnectionsRequest { - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryConnectionsResponse is the response type for the Query/Connections RPC -// method. -message QueryConnectionsResponse { - // list of stored connections of the chain. - repeated ibc.core.connection.v1.IdentifiedConnection connections = 1; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; - // query block height - ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false]; -} - -// QueryClientConnectionsRequest is the request type for the -// Query/ClientConnections RPC method -message QueryClientConnectionsRequest { - // client identifier associated with a connection - string client_id = 1; -} - -// QueryClientConnectionsResponse is the response type for the -// Query/ClientConnections RPC method -message QueryClientConnectionsResponse { - // slice of all the connection paths associated with a client. - repeated string connection_paths = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was generated - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryConnectionClientStateRequest is the request type for the -// Query/ConnectionClientState RPC method -message QueryConnectionClientStateRequest { - // connection identifier - string connection_id = 1 [(gogoproto.moretags) = "yaml:\"connection_id\""]; -} - -// QueryConnectionClientStateResponse is the response type for the -// Query/ConnectionClientState RPC method -message QueryConnectionClientStateResponse { - // client state associated with the channel - ibc.core.client.v1.IdentifiedClientState identified_client_state = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryConnectionConsensusStateRequest is the request type for the -// Query/ConnectionConsensusState RPC method -message QueryConnectionConsensusStateRequest { - // connection identifier - string connection_id = 1 [(gogoproto.moretags) = "yaml:\"connection_id\""]; - uint64 revision_number = 2; - uint64 revision_height = 3; -} - -// QueryConnectionConsensusStateResponse is the response type for the -// Query/ConnectionConsensusState RPC method -message QueryConnectionConsensusStateResponse { - // consensus state associated with the channel - google.protobuf.Any consensus_state = 1; - // client ID associated with the consensus state - string client_id = 2; - // merkle proof of existence - bytes proof = 3; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/ibc/core/connection/v1/tx.proto b/third_party/proto/ibc/core/connection/v1/tx.proto deleted file mode 100644 index e7e09c84cf..0000000000 --- a/third_party/proto/ibc/core/connection/v1/tx.proto +++ /dev/null @@ -1,119 +0,0 @@ -syntax = "proto3"; - -package ibc.core.connection.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "ibc/core/client/v1/client.proto"; -import "ibc/core/connection/v1/connection.proto"; - -// Msg defines the ibc/connection Msg service. -service Msg { - // ConnectionOpenInit defines a rpc handler method for MsgConnectionOpenInit. - rpc ConnectionOpenInit(MsgConnectionOpenInit) returns (MsgConnectionOpenInitResponse); - - // ConnectionOpenTry defines a rpc handler method for MsgConnectionOpenTry. - rpc ConnectionOpenTry(MsgConnectionOpenTry) returns (MsgConnectionOpenTryResponse); - - // ConnectionOpenAck defines a rpc handler method for MsgConnectionOpenAck. - rpc ConnectionOpenAck(MsgConnectionOpenAck) returns (MsgConnectionOpenAckResponse); - - // ConnectionOpenConfirm defines a rpc handler method for - // MsgConnectionOpenConfirm. - rpc ConnectionOpenConfirm(MsgConnectionOpenConfirm) returns (MsgConnectionOpenConfirmResponse); -} - -// MsgConnectionOpenInit defines the msg sent by an account on Chain A to -// initialize a connection with Chain B. -message MsgConnectionOpenInit { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - Counterparty counterparty = 2 [(gogoproto.nullable) = false]; - Version version = 3; - uint64 delay_period = 4 [(gogoproto.moretags) = "yaml:\"delay_period\""]; - string signer = 5; -} - -// MsgConnectionOpenInitResponse defines the Msg/ConnectionOpenInit response -// type. -message MsgConnectionOpenInitResponse {} - -// MsgConnectionOpenTry defines a msg sent by a Relayer to try to open a -// connection on Chain B. -message MsgConnectionOpenTry { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // in the case of crossing hello's, when both chains call OpenInit, we need - // the connection identifier of the previous connection in state INIT - string previous_connection_id = 2 [(gogoproto.moretags) = "yaml:\"previous_connection_id\""]; - google.protobuf.Any client_state = 3 [(gogoproto.moretags) = "yaml:\"client_state\""]; - Counterparty counterparty = 4 [(gogoproto.nullable) = false]; - uint64 delay_period = 5 [(gogoproto.moretags) = "yaml:\"delay_period\""]; - repeated Version counterparty_versions = 6 [(gogoproto.moretags) = "yaml:\"counterparty_versions\""]; - ibc.core.client.v1.Height proof_height = 7 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - // proof of the initialization the connection on Chain A: `UNITIALIZED -> - // INIT` - bytes proof_init = 8 [(gogoproto.moretags) = "yaml:\"proof_init\""]; - // proof of client state included in message - bytes proof_client = 9 [(gogoproto.moretags) = "yaml:\"proof_client\""]; - // proof of client consensus state - bytes proof_consensus = 10 [(gogoproto.moretags) = "yaml:\"proof_consensus\""]; - ibc.core.client.v1.Height consensus_height = 11 - [(gogoproto.moretags) = "yaml:\"consensus_height\"", (gogoproto.nullable) = false]; - string signer = 12; -} - -// MsgConnectionOpenTryResponse defines the Msg/ConnectionOpenTry response type. -message MsgConnectionOpenTryResponse {} - -// MsgConnectionOpenAck defines a msg sent by a Relayer to Chain A to -// acknowledge the change of connection state to TRYOPEN on Chain B. -message MsgConnectionOpenAck { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string connection_id = 1 [(gogoproto.moretags) = "yaml:\"connection_id\""]; - string counterparty_connection_id = 2 [(gogoproto.moretags) = "yaml:\"counterparty_connection_id\""]; - Version version = 3; - google.protobuf.Any client_state = 4 [(gogoproto.moretags) = "yaml:\"client_state\""]; - ibc.core.client.v1.Height proof_height = 5 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - // proof of the initialization the connection on Chain B: `UNITIALIZED -> - // TRYOPEN` - bytes proof_try = 6 [(gogoproto.moretags) = "yaml:\"proof_try\""]; - // proof of client state included in message - bytes proof_client = 7 [(gogoproto.moretags) = "yaml:\"proof_client\""]; - // proof of client consensus state - bytes proof_consensus = 8 [(gogoproto.moretags) = "yaml:\"proof_consensus\""]; - ibc.core.client.v1.Height consensus_height = 9 - [(gogoproto.moretags) = "yaml:\"consensus_height\"", (gogoproto.nullable) = false]; - string signer = 10; -} - -// MsgConnectionOpenAckResponse defines the Msg/ConnectionOpenAck response type. -message MsgConnectionOpenAckResponse {} - -// MsgConnectionOpenConfirm defines a msg sent by a Relayer to Chain B to -// acknowledge the change of connection state to OPEN on Chain A. -message MsgConnectionOpenConfirm { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string connection_id = 1 [(gogoproto.moretags) = "yaml:\"connection_id\""]; - // proof for the change of the connection state on Chain A: `INIT -> OPEN` - bytes proof_ack = 2 [(gogoproto.moretags) = "yaml:\"proof_ack\""]; - ibc.core.client.v1.Height proof_height = 3 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 4; -} - -// MsgConnectionOpenConfirmResponse defines the Msg/ConnectionOpenConfirm -// response type. -message MsgConnectionOpenConfirmResponse {} diff --git a/third_party/proto/ibc/core/types/v1/genesis.proto b/third_party/proto/ibc/core/types/v1/genesis.proto deleted file mode 100644 index fbddbf3035..0000000000 --- a/third_party/proto/ibc/core/types/v1/genesis.proto +++ /dev/null @@ -1,23 +0,0 @@ -syntax = "proto3"; - -package ibc.core.types.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/client/v1/genesis.proto"; -import "ibc/core/connection/v1/genesis.proto"; -import "ibc/core/channel/v1/genesis.proto"; - -// GenesisState defines the ibc module's genesis state. -message GenesisState { - // ICS002 - Clients genesis state - ibc.core.client.v1.GenesisState client_genesis = 1 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"client_genesis\""]; - // ICS003 - Connections genesis state - ibc.core.connection.v1.GenesisState connection_genesis = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"connection_genesis\""]; - // ICS004 - Channel genesis state - ibc.core.channel.v1.GenesisState channel_genesis = 3 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"channel_genesis\""]; -} diff --git a/third_party/proto/ibc/lightclients/localhost/v1/localhost.proto b/third_party/proto/ibc/lightclients/localhost/v1/localhost.proto deleted file mode 100644 index 4305680154..0000000000 --- a/third_party/proto/ibc/lightclients/localhost/v1/localhost.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto3"; - -package ibc.lightclients.localhost.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/light-clients/09-localhost/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/client/v1/client.proto"; - -// ClientState defines a loopback (localhost) client. It requires (read-only) -// access to keys outside the client prefix. -message ClientState { - option (gogoproto.goproto_getters) = false; - // self chain ID - string chain_id = 1 [(gogoproto.moretags) = "yaml:\"chain_id\""]; - // self latest block height - ibc.core.client.v1.Height height = 2 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/ibc/lightclients/solomachine/v1/solomachine.proto b/third_party/proto/ibc/lightclients/solomachine/v1/solomachine.proto deleted file mode 100644 index c279f5e728..0000000000 --- a/third_party/proto/ibc/lightclients/solomachine/v1/solomachine.proto +++ /dev/null @@ -1,189 +0,0 @@ -syntax = "proto3"; - -package ibc.lightclients.solomachine.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/core/02-client/legacy/v100"; - -import "ibc/core/connection/v1/connection.proto"; -import "ibc/core/channel/v1/channel.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; - -// ClientState defines a solo machine client that tracks the current consensus -// state and if the client is frozen. -message ClientState { - option (gogoproto.goproto_getters) = false; - // latest sequence of the client state - uint64 sequence = 1; - // frozen sequence of the solo machine - uint64 frozen_sequence = 2 [(gogoproto.moretags) = "yaml:\"frozen_sequence\""]; - ConsensusState consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; - // when set to true, will allow governance to update a solo machine client. - // The client will be unfrozen if it is frozen. - bool allow_update_after_proposal = 4 [(gogoproto.moretags) = "yaml:\"allow_update_after_proposal\""]; -} - -// ConsensusState defines a solo machine consensus state. The sequence of a -// consensus state is contained in the "height" key used in storing the -// consensus state. -message ConsensusState { - option (gogoproto.goproto_getters) = false; - // public key of the solo machine - google.protobuf.Any public_key = 1 [(gogoproto.moretags) = "yaml:\"public_key\""]; - // diversifier allows the same public key to be re-used across different solo - // machine clients (potentially on different chains) without being considered - // misbehaviour. - string diversifier = 2; - uint64 timestamp = 3; -} - -// Header defines a solo machine consensus header -message Header { - option (gogoproto.goproto_getters) = false; - // sequence to update solo machine public key at - uint64 sequence = 1; - uint64 timestamp = 2; - bytes signature = 3; - google.protobuf.Any new_public_key = 4 [(gogoproto.moretags) = "yaml:\"new_public_key\""]; - string new_diversifier = 5 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; -} - -// Misbehaviour defines misbehaviour for a solo machine which consists -// of a sequence and two signatures over different messages at that sequence. -message Misbehaviour { - option (gogoproto.goproto_getters) = false; - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - uint64 sequence = 2; - SignatureAndData signature_one = 3 [(gogoproto.moretags) = "yaml:\"signature_one\""]; - SignatureAndData signature_two = 4 [(gogoproto.moretags) = "yaml:\"signature_two\""]; -} - -// SignatureAndData contains a signature and the data signed over to create that -// signature. -message SignatureAndData { - option (gogoproto.goproto_getters) = false; - bytes signature = 1; - DataType data_type = 2 [(gogoproto.moretags) = "yaml:\"data_type\""]; - bytes data = 3; - uint64 timestamp = 4; -} - -// TimestampedSignatureData contains the signature data and the timestamp of the -// signature. -message TimestampedSignatureData { - option (gogoproto.goproto_getters) = false; - bytes signature_data = 1 [(gogoproto.moretags) = "yaml:\"signature_data\""]; - uint64 timestamp = 2; -} - -// SignBytes defines the signed bytes used for signature verification. -message SignBytes { - option (gogoproto.goproto_getters) = false; - - uint64 sequence = 1; - uint64 timestamp = 2; - string diversifier = 3; - // type of the data used - DataType data_type = 4 [(gogoproto.moretags) = "yaml:\"data_type\""]; - // marshaled data - bytes data = 5; -} - -// DataType defines the type of solo machine proof being created. This is done -// to preserve uniqueness of different data sign byte encodings. -enum DataType { - option (gogoproto.goproto_enum_prefix) = false; - - // Default State - DATA_TYPE_UNINITIALIZED_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNSPECIFIED"]; - // Data type for client state verification - DATA_TYPE_CLIENT_STATE = 1 [(gogoproto.enumvalue_customname) = "CLIENT"]; - // Data type for consensus state verification - DATA_TYPE_CONSENSUS_STATE = 2 [(gogoproto.enumvalue_customname) = "CONSENSUS"]; - // Data type for connection state verification - DATA_TYPE_CONNECTION_STATE = 3 [(gogoproto.enumvalue_customname) = "CONNECTION"]; - // Data type for channel state verification - DATA_TYPE_CHANNEL_STATE = 4 [(gogoproto.enumvalue_customname) = "CHANNEL"]; - // Data type for packet commitment verification - DATA_TYPE_PACKET_COMMITMENT = 5 [(gogoproto.enumvalue_customname) = "PACKETCOMMITMENT"]; - // Data type for packet acknowledgement verification - DATA_TYPE_PACKET_ACKNOWLEDGEMENT = 6 [(gogoproto.enumvalue_customname) = "PACKETACKNOWLEDGEMENT"]; - // Data type for packet receipt absence verification - DATA_TYPE_PACKET_RECEIPT_ABSENCE = 7 [(gogoproto.enumvalue_customname) = "PACKETRECEIPTABSENCE"]; - // Data type for next sequence recv verification - DATA_TYPE_NEXT_SEQUENCE_RECV = 8 [(gogoproto.enumvalue_customname) = "NEXTSEQUENCERECV"]; - // Data type for header verification - DATA_TYPE_HEADER = 9 [(gogoproto.enumvalue_customname) = "HEADER"]; -} - -// HeaderData returns the SignBytes data for update verification. -message HeaderData { - option (gogoproto.goproto_getters) = false; - - // header public key - google.protobuf.Any new_pub_key = 1 [(gogoproto.moretags) = "yaml:\"new_pub_key\""]; - // header diversifier - string new_diversifier = 2 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; -} - -// ClientStateData returns the SignBytes data for client state verification. -message ClientStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; -} - -// ConsensusStateData returns the SignBytes data for consensus state -// verification. -message ConsensusStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - google.protobuf.Any consensus_state = 2 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; -} - -// ConnectionStateData returns the SignBytes data for connection state -// verification. -message ConnectionStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - ibc.core.connection.v1.ConnectionEnd connection = 2; -} - -// ChannelStateData returns the SignBytes data for channel state -// verification. -message ChannelStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - ibc.core.channel.v1.Channel channel = 2; -} - -// PacketCommitmentData returns the SignBytes data for packet commitment -// verification. -message PacketCommitmentData { - bytes path = 1; - bytes commitment = 2; -} - -// PacketAcknowledgementData returns the SignBytes data for acknowledgement -// verification. -message PacketAcknowledgementData { - bytes path = 1; - bytes acknowledgement = 2; -} - -// PacketReceiptAbsenceData returns the SignBytes data for -// packet receipt absence verification. -message PacketReceiptAbsenceData { - bytes path = 1; -} - -// NextSequenceRecvData returns the SignBytes data for verification of the next -// sequence to be received. -message NextSequenceRecvData { - bytes path = 1; - uint64 next_seq_recv = 2 [(gogoproto.moretags) = "yaml:\"next_seq_recv\""]; -} diff --git a/third_party/proto/ibc/lightclients/solomachine/v2/solomachine.proto b/third_party/proto/ibc/lightclients/solomachine/v2/solomachine.proto deleted file mode 100644 index e626c18ac6..0000000000 --- a/third_party/proto/ibc/lightclients/solomachine/v2/solomachine.proto +++ /dev/null @@ -1,189 +0,0 @@ -syntax = "proto3"; - -package ibc.lightclients.solomachine.v2; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/light-clients/06-solomachine/types"; - -import "ibc/core/connection/v1/connection.proto"; -import "ibc/core/channel/v1/channel.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; - -// ClientState defines a solo machine client that tracks the current consensus -// state and if the client is frozen. -message ClientState { - option (gogoproto.goproto_getters) = false; - // latest sequence of the client state - uint64 sequence = 1; - // frozen sequence of the solo machine - bool is_frozen = 2 [(gogoproto.moretags) = "yaml:\"is_frozen\""]; - ConsensusState consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; - // when set to true, will allow governance to update a solo machine client. - // The client will be unfrozen if it is frozen. - bool allow_update_after_proposal = 4 [(gogoproto.moretags) = "yaml:\"allow_update_after_proposal\""]; -} - -// ConsensusState defines a solo machine consensus state. The sequence of a -// consensus state is contained in the "height" key used in storing the -// consensus state. -message ConsensusState { - option (gogoproto.goproto_getters) = false; - // public key of the solo machine - google.protobuf.Any public_key = 1 [(gogoproto.moretags) = "yaml:\"public_key\""]; - // diversifier allows the same public key to be re-used across different solo - // machine clients (potentially on different chains) without being considered - // misbehaviour. - string diversifier = 2; - uint64 timestamp = 3; -} - -// Header defines a solo machine consensus header -message Header { - option (gogoproto.goproto_getters) = false; - // sequence to update solo machine public key at - uint64 sequence = 1; - uint64 timestamp = 2; - bytes signature = 3; - google.protobuf.Any new_public_key = 4 [(gogoproto.moretags) = "yaml:\"new_public_key\""]; - string new_diversifier = 5 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; -} - -// Misbehaviour defines misbehaviour for a solo machine which consists -// of a sequence and two signatures over different messages at that sequence. -message Misbehaviour { - option (gogoproto.goproto_getters) = false; - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - uint64 sequence = 2; - SignatureAndData signature_one = 3 [(gogoproto.moretags) = "yaml:\"signature_one\""]; - SignatureAndData signature_two = 4 [(gogoproto.moretags) = "yaml:\"signature_two\""]; -} - -// SignatureAndData contains a signature and the data signed over to create that -// signature. -message SignatureAndData { - option (gogoproto.goproto_getters) = false; - bytes signature = 1; - DataType data_type = 2 [(gogoproto.moretags) = "yaml:\"data_type\""]; - bytes data = 3; - uint64 timestamp = 4; -} - -// TimestampedSignatureData contains the signature data and the timestamp of the -// signature. -message TimestampedSignatureData { - option (gogoproto.goproto_getters) = false; - bytes signature_data = 1 [(gogoproto.moretags) = "yaml:\"signature_data\""]; - uint64 timestamp = 2; -} - -// SignBytes defines the signed bytes used for signature verification. -message SignBytes { - option (gogoproto.goproto_getters) = false; - - uint64 sequence = 1; - uint64 timestamp = 2; - string diversifier = 3; - // type of the data used - DataType data_type = 4 [(gogoproto.moretags) = "yaml:\"data_type\""]; - // marshaled data - bytes data = 5; -} - -// DataType defines the type of solo machine proof being created. This is done -// to preserve uniqueness of different data sign byte encodings. -enum DataType { - option (gogoproto.goproto_enum_prefix) = false; - - // Default State - DATA_TYPE_UNINITIALIZED_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNSPECIFIED"]; - // Data type for client state verification - DATA_TYPE_CLIENT_STATE = 1 [(gogoproto.enumvalue_customname) = "CLIENT"]; - // Data type for consensus state verification - DATA_TYPE_CONSENSUS_STATE = 2 [(gogoproto.enumvalue_customname) = "CONSENSUS"]; - // Data type for connection state verification - DATA_TYPE_CONNECTION_STATE = 3 [(gogoproto.enumvalue_customname) = "CONNECTION"]; - // Data type for channel state verification - DATA_TYPE_CHANNEL_STATE = 4 [(gogoproto.enumvalue_customname) = "CHANNEL"]; - // Data type for packet commitment verification - DATA_TYPE_PACKET_COMMITMENT = 5 [(gogoproto.enumvalue_customname) = "PACKETCOMMITMENT"]; - // Data type for packet acknowledgement verification - DATA_TYPE_PACKET_ACKNOWLEDGEMENT = 6 [(gogoproto.enumvalue_customname) = "PACKETACKNOWLEDGEMENT"]; - // Data type for packet receipt absence verification - DATA_TYPE_PACKET_RECEIPT_ABSENCE = 7 [(gogoproto.enumvalue_customname) = "PACKETRECEIPTABSENCE"]; - // Data type for next sequence recv verification - DATA_TYPE_NEXT_SEQUENCE_RECV = 8 [(gogoproto.enumvalue_customname) = "NEXTSEQUENCERECV"]; - // Data type for header verification - DATA_TYPE_HEADER = 9 [(gogoproto.enumvalue_customname) = "HEADER"]; -} - -// HeaderData returns the SignBytes data for update verification. -message HeaderData { - option (gogoproto.goproto_getters) = false; - - // header public key - google.protobuf.Any new_pub_key = 1 [(gogoproto.moretags) = "yaml:\"new_pub_key\""]; - // header diversifier - string new_diversifier = 2 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; -} - -// ClientStateData returns the SignBytes data for client state verification. -message ClientStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; -} - -// ConsensusStateData returns the SignBytes data for consensus state -// verification. -message ConsensusStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - google.protobuf.Any consensus_state = 2 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; -} - -// ConnectionStateData returns the SignBytes data for connection state -// verification. -message ConnectionStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - ibc.core.connection.v1.ConnectionEnd connection = 2; -} - -// ChannelStateData returns the SignBytes data for channel state -// verification. -message ChannelStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - ibc.core.channel.v1.Channel channel = 2; -} - -// PacketCommitmentData returns the SignBytes data for packet commitment -// verification. -message PacketCommitmentData { - bytes path = 1; - bytes commitment = 2; -} - -// PacketAcknowledgementData returns the SignBytes data for acknowledgement -// verification. -message PacketAcknowledgementData { - bytes path = 1; - bytes acknowledgement = 2; -} - -// PacketReceiptAbsenceData returns the SignBytes data for -// packet receipt absence verification. -message PacketReceiptAbsenceData { - bytes path = 1; -} - -// NextSequenceRecvData returns the SignBytes data for verification of the next -// sequence to be received. -message NextSequenceRecvData { - bytes path = 1; - uint64 next_seq_recv = 2 [(gogoproto.moretags) = "yaml:\"next_seq_recv\""]; -} diff --git a/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto b/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto deleted file mode 100644 index f04dc17565..0000000000 --- a/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto +++ /dev/null @@ -1,114 +0,0 @@ -syntax = "proto3"; - -package ibc.lightclients.tendermint.v1; - -option go_package = "github.com/cosmos/ibc-go/v3/modules/light-clients/07-tendermint/types"; - -import "tendermint/types/validator.proto"; -import "tendermint/types/types.proto"; -import "confio/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, (gogoproto.moretags) = "yaml:\"trust_level\""]; - // 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, (gogoproto.moretags) = "yaml:\"trusting_period\""]; - // duration of the staking unbonding period - google.protobuf.Duration unbonding_period = 4 [ - (gogoproto.nullable) = false, - (gogoproto.stdduration) = true, - (gogoproto.moretags) = "yaml:\"unbonding_period\"" - ]; - // 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, (gogoproto.moretags) = "yaml:\"max_clock_drift\""]; - // Block height when the client was frozen due to a misbehaviour - ibc.core.client.v1.Height frozen_height = 6 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"frozen_height\""]; - // Latest height the client was updated to - ibc.core.client.v1.Height latest_height = 7 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"latest_height\""]; - - // Proof specifications used in verifying counterparty state - repeated ics23.ProofSpec proof_specs = 8 [(gogoproto.moretags) = "yaml:\"proof_specs\""]; - - // 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 [(gogoproto.moretags) = "yaml:\"upgrade_path\""]; - - // allow_update_after_expiry is deprecated - bool allow_update_after_expiry = 10 [deprecated = true, (gogoproto.moretags) = "yaml:\"allow_update_after_expiry\""]; - // allow_update_after_misbehaviour is deprecated - bool allow_update_after_misbehaviour = 11 - [deprecated = true, (gogoproto.moretags) = "yaml:\"allow_update_after_misbehaviour\""]; -} - -// 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/tendermint/tendermint/libs/bytes.HexBytes", - (gogoproto.moretags) = "yaml:\"next_validators_hash\"" - ]; -} - -// Misbehaviour is a wrapper over two conflicting Headers -// that implements Misbehaviour interface expected by ICS-02 -message Misbehaviour { - option (gogoproto.goproto_getters) = false; - - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - Header header_1 = 2 [(gogoproto.customname) = "Header1", (gogoproto.moretags) = "yaml:\"header_1\""]; - Header header_2 = 3 [(gogoproto.customname) = "Header2", (gogoproto.moretags) = "yaml:\"header_2\""]; -} - -// 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, (gogoproto.moretags) = "yaml:\"signed_header\""]; - - .tendermint.types.ValidatorSet validator_set = 2 [(gogoproto.moretags) = "yaml:\"validator_set\""]; - ibc.core.client.v1.Height trusted_height = 3 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"trusted_height\""]; - .tendermint.types.ValidatorSet trusted_validators = 4 [(gogoproto.moretags) = "yaml:\"trusted_validators\""]; -} - -// Fraction defines the protobuf message type for tmmath.Fraction that only -// supports positive values. -message Fraction { - uint64 numerator = 1; - uint64 denominator = 2; -} diff --git a/third_party/proto/tendermint/abci/types.proto b/third_party/proto/tendermint/abci/types.proto deleted file mode 100644 index 340800f46b..0000000000 --- a/third_party/proto/tendermint/abci/types.proto +++ /dev/null @@ -1,413 +0,0 @@ -syntax = "proto3"; -package tendermint.abci; - -option go_package = "github.com/tendermint/tendermint/abci/types"; - -// For more information on gogo.proto, see: -// https://github.com/gogo/protobuf/blob/master/extensions.md -import "tendermint/crypto/proof.proto"; -import "tendermint/types/types.proto"; -import "tendermint/crypto/keys.proto"; -import "tendermint/types/params.proto"; -import "google/protobuf/timestamp.proto"; -import "gogoproto/gogo.proto"; - -// This file is copied from http://github.com/tendermint/abci -// NOTE: When using custom types, mind the warnings. -// https://github.com/gogo/protobuf/blob/master/custom_types.md#warnings-and-issues - -//---------------------------------------- -// Request types - -message Request { - oneof value { - RequestEcho echo = 1; - RequestFlush flush = 2; - RequestInfo info = 3; - RequestSetOption set_option = 4; - RequestInitChain init_chain = 5; - RequestQuery query = 6; - RequestBeginBlock begin_block = 7; - RequestCheckTx check_tx = 8; - RequestDeliverTx deliver_tx = 9; - RequestEndBlock end_block = 10; - RequestCommit commit = 11; - RequestListSnapshots list_snapshots = 12; - RequestOfferSnapshot offer_snapshot = 13; - RequestLoadSnapshotChunk load_snapshot_chunk = 14; - RequestApplySnapshotChunk apply_snapshot_chunk = 15; - } -} - -message RequestEcho { - string message = 1; -} - -message RequestFlush {} - -message RequestInfo { - string version = 1; - uint64 block_version = 2; - uint64 p2p_version = 3; -} - -// nondeterministic -message RequestSetOption { - string key = 1; - string value = 2; -} - -message RequestInitChain { - google.protobuf.Timestamp time = 1 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - string chain_id = 2; - ConsensusParams consensus_params = 3; - repeated ValidatorUpdate validators = 4 [(gogoproto.nullable) = false]; - bytes app_state_bytes = 5; - int64 initial_height = 6; -} - -message RequestQuery { - bytes data = 1; - string path = 2; - int64 height = 3; - bool prove = 4; -} - -message RequestBeginBlock { - bytes hash = 1; - tendermint.types.Header header = 2 [(gogoproto.nullable) = false]; - LastCommitInfo last_commit_info = 3 [(gogoproto.nullable) = false]; - repeated Evidence byzantine_validators = 4 [(gogoproto.nullable) = false]; -} - -enum CheckTxType { - NEW = 0 [(gogoproto.enumvalue_customname) = "New"]; - RECHECK = 1 [(gogoproto.enumvalue_customname) = "Recheck"]; -} - -message RequestCheckTx { - bytes tx = 1; - CheckTxType type = 2; -} - -message RequestDeliverTx { - bytes tx = 1; -} - -message RequestEndBlock { - int64 height = 1; -} - -message RequestCommit {} - -// lists available snapshots -message RequestListSnapshots {} - -// offers a snapshot to the application -message RequestOfferSnapshot { - Snapshot snapshot = 1; // snapshot offered by peers - bytes app_hash = 2; // light client-verified app hash for snapshot height -} - -// loads a snapshot chunk -message RequestLoadSnapshotChunk { - uint64 height = 1; - uint32 format = 2; - uint32 chunk = 3; -} - -// Applies a snapshot chunk -message RequestApplySnapshotChunk { - uint32 index = 1; - bytes chunk = 2; - string sender = 3; -} - -//---------------------------------------- -// Response types - -message Response { - oneof value { - ResponseException exception = 1; - ResponseEcho echo = 2; - ResponseFlush flush = 3; - ResponseInfo info = 4; - ResponseSetOption set_option = 5; - ResponseInitChain init_chain = 6; - ResponseQuery query = 7; - ResponseBeginBlock begin_block = 8; - ResponseCheckTx check_tx = 9; - ResponseDeliverTx deliver_tx = 10; - ResponseEndBlock end_block = 11; - ResponseCommit commit = 12; - ResponseListSnapshots list_snapshots = 13; - ResponseOfferSnapshot offer_snapshot = 14; - ResponseLoadSnapshotChunk load_snapshot_chunk = 15; - ResponseApplySnapshotChunk apply_snapshot_chunk = 16; - } -} - -// nondeterministic -message ResponseException { - string error = 1; -} - -message ResponseEcho { - string message = 1; -} - -message ResponseFlush {} - -message ResponseInfo { - string data = 1; - - string version = 2; - uint64 app_version = 3; - - int64 last_block_height = 4; - bytes last_block_app_hash = 5; -} - -// nondeterministic -message ResponseSetOption { - uint32 code = 1; - // bytes data = 2; - string log = 3; - string info = 4; -} - -message ResponseInitChain { - ConsensusParams consensus_params = 1; - repeated ValidatorUpdate validators = 2 [(gogoproto.nullable) = false]; - bytes app_hash = 3; -} - -message ResponseQuery { - uint32 code = 1; - // bytes data = 2; // use "value" instead. - string log = 3; // nondeterministic - string info = 4; // nondeterministic - int64 index = 5; - bytes key = 6; - bytes value = 7; - tendermint.crypto.ProofOps proof_ops = 8; - int64 height = 9; - string codespace = 10; -} - -message ResponseBeginBlock { - repeated Event events = 1 - [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; -} - -message ResponseCheckTx { - uint32 code = 1; - bytes data = 2; - string log = 3; // nondeterministic - string info = 4; // nondeterministic - int64 gas_wanted = 5 [json_name = "gas_wanted"]; - int64 gas_used = 6 [json_name = "gas_used"]; - repeated Event events = 7 - [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; - string codespace = 8; - string sender = 9; - int64 priority = 10; - - // mempool_error is set by Tendermint. - // ABCI applictions creating a ResponseCheckTX should not set mempool_error. - string mempool_error = 11; -} - -message ResponseDeliverTx { - uint32 code = 1; - bytes data = 2; - string log = 3; // nondeterministic - string info = 4; // nondeterministic - int64 gas_wanted = 5 [json_name = "gas_wanted"]; - int64 gas_used = 6 [json_name = "gas_used"]; - repeated Event events = 7 [ - (gogoproto.nullable) = false, - (gogoproto.jsontag) = "events,omitempty" - ]; // nondeterministic - string codespace = 8; -} - -message ResponseEndBlock { - repeated ValidatorUpdate validator_updates = 1 [(gogoproto.nullable) = false]; - ConsensusParams consensus_param_updates = 2; - repeated Event events = 3 - [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; -} - -message ResponseCommit { - // reserve 1 - bytes data = 2; - int64 retain_height = 3; -} - -message ResponseListSnapshots { - repeated Snapshot snapshots = 1; -} - -message ResponseOfferSnapshot { - Result result = 1; - - enum Result { - UNKNOWN = 0; // Unknown result, abort all snapshot restoration - ACCEPT = 1; // Snapshot accepted, apply chunks - ABORT = 2; // Abort all snapshot restoration - REJECT = 3; // Reject this specific snapshot, try others - REJECT_FORMAT = 4; // Reject all snapshots of this format, try others - REJECT_SENDER = 5; // Reject all snapshots from the sender(s), try others - } -} - -message ResponseLoadSnapshotChunk { - bytes chunk = 1; -} - -message ResponseApplySnapshotChunk { - Result result = 1; - repeated uint32 refetch_chunks = 2; // Chunks to refetch and reapply - repeated string reject_senders = 3; // Chunk senders to reject and ban - - enum Result { - UNKNOWN = 0; // Unknown result, abort all snapshot restoration - ACCEPT = 1; // Chunk successfully accepted - ABORT = 2; // Abort all snapshot restoration - RETRY = 3; // Retry chunk (combine with refetch and reject) - RETRY_SNAPSHOT = 4; // Retry snapshot (combine with refetch and reject) - REJECT_SNAPSHOT = 5; // Reject this snapshot, try others - } -} - -//---------------------------------------- -// Misc. - -// ConsensusParams contains all consensus-relevant parameters -// that can be adjusted by the abci app -message ConsensusParams { - BlockParams block = 1; - tendermint.types.EvidenceParams evidence = 2; - tendermint.types.ValidatorParams validator = 3; - tendermint.types.VersionParams version = 4; -} - -// BlockParams contains limits on the block size. -message BlockParams { - // Note: must be greater than 0 - int64 max_bytes = 1; - // Note: must be greater or equal to -1 - int64 max_gas = 2; -} - -message LastCommitInfo { - int32 round = 1; - repeated VoteInfo votes = 2 [(gogoproto.nullable) = false]; -} - -// Event allows application developers to attach additional information to -// ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx. -// Later, transactions may be queried using these events. -message Event { - string type = 1; - repeated EventAttribute attributes = 2 [ - (gogoproto.nullable) = false, - (gogoproto.jsontag) = "attributes,omitempty" - ]; -} - -// EventAttribute is a single key-value pair, associated with an event. -message EventAttribute { - bytes key = 1; - bytes value = 2; - bool index = 3; // nondeterministic -} - -// TxResult contains results of executing the transaction. -// -// One usage is indexing transaction results. -message TxResult { - int64 height = 1; - uint32 index = 2; - bytes tx = 3; - ResponseDeliverTx result = 4 [(gogoproto.nullable) = false]; -} - -//---------------------------------------- -// Blockchain Types - -// Validator -message Validator { - bytes address = 1; // The first 20 bytes of SHA256(public key) - // PubKey pub_key = 2 [(gogoproto.nullable)=false]; - int64 power = 3; // The voting power -} - -// ValidatorUpdate -message ValidatorUpdate { - tendermint.crypto.PublicKey pub_key = 1 [(gogoproto.nullable) = false]; - int64 power = 2; -} - -// VoteInfo -message VoteInfo { - Validator validator = 1 [(gogoproto.nullable) = false]; - bool signed_last_block = 2; -} - -enum EvidenceType { - UNKNOWN = 0; - DUPLICATE_VOTE = 1; - LIGHT_CLIENT_ATTACK = 2; -} - -message Evidence { - EvidenceType type = 1; - // The offending validator - Validator validator = 2 [(gogoproto.nullable) = false]; - // The height when the offense occurred - int64 height = 3; - // The corresponding time where the offense occurred - google.protobuf.Timestamp time = 4 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - // Total voting power of the validator set in case the ABCI application does - // not store historical validators. - // https://github.com/tendermint/tendermint/issues/4581 - int64 total_voting_power = 5; -} - -//---------------------------------------- -// State Sync Types - -message Snapshot { - uint64 height = 1; // The height at which the snapshot was taken - uint32 format = 2; // The application-specific snapshot format - uint32 chunks = 3; // Number of chunks in the snapshot - bytes hash = 4; // Arbitrary snapshot hash, equal only if identical - bytes metadata = 5; // Arbitrary application metadata -} - -//---------------------------------------- -// Service Definition - -service ABCIApplication { - rpc Echo(RequestEcho) returns (ResponseEcho); - rpc Flush(RequestFlush) returns (ResponseFlush); - rpc Info(RequestInfo) returns (ResponseInfo); - rpc SetOption(RequestSetOption) returns (ResponseSetOption); - rpc DeliverTx(RequestDeliverTx) returns (ResponseDeliverTx); - rpc CheckTx(RequestCheckTx) returns (ResponseCheckTx); - rpc Query(RequestQuery) returns (ResponseQuery); - rpc Commit(RequestCommit) returns (ResponseCommit); - rpc InitChain(RequestInitChain) returns (ResponseInitChain); - rpc BeginBlock(RequestBeginBlock) returns (ResponseBeginBlock); - rpc EndBlock(RequestEndBlock) returns (ResponseEndBlock); - rpc ListSnapshots(RequestListSnapshots) returns (ResponseListSnapshots); - rpc OfferSnapshot(RequestOfferSnapshot) returns (ResponseOfferSnapshot); - rpc LoadSnapshotChunk(RequestLoadSnapshotChunk) - returns (ResponseLoadSnapshotChunk); - rpc ApplySnapshotChunk(RequestApplySnapshotChunk) - returns (ResponseApplySnapshotChunk); -} diff --git a/third_party/proto/tendermint/blockchain/types.pb.go b/third_party/proto/tendermint/blockchain/types.pb.go deleted file mode 100644 index 45db6e95ed..0000000000 --- a/third_party/proto/tendermint/blockchain/types.pb.go +++ /dev/null @@ -1,1570 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/blockchain/types.proto - -package blockchain - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - proto "github.com/gogo/protobuf/proto" - types "github.com/tendermint/tendermint/proto/tendermint/types" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 - -// BlockRequest requests a block for a specific height -type BlockRequest struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` -} - -func (m *BlockRequest) Reset() { *m = BlockRequest{} } -func (m *BlockRequest) String() string { return proto.CompactTextString(m) } -func (*BlockRequest) ProtoMessage() {} -func (*BlockRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2927480384e78499, []int{0} -} - -func (m *BlockRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *BlockRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BlockRequest.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 *BlockRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_BlockRequest.Merge(m, src) -} - -func (m *BlockRequest) XXX_Size() int { - return m.Size() -} - -func (m *BlockRequest) XXX_DiscardUnknown() { - xxx_messageInfo_BlockRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_BlockRequest proto.InternalMessageInfo - -func (m *BlockRequest) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -// NoBlockResponse informs the node that the peer does not have block at the requested height -type NoBlockResponse struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` -} - -func (m *NoBlockResponse) Reset() { *m = NoBlockResponse{} } -func (m *NoBlockResponse) String() string { return proto.CompactTextString(m) } -func (*NoBlockResponse) ProtoMessage() {} -func (*NoBlockResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2927480384e78499, []int{1} -} - -func (m *NoBlockResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *NoBlockResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NoBlockResponse.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 *NoBlockResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_NoBlockResponse.Merge(m, src) -} - -func (m *NoBlockResponse) XXX_Size() int { - return m.Size() -} - -func (m *NoBlockResponse) XXX_DiscardUnknown() { - xxx_messageInfo_NoBlockResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_NoBlockResponse proto.InternalMessageInfo - -func (m *NoBlockResponse) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -// BlockResponse returns block to the requested -type BlockResponse struct { - Block *types.Block `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` -} - -func (m *BlockResponse) Reset() { *m = BlockResponse{} } -func (m *BlockResponse) String() string { return proto.CompactTextString(m) } -func (*BlockResponse) ProtoMessage() {} -func (*BlockResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2927480384e78499, []int{2} -} - -func (m *BlockResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *BlockResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BlockResponse.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 *BlockResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_BlockResponse.Merge(m, src) -} - -func (m *BlockResponse) XXX_Size() int { - return m.Size() -} - -func (m *BlockResponse) XXX_DiscardUnknown() { - xxx_messageInfo_BlockResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_BlockResponse proto.InternalMessageInfo - -func (m *BlockResponse) GetBlock() *types.Block { - if m != nil { - return m.Block - } - return nil -} - -// StatusRequest requests the status of a peer. -type StatusRequest struct{} - -func (m *StatusRequest) Reset() { *m = StatusRequest{} } -func (m *StatusRequest) String() string { return proto.CompactTextString(m) } -func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2927480384e78499, []int{3} -} - -func (m *StatusRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusRequest.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 *StatusRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusRequest.Merge(m, src) -} - -func (m *StatusRequest) XXX_Size() int { - return m.Size() -} - -func (m *StatusRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StatusRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_StatusRequest proto.InternalMessageInfo - -// StatusResponse is a peer response to inform their status. -type StatusResponse struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Base int64 `protobuf:"varint,2,opt,name=base,proto3" json:"base,omitempty"` -} - -func (m *StatusResponse) Reset() { *m = StatusResponse{} } -func (m *StatusResponse) String() string { return proto.CompactTextString(m) } -func (*StatusResponse) ProtoMessage() {} -func (*StatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2927480384e78499, []int{4} -} - -func (m *StatusResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *StatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusResponse.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 *StatusResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusResponse.Merge(m, src) -} - -func (m *StatusResponse) XXX_Size() int { - return m.Size() -} - -func (m *StatusResponse) XXX_DiscardUnknown() { - xxx_messageInfo_StatusResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_StatusResponse proto.InternalMessageInfo - -func (m *StatusResponse) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *StatusResponse) GetBase() int64 { - if m != nil { - return m.Base - } - return 0 -} - -type Message struct { - // Types that are valid to be assigned to Sum: - // *Message_BlockRequest - // *Message_NoBlockResponse - // *Message_BlockResponse - // *Message_StatusRequest - // *Message_StatusResponse - Sum isMessage_Sum `protobuf_oneof:"sum"` -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} -func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_2927480384e78499, []int{5} -} - -func (m *Message) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Message.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 *Message) XXX_Merge(src proto.Message) { - xxx_messageInfo_Message.Merge(m, src) -} - -func (m *Message) XXX_Size() int { - return m.Size() -} - -func (m *Message) XXX_DiscardUnknown() { - xxx_messageInfo_Message.DiscardUnknown(m) -} - -var xxx_messageInfo_Message proto.InternalMessageInfo - -type isMessage_Sum interface { - isMessage_Sum() - MarshalTo([]byte) (int, error) - Size() int -} - -type Message_BlockRequest struct { - BlockRequest *BlockRequest `protobuf:"bytes,1,opt,name=block_request,json=blockRequest,proto3,oneof" json:"block_request,omitempty"` -} -type Message_NoBlockResponse struct { - NoBlockResponse *NoBlockResponse `protobuf:"bytes,2,opt,name=no_block_response,json=noBlockResponse,proto3,oneof" json:"no_block_response,omitempty"` -} -type Message_BlockResponse struct { - BlockResponse *BlockResponse `protobuf:"bytes,3,opt,name=block_response,json=blockResponse,proto3,oneof" json:"block_response,omitempty"` -} -type Message_StatusRequest struct { - StatusRequest *StatusRequest `protobuf:"bytes,4,opt,name=status_request,json=statusRequest,proto3,oneof" json:"status_request,omitempty"` -} -type Message_StatusResponse struct { - StatusResponse *StatusResponse `protobuf:"bytes,5,opt,name=status_response,json=statusResponse,proto3,oneof" json:"status_response,omitempty"` -} - -func (*Message_BlockRequest) isMessage_Sum() {} -func (*Message_NoBlockResponse) isMessage_Sum() {} -func (*Message_BlockResponse) isMessage_Sum() {} -func (*Message_StatusRequest) isMessage_Sum() {} -func (*Message_StatusResponse) isMessage_Sum() {} - -func (m *Message) GetSum() isMessage_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *Message) GetBlockRequest() *BlockRequest { - if x, ok := m.GetSum().(*Message_BlockRequest); ok { - return x.BlockRequest - } - return nil -} - -func (m *Message) GetNoBlockResponse() *NoBlockResponse { - if x, ok := m.GetSum().(*Message_NoBlockResponse); ok { - return x.NoBlockResponse - } - return nil -} - -func (m *Message) GetBlockResponse() *BlockResponse { - if x, ok := m.GetSum().(*Message_BlockResponse); ok { - return x.BlockResponse - } - return nil -} - -func (m *Message) GetStatusRequest() *StatusRequest { - if x, ok := m.GetSum().(*Message_StatusRequest); ok { - return x.StatusRequest - } - return nil -} - -func (m *Message) GetStatusResponse() *StatusResponse { - if x, ok := m.GetSum().(*Message_StatusResponse); ok { - return x.StatusResponse - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Message) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Message_BlockRequest)(nil), - (*Message_NoBlockResponse)(nil), - (*Message_BlockResponse)(nil), - (*Message_StatusRequest)(nil), - (*Message_StatusResponse)(nil), - } -} - -func init() { - proto.RegisterType((*BlockRequest)(nil), "tendermint.blockchain.BlockRequest") - proto.RegisterType((*NoBlockResponse)(nil), "tendermint.blockchain.NoBlockResponse") - proto.RegisterType((*BlockResponse)(nil), "tendermint.blockchain.BlockResponse") - proto.RegisterType((*StatusRequest)(nil), "tendermint.blockchain.StatusRequest") - proto.RegisterType((*StatusResponse)(nil), "tendermint.blockchain.StatusResponse") - proto.RegisterType((*Message)(nil), "tendermint.blockchain.Message") -} - -func init() { proto.RegisterFile("tendermint/blockchain/types.proto", fileDescriptor_2927480384e78499) } - -var fileDescriptor_2927480384e78499 = []byte{ - // 370 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0xc1, 0x4e, 0xfa, 0x40, - 0x10, 0xc6, 0xdb, 0x7f, 0x81, 0x7f, 0x32, 0x50, 0x1a, 0x9b, 0xa8, 0xc4, 0x98, 0x46, 0xab, 0x12, - 0x3d, 0xd8, 0x26, 0x78, 0x25, 0x1e, 0x38, 0x11, 0x13, 0x8c, 0xa9, 0xc6, 0x83, 0x17, 0xd2, 0xe2, - 0x86, 0x36, 0x4a, 0x17, 0xd9, 0xed, 0xc1, 0xb7, 0xf0, 0x19, 0x7c, 0x1a, 0x8f, 0x1c, 0x3d, 0x1a, - 0x78, 0x11, 0xc3, 0x6c, 0x29, 0x4b, 0x03, 0xf5, 0xb6, 0x3b, 0xfd, 0xe6, 0x37, 0xdf, 0x7e, 0x99, - 0xc2, 0x31, 0x27, 0xf1, 0x33, 0x99, 0x8c, 0xa2, 0x98, 0xbb, 0xc1, 0x2b, 0x1d, 0xbc, 0x0c, 0x42, - 0x3f, 0x8a, 0x5d, 0xfe, 0x3e, 0x26, 0xcc, 0x19, 0x4f, 0x28, 0xa7, 0xe6, 0xee, 0x4a, 0xe2, 0xac, - 0x24, 0x07, 0x87, 0x52, 0x27, 0xca, 0x45, 0xbf, 0x68, 0xb2, 0x9b, 0x50, 0xeb, 0x2c, 0xae, 0x1e, - 0x79, 0x4b, 0x08, 0xe3, 0xe6, 0x1e, 0x54, 0x42, 0x12, 0x0d, 0x43, 0xde, 0x50, 0x8f, 0xd4, 0x73, - 0xcd, 0x4b, 0x6f, 0xf6, 0x05, 0x18, 0xb7, 0x34, 0x55, 0xb2, 0x31, 0x8d, 0x19, 0xd9, 0x2a, 0xbd, - 0x06, 0x7d, 0x5d, 0x78, 0x09, 0x65, 0x1c, 0x89, 0xba, 0x6a, 0x6b, 0xdf, 0x91, 0x8c, 0x8a, 0x07, - 0x08, 0xbd, 0x50, 0xd9, 0x06, 0xe8, 0xf7, 0xdc, 0xe7, 0x09, 0x4b, 0x3d, 0xd9, 0x6d, 0xa8, 0x2f, - 0x0b, 0xc5, 0xa3, 0x4d, 0x13, 0x4a, 0x81, 0xcf, 0x48, 0xe3, 0x1f, 0x56, 0xf1, 0x6c, 0x7f, 0x6a, - 0xf0, 0xbf, 0x47, 0x18, 0xf3, 0x87, 0xc4, 0xbc, 0x01, 0x1d, 0x67, 0xf4, 0x27, 0x02, 0x9d, 0x3a, - 0x3a, 0x71, 0x36, 0x46, 0xe7, 0xc8, 0xc9, 0x74, 0x15, 0xaf, 0x16, 0xc8, 0x49, 0x3d, 0xc0, 0x4e, - 0x4c, 0xfb, 0x4b, 0x9c, 0x30, 0x86, 0x83, 0xab, 0xad, 0xe6, 0x16, 0x5e, 0x2e, 0xc1, 0xae, 0xe2, - 0x19, 0x71, 0x2e, 0xd4, 0x1e, 0xd4, 0x73, 0x48, 0x0d, 0x91, 0xa7, 0xc5, 0x16, 0x33, 0xa0, 0x1e, - 0xe4, 0x71, 0x0c, 0xa3, 0xcb, 0x5e, 0x5c, 0x2a, 0xc4, 0xad, 0x05, 0xbf, 0xc0, 0x31, 0xb9, 0x60, - 0xde, 0x81, 0x91, 0xe1, 0x52, 0x7b, 0x65, 0xe4, 0x9d, 0xfd, 0xc1, 0xcb, 0xfc, 0xd5, 0xd9, 0x5a, - 0xa5, 0x53, 0x06, 0x8d, 0x25, 0xa3, 0xce, 0xe3, 0xd7, 0xcc, 0x52, 0xa7, 0x33, 0x4b, 0xfd, 0x99, - 0x59, 0xea, 0xc7, 0xdc, 0x52, 0xa6, 0x73, 0x4b, 0xf9, 0x9e, 0x5b, 0xca, 0x53, 0x7b, 0x18, 0xf1, - 0x30, 0x09, 0x9c, 0x01, 0x1d, 0xb9, 0xf2, 0x26, 0xaf, 0x8e, 0xb8, 0xc8, 0xee, 0xc6, 0xff, 0x23, - 0xa8, 0xe0, 0xc7, 0xab, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x59, 0x07, 0xbd, 0x3f, 0x03, - 0x00, 0x00, -} - -func (m *BlockRequest) 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 *BlockRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BlockRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *NoBlockResponse) 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 *NoBlockResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NoBlockResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *BlockResponse) 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 *BlockResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BlockResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Block != nil { - { - size, err := m.Block.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *StatusRequest) 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 *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *StatusResponse) 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 *StatusResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Base != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Base)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Message) 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 *Message) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *Message_BlockRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_BlockRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.BlockRequest != nil { - { - size, err := m.BlockRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Message_NoBlockResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_NoBlockResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.NoBlockResponse != nil { - { - size, err := m.NoBlockResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} - -func (m *Message_BlockResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_BlockResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.BlockResponse != nil { - { - size, err := m.BlockResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} - -func (m *Message_StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.StatusRequest != nil { - { - size, err := m.StatusRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} - -func (m *Message_StatusResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_StatusResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.StatusResponse != nil { - { - size, err := m.StatusResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *BlockRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - return n -} - -func (m *NoBlockResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - return n -} - -func (m *BlockResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Block != nil { - l = m.Block.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *StatusRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *StatusResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Base != 0 { - n += 1 + sovTypes(uint64(m.Base)) - } - return n -} - -func (m *Message) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *Message_BlockRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.BlockRequest != nil { - l = m.BlockRequest.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_NoBlockResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.NoBlockResponse != nil { - l = m.NoBlockResponse.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_BlockResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.BlockResponse != nil { - l = m.BlockResponse.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_StatusRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.StatusRequest != nil { - l = m.StatusRequest.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_StatusResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.StatusResponse != nil { - l = m.StatusResponse.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *BlockRequest) 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 ErrIntOverflowTypes - } - 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: BlockRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BlockRequest: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *NoBlockResponse) 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 ErrIntOverflowTypes - } - 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: NoBlockResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NoBlockResponse: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *BlockResponse) 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 ErrIntOverflowTypes - } - 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: BlockResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BlockResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Block", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Block == nil { - m.Block = &types.Block{} - } - if err := m.Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *StatusRequest) 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 ErrIntOverflowTypes - } - 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: StatusRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *StatusResponse) 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 ErrIntOverflowTypes - } - 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: StatusResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusResponse: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Base", wireType) - } - m.Base = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Base |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Message) 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 ErrIntOverflowTypes - } - 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: Message: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Message: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &BlockRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_BlockRequest{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NoBlockResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &NoBlockResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_NoBlockResponse{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &BlockResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_BlockResponse{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StatusRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &StatusRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_StatusRequest{v} - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StatusResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &StatusResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_StatusResponse{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/blockchain/types.proto b/third_party/proto/tendermint/blockchain/types.proto deleted file mode 100644 index f5c143cf5b..0000000000 --- a/third_party/proto/tendermint/blockchain/types.proto +++ /dev/null @@ -1,41 +0,0 @@ -syntax = "proto3"; -package tendermint.blockchain; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/blockchain"; - -import "tendermint/types/block.proto"; - -// BlockRequest requests a block for a specific height -message BlockRequest { - int64 height = 1; -} - -// NoBlockResponse informs the node that the peer does not have block at the requested height -message NoBlockResponse { - int64 height = 1; -} - -// BlockResponse returns block to the requested -message BlockResponse { - tendermint.types.Block block = 1; -} - -// StatusRequest requests the status of a peer. -message StatusRequest { -} - -// StatusResponse is a peer response to inform their status. -message StatusResponse { - int64 height = 1; - int64 base = 2; -} - -message Message { - oneof sum { - BlockRequest block_request = 1; - NoBlockResponse no_block_response = 2; - BlockResponse block_response = 3; - StatusRequest status_request = 4; - StatusResponse status_response = 5; - } -} diff --git a/third_party/proto/tendermint/consensus/types.pb.go b/third_party/proto/tendermint/consensus/types.pb.go deleted file mode 100644 index c6c96e0433..0000000000 --- a/third_party/proto/tendermint/consensus/types.pb.go +++ /dev/null @@ -1,3509 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/consensus/types.proto - -package consensus - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - bits "github.com/tendermint/tendermint/proto/tendermint/libs/bits" - types "github.com/tendermint/tendermint/proto/tendermint/types" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 - -// NewRoundStep is sent for every step taken in the ConsensusState. -// For every height/round/step transition -type NewRoundStep struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,2,opt,name=round,proto3" json:"round,omitempty"` - Step uint32 `protobuf:"varint,3,opt,name=step,proto3" json:"step,omitempty"` - SecondsSinceStartTime int64 `protobuf:"varint,4,opt,name=seconds_since_start_time,json=secondsSinceStartTime,proto3" json:"seconds_since_start_time,omitempty"` - LastCommitRound int32 `protobuf:"varint,5,opt,name=last_commit_round,json=lastCommitRound,proto3" json:"last_commit_round,omitempty"` -} - -func (m *NewRoundStep) Reset() { *m = NewRoundStep{} } -func (m *NewRoundStep) String() string { return proto.CompactTextString(m) } -func (*NewRoundStep) ProtoMessage() {} -func (*NewRoundStep) Descriptor() ([]byte, []int) { - return fileDescriptor_81a22d2efc008981, []int{0} -} - -func (m *NewRoundStep) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *NewRoundStep) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewRoundStep.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 *NewRoundStep) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewRoundStep.Merge(m, src) -} - -func (m *NewRoundStep) XXX_Size() int { - return m.Size() -} - -func (m *NewRoundStep) XXX_DiscardUnknown() { - xxx_messageInfo_NewRoundStep.DiscardUnknown(m) -} - -var xxx_messageInfo_NewRoundStep proto.InternalMessageInfo - -func (m *NewRoundStep) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *NewRoundStep) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *NewRoundStep) GetStep() uint32 { - if m != nil { - return m.Step - } - return 0 -} - -func (m *NewRoundStep) GetSecondsSinceStartTime() int64 { - if m != nil { - return m.SecondsSinceStartTime - } - return 0 -} - -func (m *NewRoundStep) GetLastCommitRound() int32 { - if m != nil { - return m.LastCommitRound - } - return 0 -} - -// NewValidBlock is sent when a validator observes a valid block B in some round r, -// i.e., there is a Proposal for block B and 2/3+ prevotes for the block B in the round r. -// In case the block is also committed, then IsCommit flag is set to true. -type NewValidBlock struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,2,opt,name=round,proto3" json:"round,omitempty"` - BlockPartSetHeader types.PartSetHeader `protobuf:"bytes,3,opt,name=block_part_set_header,json=blockPartSetHeader,proto3" json:"block_part_set_header"` - BlockParts *bits.BitArray `protobuf:"bytes,4,opt,name=block_parts,json=blockParts,proto3" json:"block_parts,omitempty"` - IsCommit bool `protobuf:"varint,5,opt,name=is_commit,json=isCommit,proto3" json:"is_commit,omitempty"` -} - -func (m *NewValidBlock) Reset() { *m = NewValidBlock{} } -func (m *NewValidBlock) String() string { return proto.CompactTextString(m) } -func (*NewValidBlock) ProtoMessage() {} -func (*NewValidBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_81a22d2efc008981, []int{1} -} - -func (m *NewValidBlock) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *NewValidBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewValidBlock.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 *NewValidBlock) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewValidBlock.Merge(m, src) -} - -func (m *NewValidBlock) XXX_Size() int { - return m.Size() -} - -func (m *NewValidBlock) XXX_DiscardUnknown() { - xxx_messageInfo_NewValidBlock.DiscardUnknown(m) -} - -var xxx_messageInfo_NewValidBlock proto.InternalMessageInfo - -func (m *NewValidBlock) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *NewValidBlock) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *NewValidBlock) GetBlockPartSetHeader() types.PartSetHeader { - if m != nil { - return m.BlockPartSetHeader - } - return types.PartSetHeader{} -} - -func (m *NewValidBlock) GetBlockParts() *bits.BitArray { - if m != nil { - return m.BlockParts - } - return nil -} - -func (m *NewValidBlock) GetIsCommit() bool { - if m != nil { - return m.IsCommit - } - return false -} - -// Proposal is sent when a new block is proposed. -type Proposal struct { - Proposal types.Proposal `protobuf:"bytes,1,opt,name=proposal,proto3" json:"proposal"` -} - -func (m *Proposal) Reset() { *m = Proposal{} } -func (m *Proposal) String() string { return proto.CompactTextString(m) } -func (*Proposal) ProtoMessage() {} -func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_81a22d2efc008981, []int{2} -} - -func (m *Proposal) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Proposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Proposal.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 *Proposal) XXX_Merge(src proto.Message) { - xxx_messageInfo_Proposal.Merge(m, src) -} - -func (m *Proposal) XXX_Size() int { - return m.Size() -} - -func (m *Proposal) XXX_DiscardUnknown() { - xxx_messageInfo_Proposal.DiscardUnknown(m) -} - -var xxx_messageInfo_Proposal proto.InternalMessageInfo - -func (m *Proposal) GetProposal() types.Proposal { - if m != nil { - return m.Proposal - } - return types.Proposal{} -} - -// ProposalPOL is sent when a previous proposal is re-proposed. -type ProposalPOL struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - ProposalPolRound int32 `protobuf:"varint,2,opt,name=proposal_pol_round,json=proposalPolRound,proto3" json:"proposal_pol_round,omitempty"` - ProposalPol bits.BitArray `protobuf:"bytes,3,opt,name=proposal_pol,json=proposalPol,proto3" json:"proposal_pol"` -} - -func (m *ProposalPOL) Reset() { *m = ProposalPOL{} } -func (m *ProposalPOL) String() string { return proto.CompactTextString(m) } -func (*ProposalPOL) ProtoMessage() {} -func (*ProposalPOL) Descriptor() ([]byte, []int) { - return fileDescriptor_81a22d2efc008981, []int{3} -} - -func (m *ProposalPOL) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ProposalPOL) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ProposalPOL.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 *ProposalPOL) XXX_Merge(src proto.Message) { - xxx_messageInfo_ProposalPOL.Merge(m, src) -} - -func (m *ProposalPOL) XXX_Size() int { - return m.Size() -} - -func (m *ProposalPOL) XXX_DiscardUnknown() { - xxx_messageInfo_ProposalPOL.DiscardUnknown(m) -} - -var xxx_messageInfo_ProposalPOL proto.InternalMessageInfo - -func (m *ProposalPOL) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *ProposalPOL) GetProposalPolRound() int32 { - if m != nil { - return m.ProposalPolRound - } - return 0 -} - -func (m *ProposalPOL) GetProposalPol() bits.BitArray { - if m != nil { - return m.ProposalPol - } - return bits.BitArray{} -} - -// BlockPart is sent when gossipping a piece of the proposed block. -type BlockPart struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,2,opt,name=round,proto3" json:"round,omitempty"` - Part types.Part `protobuf:"bytes,3,opt,name=part,proto3" json:"part"` -} - -func (m *BlockPart) Reset() { *m = BlockPart{} } -func (m *BlockPart) String() string { return proto.CompactTextString(m) } -func (*BlockPart) ProtoMessage() {} -func (*BlockPart) Descriptor() ([]byte, []int) { - return fileDescriptor_81a22d2efc008981, []int{4} -} - -func (m *BlockPart) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *BlockPart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BlockPart.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 *BlockPart) XXX_Merge(src proto.Message) { - xxx_messageInfo_BlockPart.Merge(m, src) -} - -func (m *BlockPart) XXX_Size() int { - return m.Size() -} - -func (m *BlockPart) XXX_DiscardUnknown() { - xxx_messageInfo_BlockPart.DiscardUnknown(m) -} - -var xxx_messageInfo_BlockPart proto.InternalMessageInfo - -func (m *BlockPart) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *BlockPart) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *BlockPart) GetPart() types.Part { - if m != nil { - return m.Part - } - return types.Part{} -} - -// Vote is sent when voting for a proposal (or lack thereof). -type Vote struct { - Vote *types.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` -} - -func (m *Vote) Reset() { *m = Vote{} } -func (m *Vote) String() string { return proto.CompactTextString(m) } -func (*Vote) ProtoMessage() {} -func (*Vote) Descriptor() ([]byte, []int) { - return fileDescriptor_81a22d2efc008981, []int{5} -} - -func (m *Vote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Vote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Vote.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 *Vote) XXX_Merge(src proto.Message) { - xxx_messageInfo_Vote.Merge(m, src) -} - -func (m *Vote) XXX_Size() int { - return m.Size() -} - -func (m *Vote) XXX_DiscardUnknown() { - xxx_messageInfo_Vote.DiscardUnknown(m) -} - -var xxx_messageInfo_Vote proto.InternalMessageInfo - -func (m *Vote) GetVote() *types.Vote { - if m != nil { - return m.Vote - } - return nil -} - -// HasVote is sent to indicate that a particular vote has been received. -type HasVote struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,2,opt,name=round,proto3" json:"round,omitempty"` - Type types.SignedMsgType `protobuf:"varint,3,opt,name=type,proto3,enum=tendermint.types.SignedMsgType" json:"type,omitempty"` - Index int32 `protobuf:"varint,4,opt,name=index,proto3" json:"index,omitempty"` -} - -func (m *HasVote) Reset() { *m = HasVote{} } -func (m *HasVote) String() string { return proto.CompactTextString(m) } -func (*HasVote) ProtoMessage() {} -func (*HasVote) Descriptor() ([]byte, []int) { - return fileDescriptor_81a22d2efc008981, []int{6} -} - -func (m *HasVote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *HasVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_HasVote.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 *HasVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_HasVote.Merge(m, src) -} - -func (m *HasVote) XXX_Size() int { - return m.Size() -} - -func (m *HasVote) XXX_DiscardUnknown() { - xxx_messageInfo_HasVote.DiscardUnknown(m) -} - -var xxx_messageInfo_HasVote proto.InternalMessageInfo - -func (m *HasVote) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *HasVote) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *HasVote) GetType() types.SignedMsgType { - if m != nil { - return m.Type - } - return types.UnknownType -} - -func (m *HasVote) GetIndex() int32 { - if m != nil { - return m.Index - } - return 0 -} - -// VoteSetMaj23 is sent to indicate that a given BlockID has seen +2/3 votes. -type VoteSetMaj23 struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,2,opt,name=round,proto3" json:"round,omitempty"` - Type types.SignedMsgType `protobuf:"varint,3,opt,name=type,proto3,enum=tendermint.types.SignedMsgType" json:"type,omitempty"` - BlockID types.BlockID `protobuf:"bytes,4,opt,name=block_id,json=blockId,proto3" json:"block_id"` -} - -func (m *VoteSetMaj23) Reset() { *m = VoteSetMaj23{} } -func (m *VoteSetMaj23) String() string { return proto.CompactTextString(m) } -func (*VoteSetMaj23) ProtoMessage() {} -func (*VoteSetMaj23) Descriptor() ([]byte, []int) { - return fileDescriptor_81a22d2efc008981, []int{7} -} - -func (m *VoteSetMaj23) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *VoteSetMaj23) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_VoteSetMaj23.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 *VoteSetMaj23) XXX_Merge(src proto.Message) { - xxx_messageInfo_VoteSetMaj23.Merge(m, src) -} - -func (m *VoteSetMaj23) XXX_Size() int { - return m.Size() -} - -func (m *VoteSetMaj23) XXX_DiscardUnknown() { - xxx_messageInfo_VoteSetMaj23.DiscardUnknown(m) -} - -var xxx_messageInfo_VoteSetMaj23 proto.InternalMessageInfo - -func (m *VoteSetMaj23) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *VoteSetMaj23) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *VoteSetMaj23) GetType() types.SignedMsgType { - if m != nil { - return m.Type - } - return types.UnknownType -} - -func (m *VoteSetMaj23) GetBlockID() types.BlockID { - if m != nil { - return m.BlockID - } - return types.BlockID{} -} - -// VoteSetBits is sent to communicate the bit-array of votes seen for the BlockID. -type VoteSetBits struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,2,opt,name=round,proto3" json:"round,omitempty"` - Type types.SignedMsgType `protobuf:"varint,3,opt,name=type,proto3,enum=tendermint.types.SignedMsgType" json:"type,omitempty"` - BlockID types.BlockID `protobuf:"bytes,4,opt,name=block_id,json=blockId,proto3" json:"block_id"` - Votes bits.BitArray `protobuf:"bytes,5,opt,name=votes,proto3" json:"votes"` -} - -func (m *VoteSetBits) Reset() { *m = VoteSetBits{} } -func (m *VoteSetBits) String() string { return proto.CompactTextString(m) } -func (*VoteSetBits) ProtoMessage() {} -func (*VoteSetBits) Descriptor() ([]byte, []int) { - return fileDescriptor_81a22d2efc008981, []int{8} -} - -func (m *VoteSetBits) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *VoteSetBits) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_VoteSetBits.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 *VoteSetBits) XXX_Merge(src proto.Message) { - xxx_messageInfo_VoteSetBits.Merge(m, src) -} - -func (m *VoteSetBits) XXX_Size() int { - return m.Size() -} - -func (m *VoteSetBits) XXX_DiscardUnknown() { - xxx_messageInfo_VoteSetBits.DiscardUnknown(m) -} - -var xxx_messageInfo_VoteSetBits proto.InternalMessageInfo - -func (m *VoteSetBits) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *VoteSetBits) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *VoteSetBits) GetType() types.SignedMsgType { - if m != nil { - return m.Type - } - return types.UnknownType -} - -func (m *VoteSetBits) GetBlockID() types.BlockID { - if m != nil { - return m.BlockID - } - return types.BlockID{} -} - -func (m *VoteSetBits) GetVotes() bits.BitArray { - if m != nil { - return m.Votes - } - return bits.BitArray{} -} - -type Message struct { - // Types that are valid to be assigned to Sum: - // *Message_NewRoundStep - // *Message_NewValidBlock - // *Message_Proposal - // *Message_ProposalPol - // *Message_BlockPart - // *Message_Vote - // *Message_HasVote - // *Message_VoteSetMaj23 - // *Message_VoteSetBits - Sum isMessage_Sum `protobuf_oneof:"sum"` -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} -func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_81a22d2efc008981, []int{9} -} - -func (m *Message) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Message.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 *Message) XXX_Merge(src proto.Message) { - xxx_messageInfo_Message.Merge(m, src) -} - -func (m *Message) XXX_Size() int { - return m.Size() -} - -func (m *Message) XXX_DiscardUnknown() { - xxx_messageInfo_Message.DiscardUnknown(m) -} - -var xxx_messageInfo_Message proto.InternalMessageInfo - -type isMessage_Sum interface { - isMessage_Sum() - MarshalTo([]byte) (int, error) - Size() int -} - -type Message_NewRoundStep struct { - NewRoundStep *NewRoundStep `protobuf:"bytes,1,opt,name=new_round_step,json=newRoundStep,proto3,oneof" json:"new_round_step,omitempty"` -} -type Message_NewValidBlock struct { - NewValidBlock *NewValidBlock `protobuf:"bytes,2,opt,name=new_valid_block,json=newValidBlock,proto3,oneof" json:"new_valid_block,omitempty"` -} -type Message_Proposal struct { - Proposal *Proposal `protobuf:"bytes,3,opt,name=proposal,proto3,oneof" json:"proposal,omitempty"` -} -type Message_ProposalPol struct { - ProposalPol *ProposalPOL `protobuf:"bytes,4,opt,name=proposal_pol,json=proposalPol,proto3,oneof" json:"proposal_pol,omitempty"` -} -type Message_BlockPart struct { - BlockPart *BlockPart `protobuf:"bytes,5,opt,name=block_part,json=blockPart,proto3,oneof" json:"block_part,omitempty"` -} -type Message_Vote struct { - Vote *Vote `protobuf:"bytes,6,opt,name=vote,proto3,oneof" json:"vote,omitempty"` -} -type Message_HasVote struct { - HasVote *HasVote `protobuf:"bytes,7,opt,name=has_vote,json=hasVote,proto3,oneof" json:"has_vote,omitempty"` -} -type Message_VoteSetMaj23 struct { - VoteSetMaj23 *VoteSetMaj23 `protobuf:"bytes,8,opt,name=vote_set_maj23,json=voteSetMaj23,proto3,oneof" json:"vote_set_maj23,omitempty"` -} -type Message_VoteSetBits struct { - VoteSetBits *VoteSetBits `protobuf:"bytes,9,opt,name=vote_set_bits,json=voteSetBits,proto3,oneof" json:"vote_set_bits,omitempty"` -} - -func (*Message_NewRoundStep) isMessage_Sum() {} -func (*Message_NewValidBlock) isMessage_Sum() {} -func (*Message_Proposal) isMessage_Sum() {} -func (*Message_ProposalPol) isMessage_Sum() {} -func (*Message_BlockPart) isMessage_Sum() {} -func (*Message_Vote) isMessage_Sum() {} -func (*Message_HasVote) isMessage_Sum() {} -func (*Message_VoteSetMaj23) isMessage_Sum() {} -func (*Message_VoteSetBits) isMessage_Sum() {} - -func (m *Message) GetSum() isMessage_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *Message) GetNewRoundStep() *NewRoundStep { - if x, ok := m.GetSum().(*Message_NewRoundStep); ok { - return x.NewRoundStep - } - return nil -} - -func (m *Message) GetNewValidBlock() *NewValidBlock { - if x, ok := m.GetSum().(*Message_NewValidBlock); ok { - return x.NewValidBlock - } - return nil -} - -func (m *Message) GetProposal() *Proposal { - if x, ok := m.GetSum().(*Message_Proposal); ok { - return x.Proposal - } - return nil -} - -func (m *Message) GetProposalPol() *ProposalPOL { - if x, ok := m.GetSum().(*Message_ProposalPol); ok { - return x.ProposalPol - } - return nil -} - -func (m *Message) GetBlockPart() *BlockPart { - if x, ok := m.GetSum().(*Message_BlockPart); ok { - return x.BlockPart - } - return nil -} - -func (m *Message) GetVote() *Vote { - if x, ok := m.GetSum().(*Message_Vote); ok { - return x.Vote - } - return nil -} - -func (m *Message) GetHasVote() *HasVote { - if x, ok := m.GetSum().(*Message_HasVote); ok { - return x.HasVote - } - return nil -} - -func (m *Message) GetVoteSetMaj23() *VoteSetMaj23 { - if x, ok := m.GetSum().(*Message_VoteSetMaj23); ok { - return x.VoteSetMaj23 - } - return nil -} - -func (m *Message) GetVoteSetBits() *VoteSetBits { - if x, ok := m.GetSum().(*Message_VoteSetBits); ok { - return x.VoteSetBits - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Message) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Message_NewRoundStep)(nil), - (*Message_NewValidBlock)(nil), - (*Message_Proposal)(nil), - (*Message_ProposalPol)(nil), - (*Message_BlockPart)(nil), - (*Message_Vote)(nil), - (*Message_HasVote)(nil), - (*Message_VoteSetMaj23)(nil), - (*Message_VoteSetBits)(nil), - } -} - -func init() { - proto.RegisterType((*NewRoundStep)(nil), "tendermint.consensus.NewRoundStep") - proto.RegisterType((*NewValidBlock)(nil), "tendermint.consensus.NewValidBlock") - proto.RegisterType((*Proposal)(nil), "tendermint.consensus.Proposal") - proto.RegisterType((*ProposalPOL)(nil), "tendermint.consensus.ProposalPOL") - proto.RegisterType((*BlockPart)(nil), "tendermint.consensus.BlockPart") - proto.RegisterType((*Vote)(nil), "tendermint.consensus.Vote") - proto.RegisterType((*HasVote)(nil), "tendermint.consensus.HasVote") - proto.RegisterType((*VoteSetMaj23)(nil), "tendermint.consensus.VoteSetMaj23") - proto.RegisterType((*VoteSetBits)(nil), "tendermint.consensus.VoteSetBits") - proto.RegisterType((*Message)(nil), "tendermint.consensus.Message") -} - -func init() { proto.RegisterFile("tendermint/consensus/types.proto", fileDescriptor_81a22d2efc008981) } - -var fileDescriptor_81a22d2efc008981 = []byte{ - // 853 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4f, 0x8f, 0xdb, 0x44, - 0x14, 0xb7, 0x59, 0x67, 0x93, 0x7d, 0xde, 0xec, 0xc2, 0x68, 0x5b, 0x85, 0x00, 0x49, 0x30, 0x97, - 0x15, 0x42, 0x0e, 0xca, 0x1e, 0x90, 0x0a, 0x12, 0x60, 0xfe, 0xd4, 0xad, 0x9a, 0x36, 0x72, 0x4a, - 0x85, 0xb8, 0x58, 0x4e, 0x3c, 0x4a, 0x86, 0xc6, 0x1e, 0xcb, 0x33, 0xc9, 0xb2, 0x57, 0x3e, 0x01, - 0x1f, 0x80, 0xaf, 0x81, 0xc4, 0x47, 0xe8, 0xb1, 0x47, 0x4e, 0x15, 0xca, 0x7e, 0x04, 0x04, 0x67, - 0x34, 0xe3, 0x49, 0x3c, 0xa1, 0xde, 0x85, 0xbd, 0x20, 0xf5, 0x36, 0xe3, 0xf7, 0xde, 0x6f, 0xde, - 0xfc, 0xde, 0x7b, 0x3f, 0x0f, 0xf4, 0x38, 0x4e, 0x63, 0x9c, 0x27, 0x24, 0xe5, 0xfd, 0x29, 0x4d, - 0x19, 0x4e, 0xd9, 0x92, 0xf5, 0xf9, 0x45, 0x86, 0x99, 0x9b, 0xe5, 0x94, 0x53, 0x74, 0x52, 0x7a, - 0xb8, 0x5b, 0x8f, 0xf6, 0xc9, 0x8c, 0xce, 0xa8, 0x74, 0xe8, 0x8b, 0x55, 0xe1, 0xdb, 0x7e, 0x5b, - 0x43, 0x93, 0x18, 0x3a, 0x52, 0x5b, 0x3f, 0x6b, 0x41, 0x26, 0xac, 0x3f, 0x21, 0x7c, 0xc7, 0xc3, - 0xf9, 0xc5, 0x84, 0xc3, 0x87, 0xf8, 0x3c, 0xa0, 0xcb, 0x34, 0x1e, 0x73, 0x9c, 0xa1, 0xdb, 0xb0, - 0x3f, 0xc7, 0x64, 0x36, 0xe7, 0x2d, 0xb3, 0x67, 0x9e, 0xee, 0x05, 0x6a, 0x87, 0x4e, 0xa0, 0x96, - 0x0b, 0xa7, 0xd6, 0x6b, 0x3d, 0xf3, 0xb4, 0x16, 0x14, 0x1b, 0x84, 0xc0, 0x62, 0x1c, 0x67, 0xad, - 0xbd, 0x9e, 0x79, 0xda, 0x0c, 0xe4, 0x1a, 0x7d, 0x04, 0x2d, 0x86, 0xa7, 0x34, 0x8d, 0x59, 0xc8, - 0x48, 0x3a, 0xc5, 0x21, 0xe3, 0x51, 0xce, 0x43, 0x4e, 0x12, 0xdc, 0xb2, 0x24, 0xe6, 0x2d, 0x65, - 0x1f, 0x0b, 0xf3, 0x58, 0x58, 0x1f, 0x93, 0x04, 0xa3, 0xf7, 0xe1, 0x8d, 0x45, 0xc4, 0x78, 0x38, - 0xa5, 0x49, 0x42, 0x78, 0x58, 0x1c, 0x57, 0x93, 0xc7, 0x1d, 0x0b, 0xc3, 0x17, 0xf2, 0xbb, 0x4c, - 0xd5, 0xf9, 0xd3, 0x84, 0xe6, 0x43, 0x7c, 0xfe, 0x24, 0x5a, 0x90, 0xd8, 0x5b, 0xd0, 0xe9, 0xd3, - 0x1b, 0x26, 0xfe, 0x2d, 0xdc, 0x9a, 0x88, 0xb0, 0x30, 0x13, 0xb9, 0x31, 0xcc, 0xc3, 0x39, 0x8e, - 0x62, 0x9c, 0xcb, 0x9b, 0xd8, 0x83, 0xae, 0xab, 0xd5, 0xa0, 0xe0, 0x6b, 0x14, 0xe5, 0x7c, 0x8c, - 0xb9, 0x2f, 0xdd, 0x3c, 0xeb, 0xd9, 0x8b, 0xae, 0x11, 0x20, 0x89, 0xb1, 0x63, 0x41, 0x9f, 0x82, - 0x5d, 0x22, 0x33, 0x79, 0x63, 0x7b, 0xd0, 0xd1, 0xf1, 0x44, 0x25, 0x5c, 0x51, 0x09, 0xd7, 0x23, - 0xfc, 0xf3, 0x3c, 0x8f, 0x2e, 0x02, 0xd8, 0x02, 0x31, 0xf4, 0x16, 0x1c, 0x10, 0xa6, 0x48, 0x90, - 0xd7, 0x6f, 0x04, 0x0d, 0xc2, 0x8a, 0xcb, 0x3b, 0x3e, 0x34, 0x46, 0x39, 0xcd, 0x28, 0x8b, 0x16, - 0xe8, 0x13, 0x68, 0x64, 0x6a, 0x2d, 0xef, 0x6c, 0x0f, 0xda, 0x15, 0x69, 0x2b, 0x0f, 0x95, 0xf1, - 0x36, 0xc2, 0xf9, 0xd9, 0x04, 0x7b, 0x63, 0x1c, 0x3d, 0x7a, 0x70, 0x25, 0x7f, 0x1f, 0x00, 0xda, - 0xc4, 0x84, 0x19, 0x5d, 0x84, 0x3a, 0x99, 0xaf, 0x6f, 0x2c, 0x23, 0xba, 0x90, 0x75, 0x41, 0x77, - 0xe1, 0x50, 0xf7, 0x56, 0x74, 0xfe, 0xcb, 0xf5, 0x55, 0x6e, 0xb6, 0x86, 0xe6, 0x3c, 0x85, 0x03, - 0x6f, 0xc3, 0xc9, 0x0d, 0x6b, 0xfb, 0x21, 0x58, 0x82, 0x7b, 0x75, 0xf6, 0xed, 0xea, 0x52, 0xaa, - 0x33, 0xa5, 0xa7, 0x33, 0x00, 0xeb, 0x09, 0xe5, 0xa2, 0x03, 0xad, 0x15, 0xe5, 0x58, 0xb1, 0x59, - 0x11, 0x29, 0xbc, 0x02, 0xe9, 0xe3, 0xfc, 0x68, 0x42, 0xdd, 0x8f, 0x98, 0x8c, 0xbb, 0x59, 0x7e, - 0x67, 0x60, 0x09, 0x34, 0x99, 0xdf, 0x51, 0x55, 0xab, 0x8d, 0xc9, 0x2c, 0xc5, 0xf1, 0x90, 0xcd, - 0x1e, 0x5f, 0x64, 0x38, 0x90, 0xce, 0x02, 0x8a, 0xa4, 0x31, 0xfe, 0x41, 0x36, 0x54, 0x2d, 0x28, - 0x36, 0xce, 0xaf, 0x26, 0x1c, 0x8a, 0x0c, 0xc6, 0x98, 0x0f, 0xa3, 0xef, 0x07, 0x67, 0xff, 0x47, - 0x26, 0x5f, 0x41, 0xa3, 0x68, 0x70, 0x12, 0xab, 0xee, 0x7e, 0xf3, 0xe5, 0x40, 0x59, 0xbb, 0x7b, - 0x5f, 0x7a, 0xc7, 0x82, 0xe5, 0xf5, 0x8b, 0x6e, 0x5d, 0x7d, 0x08, 0xea, 0x32, 0xf6, 0x5e, 0xec, - 0xfc, 0x61, 0x82, 0xad, 0x52, 0xf7, 0x08, 0x67, 0xaf, 0x4e, 0xe6, 0xe8, 0x0e, 0xd4, 0x44, 0x07, - 0x30, 0x39, 0x9c, 0xff, 0xb5, 0xb9, 0x8b, 0x10, 0xe7, 0x2f, 0x0b, 0xea, 0x43, 0xcc, 0x58, 0x34, - 0xc3, 0xe8, 0x3e, 0x1c, 0xa5, 0xf8, 0xbc, 0x18, 0xa8, 0x50, 0xca, 0x68, 0xd1, 0x77, 0x8e, 0x5b, - 0xf5, 0x03, 0x70, 0x75, 0x99, 0xf6, 0x8d, 0xe0, 0x30, 0xd5, 0x65, 0x7b, 0x08, 0xc7, 0x02, 0x6b, - 0x25, 0xf4, 0x30, 0x94, 0x89, 0x4a, 0xbe, 0xec, 0xc1, 0x7b, 0x57, 0x82, 0x95, 0xda, 0xe9, 0x1b, - 0x41, 0x33, 0xdd, 0x11, 0x53, 0x5d, 0x5a, 0x2a, 0x46, 0xb8, 0xc4, 0xd9, 0x28, 0x88, 0xaf, 0x49, - 0x0b, 0xfa, 0xfa, 0x1f, 0x22, 0x50, 0x70, 0xfd, 0xee, 0xf5, 0x08, 0xa3, 0x47, 0x0f, 0xfc, 0x5d, - 0x0d, 0x40, 0x9f, 0x01, 0x94, 0x52, 0xaa, 0xd8, 0xee, 0x56, 0xa3, 0x6c, 0xb5, 0xc2, 0x37, 0x82, - 0x83, 0xad, 0x98, 0x0a, 0x29, 0x90, 0x03, 0xbd, 0xff, 0xb2, 0x3c, 0x96, 0xb1, 0xa2, 0x0b, 0x7d, - 0xa3, 0x18, 0x6b, 0x74, 0x07, 0x1a, 0xf3, 0x88, 0x85, 0x32, 0xaa, 0x2e, 0xa3, 0xde, 0xa9, 0x8e, - 0x52, 0xb3, 0xef, 0x1b, 0x41, 0x7d, 0xae, 0x64, 0xe0, 0x3e, 0x1c, 0x89, 0x38, 0xf9, 0x3b, 0x49, - 0xc4, 0x38, 0xb6, 0x1a, 0xd7, 0x15, 0x54, 0x1f, 0x5c, 0x51, 0xd0, 0x95, 0x3e, 0xc8, 0x77, 0xa1, - 0xb9, 0xc5, 0x12, 0xfd, 0xd4, 0x3a, 0xb8, 0x8e, 0x44, 0x6d, 0x90, 0x04, 0x89, 0xab, 0x72, 0xeb, - 0xd5, 0x60, 0x8f, 0x2d, 0x13, 0xef, 0x9b, 0x67, 0xeb, 0x8e, 0xf9, 0x7c, 0xdd, 0x31, 0x7f, 0x5f, - 0x77, 0xcc, 0x9f, 0x2e, 0x3b, 0xc6, 0xf3, 0xcb, 0x8e, 0xf1, 0xdb, 0x65, 0xc7, 0xf8, 0xee, 0xe3, - 0x19, 0xe1, 0xf3, 0xe5, 0xc4, 0x9d, 0xd2, 0xa4, 0xaf, 0xbf, 0x26, 0xca, 0x65, 0xf1, 0xea, 0xa8, - 0x7a, 0xb7, 0x4c, 0xf6, 0xa5, 0xed, 0xec, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc7, 0x5c, 0x91, - 0x04, 0xd6, 0x08, 0x00, 0x00, -} - -func (m *NewRoundStep) 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 *NewRoundStep) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewRoundStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.LastCommitRound != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.LastCommitRound)) - i-- - dAtA[i] = 0x28 - } - if m.SecondsSinceStartTime != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.SecondsSinceStartTime)) - i-- - dAtA[i] = 0x20 - } - if m.Step != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Step)) - i-- - dAtA[i] = 0x18 - } - if m.Round != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *NewValidBlock) 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 *NewValidBlock) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewValidBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.IsCommit { - i-- - if m.IsCommit { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } - if m.BlockParts != nil { - { - size, err := m.BlockParts.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - { - size, err := m.BlockPartSetHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if m.Round != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Proposal) 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 *Proposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Proposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Proposal.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ProposalPOL) 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 *ProposalPOL) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ProposalPOL) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.ProposalPol.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if m.ProposalPolRound != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.ProposalPolRound)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *BlockPart) 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 *BlockPart) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BlockPart) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Part.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if m.Round != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Vote) 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 *Vote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Vote != nil { - { - size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *HasVote) 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 *HasVote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *HasVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Index != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x20 - } - if m.Type != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x18 - } - if m.Round != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *VoteSetMaj23) 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 *VoteSetMaj23) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *VoteSetMaj23) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.BlockID.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - if m.Type != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x18 - } - if m.Round != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *VoteSetBits) 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 *VoteSetBits) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *VoteSetBits) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Votes.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size, err := m.BlockID.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - if m.Type != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x18 - } - if m.Round != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Message) 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 *Message) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *Message_NewRoundStep) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_NewRoundStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.NewRoundStep != nil { - { - size, err := m.NewRoundStep.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Message_NewValidBlock) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_NewValidBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.NewValidBlock != nil { - { - size, err := m.NewValidBlock.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} - -func (m *Message_Proposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_Proposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Proposal != nil { - { - size, err := m.Proposal.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} - -func (m *Message_ProposalPol) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_ProposalPol) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ProposalPol != nil { - { - size, err := m.ProposalPol.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} - -func (m *Message_BlockPart) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_BlockPart) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.BlockPart != nil { - { - size, err := m.BlockPart.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - return len(dAtA) - i, nil -} - -func (m *Message_Vote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Vote != nil { - { - size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - return len(dAtA) - i, nil -} - -func (m *Message_HasVote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_HasVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.HasVote != nil { - { - size, err := m.HasVote.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - return len(dAtA) - i, nil -} - -func (m *Message_VoteSetMaj23) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_VoteSetMaj23) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.VoteSetMaj23 != nil { - { - size, err := m.VoteSetMaj23.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - return len(dAtA) - i, nil -} - -func (m *Message_VoteSetBits) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_VoteSetBits) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.VoteSetBits != nil { - { - size, err := m.VoteSetBits.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *NewRoundStep) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovTypes(uint64(m.Round)) - } - if m.Step != 0 { - n += 1 + sovTypes(uint64(m.Step)) - } - if m.SecondsSinceStartTime != 0 { - n += 1 + sovTypes(uint64(m.SecondsSinceStartTime)) - } - if m.LastCommitRound != 0 { - n += 1 + sovTypes(uint64(m.LastCommitRound)) - } - return n -} - -func (m *NewValidBlock) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovTypes(uint64(m.Round)) - } - l = m.BlockPartSetHeader.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.BlockParts != nil { - l = m.BlockParts.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.IsCommit { - n += 2 - } - return n -} - -func (m *Proposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Proposal.Size() - n += 1 + l + sovTypes(uint64(l)) - return n -} - -func (m *ProposalPOL) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.ProposalPolRound != 0 { - n += 1 + sovTypes(uint64(m.ProposalPolRound)) - } - l = m.ProposalPol.Size() - n += 1 + l + sovTypes(uint64(l)) - return n -} - -func (m *BlockPart) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovTypes(uint64(m.Round)) - } - l = m.Part.Size() - n += 1 + l + sovTypes(uint64(l)) - return n -} - -func (m *Vote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Vote != nil { - l = m.Vote.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *HasVote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovTypes(uint64(m.Round)) - } - if m.Type != 0 { - n += 1 + sovTypes(uint64(m.Type)) - } - if m.Index != 0 { - n += 1 + sovTypes(uint64(m.Index)) - } - return n -} - -func (m *VoteSetMaj23) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovTypes(uint64(m.Round)) - } - if m.Type != 0 { - n += 1 + sovTypes(uint64(m.Type)) - } - l = m.BlockID.Size() - n += 1 + l + sovTypes(uint64(l)) - return n -} - -func (m *VoteSetBits) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovTypes(uint64(m.Round)) - } - if m.Type != 0 { - n += 1 + sovTypes(uint64(m.Type)) - } - l = m.BlockID.Size() - n += 1 + l + sovTypes(uint64(l)) - l = m.Votes.Size() - n += 1 + l + sovTypes(uint64(l)) - return n -} - -func (m *Message) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *Message_NewRoundStep) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.NewRoundStep != nil { - l = m.NewRoundStep.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_NewValidBlock) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.NewValidBlock != nil { - l = m.NewValidBlock.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_Proposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Proposal != nil { - l = m.Proposal.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_ProposalPol) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ProposalPol != nil { - l = m.ProposalPol.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_BlockPart) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.BlockPart != nil { - l = m.BlockPart.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_Vote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Vote != nil { - l = m.Vote.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_HasVote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.HasVote != nil { - l = m.HasVote.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_VoteSetMaj23) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.VoteSetMaj23 != nil { - l = m.VoteSetMaj23.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_VoteSetBits) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.VoteSetBits != nil { - l = m.VoteSetBits.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *NewRoundStep) 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 ErrIntOverflowTypes - } - 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: NewRoundStep: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewRoundStep: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Step", wireType) - } - m.Step = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Step |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SecondsSinceStartTime", wireType) - } - m.SecondsSinceStartTime = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.SecondsSinceStartTime |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastCommitRound", wireType) - } - m.LastCommitRound = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastCommitRound |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *NewValidBlock) 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 ErrIntOverflowTypes - } - 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: NewValidBlock: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewValidBlock: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockPartSetHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BlockPartSetHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockParts", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.BlockParts == nil { - m.BlockParts = &bits.BitArray{} - } - if err := m.BlockParts.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsCommit", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IsCommit = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Proposal) 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 ErrIntOverflowTypes - } - 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: Proposal: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Proposal: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proposal", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Proposal.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ProposalPOL) 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 ErrIntOverflowTypes - } - 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: ProposalPOL: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ProposalPOL: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ProposalPolRound", wireType) - } - m.ProposalPolRound = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ProposalPolRound |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProposalPol", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ProposalPol.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *BlockPart) 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 ErrIntOverflowTypes - } - 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: BlockPart: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BlockPart: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Part", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Part.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Vote) 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 ErrIntOverflowTypes - } - 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: Vote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Vote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vote == nil { - m.Vote = &types.Vote{} - } - if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *HasVote) 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 ErrIntOverflowTypes - } - 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: HasVote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: HasVote: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= types.SignedMsgType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *VoteSetMaj23) 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 ErrIntOverflowTypes - } - 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: VoteSetMaj23: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: VoteSetMaj23: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= types.SignedMsgType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockID", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BlockID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *VoteSetBits) 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 ErrIntOverflowTypes - } - 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: VoteSetBits: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: VoteSetBits: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= types.SignedMsgType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockID", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BlockID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Votes.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Message) 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 ErrIntOverflowTypes - } - 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: Message: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Message: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewRoundStep", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &NewRoundStep{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_NewRoundStep{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewValidBlock", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &NewValidBlock{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_NewValidBlock{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proposal", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Proposal{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_Proposal{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProposalPol", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ProposalPOL{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_ProposalPol{v} - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockPart", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &BlockPart{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_BlockPart{v} - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Vote{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_Vote{v} - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field HasVote", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &HasVote{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_HasVote{v} - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VoteSetMaj23", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &VoteSetMaj23{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_VoteSetMaj23{v} - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VoteSetBits", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &VoteSetBits{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_VoteSetBits{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/consensus/types.proto b/third_party/proto/tendermint/consensus/types.proto deleted file mode 100644 index 5048f85452..0000000000 --- a/third_party/proto/tendermint/consensus/types.proto +++ /dev/null @@ -1,92 +0,0 @@ -syntax = "proto3"; -package tendermint.consensus; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/consensus"; - -import "gogoproto/gogo.proto"; -import "tendermint/types/types.proto"; -import "tendermint/libs/bits/types.proto"; - -// NewRoundStep is sent for every step taken in the ConsensusState. -// For every height/round/step transition -message NewRoundStep { - int64 height = 1; - int32 round = 2; - uint32 step = 3; - int64 seconds_since_start_time = 4; - int32 last_commit_round = 5; -} - -// NewValidBlock is sent when a validator observes a valid block B in some round r, -// i.e., there is a Proposal for block B and 2/3+ prevotes for the block B in the round r. -// In case the block is also committed, then IsCommit flag is set to true. -message NewValidBlock { - int64 height = 1; - int32 round = 2; - tendermint.types.PartSetHeader block_part_set_header = 3 [(gogoproto.nullable) = false]; - tendermint.libs.bits.BitArray block_parts = 4; - bool is_commit = 5; -} - -// Proposal is sent when a new block is proposed. -message Proposal { - tendermint.types.Proposal proposal = 1 [(gogoproto.nullable) = false]; -} - -// ProposalPOL is sent when a previous proposal is re-proposed. -message ProposalPOL { - int64 height = 1; - int32 proposal_pol_round = 2; - tendermint.libs.bits.BitArray proposal_pol = 3 [(gogoproto.nullable) = false]; -} - -// BlockPart is sent when gossipping a piece of the proposed block. -message BlockPart { - int64 height = 1; - int32 round = 2; - tendermint.types.Part part = 3 [(gogoproto.nullable) = false]; -} - -// Vote is sent when voting for a proposal (or lack thereof). -message Vote { - tendermint.types.Vote vote = 1; -} - -// HasVote is sent to indicate that a particular vote has been received. -message HasVote { - int64 height = 1; - int32 round = 2; - tendermint.types.SignedMsgType type = 3; - int32 index = 4; -} - -// VoteSetMaj23 is sent to indicate that a given BlockID has seen +2/3 votes. -message VoteSetMaj23 { - int64 height = 1; - int32 round = 2; - tendermint.types.SignedMsgType type = 3; - tendermint.types.BlockID block_id = 4 [(gogoproto.customname) = "BlockID", (gogoproto.nullable) = false]; -} - -// VoteSetBits is sent to communicate the bit-array of votes seen for the BlockID. -message VoteSetBits { - int64 height = 1; - int32 round = 2; - tendermint.types.SignedMsgType type = 3; - tendermint.types.BlockID block_id = 4 [(gogoproto.customname) = "BlockID", (gogoproto.nullable) = false]; - tendermint.libs.bits.BitArray votes = 5 [(gogoproto.nullable) = false]; -} - -message Message { - oneof sum { - NewRoundStep new_round_step = 1; - NewValidBlock new_valid_block = 2; - Proposal proposal = 3; - ProposalPOL proposal_pol = 4; - BlockPart block_part = 5; - Vote vote = 6; - HasVote has_vote = 7; - VoteSetMaj23 vote_set_maj23 = 8; - VoteSetBits vote_set_bits = 9; - } -} diff --git a/third_party/proto/tendermint/consensus/wal.pb.go b/third_party/proto/tendermint/consensus/wal.pb.go deleted file mode 100644 index b1e313b4e8..0000000000 --- a/third_party/proto/tendermint/consensus/wal.pb.go +++ /dev/null @@ -1,1585 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/consensus/wal.proto - -package consensus - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - time "time" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/golang/protobuf/ptypes/duration" - types "github.com/tendermint/tendermint/proto/tendermint/types" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = math.Inf - _ = time.Kitchen -) - -// 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 - -// MsgInfo are msgs from the reactor which may update the state -type MsgInfo struct { - Msg Message `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg"` - PeerID string `protobuf:"bytes,2,opt,name=peer_id,json=peerId,proto3" json:"peer_id,omitempty"` -} - -func (m *MsgInfo) Reset() { *m = MsgInfo{} } -func (m *MsgInfo) String() string { return proto.CompactTextString(m) } -func (*MsgInfo) ProtoMessage() {} -func (*MsgInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ed0b60c2d348ab09, []int{0} -} - -func (m *MsgInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *MsgInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgInfo.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 *MsgInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgInfo.Merge(m, src) -} - -func (m *MsgInfo) XXX_Size() int { - return m.Size() -} - -func (m *MsgInfo) XXX_DiscardUnknown() { - xxx_messageInfo_MsgInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgInfo proto.InternalMessageInfo - -func (m *MsgInfo) GetMsg() Message { - if m != nil { - return m.Msg - } - return Message{} -} - -func (m *MsgInfo) GetPeerID() string { - if m != nil { - return m.PeerID - } - return "" -} - -// TimeoutInfo internally generated messages which may update the state -type TimeoutInfo struct { - Duration time.Duration `protobuf:"bytes,1,opt,name=duration,proto3,stdduration" json:"duration"` - Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,3,opt,name=round,proto3" json:"round,omitempty"` - Step uint32 `protobuf:"varint,4,opt,name=step,proto3" json:"step,omitempty"` -} - -func (m *TimeoutInfo) Reset() { *m = TimeoutInfo{} } -func (m *TimeoutInfo) String() string { return proto.CompactTextString(m) } -func (*TimeoutInfo) ProtoMessage() {} -func (*TimeoutInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ed0b60c2d348ab09, []int{1} -} - -func (m *TimeoutInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *TimeoutInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TimeoutInfo.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 *TimeoutInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TimeoutInfo.Merge(m, src) -} - -func (m *TimeoutInfo) XXX_Size() int { - return m.Size() -} - -func (m *TimeoutInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TimeoutInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_TimeoutInfo proto.InternalMessageInfo - -func (m *TimeoutInfo) GetDuration() time.Duration { - if m != nil { - return m.Duration - } - return 0 -} - -func (m *TimeoutInfo) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *TimeoutInfo) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *TimeoutInfo) GetStep() uint32 { - if m != nil { - return m.Step - } - return 0 -} - -// EndHeight marks the end of the given height inside WAL. -// @internal used by scripts/wal2json util. -type EndHeight struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` -} - -func (m *EndHeight) Reset() { *m = EndHeight{} } -func (m *EndHeight) String() string { return proto.CompactTextString(m) } -func (*EndHeight) ProtoMessage() {} -func (*EndHeight) Descriptor() ([]byte, []int) { - return fileDescriptor_ed0b60c2d348ab09, []int{2} -} - -func (m *EndHeight) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *EndHeight) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EndHeight.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 *EndHeight) XXX_Merge(src proto.Message) { - xxx_messageInfo_EndHeight.Merge(m, src) -} - -func (m *EndHeight) XXX_Size() int { - return m.Size() -} - -func (m *EndHeight) XXX_DiscardUnknown() { - xxx_messageInfo_EndHeight.DiscardUnknown(m) -} - -var xxx_messageInfo_EndHeight proto.InternalMessageInfo - -func (m *EndHeight) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -type WALMessage struct { - // Types that are valid to be assigned to Sum: - // *WALMessage_EventDataRoundState - // *WALMessage_MsgInfo - // *WALMessage_TimeoutInfo - // *WALMessage_EndHeight - Sum isWALMessage_Sum `protobuf_oneof:"sum"` -} - -func (m *WALMessage) Reset() { *m = WALMessage{} } -func (m *WALMessage) String() string { return proto.CompactTextString(m) } -func (*WALMessage) ProtoMessage() {} -func (*WALMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_ed0b60c2d348ab09, []int{3} -} - -func (m *WALMessage) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *WALMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_WALMessage.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 *WALMessage) XXX_Merge(src proto.Message) { - xxx_messageInfo_WALMessage.Merge(m, src) -} - -func (m *WALMessage) XXX_Size() int { - return m.Size() -} - -func (m *WALMessage) XXX_DiscardUnknown() { - xxx_messageInfo_WALMessage.DiscardUnknown(m) -} - -var xxx_messageInfo_WALMessage proto.InternalMessageInfo - -type isWALMessage_Sum interface { - isWALMessage_Sum() - MarshalTo([]byte) (int, error) - Size() int -} - -type WALMessage_EventDataRoundState struct { - EventDataRoundState *types.EventDataRoundState `protobuf:"bytes,1,opt,name=event_data_round_state,json=eventDataRoundState,proto3,oneof" json:"event_data_round_state,omitempty"` -} -type WALMessage_MsgInfo struct { - MsgInfo *MsgInfo `protobuf:"bytes,2,opt,name=msg_info,json=msgInfo,proto3,oneof" json:"msg_info,omitempty"` -} -type WALMessage_TimeoutInfo struct { - TimeoutInfo *TimeoutInfo `protobuf:"bytes,3,opt,name=timeout_info,json=timeoutInfo,proto3,oneof" json:"timeout_info,omitempty"` -} -type WALMessage_EndHeight struct { - EndHeight *EndHeight `protobuf:"bytes,4,opt,name=end_height,json=endHeight,proto3,oneof" json:"end_height,omitempty"` -} - -func (*WALMessage_EventDataRoundState) isWALMessage_Sum() {} -func (*WALMessage_MsgInfo) isWALMessage_Sum() {} -func (*WALMessage_TimeoutInfo) isWALMessage_Sum() {} -func (*WALMessage_EndHeight) isWALMessage_Sum() {} - -func (m *WALMessage) GetSum() isWALMessage_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *WALMessage) GetEventDataRoundState() *types.EventDataRoundState { - if x, ok := m.GetSum().(*WALMessage_EventDataRoundState); ok { - return x.EventDataRoundState - } - return nil -} - -func (m *WALMessage) GetMsgInfo() *MsgInfo { - if x, ok := m.GetSum().(*WALMessage_MsgInfo); ok { - return x.MsgInfo - } - return nil -} - -func (m *WALMessage) GetTimeoutInfo() *TimeoutInfo { - if x, ok := m.GetSum().(*WALMessage_TimeoutInfo); ok { - return x.TimeoutInfo - } - return nil -} - -func (m *WALMessage) GetEndHeight() *EndHeight { - if x, ok := m.GetSum().(*WALMessage_EndHeight); ok { - return x.EndHeight - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*WALMessage) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*WALMessage_EventDataRoundState)(nil), - (*WALMessage_MsgInfo)(nil), - (*WALMessage_TimeoutInfo)(nil), - (*WALMessage_EndHeight)(nil), - } -} - -// TimedWALMessage wraps WALMessage and adds Time for debugging purposes. -type TimedWALMessage struct { - Time time.Time `protobuf:"bytes,1,opt,name=time,proto3,stdtime" json:"time"` - Msg *WALMessage `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` -} - -func (m *TimedWALMessage) Reset() { *m = TimedWALMessage{} } -func (m *TimedWALMessage) String() string { return proto.CompactTextString(m) } -func (*TimedWALMessage) ProtoMessage() {} -func (*TimedWALMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_ed0b60c2d348ab09, []int{4} -} - -func (m *TimedWALMessage) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *TimedWALMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TimedWALMessage.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 *TimedWALMessage) XXX_Merge(src proto.Message) { - xxx_messageInfo_TimedWALMessage.Merge(m, src) -} - -func (m *TimedWALMessage) XXX_Size() int { - return m.Size() -} - -func (m *TimedWALMessage) XXX_DiscardUnknown() { - xxx_messageInfo_TimedWALMessage.DiscardUnknown(m) -} - -var xxx_messageInfo_TimedWALMessage proto.InternalMessageInfo - -func (m *TimedWALMessage) GetTime() time.Time { - if m != nil { - return m.Time - } - return time.Time{} -} - -func (m *TimedWALMessage) GetMsg() *WALMessage { - if m != nil { - return m.Msg - } - return nil -} - -func init() { - proto.RegisterType((*MsgInfo)(nil), "tendermint.consensus.MsgInfo") - proto.RegisterType((*TimeoutInfo)(nil), "tendermint.consensus.TimeoutInfo") - proto.RegisterType((*EndHeight)(nil), "tendermint.consensus.EndHeight") - proto.RegisterType((*WALMessage)(nil), "tendermint.consensus.WALMessage") - proto.RegisterType((*TimedWALMessage)(nil), "tendermint.consensus.TimedWALMessage") -} - -func init() { proto.RegisterFile("tendermint/consensus/wal.proto", fileDescriptor_ed0b60c2d348ab09) } - -var fileDescriptor_ed0b60c2d348ab09 = []byte{ - // 539 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x53, 0xdd, 0x8a, 0xd3, 0x40, - 0x14, 0xce, 0x6c, 0xff, 0x4f, 0x15, 0x21, 0x96, 0xa5, 0x16, 0x36, 0x8d, 0x5d, 0x84, 0x5e, 0x25, - 0xb0, 0x22, 0x88, 0x5e, 0xa8, 0xa5, 0x2b, 0x2d, 0xb8, 0x20, 0xe3, 0x8a, 0x20, 0x42, 0x48, 0x37, - 0xa7, 0x69, 0x60, 0x33, 0x53, 0x32, 0x13, 0xc5, 0x2b, 0x5f, 0xa1, 0x97, 0xbe, 0x89, 0xaf, 0xb0, - 0x97, 0x7b, 0xe9, 0xd5, 0x2a, 0xed, 0x8b, 0x48, 0x66, 0xd2, 0x36, 0xb8, 0xd9, 0xbb, 0x39, 0x73, - 0xbe, 0x73, 0xbe, 0x73, 0xbe, 0x6f, 0x06, 0x2c, 0x89, 0x2c, 0xc0, 0x24, 0x8e, 0x98, 0x74, 0x2f, - 0x38, 0x13, 0xc8, 0x44, 0x2a, 0xdc, 0x6f, 0xfe, 0xa5, 0xb3, 0x4c, 0xb8, 0xe4, 0x66, 0x67, 0x9f, - 0x77, 0x76, 0xf9, 0x5e, 0x27, 0xe4, 0x21, 0x57, 0x00, 0x37, 0x3b, 0x69, 0x6c, 0xcf, 0x2e, 0xed, - 0x25, 0xbf, 0x2f, 0x51, 0xe4, 0x88, 0xa3, 0x02, 0x42, 0xdd, 0xbb, 0xf8, 0x15, 0x99, 0xdc, 0xa6, - 0xad, 0x90, 0xf3, 0xf0, 0x12, 0x5d, 0x15, 0xcd, 0xd2, 0xb9, 0x1b, 0xa4, 0x89, 0x2f, 0x23, 0xce, - 0xf2, 0x7c, 0xff, 0xff, 0xbc, 0x8c, 0x62, 0x14, 0xd2, 0x8f, 0x97, 0x1a, 0x30, 0x40, 0x68, 0x9c, - 0x89, 0x70, 0xca, 0xe6, 0xdc, 0x7c, 0x06, 0x95, 0x58, 0x84, 0x5d, 0x62, 0x93, 0x61, 0xfb, 0xe4, - 0xc8, 0x29, 0x5b, 0xc3, 0x39, 0x43, 0x21, 0xfc, 0x10, 0x47, 0xd5, 0xab, 0x9b, 0xbe, 0x41, 0x33, - 0xbc, 0x79, 0x0c, 0x8d, 0x25, 0x62, 0xe2, 0x45, 0x41, 0xf7, 0xc0, 0x26, 0xc3, 0xd6, 0x08, 0xd6, - 0x37, 0xfd, 0xfa, 0x7b, 0xc4, 0x64, 0x3a, 0xa6, 0xf5, 0x2c, 0x35, 0x0d, 0x06, 0x2b, 0x02, 0xed, - 0xf3, 0x28, 0x46, 0x9e, 0x4a, 0xc5, 0xf5, 0x0a, 0x9a, 0xdb, 0x49, 0x73, 0xc2, 0x47, 0x8e, 0x1e, - 0xd5, 0xd9, 0x8e, 0xea, 0x8c, 0x73, 0xc0, 0xa8, 0x99, 0x91, 0xfd, 0xfc, 0xd3, 0x27, 0x74, 0x57, - 0x64, 0x1e, 0x42, 0x7d, 0x81, 0x51, 0xb8, 0x90, 0x8a, 0xb4, 0x42, 0xf3, 0xc8, 0xec, 0x40, 0x2d, - 0xe1, 0x29, 0x0b, 0xba, 0x15, 0x9b, 0x0c, 0x6b, 0x54, 0x07, 0xa6, 0x09, 0x55, 0x21, 0x71, 0xd9, - 0xad, 0xda, 0x64, 0x78, 0x9f, 0xaa, 0xf3, 0xe0, 0x18, 0x5a, 0xa7, 0x2c, 0x98, 0xe8, 0xb2, 0x7d, - 0x3b, 0x52, 0x6c, 0x37, 0xf8, 0x75, 0x00, 0xf0, 0xe9, 0xcd, 0xbb, 0x7c, 0x6d, 0xf3, 0x0b, 0x1c, - 0x2a, 0xf9, 0xbd, 0xc0, 0x97, 0xbe, 0xa7, 0x7a, 0x7b, 0x42, 0xfa, 0x12, 0xf3, 0x25, 0x9e, 0x14, - 0x55, 0xd3, 0x36, 0x9e, 0x66, 0xf8, 0xb1, 0x2f, 0x7d, 0x9a, 0xa1, 0x3f, 0x64, 0xe0, 0x89, 0x41, - 0x1f, 0xe2, 0xed, 0x6b, 0xf3, 0x05, 0x34, 0x63, 0x11, 0x7a, 0x11, 0x9b, 0x73, 0xb5, 0xd5, 0xdd, - 0x2e, 0x68, 0xc7, 0x26, 0x06, 0x6d, 0xc4, 0xb9, 0x79, 0x6f, 0xe1, 0x9e, 0xd4, 0xfa, 0xea, 0xfa, - 0x8a, 0xaa, 0x7f, 0x5c, 0x5e, 0x5f, 0x70, 0x62, 0x62, 0xd0, 0xb6, 0x2c, 0x18, 0xf3, 0x1a, 0x00, - 0x59, 0xe0, 0xe5, 0x62, 0x54, 0x55, 0x97, 0x7e, 0x79, 0x97, 0x9d, 0x7a, 0x13, 0x83, 0xb6, 0x70, - 0x1b, 0x8c, 0x6a, 0x50, 0x11, 0x69, 0x3c, 0xf8, 0x01, 0x0f, 0x32, 0x9a, 0xa0, 0xa0, 0xde, 0x73, - 0xa8, 0x66, 0x54, 0xb9, 0x56, 0xbd, 0x5b, 0x86, 0x9f, 0x6f, 0xdf, 0xa6, 0x76, 0x7c, 0x95, 0x39, - 0xae, 0x2a, 0xcc, 0x13, 0xfd, 0x34, 0xb5, 0x28, 0x76, 0xf9, 0x38, 0x7b, 0x22, 0xf5, 0x2e, 0x47, - 0x1f, 0xaf, 0xd6, 0x16, 0xb9, 0x5e, 0x5b, 0xe4, 0xef, 0xda, 0x22, 0xab, 0x8d, 0x65, 0x5c, 0x6f, - 0x2c, 0xe3, 0xf7, 0xc6, 0x32, 0x3e, 0xbf, 0x0c, 0x23, 0xb9, 0x48, 0x67, 0xce, 0x05, 0x8f, 0xdd, - 0xe2, 0xf7, 0xda, 0x1f, 0xf5, 0x47, 0x2d, 0xfb, 0x9c, 0xb3, 0xba, 0xca, 0x3d, 0xfd, 0x17, 0x00, - 0x00, 0xff, 0xff, 0x0b, 0xad, 0x1c, 0x1b, 0x07, 0x04, 0x00, 0x00, -} - -func (m *MsgInfo) 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 *MsgInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.PeerID) > 0 { - i -= len(m.PeerID) - copy(dAtA[i:], m.PeerID) - i = encodeVarintWal(dAtA, i, uint64(len(m.PeerID))) - i-- - dAtA[i] = 0x12 - } - { - size, err := m.Msg.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintWal(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *TimeoutInfo) 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 *TimeoutInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TimeoutInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Step != 0 { - i = encodeVarintWal(dAtA, i, uint64(m.Step)) - i-- - dAtA[i] = 0x20 - } - if m.Round != 0 { - i = encodeVarintWal(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x18 - } - if m.Height != 0 { - i = encodeVarintWal(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x10 - } - n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration):]) - if err2 != nil { - return 0, err2 - } - i -= n2 - i = encodeVarintWal(dAtA, i, uint64(n2)) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *EndHeight) 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 *EndHeight) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EndHeight) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Height != 0 { - i = encodeVarintWal(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *WALMessage) 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 *WALMessage) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WALMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *WALMessage_EventDataRoundState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WALMessage_EventDataRoundState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EventDataRoundState != nil { - { - size, err := m.EventDataRoundState.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintWal(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *WALMessage_MsgInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WALMessage_MsgInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MsgInfo != nil { - { - size, err := m.MsgInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintWal(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} - -func (m *WALMessage_TimeoutInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WALMessage_TimeoutInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TimeoutInfo != nil { - { - size, err := m.TimeoutInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintWal(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} - -func (m *WALMessage_EndHeight) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WALMessage_EndHeight) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EndHeight != nil { - { - size, err := m.EndHeight.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintWal(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} - -func (m *TimedWALMessage) 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 *TimedWALMessage) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TimedWALMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Msg != nil { - { - size, err := m.Msg.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintWal(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err8 != nil { - return 0, err8 - } - i -= n8 - i = encodeVarintWal(dAtA, i, uint64(n8)) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintWal(dAtA []byte, offset int, v uint64) int { - offset -= sovWal(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *MsgInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Msg.Size() - n += 1 + l + sovWal(uint64(l)) - l = len(m.PeerID) - if l > 0 { - n += 1 + l + sovWal(uint64(l)) - } - return n -} - -func (m *TimeoutInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration) - n += 1 + l + sovWal(uint64(l)) - if m.Height != 0 { - n += 1 + sovWal(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovWal(uint64(m.Round)) - } - if m.Step != 0 { - n += 1 + sovWal(uint64(m.Step)) - } - return n -} - -func (m *EndHeight) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovWal(uint64(m.Height)) - } - return n -} - -func (m *WALMessage) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *WALMessage_EventDataRoundState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EventDataRoundState != nil { - l = m.EventDataRoundState.Size() - n += 1 + l + sovWal(uint64(l)) - } - return n -} - -func (m *WALMessage_MsgInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.MsgInfo != nil { - l = m.MsgInfo.Size() - n += 1 + l + sovWal(uint64(l)) - } - return n -} - -func (m *WALMessage_TimeoutInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TimeoutInfo != nil { - l = m.TimeoutInfo.Size() - n += 1 + l + sovWal(uint64(l)) - } - return n -} - -func (m *WALMessage_EndHeight) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EndHeight != nil { - l = m.EndHeight.Size() - n += 1 + l + sovWal(uint64(l)) - } - return n -} - -func (m *TimedWALMessage) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) - n += 1 + l + sovWal(uint64(l)) - if m.Msg != nil { - l = m.Msg.Size() - n += 1 + l + sovWal(uint64(l)) - } - return n -} - -func sovWal(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozWal(x uint64) (n int) { - return sovWal(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *MsgInfo) 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 ErrIntOverflowWal - } - 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: MsgInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthWal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthWal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Msg.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PeerID", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthWal - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthWal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PeerID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipWal(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWal - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *TimeoutInfo) 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 ErrIntOverflowWal - } - 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: TimeoutInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TimeoutInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthWal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthWal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - 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 ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Step", wireType) - } - m.Step = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Step |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipWal(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWal - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *EndHeight) 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 ErrIntOverflowWal - } - 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: EndHeight: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EndHeight: 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 ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipWal(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWal - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *WALMessage) 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 ErrIntOverflowWal - } - 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: WALMessage: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: WALMessage: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EventDataRoundState", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthWal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthWal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &types.EventDataRoundState{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &WALMessage_EventDataRoundState{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MsgInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthWal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthWal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &MsgInfo{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &WALMessage_MsgInfo{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TimeoutInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthWal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthWal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &TimeoutInfo{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &WALMessage_TimeoutInfo{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EndHeight", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthWal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthWal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &EndHeight{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &WALMessage_EndHeight{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipWal(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWal - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *TimedWALMessage) 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 ErrIntOverflowWal - } - 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: TimedWALMessage: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TimedWALMessage: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthWal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthWal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowWal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthWal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthWal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Msg == nil { - m.Msg = &WALMessage{} - } - if err := m.Msg.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipWal(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthWal - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipWal(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, ErrIntOverflowWal - } - 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, ErrIntOverflowWal - } - 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, ErrIntOverflowWal - } - 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, ErrInvalidLengthWal - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupWal - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthWal - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthWal = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowWal = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupWal = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/consensus/wal.proto b/third_party/proto/tendermint/consensus/wal.proto deleted file mode 100644 index 44afa2c0c3..0000000000 --- a/third_party/proto/tendermint/consensus/wal.proto +++ /dev/null @@ -1,46 +0,0 @@ -syntax = "proto3"; -package tendermint.consensus; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/consensus"; - -import "gogoproto/gogo.proto"; -import "tendermint/consensus/types.proto"; -import "tendermint/types/events.proto"; -import "google/protobuf/duration.proto"; -import "google/protobuf/timestamp.proto"; - -// MsgInfo are msgs from the reactor which may update the state -message MsgInfo { - Message msg = 1 [(gogoproto.nullable) = false]; - string peer_id = 2 [(gogoproto.customname) = "PeerID"]; -} - -// TimeoutInfo internally generated messages which may update the state -message TimeoutInfo { - google.protobuf.Duration duration = 1 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; - int64 height = 2; - int32 round = 3; - uint32 step = 4; -} - -// EndHeight marks the end of the given height inside WAL. -// @internal used by scripts/wal2json util. -message EndHeight { - int64 height = 1; -} - -message WALMessage { - oneof sum { - tendermint.types.EventDataRoundState event_data_round_state = 1; - MsgInfo msg_info = 2; - TimeoutInfo timeout_info = 3; - EndHeight end_height = 4; - } -} - -// TimedWALMessage wraps WALMessage and adds Time for debugging purposes. -message TimedWALMessage { - google.protobuf.Timestamp time = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - WALMessage msg = 2; -} diff --git a/third_party/proto/tendermint/crypto/keys.pb.go b/third_party/proto/tendermint/crypto/keys.pb.go deleted file mode 100644 index ad2de6c876..0000000000 --- a/third_party/proto/tendermint/crypto/keys.pb.go +++ /dev/null @@ -1,677 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/crypto/keys.proto - -package crypto - -import ( - bytes "bytes" - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 - -// PublicKey defines the keys available for use with Tendermint Validators -type PublicKey struct { - // Types that are valid to be assigned to Sum: - // *PublicKey_Ed25519 - // *PublicKey_Secp256K1 - Sum isPublicKey_Sum `protobuf_oneof:"sum"` -} - -func (m *PublicKey) Reset() { *m = PublicKey{} } -func (m *PublicKey) String() string { return proto.CompactTextString(m) } -func (*PublicKey) ProtoMessage() {} -func (*PublicKey) Descriptor() ([]byte, []int) { - return fileDescriptor_cb048658b234868c, []int{0} -} - -func (m *PublicKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PublicKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PublicKey.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 *PublicKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_PublicKey.Merge(m, src) -} - -func (m *PublicKey) XXX_Size() int { - return m.Size() -} - -func (m *PublicKey) XXX_DiscardUnknown() { - xxx_messageInfo_PublicKey.DiscardUnknown(m) -} - -var xxx_messageInfo_PublicKey proto.InternalMessageInfo - -type isPublicKey_Sum interface { - isPublicKey_Sum() - Equal(interface{}) bool - MarshalTo([]byte) (int, error) - Size() int - Compare(interface{}) int -} - -type PublicKey_Ed25519 struct { - Ed25519 []byte `protobuf:"bytes,1,opt,name=ed25519,proto3,oneof" json:"ed25519,omitempty"` -} -type PublicKey_Secp256K1 struct { - Secp256K1 []byte `protobuf:"bytes,2,opt,name=secp256k1,proto3,oneof" json:"secp256k1,omitempty"` -} - -func (*PublicKey_Ed25519) isPublicKey_Sum() {} -func (*PublicKey_Secp256K1) isPublicKey_Sum() {} - -func (m *PublicKey) GetSum() isPublicKey_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *PublicKey) GetEd25519() []byte { - if x, ok := m.GetSum().(*PublicKey_Ed25519); ok { - return x.Ed25519 - } - return nil -} - -func (m *PublicKey) GetSecp256K1() []byte { - if x, ok := m.GetSum().(*PublicKey_Secp256K1); ok { - return x.Secp256K1 - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*PublicKey) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*PublicKey_Ed25519)(nil), - (*PublicKey_Secp256K1)(nil), - } -} - -func init() { - proto.RegisterType((*PublicKey)(nil), "tendermint.crypto.PublicKey") -} - -func init() { proto.RegisterFile("tendermint/crypto/keys.proto", fileDescriptor_cb048658b234868c) } - -var fileDescriptor_cb048658b234868c = []byte{ - // 199 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x29, 0x49, 0xcd, 0x4b, - 0x49, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0xcf, 0x4e, - 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x44, 0xc8, 0xea, 0x41, 0x64, 0xa5, - 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xb2, 0xfa, 0x20, 0x16, 0x44, 0xa1, 0x52, 0x04, 0x17, 0x67, - 0x40, 0x69, 0x52, 0x4e, 0x66, 0xb2, 0x77, 0x6a, 0xa5, 0x90, 0x14, 0x17, 0x7b, 0x6a, 0x8a, 0x91, - 0xa9, 0xa9, 0xa1, 0xa5, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x8f, 0x07, 0x43, 0x10, 0x4c, 0x40, 0x48, - 0x8e, 0x8b, 0xb3, 0x38, 0x35, 0xb9, 0xc0, 0xc8, 0xd4, 0x2c, 0xdb, 0x50, 0x82, 0x09, 0x2a, 0x8b, - 0x10, 0xb2, 0xe2, 0x78, 0xb1, 0x40, 0x9e, 0xf1, 0xc5, 0x42, 0x79, 0x46, 0x27, 0x56, 0x2e, 0xe6, - 0xe2, 0xd2, 0x5c, 0xa7, 0xa0, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, - 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0xb2, - 0x48, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x47, 0xf2, 0x05, 0x12, 0x13, - 0xe2, 0x4c, 0x0c, 0x1f, 0x26, 0xb1, 0x81, 0x25, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe8, - 0x1d, 0x1e, 0xe2, 0xfd, 0x00, 0x00, 0x00, -} - -func (this *PublicKey) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*PublicKey) - if !ok { - that2, ok := that.(PublicKey) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if that1.Sum == nil { - if this.Sum != nil { - return 1 - } - } else if this.Sum == nil { - return -1 - } else { - thisType := -1 - switch this.Sum.(type) { - case *PublicKey_Ed25519: - thisType = 0 - case *PublicKey_Secp256K1: - thisType = 1 - default: - panic(fmt.Sprintf("compare: unexpected type %T in oneof", this.Sum)) - } - that1Type := -1 - switch that1.Sum.(type) { - case *PublicKey_Ed25519: - that1Type = 0 - case *PublicKey_Secp256K1: - that1Type = 1 - default: - panic(fmt.Sprintf("compare: unexpected type %T in oneof", that1.Sum)) - } - if thisType == that1Type { - if c := this.Sum.Compare(that1.Sum); c != 0 { - return c - } - } else if thisType < that1Type { - return -1 - } else if thisType > that1Type { - return 1 - } - } - return 0 -} - -func (this *PublicKey_Ed25519) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*PublicKey_Ed25519) - if !ok { - that2, ok := that.(PublicKey_Ed25519) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if c := bytes.Compare(this.Ed25519, that1.Ed25519); c != 0 { - return c - } - return 0 -} - -func (this *PublicKey_Secp256K1) Compare(that interface{}) int { - if that == nil { - if this == nil { - return 0 - } - return 1 - } - - that1, ok := that.(*PublicKey_Secp256K1) - if !ok { - that2, ok := that.(PublicKey_Secp256K1) - if ok { - that1 = &that2 - } else { - return 1 - } - } - if that1 == nil { - if this == nil { - return 0 - } - return 1 - } else if this == nil { - return -1 - } - if c := bytes.Compare(this.Secp256K1, that1.Secp256K1); c != 0 { - return c - } - return 0 -} - -func (this *PublicKey) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*PublicKey) - if !ok { - that2, ok := that.(PublicKey) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if that1.Sum == nil { - if this.Sum != nil { - return false - } - } else if this.Sum == nil { - return false - } else if !this.Sum.Equal(that1.Sum) { - return false - } - return true -} - -func (this *PublicKey_Ed25519) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*PublicKey_Ed25519) - if !ok { - that2, ok := that.(PublicKey_Ed25519) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !bytes.Equal(this.Ed25519, that1.Ed25519) { - return false - } - return true -} - -func (this *PublicKey_Secp256K1) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*PublicKey_Secp256K1) - if !ok { - that2, ok := that.(PublicKey_Secp256K1) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !bytes.Equal(this.Secp256K1, that1.Secp256K1) { - return false - } - return true -} - -func (m *PublicKey) 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 *PublicKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PublicKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *PublicKey_Ed25519) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PublicKey_Ed25519) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Ed25519 != nil { - i -= len(m.Ed25519) - copy(dAtA[i:], m.Ed25519) - i = encodeVarintKeys(dAtA, i, uint64(len(m.Ed25519))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *PublicKey_Secp256K1) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PublicKey_Secp256K1) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Secp256K1 != nil { - i -= len(m.Secp256K1) - copy(dAtA[i:], m.Secp256K1) - i = encodeVarintKeys(dAtA, i, uint64(len(m.Secp256K1))) - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} - -func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { - offset -= sovKeys(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *PublicKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *PublicKey_Ed25519) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Ed25519 != nil { - l = len(m.Ed25519) - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func (m *PublicKey_Secp256K1) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Secp256K1 != nil { - l = len(m.Secp256K1) - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func sovKeys(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozKeys(x uint64) (n int) { - return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *PublicKey) 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 ErrIntOverflowKeys - } - 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: PublicKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PublicKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ed25519", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := make([]byte, postIndex-iNdEx) - copy(v, dAtA[iNdEx:postIndex]) - m.Sum = &PublicKey_Ed25519{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Secp256K1", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := make([]byte, postIndex-iNdEx) - copy(v, dAtA[iNdEx:postIndex]) - m.Sum = &PublicKey_Secp256K1{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipKeys(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, ErrIntOverflowKeys - } - 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, ErrIntOverflowKeys - } - 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, ErrIntOverflowKeys - } - 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, ErrInvalidLengthKeys - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupKeys - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthKeys - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthKeys = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowKeys = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupKeys = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/crypto/keys.proto b/third_party/proto/tendermint/crypto/keys.proto deleted file mode 100644 index 16fd7adf3e..0000000000 --- a/third_party/proto/tendermint/crypto/keys.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; -package tendermint.crypto; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/crypto"; - -import "gogoproto/gogo.proto"; - -// PublicKey defines the keys available for use with Tendermint Validators -message PublicKey { - option (gogoproto.compare) = true; - option (gogoproto.equal) = true; - - oneof sum { - bytes ed25519 = 1; - bytes secp256k1 = 2; - } -} diff --git a/third_party/proto/tendermint/crypto/proof.pb.go b/third_party/proto/tendermint/crypto/proof.pb.go deleted file mode 100644 index 7437cfafec..0000000000 --- a/third_party/proto/tendermint/crypto/proof.pb.go +++ /dev/null @@ -1,1458 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/crypto/proof.proto - -package crypto - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 Proof struct { - Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` - Index int64 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` - LeafHash []byte `protobuf:"bytes,3,opt,name=leaf_hash,json=leafHash,proto3" json:"leaf_hash,omitempty"` - Aunts [][]byte `protobuf:"bytes,4,rep,name=aunts,proto3" json:"aunts,omitempty"` -} - -func (m *Proof) Reset() { *m = Proof{} } -func (m *Proof) String() string { return proto.CompactTextString(m) } -func (*Proof) ProtoMessage() {} -func (*Proof) Descriptor() ([]byte, []int) { - return fileDescriptor_6b60b6ba2ab5b856, []int{0} -} - -func (m *Proof) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Proof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Proof.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 *Proof) XXX_Merge(src proto.Message) { - xxx_messageInfo_Proof.Merge(m, src) -} - -func (m *Proof) XXX_Size() int { - return m.Size() -} - -func (m *Proof) XXX_DiscardUnknown() { - xxx_messageInfo_Proof.DiscardUnknown(m) -} - -var xxx_messageInfo_Proof proto.InternalMessageInfo - -func (m *Proof) GetTotal() int64 { - if m != nil { - return m.Total - } - return 0 -} - -func (m *Proof) GetIndex() int64 { - if m != nil { - return m.Index - } - return 0 -} - -func (m *Proof) GetLeafHash() []byte { - if m != nil { - return m.LeafHash - } - return nil -} - -func (m *Proof) GetAunts() [][]byte { - if m != nil { - return m.Aunts - } - return nil -} - -type ValueOp struct { - // Encoded in ProofOp.Key. - Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - // To encode in ProofOp.Data - Proof *Proof `protobuf:"bytes,2,opt,name=proof,proto3" json:"proof,omitempty"` -} - -func (m *ValueOp) Reset() { *m = ValueOp{} } -func (m *ValueOp) String() string { return proto.CompactTextString(m) } -func (*ValueOp) ProtoMessage() {} -func (*ValueOp) Descriptor() ([]byte, []int) { - return fileDescriptor_6b60b6ba2ab5b856, []int{1} -} - -func (m *ValueOp) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ValueOp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ValueOp.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 *ValueOp) XXX_Merge(src proto.Message) { - xxx_messageInfo_ValueOp.Merge(m, src) -} - -func (m *ValueOp) XXX_Size() int { - return m.Size() -} - -func (m *ValueOp) XXX_DiscardUnknown() { - xxx_messageInfo_ValueOp.DiscardUnknown(m) -} - -var xxx_messageInfo_ValueOp proto.InternalMessageInfo - -func (m *ValueOp) GetKey() []byte { - if m != nil { - return m.Key - } - return nil -} - -func (m *ValueOp) GetProof() *Proof { - if m != nil { - return m.Proof - } - return nil -} - -type DominoOp struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Input string `protobuf:"bytes,2,opt,name=input,proto3" json:"input,omitempty"` - Output string `protobuf:"bytes,3,opt,name=output,proto3" json:"output,omitempty"` -} - -func (m *DominoOp) Reset() { *m = DominoOp{} } -func (m *DominoOp) String() string { return proto.CompactTextString(m) } -func (*DominoOp) ProtoMessage() {} -func (*DominoOp) Descriptor() ([]byte, []int) { - return fileDescriptor_6b60b6ba2ab5b856, []int{2} -} - -func (m *DominoOp) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *DominoOp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DominoOp.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 *DominoOp) XXX_Merge(src proto.Message) { - xxx_messageInfo_DominoOp.Merge(m, src) -} - -func (m *DominoOp) XXX_Size() int { - return m.Size() -} - -func (m *DominoOp) XXX_DiscardUnknown() { - xxx_messageInfo_DominoOp.DiscardUnknown(m) -} - -var xxx_messageInfo_DominoOp proto.InternalMessageInfo - -func (m *DominoOp) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - -func (m *DominoOp) GetInput() string { - if m != nil { - return m.Input - } - return "" -} - -func (m *DominoOp) GetOutput() string { - if m != nil { - return m.Output - } - return "" -} - -// ProofOp defines an operation used for calculating Merkle root -// The data could be arbitrary format, providing necessary data -// for example neighbouring node hash -type ProofOp struct { - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` -} - -func (m *ProofOp) Reset() { *m = ProofOp{} } -func (m *ProofOp) String() string { return proto.CompactTextString(m) } -func (*ProofOp) ProtoMessage() {} -func (*ProofOp) Descriptor() ([]byte, []int) { - return fileDescriptor_6b60b6ba2ab5b856, []int{3} -} - -func (m *ProofOp) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ProofOp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ProofOp.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 *ProofOp) XXX_Merge(src proto.Message) { - xxx_messageInfo_ProofOp.Merge(m, src) -} - -func (m *ProofOp) XXX_Size() int { - return m.Size() -} - -func (m *ProofOp) XXX_DiscardUnknown() { - xxx_messageInfo_ProofOp.DiscardUnknown(m) -} - -var xxx_messageInfo_ProofOp proto.InternalMessageInfo - -func (m *ProofOp) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *ProofOp) GetKey() []byte { - if m != nil { - return m.Key - } - return nil -} - -func (m *ProofOp) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -// ProofOps is Merkle proof defined by the list of ProofOps -type ProofOps struct { - Ops []ProofOp `protobuf:"bytes,1,rep,name=ops,proto3" json:"ops"` -} - -func (m *ProofOps) Reset() { *m = ProofOps{} } -func (m *ProofOps) String() string { return proto.CompactTextString(m) } -func (*ProofOps) ProtoMessage() {} -func (*ProofOps) Descriptor() ([]byte, []int) { - return fileDescriptor_6b60b6ba2ab5b856, []int{4} -} - -func (m *ProofOps) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ProofOps) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ProofOps.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 *ProofOps) XXX_Merge(src proto.Message) { - xxx_messageInfo_ProofOps.Merge(m, src) -} - -func (m *ProofOps) XXX_Size() int { - return m.Size() -} - -func (m *ProofOps) XXX_DiscardUnknown() { - xxx_messageInfo_ProofOps.DiscardUnknown(m) -} - -var xxx_messageInfo_ProofOps proto.InternalMessageInfo - -func (m *ProofOps) GetOps() []ProofOp { - if m != nil { - return m.Ops - } - return nil -} - -func init() { - proto.RegisterType((*Proof)(nil), "tendermint.crypto.Proof") - proto.RegisterType((*ValueOp)(nil), "tendermint.crypto.ValueOp") - proto.RegisterType((*DominoOp)(nil), "tendermint.crypto.DominoOp") - proto.RegisterType((*ProofOp)(nil), "tendermint.crypto.ProofOp") - proto.RegisterType((*ProofOps)(nil), "tendermint.crypto.ProofOps") -} - -func init() { proto.RegisterFile("tendermint/crypto/proof.proto", fileDescriptor_6b60b6ba2ab5b856) } - -var fileDescriptor_6b60b6ba2ab5b856 = []byte{ - // 351 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x52, 0xbb, 0x4e, 0xc3, 0x30, - 0x14, 0x4d, 0xea, 0xf4, 0x75, 0xdb, 0x01, 0xac, 0x0a, 0x45, 0x45, 0x84, 0x28, 0x53, 0xa6, 0x44, - 0x2a, 0x0b, 0x13, 0x43, 0x61, 0x40, 0x30, 0x14, 0x79, 0x60, 0x60, 0x41, 0x6e, 0xeb, 0x36, 0x11, - 0x6d, 0x6c, 0x25, 0x8e, 0x44, 0xff, 0x82, 0xcf, 0xea, 0xd8, 0x91, 0x09, 0xa1, 0xf6, 0x47, 0x90, - 0xed, 0xa0, 0x16, 0x55, 0x6c, 0xe7, 0x71, 0x7d, 0x7c, 0xac, 0x6b, 0xb8, 0x90, 0x2c, 0x9b, 0xb2, - 0x7c, 0x99, 0x66, 0x32, 0x9e, 0xe4, 0x2b, 0x21, 0x79, 0x2c, 0x72, 0xce, 0x67, 0x91, 0xc8, 0xb9, - 0xe4, 0xf8, 0x74, 0x6f, 0x47, 0xc6, 0xee, 0xf7, 0xe6, 0x7c, 0xce, 0xb5, 0x1b, 0x2b, 0x64, 0x06, - 0x83, 0x19, 0xd4, 0x9f, 0xd4, 0x39, 0xdc, 0x83, 0xba, 0xe4, 0x92, 0x2e, 0x5c, 0xdb, 0xb7, 0x43, - 0x44, 0x0c, 0x51, 0x6a, 0x9a, 0x4d, 0xd9, 0xbb, 0x5b, 0x33, 0xaa, 0x26, 0xf8, 0x1c, 0xda, 0x0b, - 0x46, 0x67, 0xaf, 0x09, 0x2d, 0x12, 0x17, 0xf9, 0x76, 0xd8, 0x25, 0x2d, 0x25, 0xdc, 0xd3, 0x22, - 0x51, 0x47, 0x68, 0x99, 0xc9, 0xc2, 0x75, 0x7c, 0x14, 0x76, 0x89, 0x21, 0xc1, 0x23, 0x34, 0x9f, - 0xe9, 0xa2, 0x64, 0x23, 0x81, 0x4f, 0x00, 0xbd, 0xb1, 0x95, 0xbe, 0xa7, 0x4b, 0x14, 0xc4, 0x11, - 0xd4, 0x75, 0x79, 0x7d, 0x4b, 0x67, 0xe0, 0x46, 0x47, 0xed, 0x23, 0x5d, 0x92, 0x98, 0xb1, 0xe0, - 0x01, 0x5a, 0x77, 0x7c, 0x99, 0x66, 0xfc, 0x6f, 0x5a, 0xdb, 0xa4, 0xe9, 0xce, 0xa2, 0x94, 0x3a, - 0xad, 0x4d, 0x0c, 0xc1, 0x67, 0xd0, 0xe0, 0xa5, 0x54, 0x32, 0xd2, 0x72, 0xc5, 0x82, 0x5b, 0x68, - 0xea, 0xec, 0x91, 0xc0, 0x18, 0x1c, 0xb9, 0x12, 0xac, 0xca, 0xd2, 0xf8, 0x37, 0xbe, 0xb6, 0x2f, - 0x8b, 0xc1, 0x99, 0x52, 0x49, 0xab, 0x77, 0x6b, 0x1c, 0xdc, 0x40, 0xab, 0x0a, 0x29, 0xf0, 0x00, - 0x10, 0x17, 0x85, 0x6b, 0xfb, 0x28, 0xec, 0x0c, 0xfa, 0xff, 0x3d, 0x65, 0x24, 0x86, 0xce, 0xfa, - 0xeb, 0xd2, 0x22, 0x6a, 0x78, 0x48, 0xd6, 0x5b, 0xcf, 0xde, 0x6c, 0x3d, 0xfb, 0x7b, 0xeb, 0xd9, - 0x1f, 0x3b, 0xcf, 0xda, 0xec, 0x3c, 0xeb, 0x73, 0xe7, 0x59, 0x2f, 0xd7, 0xf3, 0x54, 0x26, 0xe5, - 0x38, 0x9a, 0xf0, 0x65, 0x7c, 0xb0, 0xf2, 0x03, 0x68, 0x56, 0x7a, 0xf4, 0x1d, 0xc6, 0x0d, 0x6d, - 0x5c, 0xfd, 0x04, 0x00, 0x00, 0xff, 0xff, 0x43, 0x5d, 0xb9, 0x45, 0x2a, 0x02, 0x00, 0x00, -} - -func (m *Proof) 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 *Proof) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Proof) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Aunts) > 0 { - for iNdEx := len(m.Aunts) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Aunts[iNdEx]) - copy(dAtA[i:], m.Aunts[iNdEx]) - i = encodeVarintProof(dAtA, i, uint64(len(m.Aunts[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.LeafHash) > 0 { - i -= len(m.LeafHash) - copy(dAtA[i:], m.LeafHash) - i = encodeVarintProof(dAtA, i, uint64(len(m.LeafHash))) - i-- - dAtA[i] = 0x1a - } - if m.Index != 0 { - i = encodeVarintProof(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x10 - } - if m.Total != 0 { - i = encodeVarintProof(dAtA, i, uint64(m.Total)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *ValueOp) 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 *ValueOp) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ValueOp) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Proof != nil { - { - size, err := m.Proof.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProof(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintProof(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *DominoOp) 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 *DominoOp) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DominoOp) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Output) > 0 { - i -= len(m.Output) - copy(dAtA[i:], m.Output) - i = encodeVarintProof(dAtA, i, uint64(len(m.Output))) - i-- - dAtA[i] = 0x1a - } - if len(m.Input) > 0 { - i -= len(m.Input) - copy(dAtA[i:], m.Input) - i = encodeVarintProof(dAtA, i, uint64(len(m.Input))) - i-- - dAtA[i] = 0x12 - } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintProof(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ProofOp) 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 *ProofOp) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ProofOp) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintProof(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x1a - } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintProof(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0x12 - } - if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintProof(dAtA, i, uint64(len(m.Type))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ProofOps) 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 *ProofOps) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ProofOps) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Ops) > 0 { - for iNdEx := len(m.Ops) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Ops[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProof(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintProof(dAtA []byte, offset int, v uint64) int { - offset -= sovProof(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *Proof) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Total != 0 { - n += 1 + sovProof(uint64(m.Total)) - } - if m.Index != 0 { - n += 1 + sovProof(uint64(m.Index)) - } - l = len(m.LeafHash) - if l > 0 { - n += 1 + l + sovProof(uint64(l)) - } - if len(m.Aunts) > 0 { - for _, b := range m.Aunts { - l = len(b) - n += 1 + l + sovProof(uint64(l)) - } - } - return n -} - -func (m *ValueOp) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovProof(uint64(l)) - } - if m.Proof != nil { - l = m.Proof.Size() - n += 1 + l + sovProof(uint64(l)) - } - return n -} - -func (m *DominoOp) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovProof(uint64(l)) - } - l = len(m.Input) - if l > 0 { - n += 1 + l + sovProof(uint64(l)) - } - l = len(m.Output) - if l > 0 { - n += 1 + l + sovProof(uint64(l)) - } - return n -} - -func (m *ProofOp) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Type) - if l > 0 { - n += 1 + l + sovProof(uint64(l)) - } - l = len(m.Key) - if l > 0 { - n += 1 + l + sovProof(uint64(l)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovProof(uint64(l)) - } - return n -} - -func (m *ProofOps) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Ops) > 0 { - for _, e := range m.Ops { - l = e.Size() - n += 1 + l + sovProof(uint64(l)) - } - } - return n -} - -func sovProof(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozProof(x uint64) (n int) { - return sovProof(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *Proof) 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 ErrIntOverflowProof - } - 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: Proof: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Proof: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Total", wireType) - } - m.Total = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Total |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LeafHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.LeafHash = append(m.LeafHash[:0], dAtA[iNdEx:postIndex]...) - if m.LeafHash == nil { - m.LeafHash = []byte{} - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Aunts", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Aunts = append(m.Aunts, make([]byte, postIndex-iNdEx)) - copy(m.Aunts[len(m.Aunts)-1], dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProof(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProof - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ValueOp) 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 ErrIntOverflowProof - } - 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: ValueOp: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ValueOp: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Proof == nil { - m.Proof = &Proof{} - } - if err := m.Proof.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProof(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProof - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *DominoOp) 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 ErrIntOverflowProof - } - 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: DominoOp: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DominoOp: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Input", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Input = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Output", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Output = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProof(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProof - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ProofOp) 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 ErrIntOverflowProof - } - 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: ProofOp: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ProofOp: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Type = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProof(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProof - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ProofOps) 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 ErrIntOverflowProof - } - 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: ProofOps: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ProofOps: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ops", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProof - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthProof - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthProof - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Ops = append(m.Ops, ProofOp{}) - if err := m.Ops[len(m.Ops)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProof(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProof - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipProof(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, ErrIntOverflowProof - } - 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, ErrIntOverflowProof - } - 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, ErrIntOverflowProof - } - 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, ErrInvalidLengthProof - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupProof - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthProof - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthProof = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowProof = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupProof = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/crypto/proof.proto b/third_party/proto/tendermint/crypto/proof.proto deleted file mode 100644 index 975df76853..0000000000 --- a/third_party/proto/tendermint/crypto/proof.proto +++ /dev/null @@ -1,41 +0,0 @@ -syntax = "proto3"; -package tendermint.crypto; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/crypto"; - -import "gogoproto/gogo.proto"; - -message Proof { - int64 total = 1; - int64 index = 2; - bytes leaf_hash = 3; - repeated bytes aunts = 4; -} - -message ValueOp { - // Encoded in ProofOp.Key. - bytes key = 1; - - // To encode in ProofOp.Data - Proof proof = 2; -} - -message DominoOp { - string key = 1; - string input = 2; - string output = 3; -} - -// ProofOp defines an operation used for calculating Merkle root -// The data could be arbitrary format, providing nessecary data -// for example neighbouring node hash -message ProofOp { - string type = 1; - bytes key = 2; - bytes data = 3; -} - -// ProofOps is Merkle proof defined by the list of ProofOps -message ProofOps { - repeated ProofOp ops = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/tendermint/libs/bits/types.pb.go b/third_party/proto/tendermint/libs/bits/types.pb.go deleted file mode 100644 index af529c7936..0000000000 --- a/third_party/proto/tendermint/libs/bits/types.pb.go +++ /dev/null @@ -1,421 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/libs/bits/types.proto - -package bits - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 BitArray struct { - Bits int64 `protobuf:"varint,1,opt,name=bits,proto3" json:"bits,omitempty"` - Elems []uint64 `protobuf:"varint,2,rep,packed,name=elems,proto3" json:"elems,omitempty"` -} - -func (m *BitArray) Reset() { *m = BitArray{} } -func (m *BitArray) String() string { return proto.CompactTextString(m) } -func (*BitArray) ProtoMessage() {} -func (*BitArray) Descriptor() ([]byte, []int) { - return fileDescriptor_e91ab2672920d7d4, []int{0} -} - -func (m *BitArray) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *BitArray) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BitArray.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 *BitArray) XXX_Merge(src proto.Message) { - xxx_messageInfo_BitArray.Merge(m, src) -} - -func (m *BitArray) XXX_Size() int { - return m.Size() -} - -func (m *BitArray) XXX_DiscardUnknown() { - xxx_messageInfo_BitArray.DiscardUnknown(m) -} - -var xxx_messageInfo_BitArray proto.InternalMessageInfo - -func (m *BitArray) GetBits() int64 { - if m != nil { - return m.Bits - } - return 0 -} - -func (m *BitArray) GetElems() []uint64 { - if m != nil { - return m.Elems - } - return nil -} - -func init() { - proto.RegisterType((*BitArray)(nil), "tendermint.libs.bits.BitArray") -} - -func init() { proto.RegisterFile("tendermint/libs/bits/types.proto", fileDescriptor_e91ab2672920d7d4) } - -var fileDescriptor_e91ab2672920d7d4 = []byte{ - // 168 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x28, 0x49, 0xcd, 0x4b, - 0x49, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0xcf, 0xc9, 0x4c, 0x2a, 0xd6, 0x4f, 0xca, 0x2c, 0x29, - 0xd6, 0x2f, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x41, 0xa8, - 0xd0, 0x03, 0xa9, 0xd0, 0x03, 0xa9, 0x50, 0x32, 0xe1, 0xe2, 0x70, 0xca, 0x2c, 0x71, 0x2c, 0x2a, - 0x4a, 0xac, 0x14, 0x12, 0xe2, 0x62, 0x01, 0x89, 0x49, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0x81, - 0xd9, 0x42, 0x22, 0x5c, 0xac, 0xa9, 0x39, 0xa9, 0xb9, 0xc5, 0x12, 0x4c, 0x0a, 0xcc, 0x1a, 0x2c, - 0x41, 0x10, 0x8e, 0x53, 0xe8, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, - 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x59, - 0xa7, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x23, 0x39, 0x09, 0x89, 0x09, - 0x76, 0x8d, 0x3e, 0x36, 0xe7, 0x26, 0xb1, 0x81, 0xe5, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x5b, 0x0c, 0xe3, 0x3e, 0xcd, 0x00, 0x00, 0x00, -} - -func (m *BitArray) 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 *BitArray) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BitArray) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Elems) > 0 { - dAtA2 := make([]byte, len(m.Elems)*10) - var j1 int - for _, num := range m.Elems { - for num >= 1<<7 { - dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j1++ - } - dAtA2[j1] = uint8(num) - j1++ - } - i -= j1 - copy(dAtA[i:], dAtA2[:j1]) - i = encodeVarintTypes(dAtA, i, uint64(j1)) - i-- - dAtA[i] = 0x12 - } - if m.Bits != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Bits)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *BitArray) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Bits != 0 { - n += 1 + sovTypes(uint64(m.Bits)) - } - if len(m.Elems) > 0 { - l = 0 - for _, e := range m.Elems { - l += sovTypes(uint64(e)) - } - n += 1 + sovTypes(uint64(l)) + l - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *BitArray) 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 ErrIntOverflowTypes - } - 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: BitArray: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BitArray: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Bits", wireType) - } - m.Bits = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Bits |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType == 0 { - var v uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Elems = append(m.Elems, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.Elems) == 0 { - m.Elems = make([]uint64, 0, elementCount) - } - for iNdEx < postIndex { - var v uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Elems = append(m.Elems, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field Elems", wireType) - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/libs/bits/types.proto b/third_party/proto/tendermint/libs/bits/types.proto deleted file mode 100644 index 3111d113a5..0000000000 --- a/third_party/proto/tendermint/libs/bits/types.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; -package tendermint.libs.bits; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/libs/bits"; - -message BitArray { - int64 bits = 1; - repeated uint64 elems = 2; -} diff --git a/third_party/proto/tendermint/mempool/types.pb.go b/third_party/proto/tendermint/mempool/types.pb.go deleted file mode 100644 index 95374d3343..0000000000 --- a/third_party/proto/tendermint/mempool/types.pb.go +++ /dev/null @@ -1,576 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/mempool/types.proto - -package mempool - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 Txs struct { - Txs [][]byte `protobuf:"bytes,1,rep,name=txs,proto3" json:"txs,omitempty"` -} - -func (m *Txs) Reset() { *m = Txs{} } -func (m *Txs) String() string { return proto.CompactTextString(m) } -func (*Txs) ProtoMessage() {} -func (*Txs) Descriptor() ([]byte, []int) { - return fileDescriptor_2af51926fdbcbc05, []int{0} -} - -func (m *Txs) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Txs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Txs.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 *Txs) XXX_Merge(src proto.Message) { - xxx_messageInfo_Txs.Merge(m, src) -} - -func (m *Txs) XXX_Size() int { - return m.Size() -} - -func (m *Txs) XXX_DiscardUnknown() { - xxx_messageInfo_Txs.DiscardUnknown(m) -} - -var xxx_messageInfo_Txs proto.InternalMessageInfo - -func (m *Txs) GetTxs() [][]byte { - if m != nil { - return m.Txs - } - return nil -} - -type Message struct { - // Types that are valid to be assigned to Sum: - // *Message_Txs - Sum isMessage_Sum `protobuf_oneof:"sum"` -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} -func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_2af51926fdbcbc05, []int{1} -} - -func (m *Message) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Message.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 *Message) XXX_Merge(src proto.Message) { - xxx_messageInfo_Message.Merge(m, src) -} - -func (m *Message) XXX_Size() int { - return m.Size() -} - -func (m *Message) XXX_DiscardUnknown() { - xxx_messageInfo_Message.DiscardUnknown(m) -} - -var xxx_messageInfo_Message proto.InternalMessageInfo - -type isMessage_Sum interface { - isMessage_Sum() - MarshalTo([]byte) (int, error) - Size() int -} - -type Message_Txs struct { - Txs *Txs `protobuf:"bytes,1,opt,name=txs,proto3,oneof" json:"txs,omitempty"` -} - -func (*Message_Txs) isMessage_Sum() {} - -func (m *Message) GetSum() isMessage_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *Message) GetTxs() *Txs { - if x, ok := m.GetSum().(*Message_Txs); ok { - return x.Txs - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Message) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Message_Txs)(nil), - } -} - -func init() { - proto.RegisterType((*Txs)(nil), "tendermint.mempool.Txs") - proto.RegisterType((*Message)(nil), "tendermint.mempool.Message") -} - -func init() { proto.RegisterFile("tendermint/mempool/types.proto", fileDescriptor_2af51926fdbcbc05) } - -var fileDescriptor_2af51926fdbcbc05 = []byte{ - // 179 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2b, 0x49, 0xcd, 0x4b, - 0x49, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0xcf, 0x4d, 0xcd, 0x2d, 0xc8, 0xcf, 0xcf, 0xd1, 0x2f, - 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x42, 0xc8, 0xeb, 0x41, - 0xe5, 0x95, 0xc4, 0xb9, 0x98, 0x43, 0x2a, 0x8a, 0x85, 0x04, 0xb8, 0x98, 0x4b, 0x2a, 0x8a, 0x25, - 0x18, 0x15, 0x98, 0x35, 0x78, 0x82, 0x40, 0x4c, 0x25, 0x5b, 0x2e, 0x76, 0xdf, 0xd4, 0xe2, 0xe2, - 0xc4, 0xf4, 0x54, 0x21, 0x6d, 0x98, 0x24, 0xa3, 0x06, 0xb7, 0x91, 0xb8, 0x1e, 0xa6, 0x29, 0x7a, - 0x21, 0x15, 0xc5, 0x1e, 0x0c, 0x60, 0x7d, 0x4e, 0xac, 0x5c, 0xcc, 0xc5, 0xa5, 0xb9, 0x4e, 0xc1, - 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, - 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0x65, 0x99, 0x9e, 0x59, 0x92, 0x51, - 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x8f, 0xe4, 0x60, 0x24, 0x26, 0xd8, 0xb5, 0xfa, 0x98, 0x9e, - 0x49, 0x62, 0x03, 0xcb, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xca, 0xc3, 0xa0, 0xfc, 0xe9, - 0x00, 0x00, 0x00, -} - -func (m *Txs) 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 *Txs) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Txs) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Txs) > 0 { - for iNdEx := len(m.Txs) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Txs[iNdEx]) - copy(dAtA[i:], m.Txs[iNdEx]) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Txs[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *Message) 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 *Message) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *Message_Txs) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_Txs) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Txs != nil { - { - size, err := m.Txs.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *Txs) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Txs) > 0 { - for _, b := range m.Txs { - l = len(b) - n += 1 + l + sovTypes(uint64(l)) - } - } - return n -} - -func (m *Message) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *Message_Txs) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Txs != nil { - l = m.Txs.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *Txs) 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 ErrIntOverflowTypes - } - 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: Txs: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Txs: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Txs", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Txs = append(m.Txs, make([]byte, postIndex-iNdEx)) - copy(m.Txs[len(m.Txs)-1], dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Message) 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 ErrIntOverflowTypes - } - 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: Message: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Message: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Txs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Txs{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_Txs{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/mempool/types.proto b/third_party/proto/tendermint/mempool/types.proto deleted file mode 100644 index b55d9717b1..0000000000 --- a/third_party/proto/tendermint/mempool/types.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; -package tendermint.mempool; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/mempool"; - -message Txs { - repeated bytes txs = 1; -} - -message Message { - oneof sum { - Txs txs = 1; - } -} diff --git a/third_party/proto/tendermint/p2p/conn.pb.go b/third_party/proto/tendermint/p2p/conn.pb.go deleted file mode 100644 index 3638173020..0000000000 --- a/third_party/proto/tendermint/p2p/conn.pb.go +++ /dev/null @@ -1,1310 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/p2p/conn.proto - -package p2p - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 PacketPing struct{} - -func (m *PacketPing) Reset() { *m = PacketPing{} } -func (m *PacketPing) String() string { return proto.CompactTextString(m) } -func (*PacketPing) ProtoMessage() {} -func (*PacketPing) Descriptor() ([]byte, []int) { - return fileDescriptor_22474b5527c8fa9f, []int{0} -} - -func (m *PacketPing) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PacketPing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PacketPing.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 *PacketPing) XXX_Merge(src proto.Message) { - xxx_messageInfo_PacketPing.Merge(m, src) -} - -func (m *PacketPing) XXX_Size() int { - return m.Size() -} - -func (m *PacketPing) XXX_DiscardUnknown() { - xxx_messageInfo_PacketPing.DiscardUnknown(m) -} - -var xxx_messageInfo_PacketPing proto.InternalMessageInfo - -type PacketPong struct{} - -func (m *PacketPong) Reset() { *m = PacketPong{} } -func (m *PacketPong) String() string { return proto.CompactTextString(m) } -func (*PacketPong) ProtoMessage() {} -func (*PacketPong) Descriptor() ([]byte, []int) { - return fileDescriptor_22474b5527c8fa9f, []int{1} -} - -func (m *PacketPong) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PacketPong) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PacketPong.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 *PacketPong) XXX_Merge(src proto.Message) { - xxx_messageInfo_PacketPong.Merge(m, src) -} - -func (m *PacketPong) XXX_Size() int { - return m.Size() -} - -func (m *PacketPong) XXX_DiscardUnknown() { - xxx_messageInfo_PacketPong.DiscardUnknown(m) -} - -var xxx_messageInfo_PacketPong proto.InternalMessageInfo - -type PacketMsg struct { - ChannelID int32 `protobuf:"varint,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"` - EOF bool `protobuf:"varint,2,opt,name=eof,proto3" json:"eof,omitempty"` - Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` -} - -func (m *PacketMsg) Reset() { *m = PacketMsg{} } -func (m *PacketMsg) String() string { return proto.CompactTextString(m) } -func (*PacketMsg) ProtoMessage() {} -func (*PacketMsg) Descriptor() ([]byte, []int) { - return fileDescriptor_22474b5527c8fa9f, []int{2} -} - -func (m *PacketMsg) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PacketMsg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PacketMsg.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 *PacketMsg) XXX_Merge(src proto.Message) { - xxx_messageInfo_PacketMsg.Merge(m, src) -} - -func (m *PacketMsg) XXX_Size() int { - return m.Size() -} - -func (m *PacketMsg) XXX_DiscardUnknown() { - xxx_messageInfo_PacketMsg.DiscardUnknown(m) -} - -var xxx_messageInfo_PacketMsg proto.InternalMessageInfo - -func (m *PacketMsg) GetChannelID() int32 { - if m != nil { - return m.ChannelID - } - return 0 -} - -func (m *PacketMsg) GetEOF() bool { - if m != nil { - return m.EOF - } - return false -} - -func (m *PacketMsg) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -type Packet struct { - // Types that are valid to be assigned to Sum: - // *Packet_PacketPing - // *Packet_PacketPong - // *Packet_PacketMsg - Sum isPacket_Sum `protobuf_oneof:"sum"` -} - -func (m *Packet) Reset() { *m = Packet{} } -func (m *Packet) String() string { return proto.CompactTextString(m) } -func (*Packet) ProtoMessage() {} -func (*Packet) Descriptor() ([]byte, []int) { - return fileDescriptor_22474b5527c8fa9f, []int{3} -} - -func (m *Packet) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Packet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Packet.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 *Packet) XXX_Merge(src proto.Message) { - xxx_messageInfo_Packet.Merge(m, src) -} - -func (m *Packet) XXX_Size() int { - return m.Size() -} - -func (m *Packet) XXX_DiscardUnknown() { - xxx_messageInfo_Packet.DiscardUnknown(m) -} - -var xxx_messageInfo_Packet proto.InternalMessageInfo - -type isPacket_Sum interface { - isPacket_Sum() - MarshalTo([]byte) (int, error) - Size() int -} - -type Packet_PacketPing struct { - PacketPing *PacketPing `protobuf:"bytes,1,opt,name=packet_ping,json=packetPing,proto3,oneof" json:"packet_ping,omitempty"` -} -type Packet_PacketPong struct { - PacketPong *PacketPong `protobuf:"bytes,2,opt,name=packet_pong,json=packetPong,proto3,oneof" json:"packet_pong,omitempty"` -} -type Packet_PacketMsg struct { - PacketMsg *PacketMsg `protobuf:"bytes,3,opt,name=packet_msg,json=packetMsg,proto3,oneof" json:"packet_msg,omitempty"` -} - -func (*Packet_PacketPing) isPacket_Sum() {} -func (*Packet_PacketPong) isPacket_Sum() {} -func (*Packet_PacketMsg) isPacket_Sum() {} - -func (m *Packet) GetSum() isPacket_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *Packet) GetPacketPing() *PacketPing { - if x, ok := m.GetSum().(*Packet_PacketPing); ok { - return x.PacketPing - } - return nil -} - -func (m *Packet) GetPacketPong() *PacketPong { - if x, ok := m.GetSum().(*Packet_PacketPong); ok { - return x.PacketPong - } - return nil -} - -func (m *Packet) GetPacketMsg() *PacketMsg { - if x, ok := m.GetSum().(*Packet_PacketMsg); ok { - return x.PacketMsg - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Packet) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Packet_PacketPing)(nil), - (*Packet_PacketPong)(nil), - (*Packet_PacketMsg)(nil), - } -} - -type AuthSigMessage struct { - PubKey crypto.PublicKey `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key"` - Sig []byte `protobuf:"bytes,2,opt,name=sig,proto3" json:"sig,omitempty"` -} - -func (m *AuthSigMessage) Reset() { *m = AuthSigMessage{} } -func (m *AuthSigMessage) String() string { return proto.CompactTextString(m) } -func (*AuthSigMessage) ProtoMessage() {} -func (*AuthSigMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_22474b5527c8fa9f, []int{4} -} - -func (m *AuthSigMessage) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *AuthSigMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AuthSigMessage.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 *AuthSigMessage) XXX_Merge(src proto.Message) { - xxx_messageInfo_AuthSigMessage.Merge(m, src) -} - -func (m *AuthSigMessage) XXX_Size() int { - return m.Size() -} - -func (m *AuthSigMessage) XXX_DiscardUnknown() { - xxx_messageInfo_AuthSigMessage.DiscardUnknown(m) -} - -var xxx_messageInfo_AuthSigMessage proto.InternalMessageInfo - -func (m *AuthSigMessage) GetPubKey() crypto.PublicKey { - if m != nil { - return m.PubKey - } - return crypto.PublicKey{} -} - -func (m *AuthSigMessage) GetSig() []byte { - if m != nil { - return m.Sig - } - return nil -} - -func init() { - proto.RegisterType((*PacketPing)(nil), "tendermint.p2p.PacketPing") - proto.RegisterType((*PacketPong)(nil), "tendermint.p2p.PacketPong") - proto.RegisterType((*PacketMsg)(nil), "tendermint.p2p.PacketMsg") - proto.RegisterType((*Packet)(nil), "tendermint.p2p.Packet") - proto.RegisterType((*AuthSigMessage)(nil), "tendermint.p2p.AuthSigMessage") -} - -func init() { proto.RegisterFile("tendermint/p2p/conn.proto", fileDescriptor_22474b5527c8fa9f) } - -var fileDescriptor_22474b5527c8fa9f = []byte{ - // 395 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x52, 0x3d, 0x8f, 0xd3, 0x40, - 0x10, 0xf5, 0xe2, 0xbb, 0x1c, 0x99, 0x84, 0x13, 0x5a, 0x51, 0x24, 0xd1, 0xc9, 0x89, 0x5c, 0xa5, - 0x40, 0xb6, 0x64, 0x44, 0x03, 0xa2, 0xc0, 0x7c, 0x88, 0xd3, 0x29, 0xba, 0xc8, 0x74, 0x34, 0x96, - 0x3f, 0x96, 0xf5, 0x2a, 0xe7, 0xdd, 0x55, 0x76, 0x5d, 0xf8, 0x5f, 0xf0, 0xb3, 0x8e, 0xee, 0x4a, - 0xaa, 0x08, 0x39, 0x7f, 0x04, 0x79, 0x1d, 0x88, 0x23, 0x71, 0xdd, 0x7b, 0x33, 0xf3, 0xe6, 0x43, - 0xf3, 0x60, 0xaa, 0x09, 0xcf, 0xc9, 0xb6, 0x64, 0x5c, 0xfb, 0x32, 0x90, 0x7e, 0x26, 0x38, 0xf7, - 0xe4, 0x56, 0x68, 0x81, 0x2f, 0x8f, 0x29, 0x4f, 0x06, 0x72, 0xf6, 0x82, 0x0a, 0x2a, 0x4c, 0xca, - 0x6f, 0x51, 0x57, 0x35, 0xbb, 0xea, 0x35, 0xc8, 0xb6, 0xb5, 0xd4, 0xc2, 0xdf, 0x90, 0x5a, 0x75, - 0x59, 0x77, 0x0c, 0xb0, 0x4e, 0xb2, 0x0d, 0xd1, 0x6b, 0xc6, 0x69, 0x8f, 0x09, 0x4e, 0xdd, 0x02, - 0x86, 0x1d, 0x5b, 0x29, 0x8a, 0x5f, 0x02, 0x64, 0x45, 0xc2, 0x39, 0xb9, 0x8b, 0x59, 0x3e, 0x41, - 0x0b, 0xb4, 0x3c, 0x0f, 0x9f, 0x35, 0xbb, 0xf9, 0xf0, 0x43, 0x17, 0xbd, 0xfe, 0x18, 0x0d, 0x0f, - 0x05, 0xd7, 0x39, 0x9e, 0x82, 0x4d, 0xc4, 0xf7, 0xc9, 0x93, 0x05, 0x5a, 0x3e, 0x0d, 0x2f, 0x9a, - 0xdd, 0xdc, 0xfe, 0x74, 0xfb, 0x39, 0x6a, 0x63, 0x18, 0xc3, 0x59, 0x9e, 0xe8, 0x64, 0x62, 0x2f, - 0xd0, 0x72, 0x1c, 0x19, 0xec, 0xfe, 0x44, 0x30, 0xe8, 0x46, 0xe1, 0x77, 0x30, 0x92, 0x06, 0xc5, - 0x92, 0x71, 0x6a, 0x06, 0x8d, 0x82, 0x99, 0x77, 0x7a, 0xaa, 0x77, 0xdc, 0xf9, 0x8b, 0x15, 0x81, - 0xfc, 0xc7, 0xfa, 0x72, 0xc1, 0xa9, 0x59, 0xe0, 0x71, 0xb9, 0x38, 0x91, 0x0b, 0x4e, 0xf1, 0x1b, - 0x38, 0xb0, 0xb8, 0x54, 0xd4, 0xac, 0x38, 0x0a, 0xa6, 0xff, 0x57, 0xaf, 0x54, 0x2b, 0x1e, 0xca, - 0xbf, 0x24, 0x3c, 0x07, 0x5b, 0x55, 0xa5, 0x1b, 0xc3, 0xe5, 0xfb, 0x4a, 0x17, 0x5f, 0x19, 0x5d, - 0x11, 0xa5, 0x12, 0x4a, 0xf0, 0x5b, 0xb8, 0x90, 0x55, 0x1a, 0x6f, 0x48, 0x7d, 0x38, 0xe7, 0xaa, - 0xdf, 0xb1, 0xfb, 0x89, 0xb7, 0xae, 0xd2, 0x3b, 0x96, 0xdd, 0x90, 0x3a, 0x3c, 0xbb, 0xdf, 0xcd, - 0xad, 0x68, 0x20, 0xab, 0xf4, 0x86, 0xd4, 0xf8, 0x39, 0xd8, 0x8a, 0x75, 0x87, 0x8c, 0xa3, 0x16, - 0x86, 0xb7, 0xf7, 0x8d, 0x83, 0x1e, 0x1a, 0x07, 0xfd, 0x6e, 0x1c, 0xf4, 0x63, 0xef, 0x58, 0x0f, - 0x7b, 0xc7, 0xfa, 0xb5, 0x77, 0xac, 0x6f, 0xaf, 0x29, 0xd3, 0x45, 0x95, 0x7a, 0x99, 0x28, 0xfd, - 0xde, 0xd7, 0xfb, 0x0e, 0x32, 0xee, 0x38, 0xb5, 0x54, 0x3a, 0x30, 0xd1, 0x57, 0x7f, 0x02, 0x00, - 0x00, 0xff, 0xff, 0x30, 0xfd, 0xb2, 0x8d, 0x6b, 0x02, 0x00, 0x00, -} - -func (m *PacketPing) 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 *PacketPing) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PacketPing) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *PacketPong) 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 *PacketPong) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PacketPong) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *PacketMsg) 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 *PacketMsg) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PacketMsg) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintConn(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x1a - } - if m.EOF { - i-- - if m.EOF { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if m.ChannelID != 0 { - i = encodeVarintConn(dAtA, i, uint64(m.ChannelID)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Packet) 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 *Packet) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Packet) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *Packet_PacketPing) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Packet_PacketPing) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.PacketPing != nil { - { - size, err := m.PacketPing.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintConn(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Packet_PacketPong) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Packet_PacketPong) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.PacketPong != nil { - { - size, err := m.PacketPong.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintConn(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} - -func (m *Packet_PacketMsg) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Packet_PacketMsg) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.PacketMsg != nil { - { - size, err := m.PacketMsg.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintConn(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} - -func (m *AuthSigMessage) 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 *AuthSigMessage) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AuthSigMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Sig) > 0 { - i -= len(m.Sig) - copy(dAtA[i:], m.Sig) - i = encodeVarintConn(dAtA, i, uint64(len(m.Sig))) - i-- - dAtA[i] = 0x12 - } - { - size, err := m.PubKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintConn(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintConn(dAtA []byte, offset int, v uint64) int { - offset -= sovConn(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *PacketPing) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *PacketPong) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *PacketMsg) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ChannelID != 0 { - n += 1 + sovConn(uint64(m.ChannelID)) - } - if m.EOF { - n += 2 - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovConn(uint64(l)) - } - return n -} - -func (m *Packet) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *Packet_PacketPing) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PacketPing != nil { - l = m.PacketPing.Size() - n += 1 + l + sovConn(uint64(l)) - } - return n -} - -func (m *Packet_PacketPong) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PacketPong != nil { - l = m.PacketPong.Size() - n += 1 + l + sovConn(uint64(l)) - } - return n -} - -func (m *Packet_PacketMsg) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PacketMsg != nil { - l = m.PacketMsg.Size() - n += 1 + l + sovConn(uint64(l)) - } - return n -} - -func (m *AuthSigMessage) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.PubKey.Size() - n += 1 + l + sovConn(uint64(l)) - l = len(m.Sig) - if l > 0 { - n += 1 + l + sovConn(uint64(l)) - } - return n -} - -func sovConn(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozConn(x uint64) (n int) { - return sovConn(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *PacketPing) 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 ErrIntOverflowConn - } - 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: PacketPing: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PacketPing: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipConn(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthConn - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *PacketPong) 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 ErrIntOverflowConn - } - 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: PacketPong: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PacketPong: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipConn(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthConn - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *PacketMsg) 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 ErrIntOverflowConn - } - 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: PacketMsg: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PacketMsg: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ChannelID", wireType) - } - m.ChannelID = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowConn - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ChannelID |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EOF", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowConn - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EOF = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowConn - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthConn - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthConn - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipConn(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthConn - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Packet) 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 ErrIntOverflowConn - } - 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: Packet: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Packet: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PacketPing", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowConn - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthConn - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthConn - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PacketPing{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Packet_PacketPing{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PacketPong", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowConn - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthConn - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthConn - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PacketPong{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Packet_PacketPong{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PacketMsg", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowConn - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthConn - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthConn - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PacketMsg{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Packet_PacketMsg{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipConn(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthConn - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *AuthSigMessage) 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 ErrIntOverflowConn - } - 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: AuthSigMessage: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AuthSigMessage: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKey", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowConn - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthConn - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthConn - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sig", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowConn - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthConn - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthConn - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sig = append(m.Sig[:0], dAtA[iNdEx:postIndex]...) - if m.Sig == nil { - m.Sig = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipConn(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthConn - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipConn(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, ErrIntOverflowConn - } - 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, ErrIntOverflowConn - } - 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, ErrIntOverflowConn - } - 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, ErrInvalidLengthConn - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupConn - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthConn - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthConn = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowConn = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupConn = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/p2p/conn.proto b/third_party/proto/tendermint/p2p/conn.proto deleted file mode 100644 index b12de6c827..0000000000 --- a/third_party/proto/tendermint/p2p/conn.proto +++ /dev/null @@ -1,30 +0,0 @@ -syntax = "proto3"; -package tendermint.p2p; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/p2p"; - -import "gogoproto/gogo.proto"; -import "tendermint/crypto/keys.proto"; - -message PacketPing {} - -message PacketPong {} - -message PacketMsg { - int32 channel_id = 1 [(gogoproto.customname) = "ChannelID"]; - bool eof = 2 [(gogoproto.customname) = "EOF"]; - bytes data = 3; -} - -message Packet { - oneof sum { - PacketPing packet_ping = 1; - PacketPong packet_pong = 2; - PacketMsg packet_msg = 3; - } -} - -message AuthSigMessage { - tendermint.crypto.PublicKey pub_key = 1 [(gogoproto.nullable) = false]; - bytes sig = 2; -} diff --git a/third_party/proto/tendermint/p2p/pex.pb.go b/third_party/proto/tendermint/p2p/pex.pb.go deleted file mode 100644 index 3252f41a29..0000000000 --- a/third_party/proto/tendermint/p2p/pex.pb.go +++ /dev/null @@ -1,796 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/p2p/pex.proto - -package p2p - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 PexRequest struct{} - -func (m *PexRequest) Reset() { *m = PexRequest{} } -func (m *PexRequest) String() string { return proto.CompactTextString(m) } -func (*PexRequest) ProtoMessage() {} -func (*PexRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_81c2f011fd13be57, []int{0} -} - -func (m *PexRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PexRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PexRequest.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 *PexRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PexRequest.Merge(m, src) -} - -func (m *PexRequest) XXX_Size() int { - return m.Size() -} - -func (m *PexRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PexRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PexRequest proto.InternalMessageInfo - -type PexAddrs struct { - Addrs []NetAddress `protobuf:"bytes,1,rep,name=addrs,proto3" json:"addrs"` -} - -func (m *PexAddrs) Reset() { *m = PexAddrs{} } -func (m *PexAddrs) String() string { return proto.CompactTextString(m) } -func (*PexAddrs) ProtoMessage() {} -func (*PexAddrs) Descriptor() ([]byte, []int) { - return fileDescriptor_81c2f011fd13be57, []int{1} -} - -func (m *PexAddrs) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PexAddrs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PexAddrs.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 *PexAddrs) XXX_Merge(src proto.Message) { - xxx_messageInfo_PexAddrs.Merge(m, src) -} - -func (m *PexAddrs) XXX_Size() int { - return m.Size() -} - -func (m *PexAddrs) XXX_DiscardUnknown() { - xxx_messageInfo_PexAddrs.DiscardUnknown(m) -} - -var xxx_messageInfo_PexAddrs proto.InternalMessageInfo - -func (m *PexAddrs) GetAddrs() []NetAddress { - if m != nil { - return m.Addrs - } - return nil -} - -type Message struct { - // Types that are valid to be assigned to Sum: - // *Message_PexRequest - // *Message_PexAddrs - Sum isMessage_Sum `protobuf_oneof:"sum"` -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} -func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_81c2f011fd13be57, []int{2} -} - -func (m *Message) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Message.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 *Message) XXX_Merge(src proto.Message) { - xxx_messageInfo_Message.Merge(m, src) -} - -func (m *Message) XXX_Size() int { - return m.Size() -} - -func (m *Message) XXX_DiscardUnknown() { - xxx_messageInfo_Message.DiscardUnknown(m) -} - -var xxx_messageInfo_Message proto.InternalMessageInfo - -type isMessage_Sum interface { - isMessage_Sum() - MarshalTo([]byte) (int, error) - Size() int -} - -type Message_PexRequest struct { - PexRequest *PexRequest `protobuf:"bytes,1,opt,name=pex_request,json=pexRequest,proto3,oneof" json:"pex_request,omitempty"` -} -type Message_PexAddrs struct { - PexAddrs *PexAddrs `protobuf:"bytes,2,opt,name=pex_addrs,json=pexAddrs,proto3,oneof" json:"pex_addrs,omitempty"` -} - -func (*Message_PexRequest) isMessage_Sum() {} -func (*Message_PexAddrs) isMessage_Sum() {} - -func (m *Message) GetSum() isMessage_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *Message) GetPexRequest() *PexRequest { - if x, ok := m.GetSum().(*Message_PexRequest); ok { - return x.PexRequest - } - return nil -} - -func (m *Message) GetPexAddrs() *PexAddrs { - if x, ok := m.GetSum().(*Message_PexAddrs); ok { - return x.PexAddrs - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Message) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Message_PexRequest)(nil), - (*Message_PexAddrs)(nil), - } -} - -func init() { - proto.RegisterType((*PexRequest)(nil), "tendermint.p2p.PexRequest") - proto.RegisterType((*PexAddrs)(nil), "tendermint.p2p.PexAddrs") - proto.RegisterType((*Message)(nil), "tendermint.p2p.Message") -} - -func init() { proto.RegisterFile("tendermint/p2p/pex.proto", fileDescriptor_81c2f011fd13be57) } - -var fileDescriptor_81c2f011fd13be57 = []byte{ - // 268 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x28, 0x49, 0xcd, 0x4b, - 0x49, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0x2f, 0x30, 0x2a, 0xd0, 0x2f, 0x48, 0xad, 0xd0, 0x2b, - 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x43, 0xc8, 0xe8, 0x15, 0x18, 0x15, 0x48, 0x49, 0xa1, 0xa9, - 0x2c, 0xa9, 0x2c, 0x48, 0x2d, 0x86, 0xa8, 0x95, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x33, 0xf5, - 0x41, 0x2c, 0x88, 0xa8, 0x12, 0x0f, 0x17, 0x57, 0x40, 0x6a, 0x45, 0x50, 0x6a, 0x61, 0x69, 0x6a, - 0x71, 0x89, 0x92, 0x13, 0x17, 0x47, 0x40, 0x6a, 0x85, 0x63, 0x4a, 0x4a, 0x51, 0xb1, 0x90, 0x19, - 0x17, 0x6b, 0x22, 0x88, 0x21, 0xc1, 0xa8, 0xc0, 0xac, 0xc1, 0x6d, 0x24, 0xa5, 0x87, 0x6a, 0x97, - 0x9e, 0x5f, 0x6a, 0x09, 0x48, 0x61, 0x6a, 0x71, 0xb1, 0x13, 0xcb, 0x89, 0x7b, 0xf2, 0x0c, 0x41, - 0x10, 0xe5, 0x4a, 0x1d, 0x8c, 0x5c, 0xec, 0xbe, 0xa9, 0xc5, 0xc5, 0x89, 0xe9, 0xa9, 0x42, 0xb6, - 0x5c, 0xdc, 0x05, 0xa9, 0x15, 0xf1, 0x45, 0x10, 0xe3, 0x25, 0x18, 0x15, 0x18, 0xb1, 0x99, 0x84, - 0x70, 0x80, 0x07, 0x43, 0x10, 0x57, 0x01, 0x9c, 0x27, 0x64, 0xce, 0xc5, 0x09, 0xd2, 0x0e, 0x71, - 0x06, 0x13, 0x58, 0xb3, 0x04, 0x16, 0xcd, 0x60, 0xf7, 0x7a, 0x30, 0x04, 0x71, 0x14, 0x40, 0xd9, - 0x4e, 0xac, 0x5c, 0xcc, 0xc5, 0xa5, 0xb9, 0x4e, 0xfe, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, - 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, - 0x2c, 0xc7, 0x10, 0x65, 0x9a, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x8f, - 0x14, 0x66, 0xc8, 0xc1, 0x07, 0x0e, 0x29, 0xd4, 0xf0, 0x4c, 0x62, 0x03, 0x8b, 0x1a, 0x03, 0x02, - 0x00, 0x00, 0xff, 0xff, 0x3c, 0x0b, 0xcb, 0x40, 0x92, 0x01, 0x00, 0x00, -} - -func (m *PexRequest) 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 *PexRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PexRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *PexAddrs) 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 *PexAddrs) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PexAddrs) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Addrs) > 0 { - for iNdEx := len(m.Addrs) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Addrs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPex(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *Message) 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 *Message) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *Message_PexRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_PexRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.PexRequest != nil { - { - size, err := m.PexRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPex(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Message_PexAddrs) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_PexAddrs) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.PexAddrs != nil { - { - size, err := m.PexAddrs.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPex(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} - -func encodeVarintPex(dAtA []byte, offset int, v uint64) int { - offset -= sovPex(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *PexRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *PexAddrs) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Addrs) > 0 { - for _, e := range m.Addrs { - l = e.Size() - n += 1 + l + sovPex(uint64(l)) - } - } - return n -} - -func (m *Message) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *Message_PexRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PexRequest != nil { - l = m.PexRequest.Size() - n += 1 + l + sovPex(uint64(l)) - } - return n -} - -func (m *Message_PexAddrs) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PexAddrs != nil { - l = m.PexAddrs.Size() - n += 1 + l + sovPex(uint64(l)) - } - return n -} - -func sovPex(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozPex(x uint64) (n int) { - return sovPex(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *PexRequest) 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 ErrIntOverflowPex - } - 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: PexRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PexRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipPex(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthPex - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *PexAddrs) 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 ErrIntOverflowPex - } - 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: PexAddrs: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PexAddrs: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Addrs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPex - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPex - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPex - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Addrs = append(m.Addrs, NetAddress{}) - if err := m.Addrs[len(m.Addrs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipPex(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthPex - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Message) 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 ErrIntOverflowPex - } - 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: Message: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Message: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PexRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPex - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPex - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPex - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PexRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_PexRequest{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PexAddrs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPex - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPex - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPex - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PexAddrs{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_PexAddrs{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipPex(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthPex - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipPex(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, ErrIntOverflowPex - } - 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, ErrIntOverflowPex - } - 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, ErrIntOverflowPex - } - 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, ErrInvalidLengthPex - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupPex - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthPex - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthPex = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowPex = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupPex = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/p2p/pex.proto b/third_party/proto/tendermint/p2p/pex.proto deleted file mode 100644 index dfe238dbe6..0000000000 --- a/third_party/proto/tendermint/p2p/pex.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; -package tendermint.p2p; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/p2p"; - -import "tendermint/p2p/types.proto"; -import "gogoproto/gogo.proto"; - -message PexRequest {} - -message PexAddrs { - repeated NetAddress addrs = 1 [(gogoproto.nullable) = false]; -} - -message Message { - oneof sum { - PexRequest pex_request = 1; - PexAddrs pex_addrs = 2; - } -} diff --git a/third_party/proto/tendermint/p2p/types.pb.go b/third_party/proto/tendermint/p2p/types.pb.go deleted file mode 100644 index 8fc8ec4679..0000000000 --- a/third_party/proto/tendermint/p2p/types.pb.go +++ /dev/null @@ -1,1430 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/p2p/types.proto - -package p2p - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 NetAddress struct { - ID string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - IP string `protobuf:"bytes,2,opt,name=ip,proto3" json:"ip,omitempty"` - Port uint32 `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"` -} - -func (m *NetAddress) Reset() { *m = NetAddress{} } -func (m *NetAddress) String() string { return proto.CompactTextString(m) } -func (*NetAddress) ProtoMessage() {} -func (*NetAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_c8a29e659aeca578, []int{0} -} - -func (m *NetAddress) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *NetAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NetAddress.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 *NetAddress) XXX_Merge(src proto.Message) { - xxx_messageInfo_NetAddress.Merge(m, src) -} - -func (m *NetAddress) XXX_Size() int { - return m.Size() -} - -func (m *NetAddress) XXX_DiscardUnknown() { - xxx_messageInfo_NetAddress.DiscardUnknown(m) -} - -var xxx_messageInfo_NetAddress proto.InternalMessageInfo - -func (m *NetAddress) GetID() string { - if m != nil { - return m.ID - } - return "" -} - -func (m *NetAddress) GetIP() string { - if m != nil { - return m.IP - } - return "" -} - -func (m *NetAddress) GetPort() uint32 { - if m != nil { - return m.Port - } - return 0 -} - -type ProtocolVersion struct { - P2P uint64 `protobuf:"varint,1,opt,name=p2p,proto3" json:"p2p,omitempty"` - Block uint64 `protobuf:"varint,2,opt,name=block,proto3" json:"block,omitempty"` - App uint64 `protobuf:"varint,3,opt,name=app,proto3" json:"app,omitempty"` -} - -func (m *ProtocolVersion) Reset() { *m = ProtocolVersion{} } -func (m *ProtocolVersion) String() string { return proto.CompactTextString(m) } -func (*ProtocolVersion) ProtoMessage() {} -func (*ProtocolVersion) Descriptor() ([]byte, []int) { - return fileDescriptor_c8a29e659aeca578, []int{1} -} - -func (m *ProtocolVersion) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ProtocolVersion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ProtocolVersion.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 *ProtocolVersion) XXX_Merge(src proto.Message) { - xxx_messageInfo_ProtocolVersion.Merge(m, src) -} - -func (m *ProtocolVersion) XXX_Size() int { - return m.Size() -} - -func (m *ProtocolVersion) XXX_DiscardUnknown() { - xxx_messageInfo_ProtocolVersion.DiscardUnknown(m) -} - -var xxx_messageInfo_ProtocolVersion proto.InternalMessageInfo - -func (m *ProtocolVersion) GetP2P() uint64 { - if m != nil { - return m.P2P - } - return 0 -} - -func (m *ProtocolVersion) GetBlock() uint64 { - if m != nil { - return m.Block - } - return 0 -} - -func (m *ProtocolVersion) GetApp() uint64 { - if m != nil { - return m.App - } - return 0 -} - -type DefaultNodeInfo struct { - ProtocolVersion ProtocolVersion `protobuf:"bytes,1,opt,name=protocol_version,json=protocolVersion,proto3" json:"protocol_version"` - DefaultNodeID string `protobuf:"bytes,2,opt,name=default_node_id,json=defaultNodeId,proto3" json:"default_node_id,omitempty"` - ListenAddr string `protobuf:"bytes,3,opt,name=listen_addr,json=listenAddr,proto3" json:"listen_addr,omitempty"` - Network string `protobuf:"bytes,4,opt,name=network,proto3" json:"network,omitempty"` - Version string `protobuf:"bytes,5,opt,name=version,proto3" json:"version,omitempty"` - Channels []byte `protobuf:"bytes,6,opt,name=channels,proto3" json:"channels,omitempty"` - Moniker string `protobuf:"bytes,7,opt,name=moniker,proto3" json:"moniker,omitempty"` - Other DefaultNodeInfoOther `protobuf:"bytes,8,opt,name=other,proto3" json:"other"` -} - -func (m *DefaultNodeInfo) Reset() { *m = DefaultNodeInfo{} } -func (m *DefaultNodeInfo) String() string { return proto.CompactTextString(m) } -func (*DefaultNodeInfo) ProtoMessage() {} -func (*DefaultNodeInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_c8a29e659aeca578, []int{2} -} - -func (m *DefaultNodeInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *DefaultNodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DefaultNodeInfo.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 *DefaultNodeInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_DefaultNodeInfo.Merge(m, src) -} - -func (m *DefaultNodeInfo) XXX_Size() int { - return m.Size() -} - -func (m *DefaultNodeInfo) XXX_DiscardUnknown() { - xxx_messageInfo_DefaultNodeInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_DefaultNodeInfo proto.InternalMessageInfo - -func (m *DefaultNodeInfo) GetProtocolVersion() ProtocolVersion { - if m != nil { - return m.ProtocolVersion - } - return ProtocolVersion{} -} - -func (m *DefaultNodeInfo) GetDefaultNodeID() string { - if m != nil { - return m.DefaultNodeID - } - return "" -} - -func (m *DefaultNodeInfo) GetListenAddr() string { - if m != nil { - return m.ListenAddr - } - return "" -} - -func (m *DefaultNodeInfo) GetNetwork() string { - if m != nil { - return m.Network - } - return "" -} - -func (m *DefaultNodeInfo) GetVersion() string { - if m != nil { - return m.Version - } - return "" -} - -func (m *DefaultNodeInfo) GetChannels() []byte { - if m != nil { - return m.Channels - } - return nil -} - -func (m *DefaultNodeInfo) GetMoniker() string { - if m != nil { - return m.Moniker - } - return "" -} - -func (m *DefaultNodeInfo) GetOther() DefaultNodeInfoOther { - if m != nil { - return m.Other - } - return DefaultNodeInfoOther{} -} - -type DefaultNodeInfoOther struct { - TxIndex string `protobuf:"bytes,1,opt,name=tx_index,json=txIndex,proto3" json:"tx_index,omitempty"` - RPCAddress string `protobuf:"bytes,2,opt,name=rpc_address,json=rpcAddress,proto3" json:"rpc_address,omitempty"` -} - -func (m *DefaultNodeInfoOther) Reset() { *m = DefaultNodeInfoOther{} } -func (m *DefaultNodeInfoOther) String() string { return proto.CompactTextString(m) } -func (*DefaultNodeInfoOther) ProtoMessage() {} -func (*DefaultNodeInfoOther) Descriptor() ([]byte, []int) { - return fileDescriptor_c8a29e659aeca578, []int{3} -} - -func (m *DefaultNodeInfoOther) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *DefaultNodeInfoOther) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DefaultNodeInfoOther.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 *DefaultNodeInfoOther) XXX_Merge(src proto.Message) { - xxx_messageInfo_DefaultNodeInfoOther.Merge(m, src) -} - -func (m *DefaultNodeInfoOther) XXX_Size() int { - return m.Size() -} - -func (m *DefaultNodeInfoOther) XXX_DiscardUnknown() { - xxx_messageInfo_DefaultNodeInfoOther.DiscardUnknown(m) -} - -var xxx_messageInfo_DefaultNodeInfoOther proto.InternalMessageInfo - -func (m *DefaultNodeInfoOther) GetTxIndex() string { - if m != nil { - return m.TxIndex - } - return "" -} - -func (m *DefaultNodeInfoOther) GetRPCAddress() string { - if m != nil { - return m.RPCAddress - } - return "" -} - -func init() { - proto.RegisterType((*NetAddress)(nil), "tendermint.p2p.NetAddress") - proto.RegisterType((*ProtocolVersion)(nil), "tendermint.p2p.ProtocolVersion") - proto.RegisterType((*DefaultNodeInfo)(nil), "tendermint.p2p.DefaultNodeInfo") - proto.RegisterType((*DefaultNodeInfoOther)(nil), "tendermint.p2p.DefaultNodeInfoOther") -} - -func init() { proto.RegisterFile("tendermint/p2p/types.proto", fileDescriptor_c8a29e659aeca578) } - -var fileDescriptor_c8a29e659aeca578 = []byte{ - // 479 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0x3d, 0x8f, 0xda, 0x40, - 0x10, 0xc5, 0xc6, 0x7c, 0xdc, 0x10, 0x8e, 0xcb, 0x0a, 0x45, 0x3e, 0x0a, 0x1b, 0xa1, 0x14, 0x54, - 0x20, 0x39, 0x4a, 0x91, 0x2e, 0x21, 0x34, 0x34, 0x77, 0xd6, 0x2a, 0x4a, 0x91, 0xc6, 0x02, 0xef, - 0x1e, 0xac, 0x30, 0xbb, 0xab, 0xf5, 0x5e, 0x42, 0xfe, 0x45, 0x7e, 0xd6, 0x95, 0x57, 0xa6, 0xb2, - 0x22, 0x53, 0xe6, 0x4f, 0x44, 0x5e, 0xfb, 0x12, 0x1f, 0x4a, 0x37, 0x6f, 0xbe, 0xde, 0xcc, 0xd3, - 0x83, 0x91, 0xa6, 0x9c, 0x50, 0x75, 0x60, 0x5c, 0xcf, 0x65, 0x20, 0xe7, 0xfa, 0xbb, 0xa4, 0xe9, - 0x4c, 0x2a, 0xa1, 0x05, 0xba, 0xfc, 0x57, 0x9b, 0xc9, 0x40, 0x8e, 0x86, 0x5b, 0xb1, 0x15, 0xa6, - 0x34, 0x2f, 0xa2, 0xb2, 0x6b, 0x12, 0x02, 0xdc, 0x50, 0xfd, 0x81, 0x10, 0x45, 0xd3, 0x14, 0xbd, - 0x02, 0x9b, 0x11, 0xd7, 0x1a, 0x5b, 0xd3, 0x8b, 0x45, 0x3b, 0xcf, 0x7c, 0x7b, 0xb5, 0xc4, 0x36, - 0x23, 0x26, 0x2f, 0x5d, 0xbb, 0x96, 0x0f, 0xb1, 0xcd, 0x24, 0x42, 0xe0, 0x48, 0xa1, 0xb4, 0xdb, - 0x1c, 0x5b, 0xd3, 0x3e, 0x36, 0xf1, 0xe4, 0x13, 0x0c, 0xc2, 0x62, 0x75, 0x2c, 0x92, 0xcf, 0x54, - 0xa5, 0x4c, 0x70, 0x74, 0x0d, 0x4d, 0x19, 0x48, 0xb3, 0xd7, 0x59, 0x74, 0xf2, 0xcc, 0x6f, 0x86, - 0x41, 0x88, 0x8b, 0x1c, 0x1a, 0x42, 0x6b, 0x93, 0x88, 0x78, 0x6f, 0x96, 0x3b, 0xb8, 0x04, 0xe8, - 0x0a, 0x9a, 0x6b, 0x29, 0xcd, 0x5a, 0x07, 0x17, 0xe1, 0xe4, 0xb7, 0x0d, 0x83, 0x25, 0xbd, 0x5b, - 0xdf, 0x27, 0xfa, 0x46, 0x10, 0xba, 0xe2, 0x77, 0x02, 0x85, 0x70, 0x25, 0x2b, 0xa6, 0xe8, 0x6b, - 0x49, 0x65, 0x38, 0x7a, 0x81, 0x3f, 0x7b, 0xfe, 0xfc, 0xec, 0xec, 0xa2, 0x85, 0xf3, 0x90, 0xf9, - 0x0d, 0x3c, 0x90, 0x67, 0x87, 0xbe, 0x83, 0x01, 0x29, 0x49, 0x22, 0x2e, 0x08, 0x8d, 0x18, 0xa9, - 0x9e, 0x7e, 0x99, 0x67, 0x7e, 0xbf, 0xce, 0xbf, 0xc4, 0x7d, 0x52, 0x83, 0x04, 0xf9, 0xd0, 0x4b, - 0x58, 0xaa, 0x29, 0x8f, 0xd6, 0x84, 0x28, 0x73, 0xfa, 0x05, 0x86, 0x32, 0x55, 0xc8, 0x8b, 0x5c, - 0xe8, 0x70, 0xaa, 0xbf, 0x09, 0xb5, 0x77, 0x1d, 0x53, 0x7c, 0x82, 0x45, 0xe5, 0xe9, 0xfc, 0x56, - 0x59, 0xa9, 0x20, 0x1a, 0x41, 0x37, 0xde, 0xad, 0x39, 0xa7, 0x49, 0xea, 0xb6, 0xc7, 0xd6, 0xf4, - 0x05, 0xfe, 0x8b, 0x8b, 0xa9, 0x83, 0xe0, 0x6c, 0x4f, 0x95, 0xdb, 0x29, 0xa7, 0x2a, 0x88, 0xde, - 0x43, 0x4b, 0xe8, 0x1d, 0x55, 0x6e, 0xd7, 0x88, 0xf1, 0xfa, 0x5c, 0x8c, 0x33, 0x1d, 0x6f, 0x8b, - 0xde, 0x4a, 0x91, 0x72, 0x70, 0xb2, 0x81, 0xe1, 0xff, 0x9a, 0xd0, 0x35, 0x74, 0xf5, 0x31, 0x62, - 0x9c, 0xd0, 0x63, 0xe9, 0x12, 0xdc, 0xd1, 0xc7, 0x55, 0x01, 0xd1, 0x1c, 0x7a, 0x4a, 0xc6, 0xe6, - 0x79, 0x9a, 0xa6, 0x95, 0x6c, 0x97, 0x79, 0xe6, 0x03, 0x0e, 0x3f, 0x56, 0xfe, 0xc2, 0xa0, 0x64, - 0x5c, 0xc5, 0x8b, 0xdb, 0x87, 0xdc, 0xb3, 0x1e, 0x73, 0xcf, 0xfa, 0x95, 0x7b, 0xd6, 0x8f, 0x93, - 0xd7, 0x78, 0x3c, 0x79, 0x8d, 0x9f, 0x27, 0xaf, 0xf1, 0xe5, 0xed, 0x96, 0xe9, 0xdd, 0xfd, 0x66, - 0x16, 0x8b, 0xc3, 0xbc, 0x66, 0xf0, 0xba, 0xd7, 0x8d, 0x8d, 0x9f, 0x9b, 0x7f, 0xd3, 0x36, 0xd9, - 0x37, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x6c, 0xb3, 0x68, 0x97, 0x15, 0x03, 0x00, 0x00, -} - -func (m *NetAddress) 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 *NetAddress) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NetAddress) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Port != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Port)) - i-- - dAtA[i] = 0x18 - } - if len(m.IP) > 0 { - i -= len(m.IP) - copy(dAtA[i:], m.IP) - i = encodeVarintTypes(dAtA, i, uint64(len(m.IP))) - i-- - dAtA[i] = 0x12 - } - if len(m.ID) > 0 { - i -= len(m.ID) - copy(dAtA[i:], m.ID) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ID))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ProtocolVersion) 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 *ProtocolVersion) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ProtocolVersion) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.App != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.App)) - i-- - dAtA[i] = 0x18 - } - if m.Block != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Block)) - i-- - dAtA[i] = 0x10 - } - if m.P2P != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.P2P)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *DefaultNodeInfo) 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 *DefaultNodeInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DefaultNodeInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Other.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - if len(m.Moniker) > 0 { - i -= len(m.Moniker) - copy(dAtA[i:], m.Moniker) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Moniker))) - i-- - dAtA[i] = 0x3a - } - if len(m.Channels) > 0 { - i -= len(m.Channels) - copy(dAtA[i:], m.Channels) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Channels))) - i-- - dAtA[i] = 0x32 - } - if len(m.Version) > 0 { - i -= len(m.Version) - copy(dAtA[i:], m.Version) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Version))) - i-- - dAtA[i] = 0x2a - } - if len(m.Network) > 0 { - i -= len(m.Network) - copy(dAtA[i:], m.Network) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Network))) - i-- - dAtA[i] = 0x22 - } - if len(m.ListenAddr) > 0 { - i -= len(m.ListenAddr) - copy(dAtA[i:], m.ListenAddr) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ListenAddr))) - i-- - dAtA[i] = 0x1a - } - if len(m.DefaultNodeID) > 0 { - i -= len(m.DefaultNodeID) - copy(dAtA[i:], m.DefaultNodeID) - i = encodeVarintTypes(dAtA, i, uint64(len(m.DefaultNodeID))) - i-- - dAtA[i] = 0x12 - } - { - size, err := m.ProtocolVersion.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *DefaultNodeInfoOther) 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 *DefaultNodeInfoOther) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DefaultNodeInfoOther) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.RPCAddress) > 0 { - i -= len(m.RPCAddress) - copy(dAtA[i:], m.RPCAddress) - i = encodeVarintTypes(dAtA, i, uint64(len(m.RPCAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.TxIndex) > 0 { - i -= len(m.TxIndex) - copy(dAtA[i:], m.TxIndex) - i = encodeVarintTypes(dAtA, i, uint64(len(m.TxIndex))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *NetAddress) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ID) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.IP) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.Port != 0 { - n += 1 + sovTypes(uint64(m.Port)) - } - return n -} - -func (m *ProtocolVersion) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.P2P != 0 { - n += 1 + sovTypes(uint64(m.P2P)) - } - if m.Block != 0 { - n += 1 + sovTypes(uint64(m.Block)) - } - if m.App != 0 { - n += 1 + sovTypes(uint64(m.App)) - } - return n -} - -func (m *DefaultNodeInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ProtocolVersion.Size() - n += 1 + l + sovTypes(uint64(l)) - l = len(m.DefaultNodeID) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.ListenAddr) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Network) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Version) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Channels) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Moniker) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = m.Other.Size() - n += 1 + l + sovTypes(uint64(l)) - return n -} - -func (m *DefaultNodeInfoOther) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.TxIndex) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.RPCAddress) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *NetAddress) 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 ErrIntOverflowTypes - } - 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: NetAddress: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NetAddress: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IP", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IP = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) - } - m.Port = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Port |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ProtocolVersion) 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 ErrIntOverflowTypes - } - 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: ProtocolVersion: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ProtocolVersion: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field P2P", wireType) - } - m.P2P = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.P2P |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Block", wireType) - } - m.Block = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Block |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field App", wireType) - } - m.App = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.App |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *DefaultNodeInfo) 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 ErrIntOverflowTypes - } - 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: DefaultNodeInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DefaultNodeInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProtocolVersion", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ProtocolVersion.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DefaultNodeID", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DefaultNodeID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListenAddr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ListenAddr = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Network", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Network = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Version = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Channels", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Channels = append(m.Channels[:0], dAtA[iNdEx:postIndex]...) - if m.Channels == nil { - m.Channels = []byte{} - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Moniker", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Moniker = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Other", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Other.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *DefaultNodeInfoOther) 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 ErrIntOverflowTypes - } - 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: DefaultNodeInfoOther: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DefaultNodeInfoOther: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TxIndex", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TxIndex = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RPCAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RPCAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/p2p/types.proto b/third_party/proto/tendermint/p2p/types.proto deleted file mode 100644 index 0d42ea4002..0000000000 --- a/third_party/proto/tendermint/p2p/types.proto +++ /dev/null @@ -1,34 +0,0 @@ -syntax = "proto3"; -package tendermint.p2p; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/p2p"; - -import "gogoproto/gogo.proto"; - -message NetAddress { - string id = 1 [(gogoproto.customname) = "ID"]; - string ip = 2 [(gogoproto.customname) = "IP"]; - uint32 port = 3; -} - -message ProtocolVersion { - uint64 p2p = 1 [(gogoproto.customname) = "P2P"]; - uint64 block = 2; - uint64 app = 3; -} - -message DefaultNodeInfo { - ProtocolVersion protocol_version = 1 [(gogoproto.nullable) = false]; - string default_node_id = 2 [(gogoproto.customname) = "DefaultNodeID"]; - string listen_addr = 3; - string network = 4; - string version = 5; - bytes channels = 6; - string moniker = 7; - DefaultNodeInfoOther other = 8 [(gogoproto.nullable) = false]; -} - -message DefaultNodeInfoOther { - string tx_index = 1; - string rpc_address = 2 [(gogoproto.customname) = "RPCAddress"]; -} diff --git a/third_party/proto/tendermint/privval/types.pb.go b/third_party/proto/tendermint/privval/types.pb.go deleted file mode 100644 index 2310ada9cd..0000000000 --- a/third_party/proto/tendermint/privval/types.pb.go +++ /dev/null @@ -1,2882 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/privval/types.proto - -package privval - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - types "github.com/tendermint/tendermint/proto/tendermint/types" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 Errors int32 - -const ( - Errors_ERRORS_UNKNOWN Errors = 0 - Errors_ERRORS_UNEXPECTED_RESPONSE Errors = 1 - Errors_ERRORS_NO_CONNECTION Errors = 2 - Errors_ERRORS_CONNECTION_TIMEOUT Errors = 3 - Errors_ERRORS_READ_TIMEOUT Errors = 4 - Errors_ERRORS_WRITE_TIMEOUT Errors = 5 -) - -var Errors_name = map[int32]string{ - 0: "ERRORS_UNKNOWN", - 1: "ERRORS_UNEXPECTED_RESPONSE", - 2: "ERRORS_NO_CONNECTION", - 3: "ERRORS_CONNECTION_TIMEOUT", - 4: "ERRORS_READ_TIMEOUT", - 5: "ERRORS_WRITE_TIMEOUT", -} - -var Errors_value = map[string]int32{ - "ERRORS_UNKNOWN": 0, - "ERRORS_UNEXPECTED_RESPONSE": 1, - "ERRORS_NO_CONNECTION": 2, - "ERRORS_CONNECTION_TIMEOUT": 3, - "ERRORS_READ_TIMEOUT": 4, - "ERRORS_WRITE_TIMEOUT": 5, -} - -func (x Errors) String() string { - return proto.EnumName(Errors_name, int32(x)) -} - -func (Errors) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{0} -} - -type RemoteSignerError struct { - Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` -} - -func (m *RemoteSignerError) Reset() { *m = RemoteSignerError{} } -func (m *RemoteSignerError) String() string { return proto.CompactTextString(m) } -func (*RemoteSignerError) ProtoMessage() {} -func (*RemoteSignerError) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{0} -} - -func (m *RemoteSignerError) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *RemoteSignerError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoteSignerError.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 *RemoteSignerError) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoteSignerError.Merge(m, src) -} - -func (m *RemoteSignerError) XXX_Size() int { - return m.Size() -} - -func (m *RemoteSignerError) XXX_DiscardUnknown() { - xxx_messageInfo_RemoteSignerError.DiscardUnknown(m) -} - -var xxx_messageInfo_RemoteSignerError proto.InternalMessageInfo - -func (m *RemoteSignerError) GetCode() int32 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *RemoteSignerError) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -// PubKeyRequest requests the consensus public key from the remote signer. -type PubKeyRequest struct { - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` -} - -func (m *PubKeyRequest) Reset() { *m = PubKeyRequest{} } -func (m *PubKeyRequest) String() string { return proto.CompactTextString(m) } -func (*PubKeyRequest) ProtoMessage() {} -func (*PubKeyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{1} -} - -func (m *PubKeyRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PubKeyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PubKeyRequest.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 *PubKeyRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PubKeyRequest.Merge(m, src) -} - -func (m *PubKeyRequest) XXX_Size() int { - return m.Size() -} - -func (m *PubKeyRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PubKeyRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PubKeyRequest proto.InternalMessageInfo - -func (m *PubKeyRequest) GetChainId() string { - if m != nil { - return m.ChainId - } - return "" -} - -// PubKeyResponse is a response message containing the public key. -type PubKeyResponse struct { - PubKey crypto.PublicKey `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key"` - Error *RemoteSignerError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` -} - -func (m *PubKeyResponse) Reset() { *m = PubKeyResponse{} } -func (m *PubKeyResponse) String() string { return proto.CompactTextString(m) } -func (*PubKeyResponse) ProtoMessage() {} -func (*PubKeyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{2} -} - -func (m *PubKeyResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PubKeyResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PubKeyResponse.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 *PubKeyResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_PubKeyResponse.Merge(m, src) -} - -func (m *PubKeyResponse) XXX_Size() int { - return m.Size() -} - -func (m *PubKeyResponse) XXX_DiscardUnknown() { - xxx_messageInfo_PubKeyResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_PubKeyResponse proto.InternalMessageInfo - -func (m *PubKeyResponse) GetPubKey() crypto.PublicKey { - if m != nil { - return m.PubKey - } - return crypto.PublicKey{} -} - -func (m *PubKeyResponse) GetError() *RemoteSignerError { - if m != nil { - return m.Error - } - return nil -} - -// SignVoteRequest is a request to sign a vote -type SignVoteRequest struct { - Vote *types.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` - ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` -} - -func (m *SignVoteRequest) Reset() { *m = SignVoteRequest{} } -func (m *SignVoteRequest) String() string { return proto.CompactTextString(m) } -func (*SignVoteRequest) ProtoMessage() {} -func (*SignVoteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{3} -} - -func (m *SignVoteRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *SignVoteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SignVoteRequest.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 *SignVoteRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignVoteRequest.Merge(m, src) -} - -func (m *SignVoteRequest) XXX_Size() int { - return m.Size() -} - -func (m *SignVoteRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SignVoteRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SignVoteRequest proto.InternalMessageInfo - -func (m *SignVoteRequest) GetVote() *types.Vote { - if m != nil { - return m.Vote - } - return nil -} - -func (m *SignVoteRequest) GetChainId() string { - if m != nil { - return m.ChainId - } - return "" -} - -// SignedVoteResponse is a response containing a signed vote or an error -type SignedVoteResponse struct { - Vote types.Vote `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote"` - Error *RemoteSignerError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` -} - -func (m *SignedVoteResponse) Reset() { *m = SignedVoteResponse{} } -func (m *SignedVoteResponse) String() string { return proto.CompactTextString(m) } -func (*SignedVoteResponse) ProtoMessage() {} -func (*SignedVoteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{4} -} - -func (m *SignedVoteResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *SignedVoteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SignedVoteResponse.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 *SignedVoteResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignedVoteResponse.Merge(m, src) -} - -func (m *SignedVoteResponse) XXX_Size() int { - return m.Size() -} - -func (m *SignedVoteResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SignedVoteResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_SignedVoteResponse proto.InternalMessageInfo - -func (m *SignedVoteResponse) GetVote() types.Vote { - if m != nil { - return m.Vote - } - return types.Vote{} -} - -func (m *SignedVoteResponse) GetError() *RemoteSignerError { - if m != nil { - return m.Error - } - return nil -} - -// SignProposalRequest is a request to sign a proposal -type SignProposalRequest struct { - Proposal *types.Proposal `protobuf:"bytes,1,opt,name=proposal,proto3" json:"proposal,omitempty"` - ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` -} - -func (m *SignProposalRequest) Reset() { *m = SignProposalRequest{} } -func (m *SignProposalRequest) String() string { return proto.CompactTextString(m) } -func (*SignProposalRequest) ProtoMessage() {} -func (*SignProposalRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{5} -} - -func (m *SignProposalRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *SignProposalRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SignProposalRequest.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 *SignProposalRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignProposalRequest.Merge(m, src) -} - -func (m *SignProposalRequest) XXX_Size() int { - return m.Size() -} - -func (m *SignProposalRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SignProposalRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SignProposalRequest proto.InternalMessageInfo - -func (m *SignProposalRequest) GetProposal() *types.Proposal { - if m != nil { - return m.Proposal - } - return nil -} - -func (m *SignProposalRequest) GetChainId() string { - if m != nil { - return m.ChainId - } - return "" -} - -// SignedProposalResponse is response containing a signed proposal or an error -type SignedProposalResponse struct { - Proposal types.Proposal `protobuf:"bytes,1,opt,name=proposal,proto3" json:"proposal"` - Error *RemoteSignerError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` -} - -func (m *SignedProposalResponse) Reset() { *m = SignedProposalResponse{} } -func (m *SignedProposalResponse) String() string { return proto.CompactTextString(m) } -func (*SignedProposalResponse) ProtoMessage() {} -func (*SignedProposalResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{6} -} - -func (m *SignedProposalResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *SignedProposalResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SignedProposalResponse.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 *SignedProposalResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignedProposalResponse.Merge(m, src) -} - -func (m *SignedProposalResponse) XXX_Size() int { - return m.Size() -} - -func (m *SignedProposalResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SignedProposalResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_SignedProposalResponse proto.InternalMessageInfo - -func (m *SignedProposalResponse) GetProposal() types.Proposal { - if m != nil { - return m.Proposal - } - return types.Proposal{} -} - -func (m *SignedProposalResponse) GetError() *RemoteSignerError { - if m != nil { - return m.Error - } - return nil -} - -// PingRequest is a request to confirm that the connection is alive. -type PingRequest struct{} - -func (m *PingRequest) Reset() { *m = PingRequest{} } -func (m *PingRequest) String() string { return proto.CompactTextString(m) } -func (*PingRequest) ProtoMessage() {} -func (*PingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{7} -} - -func (m *PingRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PingRequest.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 *PingRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PingRequest.Merge(m, src) -} - -func (m *PingRequest) XXX_Size() int { - return m.Size() -} - -func (m *PingRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PingRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PingRequest proto.InternalMessageInfo - -// PingResponse is a response to confirm that the connection is alive. -type PingResponse struct{} - -func (m *PingResponse) Reset() { *m = PingResponse{} } -func (m *PingResponse) String() string { return proto.CompactTextString(m) } -func (*PingResponse) ProtoMessage() {} -func (*PingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{8} -} - -func (m *PingResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PingResponse.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 *PingResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_PingResponse.Merge(m, src) -} - -func (m *PingResponse) XXX_Size() int { - return m.Size() -} - -func (m *PingResponse) XXX_DiscardUnknown() { - xxx_messageInfo_PingResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_PingResponse proto.InternalMessageInfo - -type Message struct { - // Types that are valid to be assigned to Sum: - // *Message_PubKeyRequest - // *Message_PubKeyResponse - // *Message_SignVoteRequest - // *Message_SignedVoteResponse - // *Message_SignProposalRequest - // *Message_SignedProposalResponse - // *Message_PingRequest - // *Message_PingResponse - Sum isMessage_Sum `protobuf_oneof:"sum"` -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} -func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_cb4e437a5328cf9c, []int{9} -} - -func (m *Message) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Message.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 *Message) XXX_Merge(src proto.Message) { - xxx_messageInfo_Message.Merge(m, src) -} - -func (m *Message) XXX_Size() int { - return m.Size() -} - -func (m *Message) XXX_DiscardUnknown() { - xxx_messageInfo_Message.DiscardUnknown(m) -} - -var xxx_messageInfo_Message proto.InternalMessageInfo - -type isMessage_Sum interface { - isMessage_Sum() - MarshalTo([]byte) (int, error) - Size() int -} - -type Message_PubKeyRequest struct { - PubKeyRequest *PubKeyRequest `protobuf:"bytes,1,opt,name=pub_key_request,json=pubKeyRequest,proto3,oneof" json:"pub_key_request,omitempty"` -} -type Message_PubKeyResponse struct { - PubKeyResponse *PubKeyResponse `protobuf:"bytes,2,opt,name=pub_key_response,json=pubKeyResponse,proto3,oneof" json:"pub_key_response,omitempty"` -} -type Message_SignVoteRequest struct { - SignVoteRequest *SignVoteRequest `protobuf:"bytes,3,opt,name=sign_vote_request,json=signVoteRequest,proto3,oneof" json:"sign_vote_request,omitempty"` -} -type Message_SignedVoteResponse struct { - SignedVoteResponse *SignedVoteResponse `protobuf:"bytes,4,opt,name=signed_vote_response,json=signedVoteResponse,proto3,oneof" json:"signed_vote_response,omitempty"` -} -type Message_SignProposalRequest struct { - SignProposalRequest *SignProposalRequest `protobuf:"bytes,5,opt,name=sign_proposal_request,json=signProposalRequest,proto3,oneof" json:"sign_proposal_request,omitempty"` -} -type Message_SignedProposalResponse struct { - SignedProposalResponse *SignedProposalResponse `protobuf:"bytes,6,opt,name=signed_proposal_response,json=signedProposalResponse,proto3,oneof" json:"signed_proposal_response,omitempty"` -} -type Message_PingRequest struct { - PingRequest *PingRequest `protobuf:"bytes,7,opt,name=ping_request,json=pingRequest,proto3,oneof" json:"ping_request,omitempty"` -} -type Message_PingResponse struct { - PingResponse *PingResponse `protobuf:"bytes,8,opt,name=ping_response,json=pingResponse,proto3,oneof" json:"ping_response,omitempty"` -} - -func (*Message_PubKeyRequest) isMessage_Sum() {} -func (*Message_PubKeyResponse) isMessage_Sum() {} -func (*Message_SignVoteRequest) isMessage_Sum() {} -func (*Message_SignedVoteResponse) isMessage_Sum() {} -func (*Message_SignProposalRequest) isMessage_Sum() {} -func (*Message_SignedProposalResponse) isMessage_Sum() {} -func (*Message_PingRequest) isMessage_Sum() {} -func (*Message_PingResponse) isMessage_Sum() {} - -func (m *Message) GetSum() isMessage_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *Message) GetPubKeyRequest() *PubKeyRequest { - if x, ok := m.GetSum().(*Message_PubKeyRequest); ok { - return x.PubKeyRequest - } - return nil -} - -func (m *Message) GetPubKeyResponse() *PubKeyResponse { - if x, ok := m.GetSum().(*Message_PubKeyResponse); ok { - return x.PubKeyResponse - } - return nil -} - -func (m *Message) GetSignVoteRequest() *SignVoteRequest { - if x, ok := m.GetSum().(*Message_SignVoteRequest); ok { - return x.SignVoteRequest - } - return nil -} - -func (m *Message) GetSignedVoteResponse() *SignedVoteResponse { - if x, ok := m.GetSum().(*Message_SignedVoteResponse); ok { - return x.SignedVoteResponse - } - return nil -} - -func (m *Message) GetSignProposalRequest() *SignProposalRequest { - if x, ok := m.GetSum().(*Message_SignProposalRequest); ok { - return x.SignProposalRequest - } - return nil -} - -func (m *Message) GetSignedProposalResponse() *SignedProposalResponse { - if x, ok := m.GetSum().(*Message_SignedProposalResponse); ok { - return x.SignedProposalResponse - } - return nil -} - -func (m *Message) GetPingRequest() *PingRequest { - if x, ok := m.GetSum().(*Message_PingRequest); ok { - return x.PingRequest - } - return nil -} - -func (m *Message) GetPingResponse() *PingResponse { - if x, ok := m.GetSum().(*Message_PingResponse); ok { - return x.PingResponse - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Message) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Message_PubKeyRequest)(nil), - (*Message_PubKeyResponse)(nil), - (*Message_SignVoteRequest)(nil), - (*Message_SignedVoteResponse)(nil), - (*Message_SignProposalRequest)(nil), - (*Message_SignedProposalResponse)(nil), - (*Message_PingRequest)(nil), - (*Message_PingResponse)(nil), - } -} - -func init() { - proto.RegisterEnum("tendermint.privval.Errors", Errors_name, Errors_value) - proto.RegisterType((*RemoteSignerError)(nil), "tendermint.privval.RemoteSignerError") - proto.RegisterType((*PubKeyRequest)(nil), "tendermint.privval.PubKeyRequest") - proto.RegisterType((*PubKeyResponse)(nil), "tendermint.privval.PubKeyResponse") - proto.RegisterType((*SignVoteRequest)(nil), "tendermint.privval.SignVoteRequest") - proto.RegisterType((*SignedVoteResponse)(nil), "tendermint.privval.SignedVoteResponse") - proto.RegisterType((*SignProposalRequest)(nil), "tendermint.privval.SignProposalRequest") - proto.RegisterType((*SignedProposalResponse)(nil), "tendermint.privval.SignedProposalResponse") - proto.RegisterType((*PingRequest)(nil), "tendermint.privval.PingRequest") - proto.RegisterType((*PingResponse)(nil), "tendermint.privval.PingResponse") - proto.RegisterType((*Message)(nil), "tendermint.privval.Message") -} - -func init() { proto.RegisterFile("tendermint/privval/types.proto", fileDescriptor_cb4e437a5328cf9c) } - -var fileDescriptor_cb4e437a5328cf9c = []byte{ - // 750 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0x4d, 0x4f, 0x13, 0x41, - 0x18, 0xde, 0x85, 0x7e, 0xc0, 0x5b, 0x5a, 0xca, 0x80, 0x58, 0x1a, 0x5c, 0x6a, 0x8d, 0x4a, 0x7a, - 0x68, 0x0d, 0x26, 0x26, 0x06, 0x2f, 0x02, 0x1b, 0xdb, 0x34, 0x6c, 0xeb, 0xb4, 0x08, 0x21, 0x31, - 0x9b, 0x7e, 0x8c, 0xcb, 0x06, 0xba, 0x3b, 0xee, 0x6c, 0x49, 0x7a, 0xf6, 0xe6, 0xc9, 0xc4, 0x3f, - 0xe1, 0xd9, 0x5f, 0xc1, 0x91, 0xa3, 0x27, 0x63, 0xe0, 0x8f, 0x98, 0xce, 0x4e, 0xb7, 0xdb, 0x2f, - 0xa2, 0xe1, 0xb6, 0xf3, 0xbe, 0xef, 0x3c, 0x1f, 0x33, 0xcf, 0x66, 0x40, 0x71, 0x89, 0xd5, 0x26, - 0x4e, 0xc7, 0xb4, 0xdc, 0x02, 0x75, 0xcc, 0xcb, 0xcb, 0xc6, 0x45, 0xc1, 0xed, 0x51, 0xc2, 0xf2, - 0xd4, 0xb1, 0x5d, 0x1b, 0xa1, 0x61, 0x3f, 0x2f, 0xfa, 0xe9, 0xcd, 0xc0, 0x9e, 0x96, 0xd3, 0xa3, - 0xae, 0x5d, 0x38, 0x27, 0x3d, 0xb1, 0x63, 0xa4, 0xcb, 0x91, 0x82, 0x78, 0xe9, 0x35, 0xc3, 0x36, - 0x6c, 0xfe, 0x59, 0xe8, 0x7f, 0x79, 0xd5, 0x6c, 0x09, 0x56, 0x30, 0xe9, 0xd8, 0x2e, 0xa9, 0x99, - 0x86, 0x45, 0x1c, 0xd5, 0x71, 0x6c, 0x07, 0x21, 0x08, 0xb5, 0xec, 0x36, 0x49, 0xc9, 0x19, 0x79, - 0x3b, 0x8c, 0xf9, 0x37, 0xca, 0x40, 0xac, 0x4d, 0x58, 0xcb, 0x31, 0xa9, 0x6b, 0xda, 0x56, 0x6a, - 0x2e, 0x23, 0x6f, 0x2f, 0xe2, 0x60, 0x29, 0x9b, 0x83, 0x78, 0xb5, 0xdb, 0x2c, 0x93, 0x1e, 0x26, - 0x9f, 0xbb, 0x84, 0xb9, 0x68, 0x03, 0x16, 0x5a, 0x67, 0x0d, 0xd3, 0xd2, 0xcd, 0x36, 0x87, 0x5a, - 0xc4, 0x51, 0xbe, 0x2e, 0xb5, 0xb3, 0x5f, 0x65, 0x48, 0x0c, 0x86, 0x19, 0xb5, 0x2d, 0x46, 0xd0, - 0x2e, 0x44, 0x69, 0xb7, 0xa9, 0x9f, 0x93, 0x1e, 0x1f, 0x8e, 0xed, 0x6c, 0xe6, 0x03, 0x27, 0xe0, - 0xb9, 0xcd, 0x57, 0xbb, 0xcd, 0x0b, 0xb3, 0x55, 0x26, 0xbd, 0xbd, 0xd0, 0xd5, 0xef, 0x2d, 0x09, - 0x47, 0x28, 0x07, 0x41, 0xbb, 0x10, 0x26, 0x7d, 0xe9, 0x5c, 0x57, 0x6c, 0xe7, 0x69, 0x7e, 0xf2, - 0xf0, 0xf2, 0x13, 0x3e, 0xb1, 0xb7, 0x27, 0x7b, 0x02, 0xcb, 0xfd, 0xea, 0x07, 0xdb, 0x25, 0x03, - 0xe9, 0x39, 0x08, 0x5d, 0xda, 0x2e, 0x11, 0x4a, 0xd6, 0x83, 0x70, 0xde, 0x99, 0xf2, 0x61, 0x3e, - 0x33, 0x62, 0x73, 0x6e, 0xd4, 0xe6, 0x17, 0x19, 0x10, 0x27, 0x6c, 0x7b, 0xe0, 0xc2, 0xea, 0x8b, - 0x7f, 0x41, 0x17, 0x0e, 0x3d, 0x8e, 0x7b, 0xf9, 0x3b, 0x83, 0xd5, 0x7e, 0xb5, 0xea, 0xd8, 0xd4, - 0x66, 0x8d, 0x8b, 0x81, 0xc7, 0x57, 0xb0, 0x40, 0x45, 0x49, 0x28, 0x49, 0x4f, 0x2a, 0xf1, 0x37, - 0xf9, 0xb3, 0x77, 0xf9, 0xfd, 0x2e, 0xc3, 0xba, 0xe7, 0x77, 0x48, 0x26, 0x3c, 0xbf, 0xf9, 0x1f, - 0x36, 0xe1, 0x7d, 0xc8, 0x79, 0x2f, 0xff, 0x71, 0x88, 0x55, 0x4d, 0xcb, 0x10, 0xbe, 0xb3, 0x09, - 0x58, 0xf2, 0x96, 0x9e, 0xb2, 0xec, 0xcf, 0x30, 0x44, 0x0f, 0x09, 0x63, 0x0d, 0x83, 0xa0, 0x32, - 0x2c, 0x8b, 0x10, 0xea, 0x8e, 0x37, 0x2e, 0xc4, 0x3e, 0x9e, 0xc6, 0x38, 0x12, 0xf7, 0xa2, 0x84, - 0xe3, 0x74, 0x24, 0xff, 0x1a, 0x24, 0x87, 0x60, 0x1e, 0x99, 0xd0, 0x9f, 0xbd, 0x0b, 0xcd, 0x9b, - 0x2c, 0x4a, 0x38, 0x41, 0x47, 0xff, 0x90, 0xf7, 0xb0, 0xc2, 0x4c, 0xc3, 0xd2, 0xfb, 0x89, 0xf0, - 0xe5, 0xcd, 0x73, 0xc0, 0x27, 0xd3, 0x00, 0xc7, 0x42, 0x5d, 0x94, 0xf0, 0x32, 0x1b, 0xcb, 0xf9, - 0x29, 0xac, 0x31, 0x7e, 0x5f, 0x03, 0x50, 0x21, 0x33, 0xc4, 0x51, 0x9f, 0xcd, 0x42, 0x1d, 0xcd, - 0x73, 0x51, 0xc2, 0x88, 0x4d, 0xa6, 0xfc, 0x23, 0x3c, 0xe0, 0x72, 0x07, 0x97, 0xe8, 0x4b, 0x0e, - 0x73, 0xf0, 0xe7, 0xb3, 0xc0, 0xc7, 0x72, 0x5a, 0x94, 0xf0, 0x2a, 0x9b, 0x12, 0xdf, 0x4f, 0x90, - 0x12, 0xd2, 0x03, 0x04, 0x42, 0x7e, 0x84, 0x33, 0xe4, 0x66, 0xcb, 0x1f, 0x8f, 0x67, 0x51, 0xc2, - 0xeb, 0x6c, 0x7a, 0x70, 0x0f, 0x60, 0x89, 0x9a, 0x96, 0xe1, 0xab, 0x8f, 0x72, 0xec, 0xad, 0xa9, - 0x37, 0x38, 0x4c, 0x59, 0x51, 0xc2, 0x31, 0x3a, 0x5c, 0xa2, 0x77, 0x10, 0x17, 0x28, 0x42, 0xe2, - 0x02, 0x87, 0xc9, 0xcc, 0x86, 0xf1, 0x85, 0x2d, 0xd1, 0xc0, 0x7a, 0x2f, 0x0c, 0xf3, 0xac, 0xdb, - 0xc9, 0xfd, 0x90, 0x21, 0xc2, 0x43, 0xce, 0x10, 0x82, 0x84, 0x8a, 0x71, 0x05, 0xd7, 0xf4, 0x23, - 0xad, 0xac, 0x55, 0x8e, 0xb5, 0xa4, 0x84, 0x14, 0x48, 0xfb, 0x35, 0xf5, 0xa4, 0xaa, 0xee, 0xd7, - 0xd5, 0x03, 0x1d, 0xab, 0xb5, 0x6a, 0x45, 0xab, 0xa9, 0x49, 0x19, 0xa5, 0x60, 0x4d, 0xf4, 0xb5, - 0x8a, 0xbe, 0x5f, 0xd1, 0x34, 0x75, 0xbf, 0x5e, 0xaa, 0x68, 0xc9, 0x39, 0xf4, 0x08, 0x36, 0x44, - 0x67, 0x58, 0xd6, 0xeb, 0xa5, 0x43, 0xb5, 0x72, 0x54, 0x4f, 0xce, 0xa3, 0x87, 0xb0, 0x2a, 0xda, - 0x58, 0x7d, 0x7b, 0xe0, 0x37, 0x42, 0x01, 0xc4, 0x63, 0x5c, 0xaa, 0xab, 0x7e, 0x27, 0xbc, 0x57, - 0xbb, 0xba, 0x51, 0xe4, 0xeb, 0x1b, 0x45, 0xfe, 0x73, 0xa3, 0xc8, 0xdf, 0x6e, 0x15, 0xe9, 0xfa, - 0x56, 0x91, 0x7e, 0xdd, 0x2a, 0xd2, 0xe9, 0x6b, 0xc3, 0x74, 0xcf, 0xba, 0xcd, 0x7c, 0xcb, 0xee, - 0x14, 0x82, 0x6f, 0x57, 0xf0, 0x61, 0xec, 0xbf, 0x57, 0x93, 0x2f, 0x65, 0x33, 0xc2, 0x3b, 0x2f, - 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xa5, 0x2a, 0xe5, 0x4a, 0x46, 0x07, 0x00, 0x00, -} - -func (m *RemoteSignerError) 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 *RemoteSignerError) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoteSignerError) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x12 - } - if m.Code != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Code)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *PubKeyRequest) 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 *PubKeyRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PubKeyRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *PubKeyResponse) 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 *PubKeyResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PubKeyResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Error != nil { - { - size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - { - size, err := m.PubKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *SignVoteRequest) 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 *SignVoteRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignVoteRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0x12 - } - if m.Vote != nil { - { - size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SignedVoteResponse) 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 *SignedVoteResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignedVoteResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Error != nil { - { - size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - { - size, err := m.Vote.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *SignProposalRequest) 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 *SignProposalRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignProposalRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0x12 - } - if m.Proposal != nil { - { - size, err := m.Proposal.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SignedProposalResponse) 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 *SignedProposalResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignedProposalResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Error != nil { - { - size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - { - size, err := m.Proposal.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *PingRequest) 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 *PingRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PingRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *PingResponse) 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 *PingResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PingResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *Message) 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 *Message) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *Message_PubKeyRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_PubKeyRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.PubKeyRequest != nil { - { - size, err := m.PubKeyRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Message_PubKeyResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_PubKeyResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.PubKeyResponse != nil { - { - size, err := m.PubKeyResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} - -func (m *Message_SignVoteRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_SignVoteRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.SignVoteRequest != nil { - { - size, err := m.SignVoteRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} - -func (m *Message_SignedVoteResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_SignedVoteResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.SignedVoteResponse != nil { - { - size, err := m.SignedVoteResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} - -func (m *Message_SignProposalRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_SignProposalRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.SignProposalRequest != nil { - { - size, err := m.SignProposalRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - return len(dAtA) - i, nil -} - -func (m *Message_SignedProposalResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_SignedProposalResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.SignedProposalResponse != nil { - { - size, err := m.SignedProposalResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - return len(dAtA) - i, nil -} - -func (m *Message_PingRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_PingRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.PingRequest != nil { - { - size, err := m.PingRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - return len(dAtA) - i, nil -} - -func (m *Message_PingResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_PingResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.PingResponse != nil { - { - size, err := m.PingResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *RemoteSignerError) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Code != 0 { - n += 1 + sovTypes(uint64(m.Code)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *PubKeyRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *PubKeyResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.PubKey.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.Error != nil { - l = m.Error.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *SignVoteRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Vote != nil { - l = m.Vote.Size() - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *SignedVoteResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Vote.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.Error != nil { - l = m.Error.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *SignProposalRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Proposal != nil { - l = m.Proposal.Size() - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *SignedProposalResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Proposal.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.Error != nil { - l = m.Error.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *PingRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *PingResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *Message) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *Message_PubKeyRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PubKeyRequest != nil { - l = m.PubKeyRequest.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_PubKeyResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PubKeyResponse != nil { - l = m.PubKeyResponse.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_SignVoteRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.SignVoteRequest != nil { - l = m.SignVoteRequest.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_SignedVoteResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.SignedVoteResponse != nil { - l = m.SignedVoteResponse.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_SignProposalRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.SignProposalRequest != nil { - l = m.SignProposalRequest.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_SignedProposalResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.SignedProposalResponse != nil { - l = m.SignedProposalResponse.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_PingRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PingRequest != nil { - l = m.PingRequest.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_PingResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PingResponse != nil { - l = m.PingResponse.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *RemoteSignerError) 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 ErrIntOverflowTypes - } - 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: RemoteSignerError: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RemoteSignerError: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) - } - m.Code = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Code |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *PubKeyRequest) 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 ErrIntOverflowTypes - } - 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: PubKeyRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PubKeyRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *PubKeyResponse) 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 ErrIntOverflowTypes - } - 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: PubKeyResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PubKeyResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKey", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Error == nil { - m.Error = &RemoteSignerError{} - } - if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *SignVoteRequest) 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 ErrIntOverflowTypes - } - 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: SignVoteRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SignVoteRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vote == nil { - m.Vote = &types.Vote{} - } - if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *SignedVoteResponse) 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 ErrIntOverflowTypes - } - 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: SignedVoteResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SignedVoteResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Vote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Error == nil { - m.Error = &RemoteSignerError{} - } - if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *SignProposalRequest) 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 ErrIntOverflowTypes - } - 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: SignProposalRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SignProposalRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proposal", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Proposal == nil { - m.Proposal = &types.Proposal{} - } - if err := m.Proposal.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *SignedProposalResponse) 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 ErrIntOverflowTypes - } - 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: SignedProposalResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SignedProposalResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proposal", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Proposal.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Error == nil { - m.Error = &RemoteSignerError{} - } - if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *PingRequest) 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 ErrIntOverflowTypes - } - 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: PingRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PingRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *PingResponse) 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 ErrIntOverflowTypes - } - 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: PingResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PingResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Message) 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 ErrIntOverflowTypes - } - 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: Message: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Message: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKeyRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PubKeyRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_PubKeyRequest{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKeyResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PubKeyResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_PubKeyResponse{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SignVoteRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SignVoteRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_SignVoteRequest{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SignedVoteResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SignedVoteResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_SignedVoteResponse{v} - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SignProposalRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SignProposalRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_SignProposalRequest{v} - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SignedProposalResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SignedProposalResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_SignedProposalResponse{v} - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PingRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PingRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_PingRequest{v} - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PingResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PingResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_PingResponse{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/privval/types.proto b/third_party/proto/tendermint/privval/types.proto deleted file mode 100644 index 0fc8b61dc9..0000000000 --- a/third_party/proto/tendermint/privval/types.proto +++ /dev/null @@ -1,76 +0,0 @@ -syntax = "proto3"; -package tendermint.privval; - -import "tendermint/crypto/keys.proto"; -import "tendermint/types/types.proto"; -import "gogoproto/gogo.proto"; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/privval"; - -enum Errors { - ERRORS_UNKNOWN = 0; - ERRORS_UNEXPECTED_RESPONSE = 1; - ERRORS_NO_CONNECTION = 2; - ERRORS_CONNECTION_TIMEOUT = 3; - ERRORS_READ_TIMEOUT = 4; - ERRORS_WRITE_TIMEOUT = 5; -} - -message RemoteSignerError { - int32 code = 1; - string description = 2; -} - -// PubKeyRequest requests the consensus public key from the remote signer. -message PubKeyRequest { - string chain_id = 1; -} - -// PubKeyResponse is a response message containing the public key. -message PubKeyResponse { - tendermint.crypto.PublicKey pub_key = 1 [(gogoproto.nullable) = false]; - RemoteSignerError error = 2; -} - -// SignVoteRequest is a request to sign a vote -message SignVoteRequest { - tendermint.types.Vote vote = 1; - string chain_id = 2; -} - -// SignedVoteResponse is a response containing a signed vote or an error -message SignedVoteResponse { - tendermint.types.Vote vote = 1 [(gogoproto.nullable) = false]; - RemoteSignerError error = 2; -} - -// SignProposalRequest is a request to sign a proposal -message SignProposalRequest { - tendermint.types.Proposal proposal = 1; - string chain_id = 2; -} - -// SignedProposalResponse is response containing a signed proposal or an error -message SignedProposalResponse { - tendermint.types.Proposal proposal = 1 [(gogoproto.nullable) = false]; - RemoteSignerError error = 2; -} - -// PingRequest is a request to confirm that the connection is alive. -message PingRequest {} - -// PingResponse is a response to confirm that the connection is alive. -message PingResponse {} - -message Message { - oneof sum { - PubKeyRequest pub_key_request = 1; - PubKeyResponse pub_key_response = 2; - SignVoteRequest sign_vote_request = 3; - SignedVoteResponse signed_vote_response = 4; - SignProposalRequest sign_proposal_request = 5; - SignedProposalResponse signed_proposal_response = 6; - PingRequest ping_request = 7; - PingResponse ping_response = 8; - } -} diff --git a/third_party/proto/tendermint/rpc/grpc/types.pb.go b/third_party/proto/tendermint/rpc/grpc/types.pb.go deleted file mode 100644 index de580d2a66..0000000000 --- a/third_party/proto/tendermint/rpc/grpc/types.pb.go +++ /dev/null @@ -1,953 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/rpc/grpc/types.proto - -package coregrpc - -import ( - context "context" - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - proto "github.com/gogo/protobuf/proto" - types "github.com/tendermint/tendermint/abci/types" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 RequestPing struct{} - -func (m *RequestPing) Reset() { *m = RequestPing{} } -func (m *RequestPing) String() string { return proto.CompactTextString(m) } -func (*RequestPing) ProtoMessage() {} -func (*RequestPing) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffff5682c662b95, []int{0} -} - -func (m *RequestPing) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *RequestPing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RequestPing.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 *RequestPing) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestPing.Merge(m, src) -} - -func (m *RequestPing) XXX_Size() int { - return m.Size() -} - -func (m *RequestPing) XXX_DiscardUnknown() { - xxx_messageInfo_RequestPing.DiscardUnknown(m) -} - -var xxx_messageInfo_RequestPing proto.InternalMessageInfo - -type RequestBroadcastTx struct { - Tx []byte `protobuf:"bytes,1,opt,name=tx,proto3" json:"tx,omitempty"` -} - -func (m *RequestBroadcastTx) Reset() { *m = RequestBroadcastTx{} } -func (m *RequestBroadcastTx) String() string { return proto.CompactTextString(m) } -func (*RequestBroadcastTx) ProtoMessage() {} -func (*RequestBroadcastTx) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffff5682c662b95, []int{1} -} - -func (m *RequestBroadcastTx) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *RequestBroadcastTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RequestBroadcastTx.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 *RequestBroadcastTx) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestBroadcastTx.Merge(m, src) -} - -func (m *RequestBroadcastTx) XXX_Size() int { - return m.Size() -} - -func (m *RequestBroadcastTx) XXX_DiscardUnknown() { - xxx_messageInfo_RequestBroadcastTx.DiscardUnknown(m) -} - -var xxx_messageInfo_RequestBroadcastTx proto.InternalMessageInfo - -func (m *RequestBroadcastTx) GetTx() []byte { - if m != nil { - return m.Tx - } - return nil -} - -type ResponsePing struct{} - -func (m *ResponsePing) Reset() { *m = ResponsePing{} } -func (m *ResponsePing) String() string { return proto.CompactTextString(m) } -func (*ResponsePing) ProtoMessage() {} -func (*ResponsePing) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffff5682c662b95, []int{2} -} - -func (m *ResponsePing) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ResponsePing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponsePing.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 *ResponsePing) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponsePing.Merge(m, src) -} - -func (m *ResponsePing) XXX_Size() int { - return m.Size() -} - -func (m *ResponsePing) XXX_DiscardUnknown() { - xxx_messageInfo_ResponsePing.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponsePing proto.InternalMessageInfo - -type ResponseBroadcastTx struct { - CheckTx *types.ResponseCheckTx `protobuf:"bytes,1,opt,name=check_tx,json=checkTx,proto3" json:"check_tx,omitempty"` - DeliverTx *types.ResponseDeliverTx `protobuf:"bytes,2,opt,name=deliver_tx,json=deliverTx,proto3" json:"deliver_tx,omitempty"` -} - -func (m *ResponseBroadcastTx) Reset() { *m = ResponseBroadcastTx{} } -func (m *ResponseBroadcastTx) String() string { return proto.CompactTextString(m) } -func (*ResponseBroadcastTx) ProtoMessage() {} -func (*ResponseBroadcastTx) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffff5682c662b95, []int{3} -} - -func (m *ResponseBroadcastTx) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ResponseBroadcastTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResponseBroadcastTx.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 *ResponseBroadcastTx) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseBroadcastTx.Merge(m, src) -} - -func (m *ResponseBroadcastTx) XXX_Size() int { - return m.Size() -} - -func (m *ResponseBroadcastTx) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseBroadcastTx.DiscardUnknown(m) -} - -var xxx_messageInfo_ResponseBroadcastTx proto.InternalMessageInfo - -func (m *ResponseBroadcastTx) GetCheckTx() *types.ResponseCheckTx { - if m != nil { - return m.CheckTx - } - return nil -} - -func (m *ResponseBroadcastTx) GetDeliverTx() *types.ResponseDeliverTx { - if m != nil { - return m.DeliverTx - } - return nil -} - -func init() { - proto.RegisterType((*RequestPing)(nil), "tendermint.rpc.grpc.RequestPing") - proto.RegisterType((*RequestBroadcastTx)(nil), "tendermint.rpc.grpc.RequestBroadcastTx") - proto.RegisterType((*ResponsePing)(nil), "tendermint.rpc.grpc.ResponsePing") - proto.RegisterType((*ResponseBroadcastTx)(nil), "tendermint.rpc.grpc.ResponseBroadcastTx") -} - -func init() { proto.RegisterFile("tendermint/rpc/grpc/types.proto", fileDescriptor_0ffff5682c662b95) } - -var fileDescriptor_0ffff5682c662b95 = []byte{ - // 316 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2f, 0x49, 0xcd, 0x4b, - 0x49, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0x2f, 0x2a, 0x48, 0xd6, 0x4f, 0x07, 0x11, 0x25, 0x95, - 0x05, 0xa9, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0xc2, 0x08, 0x05, 0x7a, 0x45, 0x05, - 0xc9, 0x7a, 0x20, 0x05, 0x52, 0xd2, 0x48, 0xba, 0x12, 0x93, 0x92, 0x33, 0x91, 0x75, 0x28, 0xf1, - 0x72, 0x71, 0x07, 0xa5, 0x16, 0x96, 0xa6, 0x16, 0x97, 0x04, 0x64, 0xe6, 0xa5, 0x2b, 0xa9, 0x70, - 0x09, 0x41, 0xb9, 0x4e, 0x45, 0xf9, 0x89, 0x29, 0xc9, 0x89, 0xc5, 0x25, 0x21, 0x15, 0x42, 0x7c, - 0x5c, 0x4c, 0x25, 0x15, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x3c, 0x41, 0x4c, 0x25, 0x15, 0x4a, 0x7c, - 0x5c, 0x3c, 0x41, 0xa9, 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x60, 0x5d, 0x53, 0x19, 0xb9, 0x84, - 0x61, 0x02, 0xc8, 0xfa, 0xac, 0xb9, 0x38, 0x92, 0x33, 0x52, 0x93, 0xb3, 0xe3, 0xa1, 0xba, 0xb9, - 0x8d, 0x14, 0xf4, 0x90, 0x5c, 0x08, 0x72, 0x8c, 0x1e, 0x4c, 0x9f, 0x33, 0x48, 0x61, 0x48, 0x45, - 0x10, 0x7b, 0x32, 0x84, 0x21, 0xe4, 0xc8, 0xc5, 0x95, 0x92, 0x9a, 0x93, 0x59, 0x96, 0x5a, 0x04, - 0xd2, 0xce, 0x04, 0xd6, 0xae, 0x84, 0x53, 0xbb, 0x0b, 0x44, 0x69, 0x48, 0x45, 0x10, 0x67, 0x0a, - 0x8c, 0x69, 0xb4, 0x97, 0x91, 0x8b, 0x07, 0xee, 0x1e, 0xc7, 0x00, 0x4f, 0x21, 0x6f, 0x2e, 0x16, - 0x90, 0x83, 0x85, 0x50, 0x9c, 0x01, 0x0b, 0x28, 0x3d, 0xa4, 0x80, 0x90, 0x52, 0xc4, 0xa1, 0x02, - 0xe1, 0x6b, 0xa1, 0x04, 0x2e, 0x6e, 0x64, 0xcf, 0xaa, 0xe3, 0x33, 0x13, 0x49, 0xa1, 0x94, 0x06, - 0x5e, 0xa3, 0x91, 0x54, 0x3a, 0xf9, 0x9c, 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, 0x51, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0x52, 0xf4, 0x62, - 0x49, 0x1f, 0xd6, 0xc9, 0xf9, 0x45, 0xa9, 0x20, 0x46, 0x12, 0x1b, 0x38, 0xc6, 0x8d, 0x01, 0x01, - 0x00, 0x00, 0xff, 0xff, 0xf6, 0x4b, 0x02, 0xd8, 0x46, 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 - -// BroadcastAPIClient is the client API for BroadcastAPI service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type BroadcastAPIClient interface { - Ping(ctx context.Context, in *RequestPing, opts ...grpc.CallOption) (*ResponsePing, error) - BroadcastTx(ctx context.Context, in *RequestBroadcastTx, opts ...grpc.CallOption) (*ResponseBroadcastTx, error) -} - -type broadcastAPIClient struct { - cc *grpc.ClientConn -} - -func NewBroadcastAPIClient(cc *grpc.ClientConn) BroadcastAPIClient { - return &broadcastAPIClient{cc} -} - -func (c *broadcastAPIClient) Ping(ctx context.Context, in *RequestPing, opts ...grpc.CallOption) (*ResponsePing, error) { - out := new(ResponsePing) - err := c.cc.Invoke(ctx, "/tendermint.rpc.grpc.BroadcastAPI/Ping", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *broadcastAPIClient) BroadcastTx(ctx context.Context, in *RequestBroadcastTx, opts ...grpc.CallOption) (*ResponseBroadcastTx, error) { - out := new(ResponseBroadcastTx) - err := c.cc.Invoke(ctx, "/tendermint.rpc.grpc.BroadcastAPI/BroadcastTx", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// BroadcastAPIServer is the server API for BroadcastAPI service. -type BroadcastAPIServer interface { - Ping(context.Context, *RequestPing) (*ResponsePing, error) - BroadcastTx(context.Context, *RequestBroadcastTx) (*ResponseBroadcastTx, error) -} - -// UnimplementedBroadcastAPIServer can be embedded to have forward compatible implementations. -type UnimplementedBroadcastAPIServer struct{} - -func (*UnimplementedBroadcastAPIServer) Ping(ctx context.Context, req *RequestPing) (*ResponsePing, error) { - return nil, status.Errorf(codes.Unimplemented, "method Ping not implemented") -} - -func (*UnimplementedBroadcastAPIServer) BroadcastTx(ctx context.Context, req *RequestBroadcastTx) (*ResponseBroadcastTx, error) { - return nil, status.Errorf(codes.Unimplemented, "method BroadcastTx not implemented") -} - -func RegisterBroadcastAPIServer(s *grpc.Server, srv BroadcastAPIServer) { - s.RegisterService(&_BroadcastAPI_serviceDesc, srv) -} - -func _BroadcastAPI_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestPing) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BroadcastAPIServer).Ping(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.rpc.grpc.BroadcastAPI/Ping", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BroadcastAPIServer).Ping(ctx, req.(*RequestPing)) - } - return interceptor(ctx, in, info, handler) -} - -func _BroadcastAPI_BroadcastTx_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestBroadcastTx) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BroadcastAPIServer).BroadcastTx(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tendermint.rpc.grpc.BroadcastAPI/BroadcastTx", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BroadcastAPIServer).BroadcastTx(ctx, req.(*RequestBroadcastTx)) - } - return interceptor(ctx, in, info, handler) -} - -var _BroadcastAPI_serviceDesc = grpc.ServiceDesc{ - ServiceName: "tendermint.rpc.grpc.BroadcastAPI", - HandlerType: (*BroadcastAPIServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Ping", - Handler: _BroadcastAPI_Ping_Handler, - }, - { - MethodName: "BroadcastTx", - Handler: _BroadcastAPI_BroadcastTx_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "tendermint/rpc/grpc/types.proto", -} - -func (m *RequestPing) 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 *RequestPing) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RequestPing) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *RequestBroadcastTx) 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 *RequestBroadcastTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RequestBroadcastTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Tx) > 0 { - i -= len(m.Tx) - copy(dAtA[i:], m.Tx) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Tx))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ResponsePing) 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 *ResponsePing) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResponsePing) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *ResponseBroadcastTx) 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 *ResponseBroadcastTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResponseBroadcastTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.DeliverTx != nil { - { - size, err := m.DeliverTx.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.CheckTx != nil { - { - size, err := m.CheckTx.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *RequestPing) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *RequestBroadcastTx) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Tx) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *ResponsePing) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *ResponseBroadcastTx) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CheckTx != nil { - l = m.CheckTx.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.DeliverTx != nil { - l = m.DeliverTx.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *RequestPing) 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 ErrIntOverflowTypes - } - 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: RequestPing: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestPing: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *RequestBroadcastTx) 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 ErrIntOverflowTypes - } - 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: RequestBroadcastTx: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RequestBroadcastTx: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tx", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tx = append(m.Tx[:0], dAtA[iNdEx:postIndex]...) - if m.Tx == nil { - m.Tx = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ResponsePing) 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 ErrIntOverflowTypes - } - 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: ResponsePing: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResponsePing: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ResponseBroadcastTx) 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 ErrIntOverflowTypes - } - 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: ResponseBroadcastTx: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseBroadcastTx: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CheckTx", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CheckTx == nil { - m.CheckTx = &types.ResponseCheckTx{} - } - if err := m.CheckTx.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeliverTx", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.DeliverTx == nil { - m.DeliverTx = &types.ResponseDeliverTx{} - } - if err := m.DeliverTx.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/rpc/grpc/types.proto b/third_party/proto/tendermint/rpc/grpc/types.proto deleted file mode 100644 index ee948a4065..0000000000 --- a/third_party/proto/tendermint/rpc/grpc/types.proto +++ /dev/null @@ -1,32 +0,0 @@ -syntax = "proto3"; -package tendermint.rpc.grpc; -option go_package = "github.com/tendermint/tendermint/rpc/grpc;coregrpc"; - -import "tendermint/abci/types.proto"; - -//---------------------------------------- -// Request types - -message RequestPing {} - -message RequestBroadcastTx { - bytes tx = 1; -} - -//---------------------------------------- -// Response types - -message ResponsePing {} - -message ResponseBroadcastTx { - tendermint.abci.ResponseCheckTx check_tx = 1; - tendermint.abci.ResponseDeliverTx deliver_tx = 2; -} - -//---------------------------------------- -// Service Definition - -service BroadcastAPI { - rpc Ping(RequestPing) returns (ResponsePing); - rpc BroadcastTx(RequestBroadcastTx) returns (ResponseBroadcastTx); -} diff --git a/third_party/proto/tendermint/state/types.pb.go b/third_party/proto/tendermint/state/types.pb.go deleted file mode 100644 index 6f56294825..0000000000 --- a/third_party/proto/tendermint/state/types.pb.go +++ /dev/null @@ -1,2218 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/state/types.proto - -package state - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - time "time" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - types "github.com/tendermint/tendermint/abci/types" - types1 "github.com/tendermint/tendermint/proto/tendermint/types" - version "github.com/tendermint/tendermint/proto/tendermint/version" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = math.Inf - _ = time.Kitchen -) - -// 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 - -// ABCIResponses retains the responses -// of the various ABCI calls during block processing. -// It is persisted to disk for each height before calling Commit. -type ABCIResponses struct { - DeliverTxs []*types.ResponseDeliverTx `protobuf:"bytes,1,rep,name=deliver_txs,json=deliverTxs,proto3" json:"deliver_txs,omitempty"` - EndBlock *types.ResponseEndBlock `protobuf:"bytes,2,opt,name=end_block,json=endBlock,proto3" json:"end_block,omitempty"` - BeginBlock *types.ResponseBeginBlock `protobuf:"bytes,3,opt,name=begin_block,json=beginBlock,proto3" json:"begin_block,omitempty"` -} - -func (m *ABCIResponses) Reset() { *m = ABCIResponses{} } -func (m *ABCIResponses) String() string { return proto.CompactTextString(m) } -func (*ABCIResponses) ProtoMessage() {} -func (*ABCIResponses) Descriptor() ([]byte, []int) { - return fileDescriptor_ccfacf933f22bf93, []int{0} -} - -func (m *ABCIResponses) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ABCIResponses) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ABCIResponses.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 *ABCIResponses) XXX_Merge(src proto.Message) { - xxx_messageInfo_ABCIResponses.Merge(m, src) -} - -func (m *ABCIResponses) XXX_Size() int { - return m.Size() -} - -func (m *ABCIResponses) XXX_DiscardUnknown() { - xxx_messageInfo_ABCIResponses.DiscardUnknown(m) -} - -var xxx_messageInfo_ABCIResponses proto.InternalMessageInfo - -func (m *ABCIResponses) GetDeliverTxs() []*types.ResponseDeliverTx { - if m != nil { - return m.DeliverTxs - } - return nil -} - -func (m *ABCIResponses) GetEndBlock() *types.ResponseEndBlock { - if m != nil { - return m.EndBlock - } - return nil -} - -func (m *ABCIResponses) GetBeginBlock() *types.ResponseBeginBlock { - if m != nil { - return m.BeginBlock - } - return nil -} - -// ValidatorsInfo represents the latest validator set, or the last height it changed -type ValidatorsInfo struct { - ValidatorSet *types1.ValidatorSet `protobuf:"bytes,1,opt,name=validator_set,json=validatorSet,proto3" json:"validator_set,omitempty"` - LastHeightChanged int64 `protobuf:"varint,2,opt,name=last_height_changed,json=lastHeightChanged,proto3" json:"last_height_changed,omitempty"` -} - -func (m *ValidatorsInfo) Reset() { *m = ValidatorsInfo{} } -func (m *ValidatorsInfo) String() string { return proto.CompactTextString(m) } -func (*ValidatorsInfo) ProtoMessage() {} -func (*ValidatorsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ccfacf933f22bf93, []int{1} -} - -func (m *ValidatorsInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ValidatorsInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ValidatorsInfo.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 *ValidatorsInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ValidatorsInfo.Merge(m, src) -} - -func (m *ValidatorsInfo) XXX_Size() int { - return m.Size() -} - -func (m *ValidatorsInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ValidatorsInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_ValidatorsInfo proto.InternalMessageInfo - -func (m *ValidatorsInfo) GetValidatorSet() *types1.ValidatorSet { - if m != nil { - return m.ValidatorSet - } - return nil -} - -func (m *ValidatorsInfo) GetLastHeightChanged() int64 { - if m != nil { - return m.LastHeightChanged - } - return 0 -} - -// ConsensusParamsInfo represents the latest consensus params, or the last height it changed -type ConsensusParamsInfo struct { - ConsensusParams types1.ConsensusParams `protobuf:"bytes,1,opt,name=consensus_params,json=consensusParams,proto3" json:"consensus_params"` - LastHeightChanged int64 `protobuf:"varint,2,opt,name=last_height_changed,json=lastHeightChanged,proto3" json:"last_height_changed,omitempty"` -} - -func (m *ConsensusParamsInfo) Reset() { *m = ConsensusParamsInfo{} } -func (m *ConsensusParamsInfo) String() string { return proto.CompactTextString(m) } -func (*ConsensusParamsInfo) ProtoMessage() {} -func (*ConsensusParamsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ccfacf933f22bf93, []int{2} -} - -func (m *ConsensusParamsInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ConsensusParamsInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ConsensusParamsInfo.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 *ConsensusParamsInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConsensusParamsInfo.Merge(m, src) -} - -func (m *ConsensusParamsInfo) XXX_Size() int { - return m.Size() -} - -func (m *ConsensusParamsInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ConsensusParamsInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_ConsensusParamsInfo proto.InternalMessageInfo - -func (m *ConsensusParamsInfo) GetConsensusParams() types1.ConsensusParams { - if m != nil { - return m.ConsensusParams - } - return types1.ConsensusParams{} -} - -func (m *ConsensusParamsInfo) GetLastHeightChanged() int64 { - if m != nil { - return m.LastHeightChanged - } - return 0 -} - -type ABCIResponsesInfo struct { - AbciResponses *ABCIResponses `protobuf:"bytes,1,opt,name=abci_responses,json=abciResponses,proto3" json:"abci_responses,omitempty"` - Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` -} - -func (m *ABCIResponsesInfo) Reset() { *m = ABCIResponsesInfo{} } -func (m *ABCIResponsesInfo) String() string { return proto.CompactTextString(m) } -func (*ABCIResponsesInfo) ProtoMessage() {} -func (*ABCIResponsesInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ccfacf933f22bf93, []int{3} -} - -func (m *ABCIResponsesInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ABCIResponsesInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ABCIResponsesInfo.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 *ABCIResponsesInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ABCIResponsesInfo.Merge(m, src) -} - -func (m *ABCIResponsesInfo) XXX_Size() int { - return m.Size() -} - -func (m *ABCIResponsesInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ABCIResponsesInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_ABCIResponsesInfo proto.InternalMessageInfo - -func (m *ABCIResponsesInfo) GetAbciResponses() *ABCIResponses { - if m != nil { - return m.AbciResponses - } - return nil -} - -func (m *ABCIResponsesInfo) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -type Version struct { - Consensus version.Consensus `protobuf:"bytes,1,opt,name=consensus,proto3" json:"consensus"` - Software string `protobuf:"bytes,2,opt,name=software,proto3" json:"software,omitempty"` -} - -func (m *Version) Reset() { *m = Version{} } -func (m *Version) String() string { return proto.CompactTextString(m) } -func (*Version) ProtoMessage() {} -func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_ccfacf933f22bf93, []int{4} -} - -func (m *Version) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Version.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 *Version) XXX_Merge(src proto.Message) { - xxx_messageInfo_Version.Merge(m, src) -} - -func (m *Version) XXX_Size() int { - return m.Size() -} - -func (m *Version) XXX_DiscardUnknown() { - xxx_messageInfo_Version.DiscardUnknown(m) -} - -var xxx_messageInfo_Version proto.InternalMessageInfo - -func (m *Version) GetConsensus() version.Consensus { - if m != nil { - return m.Consensus - } - return version.Consensus{} -} - -func (m *Version) GetSoftware() string { - if m != nil { - return m.Software - } - return "" -} - -type State struct { - Version Version `protobuf:"bytes,1,opt,name=version,proto3" json:"version"` - // immutable - ChainID string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - InitialHeight int64 `protobuf:"varint,14,opt,name=initial_height,json=initialHeight,proto3" json:"initial_height,omitempty"` - // LastBlockHeight=0 at genesis (ie. block(H=0) does not exist) - LastBlockHeight int64 `protobuf:"varint,3,opt,name=last_block_height,json=lastBlockHeight,proto3" json:"last_block_height,omitempty"` - LastBlockID types1.BlockID `protobuf:"bytes,4,opt,name=last_block_id,json=lastBlockId,proto3" json:"last_block_id"` - LastBlockTime time.Time `protobuf:"bytes,5,opt,name=last_block_time,json=lastBlockTime,proto3,stdtime" json:"last_block_time"` - // LastValidators is used to validate block.LastCommit. - // Validators are persisted to the database separately every time they change, - // so we can query for historical validator sets. - // Note that if s.LastBlockHeight causes a valset change, - // we set s.LastHeightValidatorsChanged = s.LastBlockHeight + 1 + 1 - // Extra +1 due to nextValSet delay. - NextValidators *types1.ValidatorSet `protobuf:"bytes,6,opt,name=next_validators,json=nextValidators,proto3" json:"next_validators,omitempty"` - Validators *types1.ValidatorSet `protobuf:"bytes,7,opt,name=validators,proto3" json:"validators,omitempty"` - LastValidators *types1.ValidatorSet `protobuf:"bytes,8,opt,name=last_validators,json=lastValidators,proto3" json:"last_validators,omitempty"` - LastHeightValidatorsChanged int64 `protobuf:"varint,9,opt,name=last_height_validators_changed,json=lastHeightValidatorsChanged,proto3" json:"last_height_validators_changed,omitempty"` - // Consensus parameters used for validating blocks. - // Changes returned by EndBlock and updated after Commit. - ConsensusParams types1.ConsensusParams `protobuf:"bytes,10,opt,name=consensus_params,json=consensusParams,proto3" json:"consensus_params"` - LastHeightConsensusParamsChanged int64 `protobuf:"varint,11,opt,name=last_height_consensus_params_changed,json=lastHeightConsensusParamsChanged,proto3" json:"last_height_consensus_params_changed,omitempty"` - // Merkle root of the results from executing prev block - LastResultsHash []byte `protobuf:"bytes,12,opt,name=last_results_hash,json=lastResultsHash,proto3" json:"last_results_hash,omitempty"` - // the latest AppHash we've received from calling abci.Commit() - AppHash []byte `protobuf:"bytes,13,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` -} - -func (m *State) Reset() { *m = State{} } -func (m *State) String() string { return proto.CompactTextString(m) } -func (*State) ProtoMessage() {} -func (*State) Descriptor() ([]byte, []int) { - return fileDescriptor_ccfacf933f22bf93, []int{5} -} - -func (m *State) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *State) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_State.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 *State) XXX_Merge(src proto.Message) { - xxx_messageInfo_State.Merge(m, src) -} - -func (m *State) XXX_Size() int { - return m.Size() -} - -func (m *State) XXX_DiscardUnknown() { - xxx_messageInfo_State.DiscardUnknown(m) -} - -var xxx_messageInfo_State proto.InternalMessageInfo - -func (m *State) GetVersion() Version { - if m != nil { - return m.Version - } - return Version{} -} - -func (m *State) GetChainID() string { - if m != nil { - return m.ChainID - } - return "" -} - -func (m *State) GetInitialHeight() int64 { - if m != nil { - return m.InitialHeight - } - return 0 -} - -func (m *State) GetLastBlockHeight() int64 { - if m != nil { - return m.LastBlockHeight - } - return 0 -} - -func (m *State) GetLastBlockID() types1.BlockID { - if m != nil { - return m.LastBlockID - } - return types1.BlockID{} -} - -func (m *State) GetLastBlockTime() time.Time { - if m != nil { - return m.LastBlockTime - } - return time.Time{} -} - -func (m *State) GetNextValidators() *types1.ValidatorSet { - if m != nil { - return m.NextValidators - } - return nil -} - -func (m *State) GetValidators() *types1.ValidatorSet { - if m != nil { - return m.Validators - } - return nil -} - -func (m *State) GetLastValidators() *types1.ValidatorSet { - if m != nil { - return m.LastValidators - } - return nil -} - -func (m *State) GetLastHeightValidatorsChanged() int64 { - if m != nil { - return m.LastHeightValidatorsChanged - } - return 0 -} - -func (m *State) GetConsensusParams() types1.ConsensusParams { - if m != nil { - return m.ConsensusParams - } - return types1.ConsensusParams{} -} - -func (m *State) GetLastHeightConsensusParamsChanged() int64 { - if m != nil { - return m.LastHeightConsensusParamsChanged - } - return 0 -} - -func (m *State) GetLastResultsHash() []byte { - if m != nil { - return m.LastResultsHash - } - return nil -} - -func (m *State) GetAppHash() []byte { - if m != nil { - return m.AppHash - } - return nil -} - -func init() { - proto.RegisterType((*ABCIResponses)(nil), "tendermint.state.ABCIResponses") - proto.RegisterType((*ValidatorsInfo)(nil), "tendermint.state.ValidatorsInfo") - proto.RegisterType((*ConsensusParamsInfo)(nil), "tendermint.state.ConsensusParamsInfo") - proto.RegisterType((*ABCIResponsesInfo)(nil), "tendermint.state.ABCIResponsesInfo") - proto.RegisterType((*Version)(nil), "tendermint.state.Version") - proto.RegisterType((*State)(nil), "tendermint.state.State") -} - -func init() { proto.RegisterFile("tendermint/state/types.proto", fileDescriptor_ccfacf933f22bf93) } - -var fileDescriptor_ccfacf933f22bf93 = []byte{ - // 805 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcd, 0x8e, 0xe3, 0x44, - 0x10, 0x8e, 0xc9, 0x6e, 0x7e, 0xca, 0x93, 0x64, 0xb7, 0x07, 0x21, 0x6f, 0x96, 0x75, 0xb2, 0xe1, - 0x47, 0x23, 0x0e, 0x8e, 0xb4, 0x1c, 0x10, 0x97, 0x95, 0xd6, 0x09, 0xb0, 0x91, 0x56, 0x08, 0x3c, - 0xa3, 0x39, 0x70, 0xb1, 0x3a, 0x71, 0x8f, 0x6d, 0x91, 0xd8, 0x96, 0xbb, 0x13, 0x86, 0x07, 0xe0, - 0x3e, 0x57, 0xde, 0x68, 0x8e, 0x73, 0x44, 0x1c, 0x06, 0xc8, 0xbc, 0x08, 0xea, 0x1f, 0xdb, 0x9d, - 0x84, 0x91, 0x06, 0xed, 0xad, 0x5d, 0xf5, 0xd5, 0x57, 0x5f, 0x55, 0x57, 0xb5, 0xe1, 0x63, 0x46, - 0x92, 0x80, 0xe4, 0xab, 0x38, 0x61, 0x63, 0xca, 0x30, 0x23, 0x63, 0xf6, 0x6b, 0x46, 0xa8, 0x93, - 0xe5, 0x29, 0x4b, 0xd1, 0x93, 0xca, 0xeb, 0x08, 0x6f, 0xff, 0xc3, 0x30, 0x0d, 0x53, 0xe1, 0x1c, - 0xf3, 0x93, 0xc4, 0xf5, 0x9f, 0x6b, 0x2c, 0x78, 0xbe, 0x88, 0x75, 0x92, 0xbe, 0x9e, 0x42, 0xd8, - 0x77, 0xbc, 0xc3, 0x03, 0xef, 0x06, 0x2f, 0xe3, 0x00, 0xb3, 0x34, 0x57, 0x88, 0x17, 0x07, 0x88, - 0x0c, 0xe7, 0x78, 0x55, 0x10, 0xd8, 0x9a, 0x7b, 0x43, 0x72, 0x1a, 0xa7, 0xc9, 0x4e, 0x82, 0x41, - 0x98, 0xa6, 0xe1, 0x92, 0x8c, 0xc5, 0xd7, 0x7c, 0x7d, 0x31, 0x66, 0xf1, 0x8a, 0x50, 0x86, 0x57, - 0x99, 0x04, 0x8c, 0xfe, 0x34, 0xa0, 0xf3, 0xc6, 0x9d, 0xcc, 0x3c, 0x42, 0xb3, 0x34, 0xa1, 0x84, - 0xa2, 0x09, 0x98, 0x01, 0x59, 0xc6, 0x1b, 0x92, 0xfb, 0xec, 0x92, 0x5a, 0xc6, 0xb0, 0x7e, 0x62, - 0xbe, 0x1a, 0x39, 0x5a, 0x33, 0x78, 0x91, 0x4e, 0x11, 0x30, 0x95, 0xd8, 0xb3, 0x4b, 0x0f, 0x82, - 0xe2, 0x48, 0xd1, 0x6b, 0x68, 0x93, 0x24, 0xf0, 0xe7, 0xcb, 0x74, 0xf1, 0xb3, 0xf5, 0xc1, 0xd0, - 0x38, 0x31, 0x5f, 0xbd, 0xbc, 0x97, 0xe2, 0x9b, 0x24, 0x70, 0x39, 0xd0, 0x6b, 0x11, 0x75, 0x42, - 0x53, 0x30, 0xe7, 0x24, 0x8c, 0x13, 0xc5, 0x50, 0x17, 0x0c, 0x9f, 0xdc, 0xcb, 0xe0, 0x72, 0xac, - 0xe4, 0x80, 0x79, 0x79, 0x1e, 0xfd, 0x66, 0x40, 0xf7, 0xbc, 0x68, 0x28, 0x9d, 0x25, 0x17, 0x29, - 0x9a, 0x40, 0xa7, 0x6c, 0xb1, 0x4f, 0x09, 0xb3, 0x0c, 0x41, 0x6d, 0xeb, 0xd4, 0xb2, 0x81, 0x65, - 0xe0, 0x29, 0x61, 0xde, 0xd1, 0x46, 0xfb, 0x42, 0x0e, 0x1c, 0x2f, 0x31, 0x65, 0x7e, 0x44, 0xe2, - 0x30, 0x62, 0xfe, 0x22, 0xc2, 0x49, 0x48, 0x02, 0x51, 0x67, 0xdd, 0x7b, 0xca, 0x5d, 0x6f, 0x85, - 0x67, 0x22, 0x1d, 0xa3, 0xdf, 0x0d, 0x38, 0x9e, 0x70, 0x9d, 0x09, 0x5d, 0xd3, 0x1f, 0xc4, 0xfd, - 0x09, 0x31, 0x1e, 0x3c, 0x59, 0x14, 0x66, 0x5f, 0xde, 0xab, 0xd2, 0xf3, 0xf2, 0x50, 0xcf, 0x1e, - 0x81, 0xfb, 0xe8, 0xfa, 0x76, 0x50, 0xf3, 0x7a, 0x8b, 0x5d, 0xf3, 0xff, 0xd6, 0x46, 0xe1, 0xe9, - 0xce, 0xfd, 0x0b, 0x61, 0xdf, 0x42, 0x97, 0xf7, 0xd7, 0xcf, 0x0b, 0xab, 0x92, 0x35, 0x70, 0xf6, - 0x77, 0xc2, 0xd9, 0x09, 0xf6, 0x3a, 0x3c, 0xac, 0x9a, 0xa5, 0x8f, 0xa0, 0x21, 0x75, 0xa8, 0xfc, - 0xea, 0x6b, 0x14, 0x41, 0xf3, 0x5c, 0x4e, 0x2b, 0x7a, 0x03, 0xed, 0xb2, 0x04, 0x95, 0xe5, 0x85, - 0x9e, 0x45, 0x4d, 0x75, 0x55, 0xbe, 0x2a, 0xbc, 0x8a, 0x42, 0x7d, 0x68, 0xd1, 0xf4, 0x82, 0xfd, - 0x82, 0x73, 0x22, 0xf2, 0xb4, 0xbd, 0xf2, 0x7b, 0xf4, 0x4f, 0x03, 0x1e, 0x9f, 0x72, 0xa1, 0xe8, - 0x6b, 0x68, 0x2a, 0x2e, 0x95, 0xe6, 0xd9, 0x61, 0x31, 0x4a, 0x94, 0x4a, 0x51, 0xe0, 0xd1, 0xe7, - 0xd0, 0x5a, 0x44, 0x38, 0x4e, 0xfc, 0x58, 0x36, 0xb2, 0xed, 0x9a, 0xdb, 0xdb, 0x41, 0x73, 0xc2, - 0x6d, 0xb3, 0xa9, 0xd7, 0x14, 0xce, 0x59, 0x80, 0x3e, 0x83, 0x6e, 0x9c, 0xc4, 0x2c, 0xc6, 0x4b, - 0xd5, 0x7e, 0xab, 0x2b, 0xca, 0xee, 0x28, 0xab, 0xec, 0x3c, 0xfa, 0x02, 0xc4, 0x3d, 0xc8, 0xd9, - 0x2e, 0x90, 0x75, 0x81, 0xec, 0x71, 0x87, 0x18, 0x5e, 0x85, 0xf5, 0xa0, 0xa3, 0x61, 0xe3, 0xc0, - 0x7a, 0x74, 0xa8, 0x5d, 0xce, 0x87, 0x88, 0x9a, 0x4d, 0xdd, 0x63, 0xae, 0x7d, 0x7b, 0x3b, 0x30, - 0xdf, 0x15, 0x54, 0xb3, 0xa9, 0x67, 0x96, 0xbc, 0xb3, 0x00, 0xbd, 0x83, 0x9e, 0xc6, 0xc9, 0x5f, - 0x04, 0xeb, 0xb1, 0x60, 0xed, 0x3b, 0xf2, 0xb9, 0x70, 0x8a, 0xe7, 0xc2, 0x39, 0x2b, 0x9e, 0x0b, - 0xb7, 0xc5, 0x69, 0xaf, 0xfe, 0x1a, 0x18, 0x5e, 0xa7, 0xe4, 0xe2, 0x5e, 0xf4, 0x1d, 0xf4, 0x12, - 0x72, 0xc9, 0xfc, 0x72, 0x43, 0xa8, 0xd5, 0x78, 0xd0, 0x4e, 0x75, 0x79, 0x58, 0xb5, 0x9e, 0xe8, - 0x35, 0x80, 0xc6, 0xd1, 0x7c, 0x10, 0x87, 0x16, 0xc1, 0x85, 0x88, 0xb2, 0x34, 0x92, 0xd6, 0xc3, - 0x84, 0xf0, 0x30, 0x4d, 0xc8, 0x04, 0x6c, 0x7d, 0x85, 0x2a, 0xbe, 0x72, 0x9b, 0xda, 0xe2, 0xb2, - 0x9e, 0x57, 0xdb, 0x54, 0x45, 0xab, 0xbd, 0xfa, 0xcf, 0xdd, 0x86, 0xf7, 0xdc, 0xed, 0xef, 0xe1, - 0xd3, 0x9d, 0xdd, 0xde, 0xe3, 0x2f, 0xe5, 0x99, 0x42, 0xde, 0x50, 0x5b, 0xf6, 0x5d, 0xa2, 0x42, - 0x63, 0x31, 0x88, 0x39, 0xa1, 0xeb, 0x25, 0xa3, 0x7e, 0x84, 0x69, 0x64, 0x1d, 0x0d, 0x8d, 0x93, - 0x23, 0x39, 0x88, 0x9e, 0xb4, 0xbf, 0xc5, 0x34, 0x42, 0xcf, 0xa0, 0x85, 0xb3, 0x4c, 0x42, 0x3a, - 0x02, 0xd2, 0xc4, 0x59, 0xc6, 0x5d, 0xee, 0x8f, 0xd7, 0x5b, 0xdb, 0xb8, 0xd9, 0xda, 0xc6, 0xdf, - 0x5b, 0xdb, 0xb8, 0xba, 0xb3, 0x6b, 0x37, 0x77, 0x76, 0xed, 0x8f, 0x3b, 0xbb, 0xf6, 0xd3, 0x57, - 0x61, 0xcc, 0xa2, 0xf5, 0xdc, 0x59, 0xa4, 0xab, 0xb1, 0xfe, 0x23, 0xab, 0x8e, 0xf2, 0x6f, 0xba, - 0xff, 0x1f, 0x9e, 0x37, 0x84, 0xfd, 0xcb, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x1a, 0xb9, - 0x2e, 0xa2, 0x07, 0x00, 0x00, -} - -func (m *ABCIResponses) 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 *ABCIResponses) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ABCIResponses) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.BeginBlock != nil { - { - size, err := m.BeginBlock.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.EndBlock != nil { - { - size, err := m.EndBlock.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.DeliverTxs) > 0 { - for iNdEx := len(m.DeliverTxs) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.DeliverTxs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ValidatorsInfo) 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 *ValidatorsInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ValidatorsInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.LastHeightChanged != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.LastHeightChanged)) - i-- - dAtA[i] = 0x10 - } - if m.ValidatorSet != nil { - { - size, err := m.ValidatorSet.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ConsensusParamsInfo) 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 *ConsensusParamsInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ConsensusParamsInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.LastHeightChanged != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.LastHeightChanged)) - i-- - dAtA[i] = 0x10 - } - { - size, err := m.ConsensusParams.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ABCIResponsesInfo) 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 *ABCIResponsesInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ABCIResponsesInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x10 - } - if m.AbciResponses != nil { - { - size, err := m.AbciResponses.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Version) 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 *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Software) > 0 { - i -= len(m.Software) - copy(dAtA[i:], m.Software) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Software))) - i-- - dAtA[i] = 0x12 - } - { - size, err := m.Consensus.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *State) 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 *State) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *State) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.InitialHeight != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.InitialHeight)) - i-- - dAtA[i] = 0x70 - } - if len(m.AppHash) > 0 { - i -= len(m.AppHash) - copy(dAtA[i:], m.AppHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.AppHash))) - i-- - dAtA[i] = 0x6a - } - if len(m.LastResultsHash) > 0 { - i -= len(m.LastResultsHash) - copy(dAtA[i:], m.LastResultsHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.LastResultsHash))) - i-- - dAtA[i] = 0x62 - } - if m.LastHeightConsensusParamsChanged != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.LastHeightConsensusParamsChanged)) - i-- - dAtA[i] = 0x58 - } - { - size, err := m.ConsensusParams.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - if m.LastHeightValidatorsChanged != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.LastHeightValidatorsChanged)) - i-- - dAtA[i] = 0x48 - } - if m.LastValidators != nil { - { - size, err := m.LastValidators.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - if m.Validators != nil { - { - size, err := m.Validators.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if m.NextValidators != nil { - { - size, err := m.NextValidators.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - n11, err11 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastBlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastBlockTime):]) - if err11 != nil { - return 0, err11 - } - i -= n11 - i = encodeVarintTypes(dAtA, i, uint64(n11)) - i-- - dAtA[i] = 0x2a - { - size, err := m.LastBlockID.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - if m.LastBlockHeight != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.LastBlockHeight)) - i-- - dAtA[i] = 0x18 - } - if len(m.ChainID) > 0 { - i -= len(m.ChainID) - copy(dAtA[i:], m.ChainID) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ChainID))) - i-- - dAtA[i] = 0x12 - } - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *ABCIResponses) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.DeliverTxs) > 0 { - for _, e := range m.DeliverTxs { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } - } - if m.EndBlock != nil { - l = m.EndBlock.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.BeginBlock != nil { - l = m.BeginBlock.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *ValidatorsInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ValidatorSet != nil { - l = m.ValidatorSet.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.LastHeightChanged != 0 { - n += 1 + sovTypes(uint64(m.LastHeightChanged)) - } - return n -} - -func (m *ConsensusParamsInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ConsensusParams.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.LastHeightChanged != 0 { - n += 1 + sovTypes(uint64(m.LastHeightChanged)) - } - return n -} - -func (m *ABCIResponsesInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.AbciResponses != nil { - l = m.AbciResponses.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - return n -} - -func (m *Version) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Consensus.Size() - n += 1 + l + sovTypes(uint64(l)) - l = len(m.Software) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *State) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Version.Size() - n += 1 + l + sovTypes(uint64(l)) - l = len(m.ChainID) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.LastBlockHeight != 0 { - n += 1 + sovTypes(uint64(m.LastBlockHeight)) - } - l = m.LastBlockID.Size() - n += 1 + l + sovTypes(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.LastBlockTime) - n += 1 + l + sovTypes(uint64(l)) - if m.NextValidators != nil { - l = m.NextValidators.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.Validators != nil { - l = m.Validators.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.LastValidators != nil { - l = m.LastValidators.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.LastHeightValidatorsChanged != 0 { - n += 1 + sovTypes(uint64(m.LastHeightValidatorsChanged)) - } - l = m.ConsensusParams.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.LastHeightConsensusParamsChanged != 0 { - n += 1 + sovTypes(uint64(m.LastHeightConsensusParamsChanged)) - } - l = len(m.LastResultsHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.AppHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.InitialHeight != 0 { - n += 1 + sovTypes(uint64(m.InitialHeight)) - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *ABCIResponses) 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 ErrIntOverflowTypes - } - 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: ABCIResponses: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ABCIResponses: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeliverTxs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DeliverTxs = append(m.DeliverTxs, &types.ResponseDeliverTx{}) - if err := m.DeliverTxs[len(m.DeliverTxs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EndBlock", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.EndBlock == nil { - m.EndBlock = &types.ResponseEndBlock{} - } - if err := m.EndBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BeginBlock", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.BeginBlock == nil { - m.BeginBlock = &types.ResponseBeginBlock{} - } - if err := m.BeginBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ValidatorsInfo) 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 ErrIntOverflowTypes - } - 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: ValidatorsInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ValidatorsInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSet", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ValidatorSet == nil { - m.ValidatorSet = &types1.ValidatorSet{} - } - if err := m.ValidatorSet.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastHeightChanged", wireType) - } - m.LastHeightChanged = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastHeightChanged |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ConsensusParamsInfo) 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 ErrIntOverflowTypes - } - 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: ConsensusParamsInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ConsensusParamsInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParams", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConsensusParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastHeightChanged", wireType) - } - m.LastHeightChanged = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastHeightChanged |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ABCIResponsesInfo) 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 ErrIntOverflowTypes - } - 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: ABCIResponsesInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ABCIResponsesInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AbciResponses", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.AbciResponses == nil { - m.AbciResponses = &ABCIResponses{} - } - if err := m.AbciResponses.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Version) 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 ErrIntOverflowTypes - } - 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: Version: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Version: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Consensus", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Consensus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Software", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Software = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *State) 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 ErrIntOverflowTypes - } - 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: State: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: State: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainID", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastBlockHeight", wireType) - } - m.LastBlockHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastBlockHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastBlockID", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.LastBlockID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastBlockTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.LastBlockTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NextValidators", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.NextValidators == nil { - m.NextValidators = &types1.ValidatorSet{} - } - if err := m.NextValidators.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validators", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Validators == nil { - m.Validators = &types1.ValidatorSet{} - } - if err := m.Validators.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastValidators", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.LastValidators == nil { - m.LastValidators = &types1.ValidatorSet{} - } - if err := m.LastValidators.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastHeightValidatorsChanged", wireType) - } - m.LastHeightValidatorsChanged = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastHeightValidatorsChanged |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConsensusParams", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConsensusParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 11: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastHeightConsensusParamsChanged", wireType) - } - m.LastHeightConsensusParamsChanged = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastHeightConsensusParamsChanged |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 12: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastResultsHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.LastResultsHash = append(m.LastResultsHash[:0], dAtA[iNdEx:postIndex]...) - if m.LastResultsHash == nil { - m.LastResultsHash = []byte{} - } - iNdEx = postIndex - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AppHash = append(m.AppHash[:0], dAtA[iNdEx:postIndex]...) - if m.AppHash == nil { - m.AppHash = []byte{} - } - iNdEx = postIndex - case 14: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field InitialHeight", wireType) - } - m.InitialHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.InitialHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/state/types.proto b/third_party/proto/tendermint/state/types.proto deleted file mode 100644 index f3fdc0ef39..0000000000 --- a/third_party/proto/tendermint/state/types.proto +++ /dev/null @@ -1,80 +0,0 @@ -syntax = "proto3"; -package tendermint.state; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/state"; - -import "gogoproto/gogo.proto"; -import "tendermint/abci/types.proto"; -import "tendermint/types/types.proto"; -import "tendermint/types/validator.proto"; -import "tendermint/types/params.proto"; -import "tendermint/version/types.proto"; -import "google/protobuf/timestamp.proto"; - -// ABCIResponses retains the responses -// of the various ABCI calls during block processing. -// It is persisted to disk for each height before calling Commit. -message ABCIResponses { - repeated tendermint.abci.ResponseDeliverTx deliver_txs = 1; - tendermint.abci.ResponseEndBlock end_block = 2; - tendermint.abci.ResponseBeginBlock begin_block = 3; -} - -// ValidatorsInfo represents the latest validator set, or the last height it changed -message ValidatorsInfo { - tendermint.types.ValidatorSet validator_set = 1; - int64 last_height_changed = 2; -} - -// ConsensusParamsInfo represents the latest consensus params, or the last height it changed -message ConsensusParamsInfo { - tendermint.types.ConsensusParams consensus_params = 1 [(gogoproto.nullable) = false]; - int64 last_height_changed = 2; -} - -message ABCIResponsesInfo { - ABCIResponses abci_responses = 1; - int64 height = 2; -} - -message Version { - tendermint.version.Consensus consensus = 1 [(gogoproto.nullable) = false]; - string software = 2; -} - -message State { - Version version = 1 [(gogoproto.nullable) = false]; - - // immutable - string chain_id = 2 [(gogoproto.customname) = "ChainID"]; - int64 initial_height = 14; - - // LastBlockHeight=0 at genesis (ie. block(H=0) does not exist) - int64 last_block_height = 3; - tendermint.types.BlockID last_block_id = 4 - [(gogoproto.nullable) = false, (gogoproto.customname) = "LastBlockID"]; - google.protobuf.Timestamp last_block_time = 5 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - - // LastValidators is used to validate block.LastCommit. - // Validators are persisted to the database separately every time they change, - // so we can query for historical validator sets. - // Note that if s.LastBlockHeight causes a valset change, - // we set s.LastHeightValidatorsChanged = s.LastBlockHeight + 1 + 1 - // Extra +1 due to nextValSet delay. - tendermint.types.ValidatorSet next_validators = 6; - tendermint.types.ValidatorSet validators = 7; - tendermint.types.ValidatorSet last_validators = 8; - int64 last_height_validators_changed = 9; - - // Consensus parameters used for validating blocks. - // Changes returned by EndBlock and updated after Commit. - tendermint.types.ConsensusParams consensus_params = 10 [(gogoproto.nullable) = false]; - int64 last_height_consensus_params_changed = 11; - - // Merkle root of the results from executing prev block - bytes last_results_hash = 12; - - // the latest AppHash we've received from calling abci.Commit() - bytes app_hash = 13; -} diff --git a/third_party/proto/tendermint/statesync/types.pb.go b/third_party/proto/tendermint/statesync/types.pb.go deleted file mode 100644 index ba43116ba8..0000000000 --- a/third_party/proto/tendermint/statesync/types.pb.go +++ /dev/null @@ -1,1672 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/statesync/types.proto - -package statesync - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 Message struct { - // Types that are valid to be assigned to Sum: - // *Message_SnapshotsRequest - // *Message_SnapshotsResponse - // *Message_ChunkRequest - // *Message_ChunkResponse - Sum isMessage_Sum `protobuf_oneof:"sum"` -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} -func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_a1c2869546ca7914, []int{0} -} - -func (m *Message) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Message.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 *Message) XXX_Merge(src proto.Message) { - xxx_messageInfo_Message.Merge(m, src) -} - -func (m *Message) XXX_Size() int { - return m.Size() -} - -func (m *Message) XXX_DiscardUnknown() { - xxx_messageInfo_Message.DiscardUnknown(m) -} - -var xxx_messageInfo_Message proto.InternalMessageInfo - -type isMessage_Sum interface { - isMessage_Sum() - MarshalTo([]byte) (int, error) - Size() int -} - -type Message_SnapshotsRequest struct { - SnapshotsRequest *SnapshotsRequest `protobuf:"bytes,1,opt,name=snapshots_request,json=snapshotsRequest,proto3,oneof" json:"snapshots_request,omitempty"` -} -type Message_SnapshotsResponse struct { - SnapshotsResponse *SnapshotsResponse `protobuf:"bytes,2,opt,name=snapshots_response,json=snapshotsResponse,proto3,oneof" json:"snapshots_response,omitempty"` -} -type Message_ChunkRequest struct { - ChunkRequest *ChunkRequest `protobuf:"bytes,3,opt,name=chunk_request,json=chunkRequest,proto3,oneof" json:"chunk_request,omitempty"` -} -type Message_ChunkResponse struct { - ChunkResponse *ChunkResponse `protobuf:"bytes,4,opt,name=chunk_response,json=chunkResponse,proto3,oneof" json:"chunk_response,omitempty"` -} - -func (*Message_SnapshotsRequest) isMessage_Sum() {} -func (*Message_SnapshotsResponse) isMessage_Sum() {} -func (*Message_ChunkRequest) isMessage_Sum() {} -func (*Message_ChunkResponse) isMessage_Sum() {} - -func (m *Message) GetSum() isMessage_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *Message) GetSnapshotsRequest() *SnapshotsRequest { - if x, ok := m.GetSum().(*Message_SnapshotsRequest); ok { - return x.SnapshotsRequest - } - return nil -} - -func (m *Message) GetSnapshotsResponse() *SnapshotsResponse { - if x, ok := m.GetSum().(*Message_SnapshotsResponse); ok { - return x.SnapshotsResponse - } - return nil -} - -func (m *Message) GetChunkRequest() *ChunkRequest { - if x, ok := m.GetSum().(*Message_ChunkRequest); ok { - return x.ChunkRequest - } - return nil -} - -func (m *Message) GetChunkResponse() *ChunkResponse { - if x, ok := m.GetSum().(*Message_ChunkResponse); ok { - return x.ChunkResponse - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Message) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Message_SnapshotsRequest)(nil), - (*Message_SnapshotsResponse)(nil), - (*Message_ChunkRequest)(nil), - (*Message_ChunkResponse)(nil), - } -} - -type SnapshotsRequest struct{} - -func (m *SnapshotsRequest) Reset() { *m = SnapshotsRequest{} } -func (m *SnapshotsRequest) String() string { return proto.CompactTextString(m) } -func (*SnapshotsRequest) ProtoMessage() {} -func (*SnapshotsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a1c2869546ca7914, []int{1} -} - -func (m *SnapshotsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *SnapshotsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SnapshotsRequest.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 *SnapshotsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SnapshotsRequest.Merge(m, src) -} - -func (m *SnapshotsRequest) XXX_Size() int { - return m.Size() -} - -func (m *SnapshotsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SnapshotsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SnapshotsRequest proto.InternalMessageInfo - -type SnapshotsResponse struct { - Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Format uint32 `protobuf:"varint,2,opt,name=format,proto3" json:"format,omitempty"` - Chunks uint32 `protobuf:"varint,3,opt,name=chunks,proto3" json:"chunks,omitempty"` - Hash []byte `protobuf:"bytes,4,opt,name=hash,proto3" json:"hash,omitempty"` - Metadata []byte `protobuf:"bytes,5,opt,name=metadata,proto3" json:"metadata,omitempty"` -} - -func (m *SnapshotsResponse) Reset() { *m = SnapshotsResponse{} } -func (m *SnapshotsResponse) String() string { return proto.CompactTextString(m) } -func (*SnapshotsResponse) ProtoMessage() {} -func (*SnapshotsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a1c2869546ca7914, []int{2} -} - -func (m *SnapshotsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *SnapshotsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SnapshotsResponse.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 *SnapshotsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SnapshotsResponse.Merge(m, src) -} - -func (m *SnapshotsResponse) XXX_Size() int { - return m.Size() -} - -func (m *SnapshotsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SnapshotsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_SnapshotsResponse proto.InternalMessageInfo - -func (m *SnapshotsResponse) GetHeight() uint64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *SnapshotsResponse) GetFormat() uint32 { - if m != nil { - return m.Format - } - return 0 -} - -func (m *SnapshotsResponse) GetChunks() uint32 { - if m != nil { - return m.Chunks - } - return 0 -} - -func (m *SnapshotsResponse) GetHash() []byte { - if m != nil { - return m.Hash - } - return nil -} - -func (m *SnapshotsResponse) GetMetadata() []byte { - if m != nil { - return m.Metadata - } - return nil -} - -type ChunkRequest struct { - Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Format uint32 `protobuf:"varint,2,opt,name=format,proto3" json:"format,omitempty"` - Index uint32 `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"` -} - -func (m *ChunkRequest) Reset() { *m = ChunkRequest{} } -func (m *ChunkRequest) String() string { return proto.CompactTextString(m) } -func (*ChunkRequest) ProtoMessage() {} -func (*ChunkRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a1c2869546ca7914, []int{3} -} - -func (m *ChunkRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ChunkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ChunkRequest.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 *ChunkRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChunkRequest.Merge(m, src) -} - -func (m *ChunkRequest) XXX_Size() int { - return m.Size() -} - -func (m *ChunkRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ChunkRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ChunkRequest proto.InternalMessageInfo - -func (m *ChunkRequest) GetHeight() uint64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *ChunkRequest) GetFormat() uint32 { - if m != nil { - return m.Format - } - return 0 -} - -func (m *ChunkRequest) GetIndex() uint32 { - if m != nil { - return m.Index - } - return 0 -} - -type ChunkResponse struct { - Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Format uint32 `protobuf:"varint,2,opt,name=format,proto3" json:"format,omitempty"` - Index uint32 `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"` - Chunk []byte `protobuf:"bytes,4,opt,name=chunk,proto3" json:"chunk,omitempty"` - Missing bool `protobuf:"varint,5,opt,name=missing,proto3" json:"missing,omitempty"` -} - -func (m *ChunkResponse) Reset() { *m = ChunkResponse{} } -func (m *ChunkResponse) String() string { return proto.CompactTextString(m) } -func (*ChunkResponse) ProtoMessage() {} -func (*ChunkResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a1c2869546ca7914, []int{4} -} - -func (m *ChunkResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ChunkResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ChunkResponse.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 *ChunkResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChunkResponse.Merge(m, src) -} - -func (m *ChunkResponse) XXX_Size() int { - return m.Size() -} - -func (m *ChunkResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ChunkResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ChunkResponse proto.InternalMessageInfo - -func (m *ChunkResponse) GetHeight() uint64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *ChunkResponse) GetFormat() uint32 { - if m != nil { - return m.Format - } - return 0 -} - -func (m *ChunkResponse) GetIndex() uint32 { - if m != nil { - return m.Index - } - return 0 -} - -func (m *ChunkResponse) GetChunk() []byte { - if m != nil { - return m.Chunk - } - return nil -} - -func (m *ChunkResponse) GetMissing() bool { - if m != nil { - return m.Missing - } - return false -} - -func init() { - proto.RegisterType((*Message)(nil), "tendermint.statesync.Message") - proto.RegisterType((*SnapshotsRequest)(nil), "tendermint.statesync.SnapshotsRequest") - proto.RegisterType((*SnapshotsResponse)(nil), "tendermint.statesync.SnapshotsResponse") - proto.RegisterType((*ChunkRequest)(nil), "tendermint.statesync.ChunkRequest") - proto.RegisterType((*ChunkResponse)(nil), "tendermint.statesync.ChunkResponse") -} - -func init() { proto.RegisterFile("tendermint/statesync/types.proto", fileDescriptor_a1c2869546ca7914) } - -var fileDescriptor_a1c2869546ca7914 = []byte{ - // 393 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x53, 0xcd, 0x6a, 0xdb, 0x40, - 0x18, 0x94, 0xfc, 0xcf, 0x57, 0xab, 0xd8, 0x8b, 0x29, 0xa2, 0x07, 0x61, 0x54, 0x68, 0x7b, 0x92, - 0xa0, 0x3d, 0xf6, 0xe6, 0x5e, 0x5c, 0x68, 0x2f, 0xdb, 0x18, 0x42, 0x2e, 0x61, 0x2d, 0x6f, 0x24, - 0x11, 0xb4, 0x52, 0xf4, 0xad, 0x20, 0x7e, 0x80, 0x9c, 0x72, 0xc9, 0x63, 0xe5, 0xe8, 0x63, 0xc8, - 0x29, 0xd8, 0x2f, 0x12, 0xb4, 0x92, 0x65, 0xc5, 0x31, 0x09, 0x81, 0xdc, 0x76, 0xc6, 0xe3, 0xd1, - 0xcc, 0xc0, 0x07, 0x63, 0xc9, 0xc5, 0x82, 0xa7, 0x51, 0x28, 0xa4, 0x8b, 0x92, 0x49, 0x8e, 0x4b, - 0xe1, 0xb9, 0x72, 0x99, 0x70, 0x74, 0x92, 0x34, 0x96, 0x31, 0x19, 0xed, 0x14, 0x4e, 0xa5, 0xb0, - 0xef, 0x1b, 0xd0, 0xfd, 0xc7, 0x11, 0x99, 0xcf, 0xc9, 0x0c, 0x86, 0x28, 0x58, 0x82, 0x41, 0x2c, - 0xf1, 0x34, 0xe5, 0x17, 0x19, 0x47, 0x69, 0xea, 0x63, 0xfd, 0xfb, 0x87, 0x1f, 0x5f, 0x9d, 0x43, - 0xff, 0x76, 0xfe, 0x6f, 0xe5, 0xb4, 0x50, 0x4f, 0x35, 0x3a, 0xc0, 0x3d, 0x8e, 0x1c, 0x03, 0xa9, - 0xdb, 0x62, 0x12, 0x0b, 0xe4, 0x66, 0x43, 0xf9, 0x7e, 0x7b, 0xd5, 0xb7, 0x90, 0x4f, 0x35, 0x3a, - 0xc4, 0x7d, 0x92, 0xfc, 0x01, 0xc3, 0x0b, 0x32, 0x71, 0x5e, 0x85, 0x6d, 0x2a, 0x53, 0xfb, 0xb0, - 0xe9, 0xef, 0x5c, 0xba, 0x0b, 0xda, 0xf7, 0x6a, 0x98, 0xfc, 0x85, 0x8f, 0x5b, 0xab, 0x32, 0x60, - 0x4b, 0x79, 0x7d, 0x79, 0xd1, 0xab, 0x0a, 0x67, 0x78, 0x75, 0x62, 0xd2, 0x86, 0x26, 0x66, 0x91, - 0x4d, 0x60, 0xb0, 0xbf, 0x90, 0x7d, 0xad, 0xc3, 0xf0, 0x59, 0x3d, 0xf2, 0x09, 0x3a, 0x01, 0x0f, - 0xfd, 0xa0, 0xd8, 0xbb, 0x45, 0x4b, 0x94, 0xf3, 0x67, 0x71, 0x1a, 0x31, 0xa9, 0xf6, 0x32, 0x68, - 0x89, 0x72, 0x5e, 0x7d, 0x11, 0x55, 0x65, 0x83, 0x96, 0x88, 0x10, 0x68, 0x05, 0x0c, 0x03, 0x15, - 0xbe, 0x4f, 0xd5, 0x9b, 0x7c, 0x86, 0x5e, 0xc4, 0x25, 0x5b, 0x30, 0xc9, 0xcc, 0xb6, 0xe2, 0x2b, - 0x6c, 0x1f, 0x41, 0xbf, 0x3e, 0xcb, 0x9b, 0x73, 0x8c, 0xa0, 0x1d, 0x8a, 0x05, 0xbf, 0x2c, 0x63, - 0x14, 0xc0, 0xbe, 0xd2, 0xc1, 0x78, 0xb2, 0xd0, 0xfb, 0xf8, 0xe6, 0xac, 0xea, 0x59, 0xd6, 0x2b, - 0x00, 0x31, 0xa1, 0x1b, 0x85, 0x88, 0xa1, 0xf0, 0x55, 0xbd, 0x1e, 0xdd, 0xc2, 0xc9, 0xec, 0x76, - 0x6d, 0xe9, 0xab, 0xb5, 0xa5, 0x3f, 0xac, 0x2d, 0xfd, 0x66, 0x63, 0x69, 0xab, 0x8d, 0xa5, 0xdd, - 0x6d, 0x2c, 0xed, 0xe4, 0x97, 0x1f, 0xca, 0x20, 0x9b, 0x3b, 0x5e, 0x1c, 0xb9, 0xb5, 0xcb, 0xa9, - 0x3d, 0xd5, 0xd1, 0xb8, 0x87, 0xae, 0x6a, 0xde, 0x51, 0xbf, 0xfd, 0x7c, 0x0c, 0x00, 0x00, 0xff, - 0xff, 0xcc, 0x16, 0xc2, 0x8b, 0x74, 0x03, 0x00, 0x00, -} - -func (m *Message) 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 *Message) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *Message_SnapshotsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_SnapshotsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.SnapshotsRequest != nil { - { - size, err := m.SnapshotsRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Message_SnapshotsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_SnapshotsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.SnapshotsResponse != nil { - { - size, err := m.SnapshotsResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} - -func (m *Message_ChunkRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_ChunkRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ChunkRequest != nil { - { - size, err := m.ChunkRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} - -func (m *Message_ChunkResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message_ChunkResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ChunkResponse != nil { - { - size, err := m.ChunkResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} - -func (m *SnapshotsRequest) 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 *SnapshotsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SnapshotsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *SnapshotsResponse) 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 *SnapshotsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SnapshotsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Metadata) > 0 { - i -= len(m.Metadata) - copy(dAtA[i:], m.Metadata) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Metadata))) - i-- - dAtA[i] = 0x2a - } - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0x22 - } - if m.Chunks != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Chunks)) - i-- - dAtA[i] = 0x18 - } - if m.Format != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Format)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *ChunkRequest) 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 *ChunkRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ChunkRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Index != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x18 - } - if m.Format != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Format)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *ChunkResponse) 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 *ChunkResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ChunkResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Missing { - i-- - if m.Missing { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } - if len(m.Chunk) > 0 { - i -= len(m.Chunk) - copy(dAtA[i:], m.Chunk) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Chunk))) - i-- - dAtA[i] = 0x22 - } - if m.Index != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x18 - } - if m.Format != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Format)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *Message) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *Message_SnapshotsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.SnapshotsRequest != nil { - l = m.SnapshotsRequest.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_SnapshotsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.SnapshotsResponse != nil { - l = m.SnapshotsResponse.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_ChunkRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ChunkRequest != nil { - l = m.ChunkRequest.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Message_ChunkResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ChunkResponse != nil { - l = m.ChunkResponse.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *SnapshotsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *SnapshotsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Format != 0 { - n += 1 + sovTypes(uint64(m.Format)) - } - if m.Chunks != 0 { - n += 1 + sovTypes(uint64(m.Chunks)) - } - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Metadata) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *ChunkRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Format != 0 { - n += 1 + sovTypes(uint64(m.Format)) - } - if m.Index != 0 { - n += 1 + sovTypes(uint64(m.Index)) - } - return n -} - -func (m *ChunkResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Format != 0 { - n += 1 + sovTypes(uint64(m.Format)) - } - if m.Index != 0 { - n += 1 + sovTypes(uint64(m.Index)) - } - l = len(m.Chunk) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.Missing { - n += 2 - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *Message) 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 ErrIntOverflowTypes - } - 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: Message: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Message: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotsRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SnapshotsRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_SnapshotsRequest{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotsResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SnapshotsResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_SnapshotsResponse{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChunkRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ChunkRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_ChunkRequest{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChunkResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ChunkResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Message_ChunkResponse{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *SnapshotsRequest) 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 ErrIntOverflowTypes - } - 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: SnapshotsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SnapshotsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *SnapshotsResponse) 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 ErrIntOverflowTypes - } - 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: SnapshotsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SnapshotsResponse: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Format", wireType) - } - m.Format = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Format |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Chunks", wireType) - } - m.Chunks = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Chunks |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) - if m.Hash == nil { - m.Hash = []byte{} - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Metadata = append(m.Metadata[:0], dAtA[iNdEx:postIndex]...) - if m.Metadata == nil { - m.Metadata = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ChunkRequest) 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 ErrIntOverflowTypes - } - 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: ChunkRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ChunkRequest: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Format", wireType) - } - m.Format = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Format |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ChunkResponse) 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 ErrIntOverflowTypes - } - 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: ChunkResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ChunkResponse: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Format", wireType) - } - m.Format = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Format |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Chunk", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Chunk = append(m.Chunk[:0], dAtA[iNdEx:postIndex]...) - if m.Chunk == nil { - m.Chunk = []byte{} - } - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Missing", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Missing = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/statesync/types.proto b/third_party/proto/tendermint/statesync/types.proto deleted file mode 100644 index 8d4a714c1d..0000000000 --- a/third_party/proto/tendermint/statesync/types.proto +++ /dev/null @@ -1,37 +0,0 @@ -syntax = "proto3"; -package tendermint.statesync; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/statesync"; - -message Message { - oneof sum { - SnapshotsRequest snapshots_request = 1; - SnapshotsResponse snapshots_response = 2; - ChunkRequest chunk_request = 3; - ChunkResponse chunk_response = 4; - } -} - -message SnapshotsRequest {} - -message SnapshotsResponse { - uint64 height = 1; - uint32 format = 2; - uint32 chunks = 3; - bytes hash = 4; - bytes metadata = 5; -} - -message ChunkRequest { - uint64 height = 1; - uint32 format = 2; - uint32 index = 3; -} - -message ChunkResponse { - uint64 height = 1; - uint32 format = 2; - uint32 index = 3; - bytes chunk = 4; - bool missing = 5; -} diff --git a/third_party/proto/tendermint/store/types.pb.go b/third_party/proto/tendermint/store/types.pb.go deleted file mode 100644 index 108bb24a8c..0000000000 --- a/third_party/proto/tendermint/store/types.pb.go +++ /dev/null @@ -1,347 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/store/types.proto - -package store - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 BlockStoreState struct { - Base int64 `protobuf:"varint,1,opt,name=base,proto3" json:"base,omitempty"` - Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` -} - -func (m *BlockStoreState) Reset() { *m = BlockStoreState{} } -func (m *BlockStoreState) String() string { return proto.CompactTextString(m) } -func (*BlockStoreState) ProtoMessage() {} -func (*BlockStoreState) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9e53a0a74267f7, []int{0} -} - -func (m *BlockStoreState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *BlockStoreState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BlockStoreState.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 *BlockStoreState) XXX_Merge(src proto.Message) { - xxx_messageInfo_BlockStoreState.Merge(m, src) -} - -func (m *BlockStoreState) XXX_Size() int { - return m.Size() -} - -func (m *BlockStoreState) XXX_DiscardUnknown() { - xxx_messageInfo_BlockStoreState.DiscardUnknown(m) -} - -var xxx_messageInfo_BlockStoreState proto.InternalMessageInfo - -func (m *BlockStoreState) GetBase() int64 { - if m != nil { - return m.Base - } - return 0 -} - -func (m *BlockStoreState) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func init() { - proto.RegisterType((*BlockStoreState)(nil), "tendermint.store.BlockStoreState") -} - -func init() { proto.RegisterFile("tendermint/store/types.proto", fileDescriptor_ff9e53a0a74267f7) } - -var fileDescriptor_ff9e53a0a74267f7 = []byte{ - // 165 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x29, 0x49, 0xcd, 0x4b, - 0x49, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0x2f, 0x2e, 0xc9, 0x2f, 0x4a, 0xd5, 0x2f, 0xa9, 0x2c, - 0x48, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x40, 0xc8, 0xea, 0x81, 0x65, 0x95, - 0x6c, 0xb9, 0xf8, 0x9d, 0x72, 0xf2, 0x93, 0xb3, 0x83, 0x41, 0xbc, 0xe0, 0x92, 0xc4, 0x92, 0x54, - 0x21, 0x21, 0x2e, 0x96, 0xa4, 0xc4, 0xe2, 0x54, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xe6, 0x20, 0x30, - 0x5b, 0x48, 0x8c, 0x8b, 0x2d, 0x23, 0x35, 0x33, 0x3d, 0xa3, 0x44, 0x82, 0x09, 0x2c, 0x0a, 0xe5, - 0x39, 0x05, 0x9e, 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, 0x79, 0x7a, 0x66, - 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0x92, 0x9b, 0x90, 0x98, 0x60, 0x27, 0xe9, - 0xa3, 0xbb, 0x37, 0x89, 0x0d, 0x2c, 0x6e, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xef, 0xa6, 0x30, - 0x63, 0xca, 0x00, 0x00, 0x00, -} - -func (m *BlockStoreState) 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 *BlockStoreState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BlockStoreState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x10 - } - if m.Base != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Base)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *BlockStoreState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Base != 0 { - n += 1 + sovTypes(uint64(m.Base)) - } - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *BlockStoreState) 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 ErrIntOverflowTypes - } - 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: BlockStoreState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BlockStoreState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Base", wireType) - } - m.Base = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Base |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/store/types.proto b/third_party/proto/tendermint/store/types.proto deleted file mode 100644 index af2f97ad08..0000000000 --- a/third_party/proto/tendermint/store/types.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; -package tendermint.store; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/store"; - -message BlockStoreState { - int64 base = 1; - int64 height = 2; -} diff --git a/third_party/proto/tendermint/types/block.pb.go b/third_party/proto/tendermint/types/block.pb.go deleted file mode 100644 index 2b4ace2d93..0000000000 --- a/third_party/proto/tendermint/types/block.pb.go +++ /dev/null @@ -1,503 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/types/block.proto - -package types - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 Block struct { - Header Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header"` - Data Data `protobuf:"bytes,2,opt,name=data,proto3" json:"data"` - Evidence EvidenceList `protobuf:"bytes,3,opt,name=evidence,proto3" json:"evidence"` - LastCommit *Commit `protobuf:"bytes,4,opt,name=last_commit,json=lastCommit,proto3" json:"last_commit,omitempty"` -} - -func (m *Block) Reset() { *m = Block{} } -func (m *Block) String() string { return proto.CompactTextString(m) } -func (*Block) ProtoMessage() {} -func (*Block) Descriptor() ([]byte, []int) { - return fileDescriptor_70840e82f4357ab1, []int{0} -} - -func (m *Block) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Block) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Block.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 *Block) XXX_Merge(src proto.Message) { - xxx_messageInfo_Block.Merge(m, src) -} - -func (m *Block) XXX_Size() int { - return m.Size() -} - -func (m *Block) XXX_DiscardUnknown() { - xxx_messageInfo_Block.DiscardUnknown(m) -} - -var xxx_messageInfo_Block proto.InternalMessageInfo - -func (m *Block) GetHeader() Header { - if m != nil { - return m.Header - } - return Header{} -} - -func (m *Block) GetData() Data { - if m != nil { - return m.Data - } - return Data{} -} - -func (m *Block) GetEvidence() EvidenceList { - if m != nil { - return m.Evidence - } - return EvidenceList{} -} - -func (m *Block) GetLastCommit() *Commit { - if m != nil { - return m.LastCommit - } - return nil -} - -func init() { - proto.RegisterType((*Block)(nil), "tendermint.types.Block") -} - -func init() { proto.RegisterFile("tendermint/types/block.proto", fileDescriptor_70840e82f4357ab1) } - -var fileDescriptor_70840e82f4357ab1 = []byte{ - // 266 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x29, 0x49, 0xcd, 0x4b, - 0x49, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0x2f, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x4f, 0xca, 0xc9, - 0x4f, 0xce, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x40, 0xc8, 0xea, 0x81, 0x65, 0xa5, - 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x92, 0xfa, 0x20, 0x16, 0x44, 0x9d, 0x14, 0xa6, 0x29, 0x60, - 0x12, 0x2a, 0x2b, 0x8f, 0x21, 0x9b, 0x5a, 0x96, 0x99, 0x92, 0x9a, 0x97, 0x9c, 0x0a, 0x51, 0xa0, - 0xf4, 0x8e, 0x91, 0x8b, 0xd5, 0x09, 0x64, 0xad, 0x90, 0x19, 0x17, 0x5b, 0x46, 0x6a, 0x62, 0x4a, - 0x6a, 0x91, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xb7, 0x91, 0x84, 0x1e, 0xba, 0x0b, 0xf4, 0x3c, 0xc0, - 0xf2, 0x4e, 0x2c, 0x27, 0xee, 0xc9, 0x33, 0x04, 0x41, 0x55, 0x0b, 0x19, 0x70, 0xb1, 0xa4, 0x24, - 0x96, 0x24, 0x4a, 0x30, 0x81, 0x75, 0x89, 0x61, 0xea, 0x72, 0x49, 0x2c, 0x49, 0x84, 0xea, 0x01, - 0xab, 0x14, 0x72, 0xe0, 0xe2, 0x80, 0xb9, 0x42, 0x82, 0x19, 0xac, 0x4b, 0x0e, 0x53, 0x97, 0x2b, - 0x54, 0x85, 0x4f, 0x66, 0x71, 0x09, 0x54, 0x37, 0x5c, 0x97, 0x90, 0x25, 0x17, 0x77, 0x4e, 0x62, - 0x71, 0x49, 0x7c, 0x72, 0x7e, 0x6e, 0x6e, 0x66, 0x89, 0x04, 0x0b, 0x2e, 0x07, 0x3b, 0x83, 0xe5, - 0x83, 0xb8, 0x40, 0x8a, 0x21, 0x6c, 0xa7, 0xc0, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, - 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, - 0x63, 0x88, 0x32, 0x4f, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x47, 0x0e, - 0x36, 0x04, 0x13, 0x12, 0xf8, 0xe8, 0x41, 0x9a, 0xc4, 0x06, 0x16, 0x37, 0x06, 0x04, 0x00, 0x00, - 0xff, 0xff, 0x79, 0x8c, 0xb5, 0x43, 0xd1, 0x01, 0x00, 0x00, -} - -func (m *Block) 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 *Block) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Block) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.LastCommit != nil { - { - size, err := m.LastCommit.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintBlock(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - { - size, err := m.Evidence.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintBlock(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintBlock(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintBlock(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintBlock(dAtA []byte, offset int, v uint64) int { - offset -= sovBlock(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *Block) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Header.Size() - n += 1 + l + sovBlock(uint64(l)) - l = m.Data.Size() - n += 1 + l + sovBlock(uint64(l)) - l = m.Evidence.Size() - n += 1 + l + sovBlock(uint64(l)) - if m.LastCommit != nil { - l = m.LastCommit.Size() - n += 1 + l + sovBlock(uint64(l)) - } - return n -} - -func sovBlock(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozBlock(x uint64) (n int) { - return sovBlock(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *Block) 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 ErrIntOverflowBlock - } - 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: Block: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Block: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBlock - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthBlock - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthBlock - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBlock - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthBlock - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthBlock - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Evidence", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBlock - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthBlock - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthBlock - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Evidence.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastCommit", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBlock - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthBlock - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthBlock - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.LastCommit == nil { - m.LastCommit = &Commit{} - } - if err := m.LastCommit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipBlock(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthBlock - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipBlock(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, ErrIntOverflowBlock - } - 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, ErrIntOverflowBlock - } - 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, ErrIntOverflowBlock - } - 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, ErrInvalidLengthBlock - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupBlock - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthBlock - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthBlock = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowBlock = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupBlock = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/types/block.proto b/third_party/proto/tendermint/types/block.proto deleted file mode 100644 index 84e9bb15d8..0000000000 --- a/third_party/proto/tendermint/types/block.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; -package tendermint.types; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; - -import "gogoproto/gogo.proto"; -import "tendermint/types/types.proto"; -import "tendermint/types/evidence.proto"; - -message Block { - Header header = 1 [(gogoproto.nullable) = false]; - Data data = 2 [(gogoproto.nullable) = false]; - tendermint.types.EvidenceList evidence = 3 [(gogoproto.nullable) = false]; - Commit last_commit = 4; -} diff --git a/third_party/proto/tendermint/types/canonical.pb.go b/third_party/proto/tendermint/types/canonical.pb.go deleted file mode 100644 index 27c593e585..0000000000 --- a/third_party/proto/tendermint/types/canonical.pb.go +++ /dev/null @@ -1,1409 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/types/canonical.proto - -package types - -import ( - encoding_binary "encoding/binary" - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - time "time" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = math.Inf - _ = time.Kitchen -) - -// 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 CanonicalBlockID struct { - Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` - PartSetHeader CanonicalPartSetHeader `protobuf:"bytes,2,opt,name=part_set_header,json=partSetHeader,proto3" json:"part_set_header"` -} - -func (m *CanonicalBlockID) Reset() { *m = CanonicalBlockID{} } -func (m *CanonicalBlockID) String() string { return proto.CompactTextString(m) } -func (*CanonicalBlockID) ProtoMessage() {} -func (*CanonicalBlockID) Descriptor() ([]byte, []int) { - return fileDescriptor_8d1a1a84ff7267ed, []int{0} -} - -func (m *CanonicalBlockID) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *CanonicalBlockID) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CanonicalBlockID.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 *CanonicalBlockID) XXX_Merge(src proto.Message) { - xxx_messageInfo_CanonicalBlockID.Merge(m, src) -} - -func (m *CanonicalBlockID) XXX_Size() int { - return m.Size() -} - -func (m *CanonicalBlockID) XXX_DiscardUnknown() { - xxx_messageInfo_CanonicalBlockID.DiscardUnknown(m) -} - -var xxx_messageInfo_CanonicalBlockID proto.InternalMessageInfo - -func (m *CanonicalBlockID) GetHash() []byte { - if m != nil { - return m.Hash - } - return nil -} - -func (m *CanonicalBlockID) GetPartSetHeader() CanonicalPartSetHeader { - if m != nil { - return m.PartSetHeader - } - return CanonicalPartSetHeader{} -} - -type CanonicalPartSetHeader struct { - Total uint32 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` - Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` -} - -func (m *CanonicalPartSetHeader) Reset() { *m = CanonicalPartSetHeader{} } -func (m *CanonicalPartSetHeader) String() string { return proto.CompactTextString(m) } -func (*CanonicalPartSetHeader) ProtoMessage() {} -func (*CanonicalPartSetHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_8d1a1a84ff7267ed, []int{1} -} - -func (m *CanonicalPartSetHeader) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *CanonicalPartSetHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CanonicalPartSetHeader.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 *CanonicalPartSetHeader) XXX_Merge(src proto.Message) { - xxx_messageInfo_CanonicalPartSetHeader.Merge(m, src) -} - -func (m *CanonicalPartSetHeader) XXX_Size() int { - return m.Size() -} - -func (m *CanonicalPartSetHeader) XXX_DiscardUnknown() { - xxx_messageInfo_CanonicalPartSetHeader.DiscardUnknown(m) -} - -var xxx_messageInfo_CanonicalPartSetHeader proto.InternalMessageInfo - -func (m *CanonicalPartSetHeader) GetTotal() uint32 { - if m != nil { - return m.Total - } - return 0 -} - -func (m *CanonicalPartSetHeader) GetHash() []byte { - if m != nil { - return m.Hash - } - return nil -} - -type CanonicalProposal struct { - Type SignedMsgType `protobuf:"varint,1,opt,name=type,proto3,enum=tendermint.types.SignedMsgType" json:"type,omitempty"` - Height int64 `protobuf:"fixed64,2,opt,name=height,proto3" json:"height,omitempty"` - Round int64 `protobuf:"fixed64,3,opt,name=round,proto3" json:"round,omitempty"` - POLRound int64 `protobuf:"varint,4,opt,name=pol_round,json=polRound,proto3" json:"pol_round,omitempty"` - BlockID *CanonicalBlockID `protobuf:"bytes,5,opt,name=block_id,json=blockId,proto3" json:"block_id,omitempty"` - Timestamp time.Time `protobuf:"bytes,6,opt,name=timestamp,proto3,stdtime" json:"timestamp"` - ChainID string `protobuf:"bytes,7,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` -} - -func (m *CanonicalProposal) Reset() { *m = CanonicalProposal{} } -func (m *CanonicalProposal) String() string { return proto.CompactTextString(m) } -func (*CanonicalProposal) ProtoMessage() {} -func (*CanonicalProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_8d1a1a84ff7267ed, []int{2} -} - -func (m *CanonicalProposal) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *CanonicalProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CanonicalProposal.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 *CanonicalProposal) XXX_Merge(src proto.Message) { - xxx_messageInfo_CanonicalProposal.Merge(m, src) -} - -func (m *CanonicalProposal) XXX_Size() int { - return m.Size() -} - -func (m *CanonicalProposal) XXX_DiscardUnknown() { - xxx_messageInfo_CanonicalProposal.DiscardUnknown(m) -} - -var xxx_messageInfo_CanonicalProposal proto.InternalMessageInfo - -func (m *CanonicalProposal) GetType() SignedMsgType { - if m != nil { - return m.Type - } - return UnknownType -} - -func (m *CanonicalProposal) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *CanonicalProposal) GetRound() int64 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *CanonicalProposal) GetPOLRound() int64 { - if m != nil { - return m.POLRound - } - return 0 -} - -func (m *CanonicalProposal) GetBlockID() *CanonicalBlockID { - if m != nil { - return m.BlockID - } - return nil -} - -func (m *CanonicalProposal) GetTimestamp() time.Time { - if m != nil { - return m.Timestamp - } - return time.Time{} -} - -func (m *CanonicalProposal) GetChainID() string { - if m != nil { - return m.ChainID - } - return "" -} - -type CanonicalVote struct { - Type SignedMsgType `protobuf:"varint,1,opt,name=type,proto3,enum=tendermint.types.SignedMsgType" json:"type,omitempty"` - Height int64 `protobuf:"fixed64,2,opt,name=height,proto3" json:"height,omitempty"` - Round int64 `protobuf:"fixed64,3,opt,name=round,proto3" json:"round,omitempty"` - BlockID *CanonicalBlockID `protobuf:"bytes,4,opt,name=block_id,json=blockId,proto3" json:"block_id,omitempty"` - Timestamp time.Time `protobuf:"bytes,5,opt,name=timestamp,proto3,stdtime" json:"timestamp"` - ChainID string `protobuf:"bytes,6,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` -} - -func (m *CanonicalVote) Reset() { *m = CanonicalVote{} } -func (m *CanonicalVote) String() string { return proto.CompactTextString(m) } -func (*CanonicalVote) ProtoMessage() {} -func (*CanonicalVote) Descriptor() ([]byte, []int) { - return fileDescriptor_8d1a1a84ff7267ed, []int{3} -} - -func (m *CanonicalVote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *CanonicalVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CanonicalVote.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 *CanonicalVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_CanonicalVote.Merge(m, src) -} - -func (m *CanonicalVote) XXX_Size() int { - return m.Size() -} - -func (m *CanonicalVote) XXX_DiscardUnknown() { - xxx_messageInfo_CanonicalVote.DiscardUnknown(m) -} - -var xxx_messageInfo_CanonicalVote proto.InternalMessageInfo - -func (m *CanonicalVote) GetType() SignedMsgType { - if m != nil { - return m.Type - } - return UnknownType -} - -func (m *CanonicalVote) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *CanonicalVote) GetRound() int64 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *CanonicalVote) GetBlockID() *CanonicalBlockID { - if m != nil { - return m.BlockID - } - return nil -} - -func (m *CanonicalVote) GetTimestamp() time.Time { - if m != nil { - return m.Timestamp - } - return time.Time{} -} - -func (m *CanonicalVote) GetChainID() string { - if m != nil { - return m.ChainID - } - return "" -} - -func init() { - proto.RegisterType((*CanonicalBlockID)(nil), "tendermint.types.CanonicalBlockID") - proto.RegisterType((*CanonicalPartSetHeader)(nil), "tendermint.types.CanonicalPartSetHeader") - proto.RegisterType((*CanonicalProposal)(nil), "tendermint.types.CanonicalProposal") - proto.RegisterType((*CanonicalVote)(nil), "tendermint.types.CanonicalVote") -} - -func init() { proto.RegisterFile("tendermint/types/canonical.proto", fileDescriptor_8d1a1a84ff7267ed) } - -var fileDescriptor_8d1a1a84ff7267ed = []byte{ - // 487 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x53, 0x3d, 0x6f, 0xd3, 0x40, - 0x18, 0xce, 0xa5, 0x4e, 0xe2, 0x5c, 0x1b, 0x08, 0xa7, 0xaa, 0xb2, 0x22, 0x64, 0x5b, 0x1e, 0x90, - 0x59, 0x6c, 0xa9, 0x1d, 0xd8, 0x5d, 0x06, 0x82, 0x40, 0x94, 0x6b, 0xd5, 0x81, 0x25, 0xba, 0xd8, - 0x87, 0x6d, 0xe1, 0xf8, 0x4e, 0xf6, 0x65, 0xe8, 0xc2, 0x6f, 0xe8, 0xef, 0xe0, 0x97, 0x74, 0xec, - 0x08, 0x4b, 0x40, 0xce, 0x1f, 0x41, 0x77, 0x4e, 0xec, 0xa8, 0x01, 0x16, 0x10, 0xcb, 0xe9, 0xfd, - 0x78, 0xee, 0x79, 0x1f, 0x3d, 0xaf, 0x5e, 0x68, 0x0b, 0x9a, 0x47, 0xb4, 0x58, 0xa4, 0xb9, 0xf0, - 0xc5, 0x0d, 0xa7, 0xa5, 0x1f, 0x92, 0x9c, 0xe5, 0x69, 0x48, 0x32, 0x8f, 0x17, 0x4c, 0x30, 0x34, - 0x6e, 0x11, 0x9e, 0x42, 0x4c, 0x8e, 0x63, 0x16, 0x33, 0xd5, 0xf4, 0x65, 0x54, 0xe3, 0x26, 0x4f, - 0xf7, 0x98, 0xd4, 0xbb, 0xe9, 0x5a, 0x31, 0x63, 0x71, 0x46, 0x7d, 0x95, 0xcd, 0x97, 0x1f, 0x7d, - 0x91, 0x2e, 0x68, 0x29, 0xc8, 0x82, 0xd7, 0x00, 0xe7, 0x33, 0x1c, 0x9f, 0x6f, 0x27, 0x07, 0x19, - 0x0b, 0x3f, 0x4d, 0x5f, 0x22, 0x04, 0xb5, 0x84, 0x94, 0x89, 0x01, 0x6c, 0xe0, 0x1e, 0x61, 0x15, - 0xa3, 0x6b, 0xf8, 0x98, 0x93, 0x42, 0xcc, 0x4a, 0x2a, 0x66, 0x09, 0x25, 0x11, 0x2d, 0x8c, 0xae, - 0x0d, 0xdc, 0xc3, 0x53, 0xd7, 0x7b, 0x28, 0xd4, 0x6b, 0x08, 0x2f, 0x48, 0x21, 0x2e, 0xa9, 0x78, - 0xa5, 0xf0, 0x81, 0x76, 0xb7, 0xb2, 0x3a, 0x78, 0xc4, 0x77, 0x8b, 0x4e, 0x00, 0x4f, 0x7e, 0x0d, - 0x47, 0xc7, 0xb0, 0x27, 0x98, 0x20, 0x99, 0x92, 0x31, 0xc2, 0x75, 0xd2, 0x68, 0xeb, 0xb6, 0xda, - 0x9c, 0x6f, 0x5d, 0xf8, 0xa4, 0x25, 0x29, 0x18, 0x67, 0x25, 0xc9, 0xd0, 0x19, 0xd4, 0xa4, 0x1c, - 0xf5, 0xfd, 0xd1, 0xa9, 0xb5, 0x2f, 0xf3, 0x32, 0x8d, 0x73, 0x1a, 0xbd, 0x2d, 0xe3, 0xab, 0x1b, - 0x4e, 0xb1, 0x02, 0xa3, 0x13, 0xd8, 0x4f, 0x68, 0x1a, 0x27, 0x42, 0x0d, 0x18, 0xe3, 0x4d, 0x26, - 0xc5, 0x14, 0x6c, 0x99, 0x47, 0xc6, 0x81, 0x2a, 0xd7, 0x09, 0x7a, 0x0e, 0x87, 0x9c, 0x65, 0xb3, - 0xba, 0xa3, 0xd9, 0xc0, 0x3d, 0x08, 0x8e, 0xaa, 0x95, 0xa5, 0x5f, 0xbc, 0x7b, 0x83, 0x65, 0x0d, - 0xeb, 0x9c, 0x65, 0x2a, 0x42, 0xaf, 0xa1, 0x3e, 0x97, 0xf6, 0xce, 0xd2, 0xc8, 0xe8, 0x29, 0xe3, - 0x9c, 0x3f, 0x18, 0xb7, 0xd9, 0x44, 0x70, 0x58, 0xad, 0xac, 0xc1, 0x26, 0xc1, 0x03, 0x45, 0x30, - 0x8d, 0x50, 0x00, 0x87, 0xcd, 0x1a, 0x8d, 0xbe, 0x22, 0x9b, 0x78, 0xf5, 0xa2, 0xbd, 0xed, 0xa2, - 0xbd, 0xab, 0x2d, 0x22, 0xd0, 0xa5, 0xef, 0xb7, 0xdf, 0x2d, 0x80, 0xdb, 0x6f, 0xe8, 0x19, 0xd4, - 0xc3, 0x84, 0xa4, 0xb9, 0xd4, 0x33, 0xb0, 0x81, 0x3b, 0xac, 0x67, 0x9d, 0xcb, 0x9a, 0x9c, 0xa5, - 0x9a, 0xd3, 0xc8, 0xf9, 0xd2, 0x85, 0xa3, 0x46, 0xd6, 0x35, 0x13, 0xf4, 0x7f, 0xf8, 0xba, 0x6b, - 0x96, 0xf6, 0x2f, 0xcd, 0xea, 0xfd, 0xbd, 0x59, 0xfd, 0xdf, 0x9b, 0x15, 0xbc, 0xbf, 0xab, 0x4c, - 0x70, 0x5f, 0x99, 0xe0, 0x47, 0x65, 0x82, 0xdb, 0xb5, 0xd9, 0xb9, 0x5f, 0x9b, 0x9d, 0xaf, 0x6b, - 0xb3, 0xf3, 0xe1, 0x45, 0x9c, 0x8a, 0x64, 0x39, 0xf7, 0x42, 0xb6, 0xf0, 0x77, 0x0f, 0xb6, 0x0d, - 0xeb, 0xc3, 0x7e, 0x78, 0xcc, 0xf3, 0xbe, 0xaa, 0x9f, 0xfd, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x6d, - 0xdd, 0x12, 0x5d, 0x31, 0x04, 0x00, 0x00, -} - -func (m *CanonicalBlockID) 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 *CanonicalBlockID) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CanonicalBlockID) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.PartSetHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintCanonical(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintCanonical(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *CanonicalPartSetHeader) 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 *CanonicalPartSetHeader) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CanonicalPartSetHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintCanonical(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0x12 - } - if m.Total != 0 { - i = encodeVarintCanonical(dAtA, i, uint64(m.Total)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *CanonicalProposal) 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 *CanonicalProposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CanonicalProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ChainID) > 0 { - i -= len(m.ChainID) - copy(dAtA[i:], m.ChainID) - i = encodeVarintCanonical(dAtA, i, uint64(len(m.ChainID))) - i-- - dAtA[i] = 0x3a - } - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err2 != nil { - return 0, err2 - } - i -= n2 - i = encodeVarintCanonical(dAtA, i, uint64(n2)) - i-- - dAtA[i] = 0x32 - if m.BlockID != nil { - { - size, err := m.BlockID.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintCanonical(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if m.POLRound != 0 { - i = encodeVarintCanonical(dAtA, i, uint64(m.POLRound)) - i-- - dAtA[i] = 0x20 - } - if m.Round != 0 { - i -= 8 - encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(m.Round)) - i-- - dAtA[i] = 0x19 - } - if m.Height != 0 { - i -= 8 - encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(m.Height)) - i-- - dAtA[i] = 0x11 - } - if m.Type != 0 { - i = encodeVarintCanonical(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *CanonicalVote) 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 *CanonicalVote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CanonicalVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ChainID) > 0 { - i -= len(m.ChainID) - copy(dAtA[i:], m.ChainID) - i = encodeVarintCanonical(dAtA, i, uint64(len(m.ChainID))) - i-- - dAtA[i] = 0x32 - } - n4, err4 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err4 != nil { - return 0, err4 - } - i -= n4 - i = encodeVarintCanonical(dAtA, i, uint64(n4)) - i-- - dAtA[i] = 0x2a - if m.BlockID != nil { - { - size, err := m.BlockID.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintCanonical(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.Round != 0 { - i -= 8 - encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(m.Round)) - i-- - dAtA[i] = 0x19 - } - if m.Height != 0 { - i -= 8 - encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(m.Height)) - i-- - dAtA[i] = 0x11 - } - if m.Type != 0 { - i = encodeVarintCanonical(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintCanonical(dAtA []byte, offset int, v uint64) int { - offset -= sovCanonical(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *CanonicalBlockID) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovCanonical(uint64(l)) - } - l = m.PartSetHeader.Size() - n += 1 + l + sovCanonical(uint64(l)) - return n -} - -func (m *CanonicalPartSetHeader) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Total != 0 { - n += 1 + sovCanonical(uint64(m.Total)) - } - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovCanonical(uint64(l)) - } - return n -} - -func (m *CanonicalProposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovCanonical(uint64(m.Type)) - } - if m.Height != 0 { - n += 9 - } - if m.Round != 0 { - n += 9 - } - if m.POLRound != 0 { - n += 1 + sovCanonical(uint64(m.POLRound)) - } - if m.BlockID != nil { - l = m.BlockID.Size() - n += 1 + l + sovCanonical(uint64(l)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp) - n += 1 + l + sovCanonical(uint64(l)) - l = len(m.ChainID) - if l > 0 { - n += 1 + l + sovCanonical(uint64(l)) - } - return n -} - -func (m *CanonicalVote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovCanonical(uint64(m.Type)) - } - if m.Height != 0 { - n += 9 - } - if m.Round != 0 { - n += 9 - } - if m.BlockID != nil { - l = m.BlockID.Size() - n += 1 + l + sovCanonical(uint64(l)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp) - n += 1 + l + sovCanonical(uint64(l)) - l = len(m.ChainID) - if l > 0 { - n += 1 + l + sovCanonical(uint64(l)) - } - return n -} - -func sovCanonical(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozCanonical(x uint64) (n int) { - return sovCanonical(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *CanonicalBlockID) 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 ErrIntOverflowCanonical - } - 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: CanonicalBlockID: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CanonicalBlockID: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthCanonical - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthCanonical - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) - if m.Hash == nil { - m.Hash = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PartSetHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthCanonical - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthCanonical - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PartSetHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipCanonical(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCanonical - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *CanonicalPartSetHeader) 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 ErrIntOverflowCanonical - } - 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: CanonicalPartSetHeader: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CanonicalPartSetHeader: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Total", wireType) - } - m.Total = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Total |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthCanonical - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthCanonical - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) - if m.Hash == nil { - m.Hash = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipCanonical(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCanonical - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *CanonicalProposal) 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 ErrIntOverflowCanonical - } - 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: CanonicalProposal: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CanonicalProposal: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= SignedMsgType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 1 { - return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) - } - m.Height = 0 - if (iNdEx + 8) > l { - return io.ErrUnexpectedEOF - } - m.Height = int64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) - iNdEx += 8 - case 3: - if wireType != 1 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - if (iNdEx + 8) > l { - return io.ErrUnexpectedEOF - } - m.Round = int64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) - iNdEx += 8 - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field POLRound", wireType) - } - m.POLRound = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.POLRound |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockID", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthCanonical - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthCanonical - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.BlockID == nil { - m.BlockID = &CanonicalBlockID{} - } - if err := m.BlockID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthCanonical - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthCanonical - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainID", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthCanonical - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthCanonical - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipCanonical(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCanonical - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *CanonicalVote) 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 ErrIntOverflowCanonical - } - 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: CanonicalVote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CanonicalVote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= SignedMsgType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 1 { - return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) - } - m.Height = 0 - if (iNdEx + 8) > l { - return io.ErrUnexpectedEOF - } - m.Height = int64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) - iNdEx += 8 - case 3: - if wireType != 1 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - if (iNdEx + 8) > l { - return io.ErrUnexpectedEOF - } - m.Round = int64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) - iNdEx += 8 - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockID", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthCanonical - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthCanonical - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.BlockID == nil { - m.BlockID = &CanonicalBlockID{} - } - if err := m.BlockID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthCanonical - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthCanonical - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainID", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCanonical - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthCanonical - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthCanonical - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipCanonical(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCanonical - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipCanonical(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, ErrIntOverflowCanonical - } - 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, ErrIntOverflowCanonical - } - 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, ErrIntOverflowCanonical - } - 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, ErrInvalidLengthCanonical - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupCanonical - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthCanonical - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthCanonical = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowCanonical = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupCanonical = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/types/canonical.proto b/third_party/proto/tendermint/types/canonical.proto deleted file mode 100644 index e88fd6ffe3..0000000000 --- a/third_party/proto/tendermint/types/canonical.proto +++ /dev/null @@ -1,37 +0,0 @@ -syntax = "proto3"; -package tendermint.types; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; - -import "gogoproto/gogo.proto"; -import "tendermint/types/types.proto"; -import "google/protobuf/timestamp.proto"; - -message CanonicalBlockID { - bytes hash = 1; - CanonicalPartSetHeader part_set_header = 2 [(gogoproto.nullable) = false]; -} - -message CanonicalPartSetHeader { - uint32 total = 1; - bytes hash = 2; -} - -message CanonicalProposal { - SignedMsgType type = 1; // type alias for byte - sfixed64 height = 2; // canonicalization requires fixed size encoding here - sfixed64 round = 3; // canonicalization requires fixed size encoding here - int64 pol_round = 4 [(gogoproto.customname) = "POLRound"]; - CanonicalBlockID block_id = 5 [(gogoproto.customname) = "BlockID"]; - google.protobuf.Timestamp timestamp = 6 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - string chain_id = 7 [(gogoproto.customname) = "ChainID"]; -} - -message CanonicalVote { - SignedMsgType type = 1; // type alias for byte - sfixed64 height = 2; // canonicalization requires fixed size encoding here - sfixed64 round = 3; // canonicalization requires fixed size encoding here - CanonicalBlockID block_id = 4 [(gogoproto.customname) = "BlockID"]; - google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - string chain_id = 6 [(gogoproto.customname) = "ChainID"]; -} diff --git a/third_party/proto/tendermint/types/events.pb.go b/third_party/proto/tendermint/types/events.pb.go deleted file mode 100644 index 8200a4d45a..0000000000 --- a/third_party/proto/tendermint/types/events.pb.go +++ /dev/null @@ -1,399 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/types/events.proto - -package types - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 EventDataRoundState struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,2,opt,name=round,proto3" json:"round,omitempty"` - Step string `protobuf:"bytes,3,opt,name=step,proto3" json:"step,omitempty"` -} - -func (m *EventDataRoundState) Reset() { *m = EventDataRoundState{} } -func (m *EventDataRoundState) String() string { return proto.CompactTextString(m) } -func (*EventDataRoundState) ProtoMessage() {} -func (*EventDataRoundState) Descriptor() ([]byte, []int) { - return fileDescriptor_72cfafd446dedf7c, []int{0} -} - -func (m *EventDataRoundState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *EventDataRoundState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventDataRoundState.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 *EventDataRoundState) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventDataRoundState.Merge(m, src) -} - -func (m *EventDataRoundState) XXX_Size() int { - return m.Size() -} - -func (m *EventDataRoundState) XXX_DiscardUnknown() { - xxx_messageInfo_EventDataRoundState.DiscardUnknown(m) -} - -var xxx_messageInfo_EventDataRoundState proto.InternalMessageInfo - -func (m *EventDataRoundState) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *EventDataRoundState) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *EventDataRoundState) GetStep() string { - if m != nil { - return m.Step - } - return "" -} - -func init() { - proto.RegisterType((*EventDataRoundState)(nil), "tendermint.types.EventDataRoundState") -} - -func init() { proto.RegisterFile("tendermint/types/events.proto", fileDescriptor_72cfafd446dedf7c) } - -var fileDescriptor_72cfafd446dedf7c = []byte{ - // 189 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2d, 0x49, 0xcd, 0x4b, - 0x49, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0x2f, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x4f, 0x2d, 0x4b, - 0xcd, 0x2b, 0x29, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x40, 0x48, 0xeb, 0x81, 0xa5, - 0x95, 0xc2, 0xb9, 0x84, 0x5d, 0x41, 0x2a, 0x5c, 0x12, 0x4b, 0x12, 0x83, 0xf2, 0x4b, 0xf3, 0x52, - 0x82, 0x4b, 0x12, 0x4b, 0x52, 0x85, 0xc4, 0xb8, 0xd8, 0x32, 0x52, 0x33, 0xd3, 0x33, 0x4a, 0x24, - 0x18, 0x15, 0x18, 0x35, 0x98, 0x83, 0xa0, 0x3c, 0x21, 0x11, 0x2e, 0xd6, 0x22, 0x90, 0x2a, 0x09, - 0x26, 0x05, 0x46, 0x0d, 0xd6, 0x20, 0x08, 0x47, 0x48, 0x88, 0x8b, 0xa5, 0xb8, 0x24, 0xb5, 0x40, - 0x82, 0x59, 0x81, 0x51, 0x83, 0x33, 0x08, 0xcc, 0x76, 0x0a, 0x3c, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, - 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, - 0xc6, 0x63, 0x39, 0x86, 0x28, 0xf3, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, - 0x7d, 0x64, 0xe7, 0x22, 0x98, 0x60, 0xc7, 0xea, 0xa3, 0x7b, 0x25, 0x89, 0x0d, 0x2c, 0x6e, 0x0c, - 0x08, 0x00, 0x00, 0xff, 0xff, 0xc3, 0xe9, 0x14, 0x02, 0xe5, 0x00, 0x00, 0x00, -} - -func (m *EventDataRoundState) 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 *EventDataRoundState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventDataRoundState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Step) > 0 { - i -= len(m.Step) - copy(dAtA[i:], m.Step) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Step))) - i-- - dAtA[i] = 0x1a - } - if m.Round != 0 { - i = encodeVarintEvents(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintEvents(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { - offset -= sovEvents(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *EventDataRoundState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovEvents(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovEvents(uint64(m.Round)) - } - l = len(m.Step) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - return n -} - -func sovEvents(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozEvents(x uint64) (n int) { - return sovEvents(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *EventDataRoundState) 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 ErrIntOverflowEvents - } - 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: EventDataRoundState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventDataRoundState: 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 ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Step", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Step = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipEvents(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, ErrIntOverflowEvents - } - 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, ErrIntOverflowEvents - } - 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, ErrIntOverflowEvents - } - 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, ErrInvalidLengthEvents - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEvents - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEvents - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEvents = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEvents = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEvents = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/types/events.proto b/third_party/proto/tendermint/types/events.proto deleted file mode 100644 index a1e5cc498d..0000000000 --- a/third_party/proto/tendermint/types/events.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; -package tendermint.types; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; - -message EventDataRoundState { - int64 height = 1; - int32 round = 2; - string step = 3; -} diff --git a/third_party/proto/tendermint/types/evidence.pb.go b/third_party/proto/tendermint/types/evidence.pb.go deleted file mode 100644 index af134db418..0000000000 --- a/third_party/proto/tendermint/types/evidence.pb.go +++ /dev/null @@ -1,1429 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/types/evidence.proto - -package types - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - time "time" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = math.Inf - _ = time.Kitchen -) - -// 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 Evidence struct { - // Types that are valid to be assigned to Sum: - // *Evidence_DuplicateVoteEvidence - // *Evidence_LightClientAttackEvidence - Sum isEvidence_Sum `protobuf_oneof:"sum"` -} - -func (m *Evidence) Reset() { *m = Evidence{} } -func (m *Evidence) String() string { return proto.CompactTextString(m) } -func (*Evidence) ProtoMessage() {} -func (*Evidence) Descriptor() ([]byte, []int) { - return fileDescriptor_6825fabc78e0a168, []int{0} -} - -func (m *Evidence) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Evidence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Evidence.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 *Evidence) XXX_Merge(src proto.Message) { - xxx_messageInfo_Evidence.Merge(m, src) -} - -func (m *Evidence) XXX_Size() int { - return m.Size() -} - -func (m *Evidence) XXX_DiscardUnknown() { - xxx_messageInfo_Evidence.DiscardUnknown(m) -} - -var xxx_messageInfo_Evidence proto.InternalMessageInfo - -type isEvidence_Sum interface { - isEvidence_Sum() - MarshalTo([]byte) (int, error) - Size() int -} - -type Evidence_DuplicateVoteEvidence struct { - DuplicateVoteEvidence *DuplicateVoteEvidence `protobuf:"bytes,1,opt,name=duplicate_vote_evidence,json=duplicateVoteEvidence,proto3,oneof" json:"duplicate_vote_evidence,omitempty"` -} -type Evidence_LightClientAttackEvidence struct { - LightClientAttackEvidence *LightClientAttackEvidence `protobuf:"bytes,2,opt,name=light_client_attack_evidence,json=lightClientAttackEvidence,proto3,oneof" json:"light_client_attack_evidence,omitempty"` -} - -func (*Evidence_DuplicateVoteEvidence) isEvidence_Sum() {} -func (*Evidence_LightClientAttackEvidence) isEvidence_Sum() {} - -func (m *Evidence) GetSum() isEvidence_Sum { - if m != nil { - return m.Sum - } - return nil -} - -func (m *Evidence) GetDuplicateVoteEvidence() *DuplicateVoteEvidence { - if x, ok := m.GetSum().(*Evidence_DuplicateVoteEvidence); ok { - return x.DuplicateVoteEvidence - } - return nil -} - -func (m *Evidence) GetLightClientAttackEvidence() *LightClientAttackEvidence { - if x, ok := m.GetSum().(*Evidence_LightClientAttackEvidence); ok { - return x.LightClientAttackEvidence - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Evidence) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Evidence_DuplicateVoteEvidence)(nil), - (*Evidence_LightClientAttackEvidence)(nil), - } -} - -// DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes. -type DuplicateVoteEvidence struct { - VoteA *Vote `protobuf:"bytes,1,opt,name=vote_a,json=voteA,proto3" json:"vote_a,omitempty"` - VoteB *Vote `protobuf:"bytes,2,opt,name=vote_b,json=voteB,proto3" json:"vote_b,omitempty"` - TotalVotingPower int64 `protobuf:"varint,3,opt,name=total_voting_power,json=totalVotingPower,proto3" json:"total_voting_power,omitempty"` - ValidatorPower int64 `protobuf:"varint,4,opt,name=validator_power,json=validatorPower,proto3" json:"validator_power,omitempty"` - Timestamp time.Time `protobuf:"bytes,5,opt,name=timestamp,proto3,stdtime" json:"timestamp"` -} - -func (m *DuplicateVoteEvidence) Reset() { *m = DuplicateVoteEvidence{} } -func (m *DuplicateVoteEvidence) String() string { return proto.CompactTextString(m) } -func (*DuplicateVoteEvidence) ProtoMessage() {} -func (*DuplicateVoteEvidence) Descriptor() ([]byte, []int) { - return fileDescriptor_6825fabc78e0a168, []int{1} -} - -func (m *DuplicateVoteEvidence) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *DuplicateVoteEvidence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DuplicateVoteEvidence.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 *DuplicateVoteEvidence) XXX_Merge(src proto.Message) { - xxx_messageInfo_DuplicateVoteEvidence.Merge(m, src) -} - -func (m *DuplicateVoteEvidence) XXX_Size() int { - return m.Size() -} - -func (m *DuplicateVoteEvidence) XXX_DiscardUnknown() { - xxx_messageInfo_DuplicateVoteEvidence.DiscardUnknown(m) -} - -var xxx_messageInfo_DuplicateVoteEvidence proto.InternalMessageInfo - -func (m *DuplicateVoteEvidence) GetVoteA() *Vote { - if m != nil { - return m.VoteA - } - return nil -} - -func (m *DuplicateVoteEvidence) GetVoteB() *Vote { - if m != nil { - return m.VoteB - } - return nil -} - -func (m *DuplicateVoteEvidence) GetTotalVotingPower() int64 { - if m != nil { - return m.TotalVotingPower - } - return 0 -} - -func (m *DuplicateVoteEvidence) GetValidatorPower() int64 { - if m != nil { - return m.ValidatorPower - } - return 0 -} - -func (m *DuplicateVoteEvidence) GetTimestamp() time.Time { - if m != nil { - return m.Timestamp - } - return time.Time{} -} - -// LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client. -type LightClientAttackEvidence struct { - ConflictingBlock *LightBlock `protobuf:"bytes,1,opt,name=conflicting_block,json=conflictingBlock,proto3" json:"conflicting_block,omitempty"` - CommonHeight int64 `protobuf:"varint,2,opt,name=common_height,json=commonHeight,proto3" json:"common_height,omitempty"` - ByzantineValidators []*Validator `protobuf:"bytes,3,rep,name=byzantine_validators,json=byzantineValidators,proto3" json:"byzantine_validators,omitempty"` - TotalVotingPower int64 `protobuf:"varint,4,opt,name=total_voting_power,json=totalVotingPower,proto3" json:"total_voting_power,omitempty"` - Timestamp time.Time `protobuf:"bytes,5,opt,name=timestamp,proto3,stdtime" json:"timestamp"` -} - -func (m *LightClientAttackEvidence) Reset() { *m = LightClientAttackEvidence{} } -func (m *LightClientAttackEvidence) String() string { return proto.CompactTextString(m) } -func (*LightClientAttackEvidence) ProtoMessage() {} -func (*LightClientAttackEvidence) Descriptor() ([]byte, []int) { - return fileDescriptor_6825fabc78e0a168, []int{2} -} - -func (m *LightClientAttackEvidence) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *LightClientAttackEvidence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_LightClientAttackEvidence.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 *LightClientAttackEvidence) XXX_Merge(src proto.Message) { - xxx_messageInfo_LightClientAttackEvidence.Merge(m, src) -} - -func (m *LightClientAttackEvidence) XXX_Size() int { - return m.Size() -} - -func (m *LightClientAttackEvidence) XXX_DiscardUnknown() { - xxx_messageInfo_LightClientAttackEvidence.DiscardUnknown(m) -} - -var xxx_messageInfo_LightClientAttackEvidence proto.InternalMessageInfo - -func (m *LightClientAttackEvidence) GetConflictingBlock() *LightBlock { - if m != nil { - return m.ConflictingBlock - } - return nil -} - -func (m *LightClientAttackEvidence) GetCommonHeight() int64 { - if m != nil { - return m.CommonHeight - } - return 0 -} - -func (m *LightClientAttackEvidence) GetByzantineValidators() []*Validator { - if m != nil { - return m.ByzantineValidators - } - return nil -} - -func (m *LightClientAttackEvidence) GetTotalVotingPower() int64 { - if m != nil { - return m.TotalVotingPower - } - return 0 -} - -func (m *LightClientAttackEvidence) GetTimestamp() time.Time { - if m != nil { - return m.Timestamp - } - return time.Time{} -} - -type EvidenceList struct { - Evidence []Evidence `protobuf:"bytes,1,rep,name=evidence,proto3" json:"evidence"` -} - -func (m *EvidenceList) Reset() { *m = EvidenceList{} } -func (m *EvidenceList) String() string { return proto.CompactTextString(m) } -func (*EvidenceList) ProtoMessage() {} -func (*EvidenceList) Descriptor() ([]byte, []int) { - return fileDescriptor_6825fabc78e0a168, []int{3} -} - -func (m *EvidenceList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *EvidenceList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EvidenceList.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 *EvidenceList) XXX_Merge(src proto.Message) { - xxx_messageInfo_EvidenceList.Merge(m, src) -} - -func (m *EvidenceList) XXX_Size() int { - return m.Size() -} - -func (m *EvidenceList) XXX_DiscardUnknown() { - xxx_messageInfo_EvidenceList.DiscardUnknown(m) -} - -var xxx_messageInfo_EvidenceList proto.InternalMessageInfo - -func (m *EvidenceList) GetEvidence() []Evidence { - if m != nil { - return m.Evidence - } - return nil -} - -func init() { - proto.RegisterType((*Evidence)(nil), "tendermint.types.Evidence") - proto.RegisterType((*DuplicateVoteEvidence)(nil), "tendermint.types.DuplicateVoteEvidence") - proto.RegisterType((*LightClientAttackEvidence)(nil), "tendermint.types.LightClientAttackEvidence") - proto.RegisterType((*EvidenceList)(nil), "tendermint.types.EvidenceList") -} - -func init() { proto.RegisterFile("tendermint/types/evidence.proto", fileDescriptor_6825fabc78e0a168) } - -var fileDescriptor_6825fabc78e0a168 = []byte{ - // 532 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x94, 0xcf, 0x6e, 0xd3, 0x40, - 0x10, 0xc6, 0xed, 0x3a, 0xa9, 0xc2, 0xb6, 0x40, 0x58, 0x5a, 0x48, 0x43, 0xe4, 0x44, 0xe1, 0xd0, - 0x48, 0x80, 0x2d, 0x95, 0x03, 0x17, 0x2e, 0x35, 0x20, 0x15, 0x29, 0x42, 0x60, 0xa1, 0x1e, 0xb8, - 0x58, 0x6b, 0x7b, 0xeb, 0xac, 0x6a, 0xef, 0x5a, 0xf1, 0x24, 0xa8, 0x3c, 0x45, 0x1e, 0xab, 0x17, - 0xa4, 0x1e, 0x39, 0x01, 0x4a, 0x78, 0x10, 0xe4, 0xf5, 0x9f, 0x44, 0x75, 0xcc, 0x89, 0x4b, 0xe4, - 0xcc, 0xfc, 0xbe, 0x9d, 0x99, 0xcf, 0xb3, 0x46, 0x7d, 0xa0, 0xdc, 0xa7, 0xd3, 0x88, 0x71, 0x30, - 0xe1, 0x2a, 0xa6, 0x89, 0x49, 0xe7, 0xcc, 0xa7, 0xdc, 0xa3, 0x46, 0x3c, 0x15, 0x20, 0x70, 0x7b, - 0x0d, 0x18, 0x12, 0xe8, 0x1e, 0x04, 0x22, 0x10, 0x32, 0x69, 0xa6, 0x4f, 0x19, 0xd7, 0xed, 0x07, - 0x42, 0x04, 0x21, 0x35, 0xe5, 0x3f, 0x77, 0x76, 0x61, 0x02, 0x8b, 0x68, 0x02, 0x24, 0x8a, 0x73, - 0xa0, 0x57, 0xa9, 0x24, 0x7f, 0xf3, 0xec, 0xa0, 0x92, 0x9d, 0x93, 0x90, 0xf9, 0x04, 0xc4, 0x34, - 0x23, 0x86, 0x7f, 0x54, 0xd4, 0x7a, 0x97, 0xf7, 0x86, 0x09, 0x7a, 0xec, 0xcf, 0xe2, 0x90, 0x79, - 0x04, 0xa8, 0x33, 0x17, 0x40, 0x9d, 0xa2, 0xed, 0x8e, 0x3a, 0x50, 0x47, 0x7b, 0x27, 0xc7, 0xc6, - 0xed, 0xbe, 0x8d, 0xb7, 0x85, 0xe0, 0x5c, 0x00, 0x2d, 0x4e, 0x3a, 0x53, 0xec, 0x43, 0x7f, 0x5b, - 0x02, 0x73, 0xd4, 0x0b, 0x59, 0x30, 0x01, 0xc7, 0x0b, 0x19, 0xe5, 0xe0, 0x10, 0x00, 0xe2, 0x5d, - 0xae, 0xeb, 0xec, 0xc8, 0x3a, 0xcf, 0xaa, 0x75, 0xc6, 0xa9, 0xea, 0x8d, 0x14, 0x9d, 0x4a, 0xcd, - 0x46, 0xad, 0xa3, 0xb0, 0x2e, 0x69, 0x35, 0x91, 0x96, 0xcc, 0xa2, 0xe1, 0x62, 0x07, 0x1d, 0x6e, - 0xed, 0x14, 0xbf, 0x40, 0xbb, 0x72, 0x52, 0x92, 0x8f, 0xf8, 0xa8, 0x5a, 0x3a, 0xe5, 0xed, 0x66, - 0x4a, 0x9d, 0x96, 0xb8, 0x9b, 0x77, 0xfa, 0x4f, 0xdc, 0xc2, 0xcf, 0x11, 0x06, 0x01, 0x24, 0x4c, - 0xdd, 0x64, 0x3c, 0x70, 0x62, 0xf1, 0x95, 0x4e, 0x3b, 0xda, 0x40, 0x1d, 0x69, 0x76, 0x5b, 0x66, - 0xce, 0x65, 0xe2, 0x63, 0x1a, 0xc7, 0xc7, 0xe8, 0x7e, 0xf9, 0x7e, 0x72, 0xb4, 0x21, 0xd1, 0x7b, - 0x65, 0x38, 0x03, 0x2d, 0x74, 0xa7, 0x5c, 0x84, 0x4e, 0x53, 0x36, 0xd2, 0x35, 0xb2, 0x55, 0x31, - 0x8a, 0x55, 0x31, 0x3e, 0x17, 0x84, 0xd5, 0xba, 0xfe, 0xd9, 0x57, 0x16, 0xbf, 0xfa, 0xaa, 0xbd, - 0x96, 0x0d, 0xbf, 0xef, 0xa0, 0xa3, 0x5a, 0x53, 0xf1, 0x7b, 0xf4, 0xc0, 0x13, 0xfc, 0x22, 0x64, - 0x9e, 0xec, 0xdb, 0x0d, 0x85, 0x77, 0x99, 0x3b, 0xd4, 0xab, 0x79, 0x39, 0x56, 0xca, 0xd8, 0xed, - 0x0d, 0x99, 0x8c, 0xe0, 0xa7, 0xe8, 0xae, 0x27, 0xa2, 0x48, 0x70, 0x67, 0x42, 0x53, 0x4e, 0x3a, - 0xa7, 0xd9, 0xfb, 0x59, 0xf0, 0x4c, 0xc6, 0xf0, 0x07, 0x74, 0xe0, 0x5e, 0x7d, 0x23, 0x1c, 0x18, - 0xa7, 0x4e, 0x39, 0x6d, 0xd2, 0xd1, 0x06, 0xda, 0x68, 0xef, 0xe4, 0xc9, 0x16, 0x97, 0x0b, 0xc6, - 0x7e, 0x58, 0x0a, 0xcb, 0x58, 0x52, 0x63, 0x7c, 0xa3, 0xc6, 0xf8, 0xff, 0xe1, 0xe7, 0x18, 0xed, - 0x17, 0xee, 0x8d, 0x59, 0x02, 0xf8, 0x35, 0x6a, 0x6d, 0xdc, 0x1e, 0x4d, 0x1e, 0x59, 0x99, 0xa2, - 0xdc, 0xd3, 0x46, 0x7a, 0xa4, 0x5d, 0x2a, 0xac, 0x4f, 0xd7, 0x4b, 0x5d, 0xbd, 0x59, 0xea, 0xea, - 0xef, 0xa5, 0xae, 0x2e, 0x56, 0xba, 0x72, 0xb3, 0xd2, 0x95, 0x1f, 0x2b, 0x5d, 0xf9, 0xf2, 0x2a, - 0x60, 0x30, 0x99, 0xb9, 0x86, 0x27, 0x22, 0x73, 0xf3, 0x7a, 0xaf, 0x1f, 0xb3, 0xaf, 0xc8, 0xed, - 0xab, 0xef, 0xee, 0xca, 0xf8, 0xcb, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa6, 0x21, 0x16, 0x68, - 0x9d, 0x04, 0x00, 0x00, -} - -func (m *Evidence) 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 *Evidence) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Evidence) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != nil { - { - size := m.Sum.Size() - i -= size - if _, err := m.Sum.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *Evidence_DuplicateVoteEvidence) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Evidence_DuplicateVoteEvidence) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.DuplicateVoteEvidence != nil { - { - size, err := m.DuplicateVoteEvidence.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvidence(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Evidence_LightClientAttackEvidence) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Evidence_LightClientAttackEvidence) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.LightClientAttackEvidence != nil { - { - size, err := m.LightClientAttackEvidence.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvidence(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} - -func (m *DuplicateVoteEvidence) 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 *DuplicateVoteEvidence) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DuplicateVoteEvidence) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err3 != nil { - return 0, err3 - } - i -= n3 - i = encodeVarintEvidence(dAtA, i, uint64(n3)) - i-- - dAtA[i] = 0x2a - if m.ValidatorPower != 0 { - i = encodeVarintEvidence(dAtA, i, uint64(m.ValidatorPower)) - i-- - dAtA[i] = 0x20 - } - if m.TotalVotingPower != 0 { - i = encodeVarintEvidence(dAtA, i, uint64(m.TotalVotingPower)) - i-- - dAtA[i] = 0x18 - } - if m.VoteB != nil { - { - size, err := m.VoteB.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvidence(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.VoteA != nil { - { - size, err := m.VoteA.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvidence(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *LightClientAttackEvidence) 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 *LightClientAttackEvidence) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *LightClientAttackEvidence) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n6, err6 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err6 != nil { - return 0, err6 - } - i -= n6 - i = encodeVarintEvidence(dAtA, i, uint64(n6)) - i-- - dAtA[i] = 0x2a - if m.TotalVotingPower != 0 { - i = encodeVarintEvidence(dAtA, i, uint64(m.TotalVotingPower)) - i-- - dAtA[i] = 0x20 - } - if len(m.ByzantineValidators) > 0 { - for iNdEx := len(m.ByzantineValidators) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ByzantineValidators[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvidence(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.CommonHeight != 0 { - i = encodeVarintEvidence(dAtA, i, uint64(m.CommonHeight)) - i-- - dAtA[i] = 0x10 - } - if m.ConflictingBlock != nil { - { - size, err := m.ConflictingBlock.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvidence(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EvidenceList) 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 *EvidenceList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EvidenceList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Evidence) > 0 { - for iNdEx := len(m.Evidence) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Evidence[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvidence(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintEvidence(dAtA []byte, offset int, v uint64) int { - offset -= sovEvidence(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *Evidence) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sum != nil { - n += m.Sum.Size() - } - return n -} - -func (m *Evidence_DuplicateVoteEvidence) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.DuplicateVoteEvidence != nil { - l = m.DuplicateVoteEvidence.Size() - n += 1 + l + sovEvidence(uint64(l)) - } - return n -} - -func (m *Evidence_LightClientAttackEvidence) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.LightClientAttackEvidence != nil { - l = m.LightClientAttackEvidence.Size() - n += 1 + l + sovEvidence(uint64(l)) - } - return n -} - -func (m *DuplicateVoteEvidence) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.VoteA != nil { - l = m.VoteA.Size() - n += 1 + l + sovEvidence(uint64(l)) - } - if m.VoteB != nil { - l = m.VoteB.Size() - n += 1 + l + sovEvidence(uint64(l)) - } - if m.TotalVotingPower != 0 { - n += 1 + sovEvidence(uint64(m.TotalVotingPower)) - } - if m.ValidatorPower != 0 { - n += 1 + sovEvidence(uint64(m.ValidatorPower)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp) - n += 1 + l + sovEvidence(uint64(l)) - return n -} - -func (m *LightClientAttackEvidence) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ConflictingBlock != nil { - l = m.ConflictingBlock.Size() - n += 1 + l + sovEvidence(uint64(l)) - } - if m.CommonHeight != 0 { - n += 1 + sovEvidence(uint64(m.CommonHeight)) - } - if len(m.ByzantineValidators) > 0 { - for _, e := range m.ByzantineValidators { - l = e.Size() - n += 1 + l + sovEvidence(uint64(l)) - } - } - if m.TotalVotingPower != 0 { - n += 1 + sovEvidence(uint64(m.TotalVotingPower)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp) - n += 1 + l + sovEvidence(uint64(l)) - return n -} - -func (m *EvidenceList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Evidence) > 0 { - for _, e := range m.Evidence { - l = e.Size() - n += 1 + l + sovEvidence(uint64(l)) - } - } - return n -} - -func sovEvidence(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozEvidence(x uint64) (n int) { - return sovEvidence(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *Evidence) 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 ErrIntOverflowEvidence - } - 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: Evidence: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Evidence: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DuplicateVoteEvidence", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvidence - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvidence - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &DuplicateVoteEvidence{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Evidence_DuplicateVoteEvidence{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LightClientAttackEvidence", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvidence - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvidence - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &LightClientAttackEvidence{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Sum = &Evidence_LightClientAttackEvidence{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvidence(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvidence - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *DuplicateVoteEvidence) 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 ErrIntOverflowEvidence - } - 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: DuplicateVoteEvidence: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DuplicateVoteEvidence: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VoteA", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvidence - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvidence - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.VoteA == nil { - m.VoteA = &Vote{} - } - if err := m.VoteA.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VoteB", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvidence - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvidence - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.VoteB == nil { - m.VoteB = &Vote{} - } - if err := m.VoteB.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalVotingPower", wireType) - } - m.TotalVotingPower = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalVotingPower |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorPower", wireType) - } - m.ValidatorPower = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ValidatorPower |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvidence - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvidence - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvidence(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvidence - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *LightClientAttackEvidence) 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 ErrIntOverflowEvidence - } - 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: LightClientAttackEvidence: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LightClientAttackEvidence: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConflictingBlock", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvidence - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvidence - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ConflictingBlock == nil { - m.ConflictingBlock = &LightBlock{} - } - if err := m.ConflictingBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CommonHeight", wireType) - } - m.CommonHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CommonHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ByzantineValidators", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvidence - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvidence - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ByzantineValidators = append(m.ByzantineValidators, &Validator{}) - if err := m.ByzantineValidators[len(m.ByzantineValidators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalVotingPower", wireType) - } - m.TotalVotingPower = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalVotingPower |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvidence - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvidence - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvidence(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvidence - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *EvidenceList) 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 ErrIntOverflowEvidence - } - 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: EvidenceList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EvidenceList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Evidence", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvidence - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvidence - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvidence - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Evidence = append(m.Evidence, Evidence{}) - if err := m.Evidence[len(m.Evidence)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvidence(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvidence - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipEvidence(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, ErrIntOverflowEvidence - } - 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, ErrIntOverflowEvidence - } - 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, ErrIntOverflowEvidence - } - 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, ErrInvalidLengthEvidence - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEvidence - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEvidence - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEvidence = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEvidence = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEvidence = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/types/evidence.proto b/third_party/proto/tendermint/types/evidence.proto deleted file mode 100644 index 451b8dca3c..0000000000 --- a/third_party/proto/tendermint/types/evidence.proto +++ /dev/null @@ -1,38 +0,0 @@ -syntax = "proto3"; -package tendermint.types; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/timestamp.proto"; -import "tendermint/types/types.proto"; -import "tendermint/types/validator.proto"; - -message Evidence { - oneof sum { - DuplicateVoteEvidence duplicate_vote_evidence = 1; - LightClientAttackEvidence light_client_attack_evidence = 2; - } -} - -// DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes. -message DuplicateVoteEvidence { - tendermint.types.Vote vote_a = 1; - tendermint.types.Vote vote_b = 2; - int64 total_voting_power = 3; - int64 validator_power = 4; - google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; -} - -// LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client. -message LightClientAttackEvidence { - tendermint.types.LightBlock conflicting_block = 1; - int64 common_height = 2; - repeated tendermint.types.Validator byzantine_validators = 3; - int64 total_voting_power = 4; - google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; -} - -message EvidenceList { - repeated Evidence evidence = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/tendermint/types/params.pb.go b/third_party/proto/tendermint/types/params.pb.go deleted file mode 100644 index 49bd916f1e..0000000000 --- a/third_party/proto/tendermint/types/params.pb.go +++ /dev/null @@ -1,1834 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/types/params.proto - -package types - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - time "time" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/golang/protobuf/ptypes/duration" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = math.Inf - _ = time.Kitchen -) - -// 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 - -// ConsensusParams contains consensus critical parameters that determine the -// validity of blocks. -type ConsensusParams struct { - Block BlockParams `protobuf:"bytes,1,opt,name=block,proto3" json:"block"` - Evidence EvidenceParams `protobuf:"bytes,2,opt,name=evidence,proto3" json:"evidence"` - Validator ValidatorParams `protobuf:"bytes,3,opt,name=validator,proto3" json:"validator"` - Version VersionParams `protobuf:"bytes,4,opt,name=version,proto3" json:"version"` -} - -func (m *ConsensusParams) Reset() { *m = ConsensusParams{} } -func (m *ConsensusParams) String() string { return proto.CompactTextString(m) } -func (*ConsensusParams) ProtoMessage() {} -func (*ConsensusParams) Descriptor() ([]byte, []int) { - return fileDescriptor_e12598271a686f57, []int{0} -} - -func (m *ConsensusParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ConsensusParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ConsensusParams.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 *ConsensusParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConsensusParams.Merge(m, src) -} - -func (m *ConsensusParams) XXX_Size() int { - return m.Size() -} - -func (m *ConsensusParams) XXX_DiscardUnknown() { - xxx_messageInfo_ConsensusParams.DiscardUnknown(m) -} - -var xxx_messageInfo_ConsensusParams proto.InternalMessageInfo - -func (m *ConsensusParams) GetBlock() BlockParams { - if m != nil { - return m.Block - } - return BlockParams{} -} - -func (m *ConsensusParams) GetEvidence() EvidenceParams { - if m != nil { - return m.Evidence - } - return EvidenceParams{} -} - -func (m *ConsensusParams) GetValidator() ValidatorParams { - if m != nil { - return m.Validator - } - return ValidatorParams{} -} - -func (m *ConsensusParams) GetVersion() VersionParams { - if m != nil { - return m.Version - } - return VersionParams{} -} - -// BlockParams contains limits on the block size. -type BlockParams struct { - // Max block size, in bytes. - // Note: must be greater than 0 - MaxBytes int64 `protobuf:"varint,1,opt,name=max_bytes,json=maxBytes,proto3" json:"max_bytes,omitempty"` - // Max gas per block. - // Note: must be greater or equal to -1 - MaxGas int64 `protobuf:"varint,2,opt,name=max_gas,json=maxGas,proto3" json:"max_gas,omitempty"` - // Minimum time increment between consecutive blocks (in milliseconds) If the - // block header timestamp is ahead of the system clock, decrease this value. - // - // Not exposed to the application. - TimeIotaMs int64 `protobuf:"varint,3,opt,name=time_iota_ms,json=timeIotaMs,proto3" json:"time_iota_ms,omitempty"` -} - -func (m *BlockParams) Reset() { *m = BlockParams{} } -func (m *BlockParams) String() string { return proto.CompactTextString(m) } -func (*BlockParams) ProtoMessage() {} -func (*BlockParams) Descriptor() ([]byte, []int) { - return fileDescriptor_e12598271a686f57, []int{1} -} - -func (m *BlockParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *BlockParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BlockParams.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 *BlockParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_BlockParams.Merge(m, src) -} - -func (m *BlockParams) XXX_Size() int { - return m.Size() -} - -func (m *BlockParams) XXX_DiscardUnknown() { - xxx_messageInfo_BlockParams.DiscardUnknown(m) -} - -var xxx_messageInfo_BlockParams proto.InternalMessageInfo - -func (m *BlockParams) GetMaxBytes() int64 { - if m != nil { - return m.MaxBytes - } - return 0 -} - -func (m *BlockParams) GetMaxGas() int64 { - if m != nil { - return m.MaxGas - } - return 0 -} - -func (m *BlockParams) GetTimeIotaMs() int64 { - if m != nil { - return m.TimeIotaMs - } - return 0 -} - -// EvidenceParams determine how we handle evidence of malfeasance. -type EvidenceParams struct { - // Max age of evidence, in blocks. - // - // The basic formula for calculating this is: MaxAgeDuration / {average block - // time}. - MaxAgeNumBlocks int64 `protobuf:"varint,1,opt,name=max_age_num_blocks,json=maxAgeNumBlocks,proto3" json:"max_age_num_blocks,omitempty"` - // Max age of evidence, in time. - // - // It should correspond with an app's "unbonding period" or other similar - // mechanism for handling [Nothing-At-Stake - // attacks](https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed). - MaxAgeDuration time.Duration `protobuf:"bytes,2,opt,name=max_age_duration,json=maxAgeDuration,proto3,stdduration" json:"max_age_duration"` - // This sets the maximum size of total evidence in bytes that can be committed in a single block. - // and should fall comfortably under the max block bytes. - // Default is 1048576 or 1MB - MaxBytes int64 `protobuf:"varint,3,opt,name=max_bytes,json=maxBytes,proto3" json:"max_bytes,omitempty"` -} - -func (m *EvidenceParams) Reset() { *m = EvidenceParams{} } -func (m *EvidenceParams) String() string { return proto.CompactTextString(m) } -func (*EvidenceParams) ProtoMessage() {} -func (*EvidenceParams) Descriptor() ([]byte, []int) { - return fileDescriptor_e12598271a686f57, []int{2} -} - -func (m *EvidenceParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *EvidenceParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EvidenceParams.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 *EvidenceParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_EvidenceParams.Merge(m, src) -} - -func (m *EvidenceParams) XXX_Size() int { - return m.Size() -} - -func (m *EvidenceParams) XXX_DiscardUnknown() { - xxx_messageInfo_EvidenceParams.DiscardUnknown(m) -} - -var xxx_messageInfo_EvidenceParams proto.InternalMessageInfo - -func (m *EvidenceParams) GetMaxAgeNumBlocks() int64 { - if m != nil { - return m.MaxAgeNumBlocks - } - return 0 -} - -func (m *EvidenceParams) GetMaxAgeDuration() time.Duration { - if m != nil { - return m.MaxAgeDuration - } - return 0 -} - -func (m *EvidenceParams) GetMaxBytes() int64 { - if m != nil { - return m.MaxBytes - } - return 0 -} - -// ValidatorParams restrict the public key types validators can use. -// NOTE: uses ABCI pubkey naming, not Amino names. -type ValidatorParams struct { - PubKeyTypes []string `protobuf:"bytes,1,rep,name=pub_key_types,json=pubKeyTypes,proto3" json:"pub_key_types,omitempty"` -} - -func (m *ValidatorParams) Reset() { *m = ValidatorParams{} } -func (m *ValidatorParams) String() string { return proto.CompactTextString(m) } -func (*ValidatorParams) ProtoMessage() {} -func (*ValidatorParams) Descriptor() ([]byte, []int) { - return fileDescriptor_e12598271a686f57, []int{3} -} - -func (m *ValidatorParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ValidatorParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ValidatorParams.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 *ValidatorParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_ValidatorParams.Merge(m, src) -} - -func (m *ValidatorParams) XXX_Size() int { - return m.Size() -} - -func (m *ValidatorParams) XXX_DiscardUnknown() { - xxx_messageInfo_ValidatorParams.DiscardUnknown(m) -} - -var xxx_messageInfo_ValidatorParams proto.InternalMessageInfo - -func (m *ValidatorParams) GetPubKeyTypes() []string { - if m != nil { - return m.PubKeyTypes - } - return nil -} - -// VersionParams contains the ABCI application version. -type VersionParams struct { - AppVersion uint64 `protobuf:"varint,1,opt,name=app_version,json=appVersion,proto3" json:"app_version,omitempty"` -} - -func (m *VersionParams) Reset() { *m = VersionParams{} } -func (m *VersionParams) String() string { return proto.CompactTextString(m) } -func (*VersionParams) ProtoMessage() {} -func (*VersionParams) Descriptor() ([]byte, []int) { - return fileDescriptor_e12598271a686f57, []int{4} -} - -func (m *VersionParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *VersionParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_VersionParams.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 *VersionParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_VersionParams.Merge(m, src) -} - -func (m *VersionParams) XXX_Size() int { - return m.Size() -} - -func (m *VersionParams) XXX_DiscardUnknown() { - xxx_messageInfo_VersionParams.DiscardUnknown(m) -} - -var xxx_messageInfo_VersionParams proto.InternalMessageInfo - -func (m *VersionParams) GetAppVersion() uint64 { - if m != nil { - return m.AppVersion - } - return 0 -} - -// HashedParams is a subset of ConsensusParams. -// -// It is hashed into the Header.ConsensusHash. -type HashedParams struct { - BlockMaxBytes int64 `protobuf:"varint,1,opt,name=block_max_bytes,json=blockMaxBytes,proto3" json:"block_max_bytes,omitempty"` - BlockMaxGas int64 `protobuf:"varint,2,opt,name=block_max_gas,json=blockMaxGas,proto3" json:"block_max_gas,omitempty"` -} - -func (m *HashedParams) Reset() { *m = HashedParams{} } -func (m *HashedParams) String() string { return proto.CompactTextString(m) } -func (*HashedParams) ProtoMessage() {} -func (*HashedParams) Descriptor() ([]byte, []int) { - return fileDescriptor_e12598271a686f57, []int{5} -} - -func (m *HashedParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *HashedParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_HashedParams.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 *HashedParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_HashedParams.Merge(m, src) -} - -func (m *HashedParams) XXX_Size() int { - return m.Size() -} - -func (m *HashedParams) XXX_DiscardUnknown() { - xxx_messageInfo_HashedParams.DiscardUnknown(m) -} - -var xxx_messageInfo_HashedParams proto.InternalMessageInfo - -func (m *HashedParams) GetBlockMaxBytes() int64 { - if m != nil { - return m.BlockMaxBytes - } - return 0 -} - -func (m *HashedParams) GetBlockMaxGas() int64 { - if m != nil { - return m.BlockMaxGas - } - return 0 -} - -func init() { - proto.RegisterType((*ConsensusParams)(nil), "tendermint.types.ConsensusParams") - proto.RegisterType((*BlockParams)(nil), "tendermint.types.BlockParams") - proto.RegisterType((*EvidenceParams)(nil), "tendermint.types.EvidenceParams") - proto.RegisterType((*ValidatorParams)(nil), "tendermint.types.ValidatorParams") - proto.RegisterType((*VersionParams)(nil), "tendermint.types.VersionParams") - proto.RegisterType((*HashedParams)(nil), "tendermint.types.HashedParams") -} - -func init() { proto.RegisterFile("tendermint/types/params.proto", fileDescriptor_e12598271a686f57) } - -var fileDescriptor_e12598271a686f57 = []byte{ - // 537 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x53, 0x31, 0x6f, 0xd3, 0x40, - 0x18, 0xcd, 0xd5, 0xa5, 0x4d, 0xbe, 0x34, 0x4d, 0x75, 0x42, 0x22, 0x14, 0xd5, 0x0e, 0x1e, 0x50, - 0x25, 0x24, 0x5b, 0x82, 0x01, 0xd1, 0xa5, 0xc2, 0x50, 0x15, 0x84, 0x82, 0x90, 0x05, 0x0c, 0x5d, - 0xac, 0x73, 0x72, 0xb8, 0x56, 0x73, 0x3e, 0xcb, 0x77, 0x8e, 0x92, 0x7f, 0xc1, 0xd8, 0xb1, 0x23, - 0xfc, 0x03, 0x7e, 0x42, 0xc7, 0x8e, 0x4c, 0x80, 0x92, 0x85, 0x9f, 0x81, 0x7c, 0xce, 0xe1, 0x38, - 0x65, 0xf3, 0x7d, 0xdf, 0x7b, 0xef, 0xfc, 0xde, 0xd3, 0xc1, 0x81, 0xa4, 0xc9, 0x88, 0x66, 0x2c, - 0x4e, 0xa4, 0x2b, 0x67, 0x29, 0x15, 0x6e, 0x4a, 0x32, 0xc2, 0x84, 0x93, 0x66, 0x5c, 0x72, 0xbc, - 0x57, 0xad, 0x1d, 0xb5, 0xde, 0xbf, 0x1b, 0xf1, 0x88, 0xab, 0xa5, 0x5b, 0x7c, 0x95, 0xb8, 0x7d, - 0x33, 0xe2, 0x3c, 0x1a, 0x53, 0x57, 0x9d, 0xc2, 0xfc, 0xb3, 0x3b, 0xca, 0x33, 0x22, 0x63, 0x9e, - 0x94, 0x7b, 0xfb, 0x72, 0x03, 0xba, 0x2f, 0x79, 0x22, 0x68, 0x22, 0x72, 0xf1, 0x5e, 0xdd, 0x80, - 0x9f, 0xc3, 0x9d, 0x70, 0xcc, 0x87, 0x17, 0x3d, 0xd4, 0x47, 0x87, 0xed, 0x27, 0x07, 0xce, 0xfa, - 0x5d, 0x8e, 0x57, 0xac, 0x4b, 0xb4, 0xb7, 0x79, 0xfd, 0xd3, 0x6a, 0xf8, 0x25, 0x03, 0x7b, 0xd0, - 0xa4, 0x93, 0x78, 0x44, 0x93, 0x21, 0xed, 0x6d, 0x28, 0x76, 0xff, 0x36, 0xfb, 0x64, 0x89, 0xa8, - 0x09, 0xfc, 0xe3, 0xe1, 0x13, 0x68, 0x4d, 0xc8, 0x38, 0x1e, 0x11, 0xc9, 0xb3, 0x9e, 0xa1, 0x44, - 0x1e, 0xde, 0x16, 0xf9, 0xa4, 0x21, 0x35, 0x95, 0x8a, 0x89, 0x8f, 0x61, 0x7b, 0x42, 0x33, 0x11, - 0xf3, 0xa4, 0xb7, 0xa9, 0x44, 0xac, 0xff, 0x88, 0x94, 0x80, 0x9a, 0x84, 0x66, 0xd9, 0x14, 0xda, - 0x2b, 0x3e, 0xf1, 0x03, 0x68, 0x31, 0x32, 0x0d, 0xc2, 0x99, 0xa4, 0x42, 0x25, 0x63, 0xf8, 0x4d, - 0x46, 0xa6, 0x5e, 0x71, 0xc6, 0xf7, 0x60, 0xbb, 0x58, 0x46, 0x44, 0x28, 0xdb, 0x86, 0xbf, 0xc5, - 0xc8, 0xf4, 0x94, 0x08, 0xdc, 0x87, 0x1d, 0x19, 0x33, 0x1a, 0xc4, 0x5c, 0x92, 0x80, 0x09, 0xe5, - 0xc7, 0xf0, 0xa1, 0x98, 0xbd, 0xe1, 0x92, 0x0c, 0x84, 0xfd, 0x0d, 0xc1, 0x6e, 0x3d, 0x11, 0xfc, - 0x18, 0x70, 0xa1, 0x46, 0x22, 0x1a, 0x24, 0x39, 0x0b, 0x54, 0xb4, 0xfa, 0xce, 0x2e, 0x23, 0xd3, - 0x17, 0x11, 0x7d, 0x97, 0x33, 0xf5, 0x73, 0x02, 0x0f, 0x60, 0x4f, 0x83, 0x75, 0xb7, 0xcb, 0xe8, - 0xef, 0x3b, 0x65, 0xf9, 0x8e, 0x2e, 0xdf, 0x79, 0xb5, 0x04, 0x78, 0xcd, 0xc2, 0xea, 0xe5, 0x2f, - 0x0b, 0xf9, 0xbb, 0xa5, 0x9e, 0xde, 0xd4, 0x6d, 0x1a, 0x75, 0x9b, 0xf6, 0x31, 0x74, 0xd7, 0x72, - 0xc7, 0x36, 0x74, 0xd2, 0x3c, 0x0c, 0x2e, 0xe8, 0x2c, 0x50, 0x99, 0xf6, 0x50, 0xdf, 0x38, 0x6c, - 0xf9, 0xed, 0x34, 0x0f, 0xdf, 0xd2, 0xd9, 0x87, 0x62, 0x74, 0xd4, 0xfc, 0x7e, 0x65, 0xa1, 0x3f, - 0x57, 0x16, 0xb2, 0x8f, 0xa0, 0x53, 0xcb, 0x1c, 0x5b, 0xd0, 0x26, 0x69, 0x1a, 0xe8, 0xa6, 0x0a, - 0x8f, 0x9b, 0x3e, 0x90, 0x34, 0x5d, 0xc2, 0x56, 0xb8, 0x67, 0xb0, 0xf3, 0x9a, 0x88, 0x73, 0x3a, - 0x5a, 0x52, 0x1f, 0x41, 0x57, 0x25, 0x13, 0xac, 0xd7, 0xd2, 0x51, 0xe3, 0x81, 0xee, 0xc6, 0x86, - 0x4e, 0x85, 0xab, 0x1a, 0x6a, 0x6b, 0xd4, 0x29, 0x11, 0xde, 0xc7, 0xaf, 0x73, 0x13, 0x5d, 0xcf, - 0x4d, 0x74, 0x33, 0x37, 0xd1, 0xef, 0xb9, 0x89, 0xbe, 0x2c, 0xcc, 0xc6, 0xcd, 0xc2, 0x6c, 0xfc, - 0x58, 0x98, 0x8d, 0xb3, 0x67, 0x51, 0x2c, 0xcf, 0xf3, 0xd0, 0x19, 0x72, 0xe6, 0xae, 0x3e, 0xcb, - 0xea, 0xb3, 0x7c, 0x77, 0xeb, 0x4f, 0x36, 0xdc, 0x52, 0xf3, 0xa7, 0x7f, 0x03, 0x00, 0x00, 0xff, - 0xff, 0xfe, 0xe0, 0x3d, 0x9c, 0xcd, 0x03, 0x00, 0x00, -} - -func (this *ConsensusParams) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*ConsensusParams) - if !ok { - that2, ok := that.(ConsensusParams) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.Block.Equal(&that1.Block) { - return false - } - if !this.Evidence.Equal(&that1.Evidence) { - return false - } - if !this.Validator.Equal(&that1.Validator) { - return false - } - if !this.Version.Equal(&that1.Version) { - return false - } - return true -} - -func (this *BlockParams) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*BlockParams) - if !ok { - that2, ok := that.(BlockParams) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.MaxBytes != that1.MaxBytes { - return false - } - if this.MaxGas != that1.MaxGas { - return false - } - if this.TimeIotaMs != that1.TimeIotaMs { - return false - } - return true -} - -func (this *EvidenceParams) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*EvidenceParams) - if !ok { - that2, ok := that.(EvidenceParams) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.MaxAgeNumBlocks != that1.MaxAgeNumBlocks { - return false - } - if this.MaxAgeDuration != that1.MaxAgeDuration { - return false - } - if this.MaxBytes != that1.MaxBytes { - return false - } - return true -} - -func (this *ValidatorParams) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*ValidatorParams) - if !ok { - that2, ok := that.(ValidatorParams) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if len(this.PubKeyTypes) != len(that1.PubKeyTypes) { - return false - } - for i := range this.PubKeyTypes { - if this.PubKeyTypes[i] != that1.PubKeyTypes[i] { - return false - } - } - return true -} - -func (this *VersionParams) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*VersionParams) - if !ok { - that2, ok := that.(VersionParams) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.AppVersion != that1.AppVersion { - return false - } - return true -} - -func (this *HashedParams) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*HashedParams) - if !ok { - that2, ok := that.(HashedParams) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.BlockMaxBytes != that1.BlockMaxBytes { - return false - } - if this.BlockMaxGas != that1.BlockMaxGas { - return false - } - return true -} - -func (m *ConsensusParams) 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 *ConsensusParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ConsensusParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintParams(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintParams(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.Evidence.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintParams(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Block.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintParams(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *BlockParams) 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 *BlockParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BlockParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.TimeIotaMs != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.TimeIotaMs)) - i-- - dAtA[i] = 0x18 - } - if m.MaxGas != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.MaxGas)) - i-- - dAtA[i] = 0x10 - } - if m.MaxBytes != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.MaxBytes)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *EvidenceParams) 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 *EvidenceParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EvidenceParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.MaxBytes != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.MaxBytes)) - i-- - dAtA[i] = 0x18 - } - n5, err5 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxAgeDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxAgeDuration):]) - if err5 != nil { - return 0, err5 - } - i -= n5 - i = encodeVarintParams(dAtA, i, uint64(n5)) - i-- - dAtA[i] = 0x12 - if m.MaxAgeNumBlocks != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.MaxAgeNumBlocks)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *ValidatorParams) 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 *ValidatorParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ValidatorParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.PubKeyTypes) > 0 { - for iNdEx := len(m.PubKeyTypes) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.PubKeyTypes[iNdEx]) - copy(dAtA[i:], m.PubKeyTypes[iNdEx]) - i = encodeVarintParams(dAtA, i, uint64(len(m.PubKeyTypes[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *VersionParams) 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 *VersionParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *VersionParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.AppVersion != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.AppVersion)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *HashedParams) 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 *HashedParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *HashedParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.BlockMaxGas != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.BlockMaxGas)) - i-- - dAtA[i] = 0x10 - } - if m.BlockMaxBytes != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.BlockMaxBytes)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintParams(dAtA []byte, offset int, v uint64) int { - offset -= sovParams(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func NewPopulatedValidatorParams(r randyParams, easy bool) *ValidatorParams { - this := &ValidatorParams{} - v1 := r.Intn(10) - this.PubKeyTypes = make([]string, v1) - for i := 0; i < v1; i++ { - this.PubKeyTypes[i] = string(randStringParams(r)) - } - if !easy && r.Intn(10) != 0 { - } - return this -} - -func NewPopulatedVersionParams(r randyParams, easy bool) *VersionParams { - this := &VersionParams{} - this.AppVersion = uint64(uint64(r.Uint32())) - if !easy && r.Intn(10) != 0 { - } - return this -} - -type randyParams interface { - Float32() float32 - Float64() float64 - Int63() int64 - Int31() int32 - Uint32() uint32 - Intn(n int) int -} - -func randUTF8RuneParams(r randyParams) rune { - ru := r.Intn(62) - if ru < 10 { - return rune(ru + 48) - } else if ru < 36 { - return rune(ru + 55) - } - return rune(ru + 61) -} - -func randStringParams(r randyParams) string { - v2 := r.Intn(100) - tmps := make([]rune, v2) - for i := 0; i < v2; i++ { - tmps[i] = randUTF8RuneParams(r) - } - return string(tmps) -} - -func randUnrecognizedParams(r randyParams, maxFieldNumber int) (dAtA []byte) { - l := r.Intn(5) - for i := 0; i < l; i++ { - wire := r.Intn(4) - if wire == 3 { - wire = 5 - } - fieldNumber := maxFieldNumber + r.Intn(100) - dAtA = randFieldParams(dAtA, r, fieldNumber, wire) - } - return dAtA -} - -func randFieldParams(dAtA []byte, r randyParams, fieldNumber int, wire int) []byte { - key := uint32(fieldNumber)<<3 | uint32(wire) - switch wire { - case 0: - dAtA = encodeVarintPopulateParams(dAtA, uint64(key)) - v3 := r.Int63() - if r.Intn(2) == 0 { - v3 *= -1 - } - dAtA = encodeVarintPopulateParams(dAtA, uint64(v3)) - case 1: - dAtA = encodeVarintPopulateParams(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - case 2: - dAtA = encodeVarintPopulateParams(dAtA, uint64(key)) - ll := r.Intn(100) - dAtA = encodeVarintPopulateParams(dAtA, uint64(ll)) - for j := 0; j < ll; j++ { - dAtA = append(dAtA, byte(r.Intn(256))) - } - default: - dAtA = encodeVarintPopulateParams(dAtA, uint64(key)) - dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) - } - return dAtA -} - -func encodeVarintPopulateParams(dAtA []byte, v uint64) []byte { - for v >= 1<<7 { - dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) - v >>= 7 - } - dAtA = append(dAtA, uint8(v)) - return dAtA -} - -func (m *ConsensusParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Block.Size() - n += 1 + l + sovParams(uint64(l)) - l = m.Evidence.Size() - n += 1 + l + sovParams(uint64(l)) - l = m.Validator.Size() - n += 1 + l + sovParams(uint64(l)) - l = m.Version.Size() - n += 1 + l + sovParams(uint64(l)) - return n -} - -func (m *BlockParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.MaxBytes != 0 { - n += 1 + sovParams(uint64(m.MaxBytes)) - } - if m.MaxGas != 0 { - n += 1 + sovParams(uint64(m.MaxGas)) - } - if m.TimeIotaMs != 0 { - n += 1 + sovParams(uint64(m.TimeIotaMs)) - } - return n -} - -func (m *EvidenceParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.MaxAgeNumBlocks != 0 { - n += 1 + sovParams(uint64(m.MaxAgeNumBlocks)) - } - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxAgeDuration) - n += 1 + l + sovParams(uint64(l)) - if m.MaxBytes != 0 { - n += 1 + sovParams(uint64(m.MaxBytes)) - } - return n -} - -func (m *ValidatorParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.PubKeyTypes) > 0 { - for _, s := range m.PubKeyTypes { - l = len(s) - n += 1 + l + sovParams(uint64(l)) - } - } - return n -} - -func (m *VersionParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.AppVersion != 0 { - n += 1 + sovParams(uint64(m.AppVersion)) - } - return n -} - -func (m *HashedParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.BlockMaxBytes != 0 { - n += 1 + sovParams(uint64(m.BlockMaxBytes)) - } - if m.BlockMaxGas != 0 { - n += 1 + sovParams(uint64(m.BlockMaxGas)) - } - return n -} - -func sovParams(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozParams(x uint64) (n int) { - return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *ConsensusParams) 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 ErrIntOverflowParams - } - 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: ConsensusParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ConsensusParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Block", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthParams - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthParams - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Evidence", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthParams - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthParams - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Evidence.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthParams - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthParams - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Validator.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthParams - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthParams - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *BlockParams) 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 ErrIntOverflowParams - } - 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: BlockParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BlockParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxBytes", wireType) - } - m.MaxBytes = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxBytes |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxGas", wireType) - } - m.MaxGas = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxGas |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TimeIotaMs", wireType) - } - m.TimeIotaMs = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TimeIotaMs |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *EvidenceParams) 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 ErrIntOverflowParams - } - 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: EvidenceParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EvidenceParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxAgeNumBlocks", wireType) - } - m.MaxAgeNumBlocks = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxAgeNumBlocks |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxAgeDuration", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthParams - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthParams - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MaxAgeDuration, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxBytes", wireType) - } - m.MaxBytes = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxBytes |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *ValidatorParams) 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 ErrIntOverflowParams - } - 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: ValidatorParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ValidatorParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKeyTypes", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthParams - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthParams - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PubKeyTypes = append(m.PubKeyTypes, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *VersionParams) 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 ErrIntOverflowParams - } - 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: VersionParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: VersionParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AppVersion", wireType) - } - m.AppVersion = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.AppVersion |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *HashedParams) 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 ErrIntOverflowParams - } - 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: HashedParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: HashedParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockMaxBytes", wireType) - } - m.BlockMaxBytes = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.BlockMaxBytes |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockMaxGas", wireType) - } - m.BlockMaxGas = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.BlockMaxGas |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipParams(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, ErrIntOverflowParams - } - 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, ErrIntOverflowParams - } - 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, ErrIntOverflowParams - } - 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, ErrInvalidLengthParams - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupParams - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthParams - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthParams = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowParams = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupParams = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/types/params.proto b/third_party/proto/tendermint/types/params.proto deleted file mode 100644 index 0de7d846fb..0000000000 --- a/third_party/proto/tendermint/types/params.proto +++ /dev/null @@ -1,80 +0,0 @@ -syntax = "proto3"; -package tendermint.types; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/duration.proto"; - -option (gogoproto.equal_all) = true; - -// ConsensusParams contains consensus critical parameters that determine the -// validity of blocks. -message ConsensusParams { - BlockParams block = 1 [(gogoproto.nullable) = false]; - EvidenceParams evidence = 2 [(gogoproto.nullable) = false]; - ValidatorParams validator = 3 [(gogoproto.nullable) = false]; - VersionParams version = 4 [(gogoproto.nullable) = false]; -} - -// BlockParams contains limits on the block size. -message BlockParams { - // Max block size, in bytes. - // Note: must be greater than 0 - int64 max_bytes = 1; - // Max gas per block. - // Note: must be greater or equal to -1 - int64 max_gas = 2; - // Minimum time increment between consecutive blocks (in milliseconds) If the - // block header timestamp is ahead of the system clock, decrease this value. - // - // Not exposed to the application. - int64 time_iota_ms = 3; -} - -// EvidenceParams determine how we handle evidence of malfeasance. -message EvidenceParams { - // Max age of evidence, in blocks. - // - // The basic formula for calculating this is: MaxAgeDuration / {average block - // time}. - int64 max_age_num_blocks = 1; - - // Max age of evidence, in time. - // - // It should correspond with an app's "unbonding period" or other similar - // mechanism for handling [Nothing-At-Stake - // attacks](https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed). - google.protobuf.Duration max_age_duration = 2 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; - - // This sets the maximum size of total evidence in bytes that can be committed in a single block. - // and should fall comfortably under the max block bytes. - // Default is 1048576 or 1MB - int64 max_bytes = 3; -} - -// ValidatorParams restrict the public key types validators can use. -// NOTE: uses ABCI pubkey naming, not Amino names. -message ValidatorParams { - option (gogoproto.populate) = true; - option (gogoproto.equal) = true; - - repeated string pub_key_types = 1; -} - -// VersionParams contains the ABCI application version. -message VersionParams { - option (gogoproto.populate) = true; - option (gogoproto.equal) = true; - - uint64 app_version = 1; -} - -// HashedParams is a subset of ConsensusParams. -// -// It is hashed into the Header.ConsensusHash. -message HashedParams { - int64 block_max_bytes = 1; - int64 block_max_gas = 2; -} diff --git a/third_party/proto/tendermint/types/types.pb.go b/third_party/proto/tendermint/types/types.pb.go deleted file mode 100644 index 10a6a7e435..0000000000 --- a/third_party/proto/tendermint/types/types.pb.go +++ /dev/null @@ -1,4657 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/types/types.proto - -package types - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - time "time" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - version "github.com/tendermint/tendermint/proto/tendermint/version" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = math.Inf - _ = time.Kitchen -) - -// 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 - -// BlockIdFlag indicates which BlcokID the signature is for -type BlockIDFlag int32 - -const ( - BlockIDFlagUnknown BlockIDFlag = 0 - BlockIDFlagAbsent BlockIDFlag = 1 - BlockIDFlagCommit BlockIDFlag = 2 - BlockIDFlagNil BlockIDFlag = 3 -) - -var BlockIDFlag_name = map[int32]string{ - 0: "BLOCK_ID_FLAG_UNKNOWN", - 1: "BLOCK_ID_FLAG_ABSENT", - 2: "BLOCK_ID_FLAG_COMMIT", - 3: "BLOCK_ID_FLAG_NIL", -} - -var BlockIDFlag_value = map[string]int32{ - "BLOCK_ID_FLAG_UNKNOWN": 0, - "BLOCK_ID_FLAG_ABSENT": 1, - "BLOCK_ID_FLAG_COMMIT": 2, - "BLOCK_ID_FLAG_NIL": 3, -} - -func (x BlockIDFlag) String() string { - return proto.EnumName(BlockIDFlag_name, int32(x)) -} - -func (BlockIDFlag) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{0} -} - -// SignedMsgType is a type of signed message in the consensus. -type SignedMsgType int32 - -const ( - UnknownType SignedMsgType = 0 - // Votes - PrevoteType SignedMsgType = 1 - PrecommitType SignedMsgType = 2 - // Proposals - ProposalType SignedMsgType = 32 -) - -var SignedMsgType_name = map[int32]string{ - 0: "SIGNED_MSG_TYPE_UNKNOWN", - 1: "SIGNED_MSG_TYPE_PREVOTE", - 2: "SIGNED_MSG_TYPE_PRECOMMIT", - 32: "SIGNED_MSG_TYPE_PROPOSAL", -} - -var SignedMsgType_value = map[string]int32{ - "SIGNED_MSG_TYPE_UNKNOWN": 0, - "SIGNED_MSG_TYPE_PREVOTE": 1, - "SIGNED_MSG_TYPE_PRECOMMIT": 2, - "SIGNED_MSG_TYPE_PROPOSAL": 32, -} - -func (x SignedMsgType) String() string { - return proto.EnumName(SignedMsgType_name, int32(x)) -} - -func (SignedMsgType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{1} -} - -// PartsetHeader -type PartSetHeader struct { - Total uint32 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` - Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` -} - -func (m *PartSetHeader) Reset() { *m = PartSetHeader{} } -func (m *PartSetHeader) String() string { return proto.CompactTextString(m) } -func (*PartSetHeader) ProtoMessage() {} -func (*PartSetHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{0} -} - -func (m *PartSetHeader) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *PartSetHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PartSetHeader.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 *PartSetHeader) XXX_Merge(src proto.Message) { - xxx_messageInfo_PartSetHeader.Merge(m, src) -} - -func (m *PartSetHeader) XXX_Size() int { - return m.Size() -} - -func (m *PartSetHeader) XXX_DiscardUnknown() { - xxx_messageInfo_PartSetHeader.DiscardUnknown(m) -} - -var xxx_messageInfo_PartSetHeader proto.InternalMessageInfo - -func (m *PartSetHeader) GetTotal() uint32 { - if m != nil { - return m.Total - } - return 0 -} - -func (m *PartSetHeader) GetHash() []byte { - if m != nil { - return m.Hash - } - return nil -} - -type Part struct { - Index uint32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Bytes []byte `protobuf:"bytes,2,opt,name=bytes,proto3" json:"bytes,omitempty"` - Proof crypto.Proof `protobuf:"bytes,3,opt,name=proof,proto3" json:"proof"` -} - -func (m *Part) Reset() { *m = Part{} } -func (m *Part) String() string { return proto.CompactTextString(m) } -func (*Part) ProtoMessage() {} -func (*Part) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{1} -} - -func (m *Part) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Part) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Part.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 *Part) XXX_Merge(src proto.Message) { - xxx_messageInfo_Part.Merge(m, src) -} - -func (m *Part) XXX_Size() int { - return m.Size() -} - -func (m *Part) XXX_DiscardUnknown() { - xxx_messageInfo_Part.DiscardUnknown(m) -} - -var xxx_messageInfo_Part proto.InternalMessageInfo - -func (m *Part) GetIndex() uint32 { - if m != nil { - return m.Index - } - return 0 -} - -func (m *Part) GetBytes() []byte { - if m != nil { - return m.Bytes - } - return nil -} - -func (m *Part) GetProof() crypto.Proof { - if m != nil { - return m.Proof - } - return crypto.Proof{} -} - -// BlockID -type BlockID struct { - Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` - PartSetHeader PartSetHeader `protobuf:"bytes,2,opt,name=part_set_header,json=partSetHeader,proto3" json:"part_set_header"` -} - -func (m *BlockID) Reset() { *m = BlockID{} } -func (m *BlockID) String() string { return proto.CompactTextString(m) } -func (*BlockID) ProtoMessage() {} -func (*BlockID) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{2} -} - -func (m *BlockID) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *BlockID) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BlockID.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 *BlockID) XXX_Merge(src proto.Message) { - xxx_messageInfo_BlockID.Merge(m, src) -} - -func (m *BlockID) XXX_Size() int { - return m.Size() -} - -func (m *BlockID) XXX_DiscardUnknown() { - xxx_messageInfo_BlockID.DiscardUnknown(m) -} - -var xxx_messageInfo_BlockID proto.InternalMessageInfo - -func (m *BlockID) GetHash() []byte { - if m != nil { - return m.Hash - } - return nil -} - -func (m *BlockID) GetPartSetHeader() PartSetHeader { - if m != nil { - return m.PartSetHeader - } - return PartSetHeader{} -} - -// Header defines the structure of a Tendermint block header. -type Header struct { - // basic block info - Version version.Consensus `protobuf:"bytes,1,opt,name=version,proto3" json:"version"` - ChainID string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - Height int64 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` - Time time.Time `protobuf:"bytes,4,opt,name=time,proto3,stdtime" json:"time"` - // prev block info - LastBlockId BlockID `protobuf:"bytes,5,opt,name=last_block_id,json=lastBlockId,proto3" json:"last_block_id"` - // hashes of block data - LastCommitHash []byte `protobuf:"bytes,6,opt,name=last_commit_hash,json=lastCommitHash,proto3" json:"last_commit_hash,omitempty"` - DataHash []byte `protobuf:"bytes,7,opt,name=data_hash,json=dataHash,proto3" json:"data_hash,omitempty"` - // hashes from the app output from the prev block - ValidatorsHash []byte `protobuf:"bytes,8,opt,name=validators_hash,json=validatorsHash,proto3" json:"validators_hash,omitempty"` - NextValidatorsHash []byte `protobuf:"bytes,9,opt,name=next_validators_hash,json=nextValidatorsHash,proto3" json:"next_validators_hash,omitempty"` - ConsensusHash []byte `protobuf:"bytes,10,opt,name=consensus_hash,json=consensusHash,proto3" json:"consensus_hash,omitempty"` - AppHash []byte `protobuf:"bytes,11,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` - LastResultsHash []byte `protobuf:"bytes,12,opt,name=last_results_hash,json=lastResultsHash,proto3" json:"last_results_hash,omitempty"` - // consensus info - EvidenceHash []byte `protobuf:"bytes,13,opt,name=evidence_hash,json=evidenceHash,proto3" json:"evidence_hash,omitempty"` - ProposerAddress []byte `protobuf:"bytes,14,opt,name=proposer_address,json=proposerAddress,proto3" json:"proposer_address,omitempty"` -} - -func (m *Header) Reset() { *m = Header{} } -func (m *Header) String() string { return proto.CompactTextString(m) } -func (*Header) ProtoMessage() {} -func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{3} -} - -func (m *Header) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Header.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 *Header) XXX_Merge(src proto.Message) { - xxx_messageInfo_Header.Merge(m, src) -} - -func (m *Header) XXX_Size() int { - return m.Size() -} - -func (m *Header) XXX_DiscardUnknown() { - xxx_messageInfo_Header.DiscardUnknown(m) -} - -var xxx_messageInfo_Header proto.InternalMessageInfo - -func (m *Header) GetVersion() version.Consensus { - if m != nil { - return m.Version - } - return version.Consensus{} -} - -func (m *Header) GetChainID() string { - if m != nil { - return m.ChainID - } - return "" -} - -func (m *Header) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *Header) GetTime() time.Time { - if m != nil { - return m.Time - } - return time.Time{} -} - -func (m *Header) GetLastBlockId() BlockID { - if m != nil { - return m.LastBlockId - } - return BlockID{} -} - -func (m *Header) GetLastCommitHash() []byte { - if m != nil { - return m.LastCommitHash - } - return nil -} - -func (m *Header) GetDataHash() []byte { - if m != nil { - return m.DataHash - } - return nil -} - -func (m *Header) GetValidatorsHash() []byte { - if m != nil { - return m.ValidatorsHash - } - return nil -} - -func (m *Header) GetNextValidatorsHash() []byte { - if m != nil { - return m.NextValidatorsHash - } - return nil -} - -func (m *Header) GetConsensusHash() []byte { - if m != nil { - return m.ConsensusHash - } - return nil -} - -func (m *Header) GetAppHash() []byte { - if m != nil { - return m.AppHash - } - return nil -} - -func (m *Header) GetLastResultsHash() []byte { - if m != nil { - return m.LastResultsHash - } - return nil -} - -func (m *Header) GetEvidenceHash() []byte { - if m != nil { - return m.EvidenceHash - } - return nil -} - -func (m *Header) GetProposerAddress() []byte { - if m != nil { - return m.ProposerAddress - } - return nil -} - -// Data contains the set of transactions included in the block -type Data struct { - // Txs that will be applied by state @ block.Height+1. - // NOTE: not all txs here are valid. We're just agreeing on the order first. - // This means that block.AppHash does not include these txs. - Txs [][]byte `protobuf:"bytes,1,rep,name=txs,proto3" json:"txs,omitempty"` -} - -func (m *Data) Reset() { *m = Data{} } -func (m *Data) String() string { return proto.CompactTextString(m) } -func (*Data) ProtoMessage() {} -func (*Data) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{4} -} - -func (m *Data) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Data) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Data.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 *Data) XXX_Merge(src proto.Message) { - xxx_messageInfo_Data.Merge(m, src) -} - -func (m *Data) XXX_Size() int { - return m.Size() -} - -func (m *Data) XXX_DiscardUnknown() { - xxx_messageInfo_Data.DiscardUnknown(m) -} - -var xxx_messageInfo_Data proto.InternalMessageInfo - -func (m *Data) GetTxs() [][]byte { - if m != nil { - return m.Txs - } - return nil -} - -// Vote represents a prevote, precommit, or commit vote from validators for -// consensus. -type Vote struct { - Type SignedMsgType `protobuf:"varint,1,opt,name=type,proto3,enum=tendermint.types.SignedMsgType" json:"type,omitempty"` - Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,3,opt,name=round,proto3" json:"round,omitempty"` - BlockID BlockID `protobuf:"bytes,4,opt,name=block_id,json=blockId,proto3" json:"block_id"` - Timestamp time.Time `protobuf:"bytes,5,opt,name=timestamp,proto3,stdtime" json:"timestamp"` - ValidatorAddress []byte `protobuf:"bytes,6,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` - ValidatorIndex int32 `protobuf:"varint,7,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty"` - Signature []byte `protobuf:"bytes,8,opt,name=signature,proto3" json:"signature,omitempty"` -} - -func (m *Vote) Reset() { *m = Vote{} } -func (m *Vote) String() string { return proto.CompactTextString(m) } -func (*Vote) ProtoMessage() {} -func (*Vote) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{5} -} - -func (m *Vote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Vote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Vote.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 *Vote) XXX_Merge(src proto.Message) { - xxx_messageInfo_Vote.Merge(m, src) -} - -func (m *Vote) XXX_Size() int { - return m.Size() -} - -func (m *Vote) XXX_DiscardUnknown() { - xxx_messageInfo_Vote.DiscardUnknown(m) -} - -var xxx_messageInfo_Vote proto.InternalMessageInfo - -func (m *Vote) GetType() SignedMsgType { - if m != nil { - return m.Type - } - return UnknownType -} - -func (m *Vote) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *Vote) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *Vote) GetBlockID() BlockID { - if m != nil { - return m.BlockID - } - return BlockID{} -} - -func (m *Vote) GetTimestamp() time.Time { - if m != nil { - return m.Timestamp - } - return time.Time{} -} - -func (m *Vote) GetValidatorAddress() []byte { - if m != nil { - return m.ValidatorAddress - } - return nil -} - -func (m *Vote) GetValidatorIndex() int32 { - if m != nil { - return m.ValidatorIndex - } - return 0 -} - -func (m *Vote) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -// Commit contains the evidence that a block was committed by a set of validators. -type Commit struct { - Height int64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,2,opt,name=round,proto3" json:"round,omitempty"` - BlockID BlockID `protobuf:"bytes,3,opt,name=block_id,json=blockId,proto3" json:"block_id"` - Signatures []CommitSig `protobuf:"bytes,4,rep,name=signatures,proto3" json:"signatures"` -} - -func (m *Commit) Reset() { *m = Commit{} } -func (m *Commit) String() string { return proto.CompactTextString(m) } -func (*Commit) ProtoMessage() {} -func (*Commit) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{6} -} - -func (m *Commit) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Commit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Commit.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 *Commit) XXX_Merge(src proto.Message) { - xxx_messageInfo_Commit.Merge(m, src) -} - -func (m *Commit) XXX_Size() int { - return m.Size() -} - -func (m *Commit) XXX_DiscardUnknown() { - xxx_messageInfo_Commit.DiscardUnknown(m) -} - -var xxx_messageInfo_Commit proto.InternalMessageInfo - -func (m *Commit) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *Commit) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *Commit) GetBlockID() BlockID { - if m != nil { - return m.BlockID - } - return BlockID{} -} - -func (m *Commit) GetSignatures() []CommitSig { - if m != nil { - return m.Signatures - } - return nil -} - -// CommitSig is a part of the Vote included in a Commit. -type CommitSig struct { - BlockIdFlag BlockIDFlag `protobuf:"varint,1,opt,name=block_id_flag,json=blockIdFlag,proto3,enum=tendermint.types.BlockIDFlag" json:"block_id_flag,omitempty"` - ValidatorAddress []byte `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` - Timestamp time.Time `protobuf:"bytes,3,opt,name=timestamp,proto3,stdtime" json:"timestamp"` - Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` -} - -func (m *CommitSig) Reset() { *m = CommitSig{} } -func (m *CommitSig) String() string { return proto.CompactTextString(m) } -func (*CommitSig) ProtoMessage() {} -func (*CommitSig) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{7} -} - -func (m *CommitSig) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *CommitSig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CommitSig.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 *CommitSig) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommitSig.Merge(m, src) -} - -func (m *CommitSig) XXX_Size() int { - return m.Size() -} - -func (m *CommitSig) XXX_DiscardUnknown() { - xxx_messageInfo_CommitSig.DiscardUnknown(m) -} - -var xxx_messageInfo_CommitSig proto.InternalMessageInfo - -func (m *CommitSig) GetBlockIdFlag() BlockIDFlag { - if m != nil { - return m.BlockIdFlag - } - return BlockIDFlagUnknown -} - -func (m *CommitSig) GetValidatorAddress() []byte { - if m != nil { - return m.ValidatorAddress - } - return nil -} - -func (m *CommitSig) GetTimestamp() time.Time { - if m != nil { - return m.Timestamp - } - return time.Time{} -} - -func (m *CommitSig) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -type Proposal struct { - Type SignedMsgType `protobuf:"varint,1,opt,name=type,proto3,enum=tendermint.types.SignedMsgType" json:"type,omitempty"` - Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` - Round int32 `protobuf:"varint,3,opt,name=round,proto3" json:"round,omitempty"` - PolRound int32 `protobuf:"varint,4,opt,name=pol_round,json=polRound,proto3" json:"pol_round,omitempty"` - BlockID BlockID `protobuf:"bytes,5,opt,name=block_id,json=blockId,proto3" json:"block_id"` - Timestamp time.Time `protobuf:"bytes,6,opt,name=timestamp,proto3,stdtime" json:"timestamp"` - Signature []byte `protobuf:"bytes,7,opt,name=signature,proto3" json:"signature,omitempty"` -} - -func (m *Proposal) Reset() { *m = Proposal{} } -func (m *Proposal) String() string { return proto.CompactTextString(m) } -func (*Proposal) ProtoMessage() {} -func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{8} -} - -func (m *Proposal) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Proposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Proposal.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 *Proposal) XXX_Merge(src proto.Message) { - xxx_messageInfo_Proposal.Merge(m, src) -} - -func (m *Proposal) XXX_Size() int { - return m.Size() -} - -func (m *Proposal) XXX_DiscardUnknown() { - xxx_messageInfo_Proposal.DiscardUnknown(m) -} - -var xxx_messageInfo_Proposal proto.InternalMessageInfo - -func (m *Proposal) GetType() SignedMsgType { - if m != nil { - return m.Type - } - return UnknownType -} - -func (m *Proposal) GetHeight() int64 { - if m != nil { - return m.Height - } - return 0 -} - -func (m *Proposal) GetRound() int32 { - if m != nil { - return m.Round - } - return 0 -} - -func (m *Proposal) GetPolRound() int32 { - if m != nil { - return m.PolRound - } - return 0 -} - -func (m *Proposal) GetBlockID() BlockID { - if m != nil { - return m.BlockID - } - return BlockID{} -} - -func (m *Proposal) GetTimestamp() time.Time { - if m != nil { - return m.Timestamp - } - return time.Time{} -} - -func (m *Proposal) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -type SignedHeader struct { - Header *Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` - Commit *Commit `protobuf:"bytes,2,opt,name=commit,proto3" json:"commit,omitempty"` -} - -func (m *SignedHeader) Reset() { *m = SignedHeader{} } -func (m *SignedHeader) String() string { return proto.CompactTextString(m) } -func (*SignedHeader) ProtoMessage() {} -func (*SignedHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{9} -} - -func (m *SignedHeader) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *SignedHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SignedHeader.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 *SignedHeader) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignedHeader.Merge(m, src) -} - -func (m *SignedHeader) XXX_Size() int { - return m.Size() -} - -func (m *SignedHeader) XXX_DiscardUnknown() { - xxx_messageInfo_SignedHeader.DiscardUnknown(m) -} - -var xxx_messageInfo_SignedHeader proto.InternalMessageInfo - -func (m *SignedHeader) GetHeader() *Header { - if m != nil { - return m.Header - } - return nil -} - -func (m *SignedHeader) GetCommit() *Commit { - if m != nil { - return m.Commit - } - return nil -} - -type LightBlock struct { - SignedHeader *SignedHeader `protobuf:"bytes,1,opt,name=signed_header,json=signedHeader,proto3" json:"signed_header,omitempty"` - ValidatorSet *ValidatorSet `protobuf:"bytes,2,opt,name=validator_set,json=validatorSet,proto3" json:"validator_set,omitempty"` -} - -func (m *LightBlock) Reset() { *m = LightBlock{} } -func (m *LightBlock) String() string { return proto.CompactTextString(m) } -func (*LightBlock) ProtoMessage() {} -func (*LightBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{10} -} - -func (m *LightBlock) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *LightBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_LightBlock.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 *LightBlock) XXX_Merge(src proto.Message) { - xxx_messageInfo_LightBlock.Merge(m, src) -} - -func (m *LightBlock) XXX_Size() int { - return m.Size() -} - -func (m *LightBlock) XXX_DiscardUnknown() { - xxx_messageInfo_LightBlock.DiscardUnknown(m) -} - -var xxx_messageInfo_LightBlock proto.InternalMessageInfo - -func (m *LightBlock) GetSignedHeader() *SignedHeader { - if m != nil { - return m.SignedHeader - } - return nil -} - -func (m *LightBlock) GetValidatorSet() *ValidatorSet { - if m != nil { - return m.ValidatorSet - } - return nil -} - -type BlockMeta struct { - BlockID BlockID `protobuf:"bytes,1,opt,name=block_id,json=blockId,proto3" json:"block_id"` - BlockSize int64 `protobuf:"varint,2,opt,name=block_size,json=blockSize,proto3" json:"block_size,omitempty"` - Header Header `protobuf:"bytes,3,opt,name=header,proto3" json:"header"` - NumTxs int64 `protobuf:"varint,4,opt,name=num_txs,json=numTxs,proto3" json:"num_txs,omitempty"` -} - -func (m *BlockMeta) Reset() { *m = BlockMeta{} } -func (m *BlockMeta) String() string { return proto.CompactTextString(m) } -func (*BlockMeta) ProtoMessage() {} -func (*BlockMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{11} -} - -func (m *BlockMeta) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *BlockMeta) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BlockMeta.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 *BlockMeta) XXX_Merge(src proto.Message) { - xxx_messageInfo_BlockMeta.Merge(m, src) -} - -func (m *BlockMeta) XXX_Size() int { - return m.Size() -} - -func (m *BlockMeta) XXX_DiscardUnknown() { - xxx_messageInfo_BlockMeta.DiscardUnknown(m) -} - -var xxx_messageInfo_BlockMeta proto.InternalMessageInfo - -func (m *BlockMeta) GetBlockID() BlockID { - if m != nil { - return m.BlockID - } - return BlockID{} -} - -func (m *BlockMeta) GetBlockSize() int64 { - if m != nil { - return m.BlockSize - } - return 0 -} - -func (m *BlockMeta) GetHeader() Header { - if m != nil { - return m.Header - } - return Header{} -} - -func (m *BlockMeta) GetNumTxs() int64 { - if m != nil { - return m.NumTxs - } - return 0 -} - -// TxProof represents a Merkle proof of the presence of a transaction in the Merkle tree. -type TxProof struct { - RootHash []byte `protobuf:"bytes,1,opt,name=root_hash,json=rootHash,proto3" json:"root_hash,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - Proof *crypto.Proof `protobuf:"bytes,3,opt,name=proof,proto3" json:"proof,omitempty"` -} - -func (m *TxProof) Reset() { *m = TxProof{} } -func (m *TxProof) String() string { return proto.CompactTextString(m) } -func (*TxProof) ProtoMessage() {} -func (*TxProof) Descriptor() ([]byte, []int) { - return fileDescriptor_d3a6e55e2345de56, []int{12} -} - -func (m *TxProof) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *TxProof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TxProof.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 *TxProof) XXX_Merge(src proto.Message) { - xxx_messageInfo_TxProof.Merge(m, src) -} - -func (m *TxProof) XXX_Size() int { - return m.Size() -} - -func (m *TxProof) XXX_DiscardUnknown() { - xxx_messageInfo_TxProof.DiscardUnknown(m) -} - -var xxx_messageInfo_TxProof proto.InternalMessageInfo - -func (m *TxProof) GetRootHash() []byte { - if m != nil { - return m.RootHash - } - return nil -} - -func (m *TxProof) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -func (m *TxProof) GetProof() *crypto.Proof { - if m != nil { - return m.Proof - } - return nil -} - -func init() { - proto.RegisterEnum("tendermint.types.BlockIDFlag", BlockIDFlag_name, BlockIDFlag_value) - proto.RegisterEnum("tendermint.types.SignedMsgType", SignedMsgType_name, SignedMsgType_value) - proto.RegisterType((*PartSetHeader)(nil), "tendermint.types.PartSetHeader") - proto.RegisterType((*Part)(nil), "tendermint.types.Part") - proto.RegisterType((*BlockID)(nil), "tendermint.types.BlockID") - proto.RegisterType((*Header)(nil), "tendermint.types.Header") - proto.RegisterType((*Data)(nil), "tendermint.types.Data") - proto.RegisterType((*Vote)(nil), "tendermint.types.Vote") - proto.RegisterType((*Commit)(nil), "tendermint.types.Commit") - proto.RegisterType((*CommitSig)(nil), "tendermint.types.CommitSig") - proto.RegisterType((*Proposal)(nil), "tendermint.types.Proposal") - proto.RegisterType((*SignedHeader)(nil), "tendermint.types.SignedHeader") - proto.RegisterType((*LightBlock)(nil), "tendermint.types.LightBlock") - proto.RegisterType((*BlockMeta)(nil), "tendermint.types.BlockMeta") - proto.RegisterType((*TxProof)(nil), "tendermint.types.TxProof") -} - -func init() { proto.RegisterFile("tendermint/types/types.proto", fileDescriptor_d3a6e55e2345de56) } - -var fileDescriptor_d3a6e55e2345de56 = []byte{ - // 1314 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xcf, 0xda, 0x9b, 0xd8, 0x7e, 0xb6, 0x13, 0x67, 0x95, 0xb6, 0xae, 0xdb, 0x38, 0x2b, 0x23, - 0x20, 0x2d, 0x68, 0x53, 0x52, 0xc4, 0x9f, 0x03, 0x07, 0xdb, 0x49, 0x5b, 0xab, 0x89, 0x63, 0xd6, - 0x6e, 0x11, 0x5c, 0x56, 0x6b, 0xef, 0xd4, 0x5e, 0xba, 0xde, 0x59, 0xed, 0x8c, 0x43, 0xd2, 0x4f, - 0x80, 0x72, 0xea, 0x89, 0x5b, 0x4e, 0x70, 0xe0, 0xce, 0x17, 0x40, 0x9c, 0x7a, 0xec, 0x0d, 0x2e, - 0x14, 0x94, 0x4a, 0x88, 0x8f, 0x81, 0xe6, 0x8f, 0xd7, 0xeb, 0x38, 0x86, 0xaa, 0xaa, 0xb8, 0x58, - 0x3b, 0xef, 0xfd, 0xde, 0xcc, 0x7b, 0xbf, 0xf7, 0x9b, 0x3f, 0x86, 0xeb, 0x14, 0xf9, 0x0e, 0x0a, - 0x87, 0xae, 0x4f, 0xb7, 0xe8, 0x71, 0x80, 0x88, 0xf8, 0x35, 0x82, 0x10, 0x53, 0xac, 0x15, 0x26, - 0x5e, 0x83, 0xdb, 0x4b, 0x6b, 0x7d, 0xdc, 0xc7, 0xdc, 0xb9, 0xc5, 0xbe, 0x04, 0xae, 0xb4, 0xd1, - 0xc7, 0xb8, 0xef, 0xa1, 0x2d, 0x3e, 0xea, 0x8e, 0x1e, 0x6d, 0x51, 0x77, 0x88, 0x08, 0xb5, 0x87, - 0x81, 0x04, 0xac, 0xc7, 0x96, 0xe9, 0x85, 0xc7, 0x01, 0xc5, 0x0c, 0x8b, 0x1f, 0x49, 0x77, 0x39, - 0xe6, 0x3e, 0x44, 0x21, 0x71, 0xb1, 0x1f, 0xcf, 0xa3, 0xa4, 0xcf, 0x64, 0x79, 0x68, 0x7b, 0xae, - 0x63, 0x53, 0x1c, 0x0a, 0x44, 0xe5, 0x53, 0xc8, 0xb7, 0xec, 0x90, 0xb6, 0x11, 0xbd, 0x87, 0x6c, - 0x07, 0x85, 0xda, 0x1a, 0x2c, 0x52, 0x4c, 0x6d, 0xaf, 0xa8, 0xe8, 0xca, 0x66, 0xde, 0x14, 0x03, - 0x4d, 0x03, 0x75, 0x60, 0x93, 0x41, 0x31, 0xa1, 0x2b, 0x9b, 0x39, 0x93, 0x7f, 0x57, 0x06, 0xa0, - 0xb2, 0x50, 0x16, 0xe1, 0xfa, 0x0e, 0x3a, 0x1a, 0x47, 0xf0, 0x01, 0xb3, 0x76, 0x8f, 0x29, 0x22, - 0x32, 0x44, 0x0c, 0xb4, 0x0f, 0x61, 0x91, 0xe7, 0x5f, 0x4c, 0xea, 0xca, 0x66, 0x76, 0xbb, 0x68, - 0xc4, 0x88, 0x12, 0xf5, 0x19, 0x2d, 0xe6, 0xaf, 0xa9, 0xcf, 0x5e, 0x6c, 0x2c, 0x98, 0x02, 0x5c, - 0xf1, 0x20, 0x55, 0xf3, 0x70, 0xef, 0x71, 0x63, 0x27, 0x4a, 0x44, 0x99, 0x24, 0xa2, 0xed, 0xc3, - 0x4a, 0x60, 0x87, 0xd4, 0x22, 0x88, 0x5a, 0x03, 0x5e, 0x05, 0x5f, 0x34, 0xbb, 0xbd, 0x61, 0x9c, - 0xef, 0x83, 0x31, 0x55, 0xac, 0x5c, 0x25, 0x1f, 0xc4, 0x8d, 0x95, 0xbf, 0x54, 0x58, 0x92, 0x64, - 0x7c, 0x06, 0x29, 0x49, 0x2b, 0x5f, 0x30, 0xbb, 0xbd, 0x1e, 0x9f, 0x51, 0xba, 0x8c, 0x3a, 0xf6, - 0x09, 0xf2, 0xc9, 0x88, 0xc8, 0xf9, 0xc6, 0x31, 0xda, 0x3b, 0x90, 0xee, 0x0d, 0x6c, 0xd7, 0xb7, - 0x5c, 0x87, 0x67, 0x94, 0xa9, 0x65, 0xcf, 0x5e, 0x6c, 0xa4, 0xea, 0xcc, 0xd6, 0xd8, 0x31, 0x53, - 0xdc, 0xd9, 0x70, 0xb4, 0xcb, 0xb0, 0x34, 0x40, 0x6e, 0x7f, 0x40, 0x39, 0x2d, 0x49, 0x53, 0x8e, - 0xb4, 0x4f, 0x40, 0x65, 0x82, 0x28, 0xaa, 0x7c, 0xed, 0x92, 0x21, 0xd4, 0x62, 0x8c, 0xd5, 0x62, - 0x74, 0xc6, 0x6a, 0xa9, 0xa5, 0xd9, 0xc2, 0x4f, 0xff, 0xd8, 0x50, 0x4c, 0x1e, 0xa1, 0xd5, 0x21, - 0xef, 0xd9, 0x84, 0x5a, 0x5d, 0x46, 0x1b, 0x5b, 0x7e, 0x91, 0x4f, 0x71, 0x75, 0x96, 0x10, 0x49, - 0xac, 0x4c, 0x3d, 0xcb, 0xa2, 0x84, 0xc9, 0xd1, 0x36, 0xa1, 0xc0, 0x27, 0xe9, 0xe1, 0xe1, 0xd0, - 0xa5, 0x16, 0xe7, 0x7d, 0x89, 0xf3, 0xbe, 0xcc, 0xec, 0x75, 0x6e, 0xbe, 0xc7, 0x3a, 0x70, 0x0d, - 0x32, 0x8e, 0x4d, 0x6d, 0x01, 0x49, 0x71, 0x48, 0x9a, 0x19, 0xb8, 0xf3, 0x5d, 0x58, 0x89, 0x54, - 0x47, 0x04, 0x24, 0x2d, 0x66, 0x99, 0x98, 0x39, 0xf0, 0x16, 0xac, 0xf9, 0xe8, 0x88, 0x5a, 0xe7, - 0xd1, 0x19, 0x8e, 0xd6, 0x98, 0xef, 0xe1, 0x74, 0xc4, 0xdb, 0xb0, 0xdc, 0x1b, 0x93, 0x2f, 0xb0, - 0xc0, 0xb1, 0xf9, 0xc8, 0xca, 0x61, 0x57, 0x21, 0x6d, 0x07, 0x81, 0x00, 0x64, 0x39, 0x20, 0x65, - 0x07, 0x01, 0x77, 0xdd, 0x84, 0x55, 0x5e, 0x63, 0x88, 0xc8, 0xc8, 0xa3, 0x72, 0x92, 0x1c, 0xc7, - 0xac, 0x30, 0x87, 0x29, 0xec, 0x1c, 0xfb, 0x16, 0xe4, 0xd1, 0xa1, 0xeb, 0x20, 0xbf, 0x87, 0x04, - 0x2e, 0xcf, 0x71, 0xb9, 0xb1, 0x91, 0x83, 0x6e, 0x40, 0x21, 0x08, 0x71, 0x80, 0x09, 0x0a, 0x2d, - 0xdb, 0x71, 0x42, 0x44, 0x48, 0x71, 0x59, 0xcc, 0x37, 0xb6, 0x57, 0x85, 0xb9, 0x52, 0x04, 0x75, - 0xc7, 0xa6, 0xb6, 0x56, 0x80, 0x24, 0x3d, 0x22, 0x45, 0x45, 0x4f, 0x6e, 0xe6, 0x4c, 0xf6, 0x59, - 0xf9, 0x3b, 0x01, 0xea, 0x43, 0x4c, 0x91, 0x76, 0x1b, 0x54, 0xd6, 0x26, 0xae, 0xbe, 0xe5, 0x8b, - 0xf4, 0xdc, 0x76, 0xfb, 0x3e, 0x72, 0xf6, 0x49, 0xbf, 0x73, 0x1c, 0x20, 0x93, 0x83, 0x63, 0x72, - 0x4a, 0x4c, 0xc9, 0x69, 0x0d, 0x16, 0x43, 0x3c, 0xf2, 0x1d, 0xae, 0xb2, 0x45, 0x53, 0x0c, 0xb4, - 0x5d, 0x48, 0x47, 0x2a, 0x51, 0xff, 0x4b, 0x25, 0x2b, 0x4c, 0x25, 0x4c, 0xc3, 0xd2, 0x60, 0xa6, - 0xba, 0x52, 0x2c, 0x35, 0xc8, 0x44, 0x87, 0x97, 0x54, 0xdb, 0xab, 0x09, 0x76, 0x12, 0xa6, 0xbd, - 0x07, 0xab, 0x51, 0xef, 0x23, 0xf2, 0x84, 0xe2, 0x0a, 0x91, 0x43, 0xb2, 0x37, 0x25, 0x2b, 0x4b, - 0x1c, 0x40, 0x29, 0x5e, 0xd7, 0x44, 0x56, 0x0d, 0x7e, 0x12, 0x5d, 0x87, 0x0c, 0x71, 0xfb, 0xbe, - 0x4d, 0x47, 0x21, 0x92, 0xca, 0x9b, 0x18, 0x2a, 0x3f, 0x2b, 0xb0, 0x24, 0x94, 0x1c, 0xe3, 0x4d, - 0xb9, 0x98, 0xb7, 0xc4, 0x3c, 0xde, 0x92, 0xaf, 0xcf, 0x5b, 0x15, 0x20, 0x4a, 0x86, 0x14, 0x55, - 0x3d, 0xb9, 0x99, 0xdd, 0xbe, 0x36, 0x3b, 0x91, 0x48, 0xb1, 0xed, 0xf6, 0xe5, 0x46, 0x8d, 0x05, - 0x55, 0x7e, 0x57, 0x20, 0x13, 0xf9, 0xb5, 0x2a, 0xe4, 0xc7, 0x79, 0x59, 0x8f, 0x3c, 0xbb, 0x2f, - 0xb5, 0xb3, 0x3e, 0x37, 0xb9, 0x3b, 0x9e, 0xdd, 0x37, 0xb3, 0x32, 0x1f, 0x36, 0xb8, 0xb8, 0x0f, - 0x89, 0x39, 0x7d, 0x98, 0x6a, 0x7c, 0xf2, 0xf5, 0x1a, 0x3f, 0xd5, 0x22, 0xf5, 0x7c, 0x8b, 0x7e, - 0x4a, 0x40, 0xba, 0xc5, 0xf7, 0x8e, 0xed, 0xfd, 0x1f, 0x3b, 0xe2, 0x1a, 0x64, 0x02, 0xec, 0x59, - 0xc2, 0xa3, 0x72, 0x4f, 0x3a, 0xc0, 0x9e, 0x39, 0xd3, 0xf6, 0xc5, 0x37, 0xb4, 0x5d, 0x96, 0xde, - 0x00, 0x6b, 0xa9, 0xf3, 0xac, 0x85, 0x90, 0x13, 0x54, 0xc8, 0xbb, 0xec, 0x16, 0xe3, 0x80, 0x5f, - 0x8e, 0xca, 0xec, 0xdd, 0x2b, 0xd2, 0x16, 0x48, 0x53, 0xe2, 0x58, 0x84, 0x38, 0xfa, 0xe5, 0x75, - 0x5a, 0x9c, 0x27, 0x4b, 0x53, 0xe2, 0x2a, 0xdf, 0x29, 0x00, 0x7b, 0x8c, 0x59, 0x5e, 0x2f, 0xbb, - 0x85, 0x08, 0x4f, 0xc1, 0x9a, 0x5a, 0xb9, 0x3c, 0xaf, 0x69, 0x72, 0xfd, 0x1c, 0x89, 0xe7, 0x5d, - 0x87, 0xfc, 0x44, 0x8c, 0x04, 0x8d, 0x93, 0xb9, 0x60, 0x92, 0xe8, 0x72, 0x68, 0x23, 0x6a, 0xe6, - 0x0e, 0x63, 0xa3, 0xca, 0x2f, 0x0a, 0x64, 0x78, 0x4e, 0xfb, 0x88, 0xda, 0x53, 0x3d, 0x54, 0x5e, - 0xbf, 0x87, 0xeb, 0x00, 0x62, 0x1a, 0xe2, 0x3e, 0x41, 0x52, 0x59, 0x19, 0x6e, 0x69, 0xbb, 0x4f, - 0x90, 0xf6, 0x51, 0x44, 0x78, 0xf2, 0xdf, 0x09, 0x97, 0x5b, 0x7a, 0x4c, 0xfb, 0x15, 0x48, 0xf9, - 0xa3, 0xa1, 0xc5, 0xae, 0x04, 0x55, 0xa8, 0xd5, 0x1f, 0x0d, 0x3b, 0x47, 0xa4, 0xf2, 0x35, 0xa4, - 0x3a, 0x47, 0xfc, 0x79, 0xc4, 0x24, 0x1a, 0x62, 0x2c, 0xef, 0x64, 0xf1, 0x16, 0x4a, 0x33, 0x03, - 0xbf, 0x82, 0x34, 0x50, 0xd9, 0xe5, 0x3b, 0x7e, 0xac, 0xb1, 0x6f, 0xcd, 0x78, 0xc5, 0x87, 0x97, - 0x7c, 0x72, 0xdd, 0xfc, 0x55, 0x81, 0x6c, 0xec, 0x7c, 0xd0, 0x3e, 0x80, 0x4b, 0xb5, 0xbd, 0x83, - 0xfa, 0x7d, 0xab, 0xb1, 0x63, 0xdd, 0xd9, 0xab, 0xde, 0xb5, 0x1e, 0x34, 0xef, 0x37, 0x0f, 0xbe, - 0x68, 0x16, 0x16, 0x4a, 0x97, 0x4f, 0x4e, 0x75, 0x2d, 0x86, 0x7d, 0xe0, 0x3f, 0xf6, 0xf1, 0x37, - 0xbe, 0xb6, 0x05, 0x6b, 0xd3, 0x21, 0xd5, 0x5a, 0x7b, 0xb7, 0xd9, 0x29, 0x28, 0xa5, 0x4b, 0x27, - 0xa7, 0xfa, 0x6a, 0x2c, 0xa2, 0xda, 0x25, 0xc8, 0xa7, 0xb3, 0x01, 0xf5, 0x83, 0xfd, 0xfd, 0x46, - 0xa7, 0x90, 0x98, 0x09, 0x90, 0x07, 0xf6, 0x0d, 0x58, 0x9d, 0x0e, 0x68, 0x36, 0xf6, 0x0a, 0xc9, - 0x92, 0x76, 0x72, 0xaa, 0x2f, 0xc7, 0xd0, 0x4d, 0xd7, 0x2b, 0xa5, 0xbf, 0xfd, 0xbe, 0xbc, 0xf0, - 0xe3, 0x0f, 0x65, 0x85, 0x55, 0x96, 0x9f, 0x3a, 0x23, 0xb4, 0xf7, 0xe1, 0x4a, 0xbb, 0x71, 0xb7, - 0xb9, 0xbb, 0x63, 0xed, 0xb7, 0xef, 0x5a, 0x9d, 0x2f, 0x5b, 0xbb, 0xb1, 0xea, 0x56, 0x4e, 0x4e, - 0xf5, 0xac, 0x2c, 0x69, 0x1e, 0xba, 0x65, 0xee, 0x3e, 0x3c, 0xe8, 0xec, 0x16, 0x14, 0x81, 0x6e, - 0x85, 0xe8, 0x10, 0x53, 0xc4, 0xd1, 0xb7, 0xe0, 0xea, 0x05, 0xe8, 0xa8, 0xb0, 0xd5, 0x93, 0x53, - 0x3d, 0xdf, 0x0a, 0x91, 0xd8, 0x3f, 0x3c, 0xc2, 0x80, 0xe2, 0x6c, 0xc4, 0x41, 0xeb, 0xa0, 0x5d, - 0xdd, 0x2b, 0xe8, 0xa5, 0xc2, 0xc9, 0xa9, 0x9e, 0x1b, 0x1f, 0x86, 0x0c, 0x3f, 0xa9, 0xac, 0xf6, - 0xf9, 0xb3, 0xb3, 0xb2, 0xf2, 0xfc, 0xac, 0xac, 0xfc, 0x79, 0x56, 0x56, 0x9e, 0xbe, 0x2c, 0x2f, - 0x3c, 0x7f, 0x59, 0x5e, 0xf8, 0xed, 0x65, 0x79, 0xe1, 0xab, 0x8f, 0xfb, 0x2e, 0x1d, 0x8c, 0xba, - 0x46, 0x0f, 0x0f, 0xb7, 0xe2, 0x7f, 0x09, 0x26, 0x9f, 0xe2, 0xaf, 0xc9, 0xf9, 0xbf, 0x0b, 0xdd, - 0x25, 0x6e, 0xbf, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x78, 0x43, 0xdf, 0xef, 0x0c, - 0x00, 0x00, -} - -func (m *PartSetHeader) 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 *PartSetHeader) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PartSetHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0x12 - } - if m.Total != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Total)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Part) 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 *Part) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Part) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Proof.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if len(m.Bytes) > 0 { - i -= len(m.Bytes) - copy(dAtA[i:], m.Bytes) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Bytes))) - i-- - dAtA[i] = 0x12 - } - if m.Index != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *BlockID) 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 *BlockID) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BlockID) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.PartSetHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Header) 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 *Header) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ProposerAddress) > 0 { - i -= len(m.ProposerAddress) - copy(dAtA[i:], m.ProposerAddress) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ProposerAddress))) - i-- - dAtA[i] = 0x72 - } - if len(m.EvidenceHash) > 0 { - i -= len(m.EvidenceHash) - copy(dAtA[i:], m.EvidenceHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.EvidenceHash))) - i-- - dAtA[i] = 0x6a - } - if len(m.LastResultsHash) > 0 { - i -= len(m.LastResultsHash) - copy(dAtA[i:], m.LastResultsHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.LastResultsHash))) - i-- - dAtA[i] = 0x62 - } - if len(m.AppHash) > 0 { - i -= len(m.AppHash) - copy(dAtA[i:], m.AppHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.AppHash))) - i-- - dAtA[i] = 0x5a - } - if len(m.ConsensusHash) > 0 { - i -= len(m.ConsensusHash) - copy(dAtA[i:], m.ConsensusHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ConsensusHash))) - i-- - dAtA[i] = 0x52 - } - if len(m.NextValidatorsHash) > 0 { - i -= len(m.NextValidatorsHash) - copy(dAtA[i:], m.NextValidatorsHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.NextValidatorsHash))) - i-- - dAtA[i] = 0x4a - } - if len(m.ValidatorsHash) > 0 { - i -= len(m.ValidatorsHash) - copy(dAtA[i:], m.ValidatorsHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ValidatorsHash))) - i-- - dAtA[i] = 0x42 - } - if len(m.DataHash) > 0 { - i -= len(m.DataHash) - copy(dAtA[i:], m.DataHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.DataHash))) - i-- - dAtA[i] = 0x3a - } - if len(m.LastCommitHash) > 0 { - i -= len(m.LastCommitHash) - copy(dAtA[i:], m.LastCommitHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.LastCommitHash))) - i-- - dAtA[i] = 0x32 - } - { - size, err := m.LastBlockId.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - n4, err4 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err4 != nil { - return 0, err4 - } - i -= n4 - i = encodeVarintTypes(dAtA, i, uint64(n4)) - i-- - dAtA[i] = 0x22 - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x18 - } - if len(m.ChainID) > 0 { - i -= len(m.ChainID) - copy(dAtA[i:], m.ChainID) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ChainID))) - i-- - dAtA[i] = 0x12 - } - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Data) 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 *Data) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Data) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Txs) > 0 { - for iNdEx := len(m.Txs) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Txs[iNdEx]) - copy(dAtA[i:], m.Txs[iNdEx]) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Txs[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *Vote) 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 *Vote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signature) > 0 { - i -= len(m.Signature) - copy(dAtA[i:], m.Signature) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) - i-- - dAtA[i] = 0x42 - } - if m.ValidatorIndex != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.ValidatorIndex)) - i-- - dAtA[i] = 0x38 - } - if len(m.ValidatorAddress) > 0 { - i -= len(m.ValidatorAddress) - copy(dAtA[i:], m.ValidatorAddress) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ValidatorAddress))) - i-- - dAtA[i] = 0x32 - } - n6, err6 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err6 != nil { - return 0, err6 - } - i -= n6 - i = encodeVarintTypes(dAtA, i, uint64(n6)) - i-- - dAtA[i] = 0x2a - { - size, err := m.BlockID.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - if m.Round != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x18 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x10 - } - if m.Type != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Commit) 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 *Commit) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Commit) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signatures) > 0 { - for iNdEx := len(m.Signatures) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Signatures[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - { - size, err := m.BlockID.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if m.Round != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x10 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *CommitSig) 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 *CommitSig) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommitSig) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signature) > 0 { - i -= len(m.Signature) - copy(dAtA[i:], m.Signature) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) - i-- - dAtA[i] = 0x22 - } - n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err9 != nil { - return 0, err9 - } - i -= n9 - i = encodeVarintTypes(dAtA, i, uint64(n9)) - i-- - dAtA[i] = 0x1a - if len(m.ValidatorAddress) > 0 { - i -= len(m.ValidatorAddress) - copy(dAtA[i:], m.ValidatorAddress) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ValidatorAddress))) - i-- - dAtA[i] = 0x12 - } - if m.BlockIdFlag != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.BlockIdFlag)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Proposal) 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 *Proposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Proposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signature) > 0 { - i -= len(m.Signature) - copy(dAtA[i:], m.Signature) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) - i-- - dAtA[i] = 0x3a - } - n10, err10 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err10 != nil { - return 0, err10 - } - i -= n10 - i = encodeVarintTypes(dAtA, i, uint64(n10)) - i-- - dAtA[i] = 0x32 - { - size, err := m.BlockID.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - if m.PolRound != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.PolRound)) - i-- - dAtA[i] = 0x20 - } - if m.Round != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Round)) - i-- - dAtA[i] = 0x18 - } - if m.Height != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Height)) - i-- - dAtA[i] = 0x10 - } - if m.Type != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SignedHeader) 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 *SignedHeader) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SignedHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Commit != nil { - { - size, err := m.Commit.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.Header != nil { - { - size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *LightBlock) 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 *LightBlock) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *LightBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.ValidatorSet != nil { - { - size, err := m.ValidatorSet.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.SignedHeader != nil { - { - size, err := m.SignedHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *BlockMeta) 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 *BlockMeta) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BlockMeta) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.NumTxs != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.NumTxs)) - i-- - dAtA[i] = 0x20 - } - { - size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if m.BlockSize != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.BlockSize)) - i-- - dAtA[i] = 0x10 - } - { - size, err := m.BlockID.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *TxProof) 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 *TxProof) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TxProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Proof != nil { - { - size, err := m.Proof.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x12 - } - if len(m.RootHash) > 0 { - i -= len(m.RootHash) - copy(dAtA[i:], m.RootHash) - i = encodeVarintTypes(dAtA, i, uint64(len(m.RootHash))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *PartSetHeader) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Total != 0 { - n += 1 + sovTypes(uint64(m.Total)) - } - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Part) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovTypes(uint64(m.Index)) - } - l = len(m.Bytes) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = m.Proof.Size() - n += 1 + l + sovTypes(uint64(l)) - return n -} - -func (m *BlockID) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = m.PartSetHeader.Size() - n += 1 + l + sovTypes(uint64(l)) - return n -} - -func (m *Header) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Version.Size() - n += 1 + l + sovTypes(uint64(l)) - l = len(m.ChainID) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) - n += 1 + l + sovTypes(uint64(l)) - l = m.LastBlockId.Size() - n += 1 + l + sovTypes(uint64(l)) - l = len(m.LastCommitHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.DataHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.ValidatorsHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.NextValidatorsHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.ConsensusHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.AppHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.LastResultsHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.EvidenceHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.ProposerAddress) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Data) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Txs) > 0 { - for _, b := range m.Txs { - l = len(b) - n += 1 + l + sovTypes(uint64(l)) - } - } - return n -} - -func (m *Vote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovTypes(uint64(m.Type)) - } - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovTypes(uint64(m.Round)) - } - l = m.BlockID.Size() - n += 1 + l + sovTypes(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp) - n += 1 + l + sovTypes(uint64(l)) - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.ValidatorIndex != 0 { - n += 1 + sovTypes(uint64(m.ValidatorIndex)) - } - l = len(m.Signature) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Commit) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovTypes(uint64(m.Round)) - } - l = m.BlockID.Size() - n += 1 + l + sovTypes(uint64(l)) - if len(m.Signatures) > 0 { - for _, e := range m.Signatures { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } - } - return n -} - -func (m *CommitSig) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.BlockIdFlag != 0 { - n += 1 + sovTypes(uint64(m.BlockIdFlag)) - } - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp) - n += 1 + l + sovTypes(uint64(l)) - l = len(m.Signature) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Proposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovTypes(uint64(m.Type)) - } - if m.Height != 0 { - n += 1 + sovTypes(uint64(m.Height)) - } - if m.Round != 0 { - n += 1 + sovTypes(uint64(m.Round)) - } - if m.PolRound != 0 { - n += 1 + sovTypes(uint64(m.PolRound)) - } - l = m.BlockID.Size() - n += 1 + l + sovTypes(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp) - n += 1 + l + sovTypes(uint64(l)) - l = len(m.Signature) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *SignedHeader) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Header != nil { - l = m.Header.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.Commit != nil { - l = m.Commit.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *LightBlock) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.SignedHeader != nil { - l = m.SignedHeader.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.ValidatorSet != nil { - l = m.ValidatorSet.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *BlockMeta) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.BlockID.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.BlockSize != 0 { - n += 1 + sovTypes(uint64(m.BlockSize)) - } - l = m.Header.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.NumTxs != 0 { - n += 1 + sovTypes(uint64(m.NumTxs)) - } - return n -} - -func (m *TxProof) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.RootHash) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.Proof != nil { - l = m.Proof.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *PartSetHeader) 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 ErrIntOverflowTypes - } - 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: PartSetHeader: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PartSetHeader: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Total", wireType) - } - m.Total = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Total |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) - if m.Hash == nil { - m.Hash = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Part) 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 ErrIntOverflowTypes - } - 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: Part: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Part: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Bytes", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Bytes = append(m.Bytes[:0], dAtA[iNdEx:postIndex]...) - if m.Bytes == nil { - m.Bytes = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Proof.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *BlockID) 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 ErrIntOverflowTypes - } - 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: BlockID: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BlockID: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) - if m.Hash == nil { - m.Hash = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PartSetHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PartSetHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Header) 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 ErrIntOverflowTypes - } - 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: Header: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Header: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainID", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastBlockId", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.LastBlockId.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastCommitHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.LastCommitHash = append(m.LastCommitHash[:0], dAtA[iNdEx:postIndex]...) - if m.LastCommitHash == nil { - m.LastCommitHash = []byte{} - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DataHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DataHash = append(m.DataHash[:0], dAtA[iNdEx:postIndex]...) - if m.DataHash == nil { - m.DataHash = []byte{} - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorsHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorsHash = append(m.ValidatorsHash[:0], dAtA[iNdEx:postIndex]...) - if m.ValidatorsHash == nil { - m.ValidatorsHash = []byte{} - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NextValidatorsHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NextValidatorsHash = append(m.NextValidatorsHash[:0], dAtA[iNdEx:postIndex]...) - if m.NextValidatorsHash == nil { - m.NextValidatorsHash = []byte{} - } - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConsensusHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ConsensusHash = append(m.ConsensusHash[:0], dAtA[iNdEx:postIndex]...) - if m.ConsensusHash == nil { - m.ConsensusHash = []byte{} - } - iNdEx = postIndex - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AppHash = append(m.AppHash[:0], dAtA[iNdEx:postIndex]...) - if m.AppHash == nil { - m.AppHash = []byte{} - } - iNdEx = postIndex - case 12: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastResultsHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.LastResultsHash = append(m.LastResultsHash[:0], dAtA[iNdEx:postIndex]...) - if m.LastResultsHash == nil { - m.LastResultsHash = []byte{} - } - iNdEx = postIndex - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EvidenceHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EvidenceHash = append(m.EvidenceHash[:0], dAtA[iNdEx:postIndex]...) - if m.EvidenceHash == nil { - m.EvidenceHash = []byte{} - } - iNdEx = postIndex - case 14: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProposerAddress", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProposerAddress = append(m.ProposerAddress[:0], dAtA[iNdEx:postIndex]...) - if m.ProposerAddress == nil { - m.ProposerAddress = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Data) 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 ErrIntOverflowTypes - } - 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: Data: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Data: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Txs", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Txs = append(m.Txs, make([]byte, postIndex-iNdEx)) - copy(m.Txs[len(m.Txs)-1], dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Vote) 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 ErrIntOverflowTypes - } - 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: Vote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Vote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= SignedMsgType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockID", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BlockID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddress = append(m.ValidatorAddress[:0], dAtA[iNdEx:postIndex]...) - if m.ValidatorAddress == nil { - m.ValidatorAddress = []byte{} - } - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorIndex", wireType) - } - m.ValidatorIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ValidatorIndex |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) - if m.Signature == nil { - m.Signature = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Commit) 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 ErrIntOverflowTypes - } - 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: Commit: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Commit: 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockID", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BlockID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signatures", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signatures = append(m.Signatures, CommitSig{}) - if err := m.Signatures[len(m.Signatures)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *CommitSig) 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 ErrIntOverflowTypes - } - 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: CommitSig: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CommitSig: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockIdFlag", wireType) - } - m.BlockIdFlag = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.BlockIdFlag |= BlockIDFlag(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddress = append(m.ValidatorAddress[:0], dAtA[iNdEx:postIndex]...) - if m.ValidatorAddress == nil { - m.ValidatorAddress = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) - if m.Signature == nil { - m.Signature = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Proposal) 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 ErrIntOverflowTypes - } - 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: Proposal: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Proposal: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= SignedMsgType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - 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 ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Height |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Round", wireType) - } - m.Round = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Round |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PolRound", wireType) - } - m.PolRound = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PolRound |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockID", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BlockID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) - if m.Signature == nil { - m.Signature = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *SignedHeader) 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 ErrIntOverflowTypes - } - 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: SignedHeader: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SignedHeader: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Header == nil { - m.Header = &Header{} - } - if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Commit == nil { - m.Commit = &Commit{} - } - if err := m.Commit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *LightBlock) 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 ErrIntOverflowTypes - } - 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: LightBlock: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LightBlock: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SignedHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.SignedHeader == nil { - m.SignedHeader = &SignedHeader{} - } - if err := m.SignedHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSet", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ValidatorSet == nil { - m.ValidatorSet = &ValidatorSet{} - } - if err := m.ValidatorSet.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *BlockMeta) 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 ErrIntOverflowTypes - } - 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: BlockMeta: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BlockMeta: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockID", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BlockID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockSize", wireType) - } - m.BlockSize = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.BlockSize |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NumTxs", wireType) - } - m.NumTxs = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NumTxs |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *TxProof) 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 ErrIntOverflowTypes - } - 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: TxProof: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TxProof: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RootHash", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RootHash = append(m.RootHash[:0], dAtA[iNdEx:postIndex]...) - if m.RootHash == nil { - m.RootHash = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Proof == nil { - m.Proof = &crypto.Proof{} - } - if err := m.Proof.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/types/types.proto b/third_party/proto/tendermint/types/types.proto deleted file mode 100644 index 8d4f009729..0000000000 --- a/third_party/proto/tendermint/types/types.proto +++ /dev/null @@ -1,157 +0,0 @@ -syntax = "proto3"; -package tendermint.types; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/timestamp.proto"; -import "tendermint/crypto/proof.proto"; -import "tendermint/version/types.proto"; -import "tendermint/types/validator.proto"; - -// BlockIdFlag indicates which BlcokID the signature is for -enum BlockIDFlag { - option (gogoproto.goproto_enum_stringer) = true; - option (gogoproto.goproto_enum_prefix) = false; - - BLOCK_ID_FLAG_UNKNOWN = 0 [(gogoproto.enumvalue_customname) = "BlockIDFlagUnknown"]; - BLOCK_ID_FLAG_ABSENT = 1 [(gogoproto.enumvalue_customname) = "BlockIDFlagAbsent"]; - BLOCK_ID_FLAG_COMMIT = 2 [(gogoproto.enumvalue_customname) = "BlockIDFlagCommit"]; - BLOCK_ID_FLAG_NIL = 3 [(gogoproto.enumvalue_customname) = "BlockIDFlagNil"]; -} - -// SignedMsgType is a type of signed message in the consensus. -enum SignedMsgType { - option (gogoproto.goproto_enum_stringer) = true; - option (gogoproto.goproto_enum_prefix) = false; - - SIGNED_MSG_TYPE_UNKNOWN = 0 [(gogoproto.enumvalue_customname) = "UnknownType"]; - // Votes - SIGNED_MSG_TYPE_PREVOTE = 1 [(gogoproto.enumvalue_customname) = "PrevoteType"]; - SIGNED_MSG_TYPE_PRECOMMIT = 2 [(gogoproto.enumvalue_customname) = "PrecommitType"]; - - // Proposals - SIGNED_MSG_TYPE_PROPOSAL = 32 [(gogoproto.enumvalue_customname) = "ProposalType"]; -} - -// PartsetHeader -message PartSetHeader { - uint32 total = 1; - bytes hash = 2; -} - -message Part { - uint32 index = 1; - bytes bytes = 2; - tendermint.crypto.Proof proof = 3 [(gogoproto.nullable) = false]; -} - -// BlockID -message BlockID { - bytes hash = 1; - PartSetHeader part_set_header = 2 [(gogoproto.nullable) = false]; -} - -// -------------------------------- - -// Header defines the structure of a Tendermint block header. -message Header { - // basic block info - tendermint.version.Consensus version = 1 [(gogoproto.nullable) = false]; - string chain_id = 2 [(gogoproto.customname) = "ChainID"]; - int64 height = 3; - google.protobuf.Timestamp time = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - - // prev block info - BlockID last_block_id = 5 [(gogoproto.nullable) = false]; - - // hashes of block data - bytes last_commit_hash = 6; // commit from validators from the last block - bytes data_hash = 7; // transactions - - // hashes from the app output from the prev block - bytes validators_hash = 8; // validators for the current block - bytes next_validators_hash = 9; // validators for the next block - bytes consensus_hash = 10; // consensus params for current block - bytes app_hash = 11; // state after txs from the previous block - bytes last_results_hash = 12; // root hash of all results from the txs from the previous block - - // consensus info - bytes evidence_hash = 13; // evidence included in the block - bytes proposer_address = 14; // original proposer of the block -} - -// Data contains the set of transactions included in the block -message Data { - // Txs that will be applied by state @ block.Height+1. - // NOTE: not all txs here are valid. We're just agreeing on the order first. - // This means that block.AppHash does not include these txs. - repeated bytes txs = 1; -} - -// Vote represents a prevote, precommit, or commit vote from validators for -// consensus. -message Vote { - SignedMsgType type = 1; - int64 height = 2; - int32 round = 3; - BlockID block_id = 4 - [(gogoproto.nullable) = false, (gogoproto.customname) = "BlockID"]; // zero if vote is nil. - google.protobuf.Timestamp timestamp = 5 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - bytes validator_address = 6; - int32 validator_index = 7; - bytes signature = 8; -} - -// Commit contains the evidence that a block was committed by a set of validators. -message Commit { - int64 height = 1; - int32 round = 2; - BlockID block_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "BlockID"]; - repeated CommitSig signatures = 4 [(gogoproto.nullable) = false]; -} - -// CommitSig is a part of the Vote included in a Commit. -message CommitSig { - BlockIDFlag block_id_flag = 1; - bytes validator_address = 2; - google.protobuf.Timestamp timestamp = 3 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - bytes signature = 4; -} - -message Proposal { - SignedMsgType type = 1; - int64 height = 2; - int32 round = 3; - int32 pol_round = 4; - BlockID block_id = 5 [(gogoproto.customname) = "BlockID", (gogoproto.nullable) = false]; - google.protobuf.Timestamp timestamp = 6 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - bytes signature = 7; -} - -message SignedHeader { - Header header = 1; - Commit commit = 2; -} - -message LightBlock { - SignedHeader signed_header = 1; - tendermint.types.ValidatorSet validator_set = 2; -} - -message BlockMeta { - BlockID block_id = 1 [(gogoproto.customname) = "BlockID", (gogoproto.nullable) = false]; - int64 block_size = 2; - Header header = 3 [(gogoproto.nullable) = false]; - int64 num_txs = 4; -} - -// TxProof represents a Merkle proof of the presence of a transaction in the Merkle tree. -message TxProof { - bytes root_hash = 1; - bytes data = 2; - tendermint.crypto.Proof proof = 3; -} diff --git a/third_party/proto/tendermint/types/validator.pb.go b/third_party/proto/tendermint/types/validator.pb.go deleted file mode 100644 index ab332cf5d0..0000000000 --- a/third_party/proto/tendermint/types/validator.pb.go +++ /dev/null @@ -1,969 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/types/validator.proto - -package types - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 ValidatorSet struct { - Validators []*Validator `protobuf:"bytes,1,rep,name=validators,proto3" json:"validators,omitempty"` - Proposer *Validator `protobuf:"bytes,2,opt,name=proposer,proto3" json:"proposer,omitempty"` - TotalVotingPower int64 `protobuf:"varint,3,opt,name=total_voting_power,json=totalVotingPower,proto3" json:"total_voting_power,omitempty"` -} - -func (m *ValidatorSet) Reset() { *m = ValidatorSet{} } -func (m *ValidatorSet) String() string { return proto.CompactTextString(m) } -func (*ValidatorSet) ProtoMessage() {} -func (*ValidatorSet) Descriptor() ([]byte, []int) { - return fileDescriptor_4e92274df03d3088, []int{0} -} - -func (m *ValidatorSet) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *ValidatorSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ValidatorSet.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 *ValidatorSet) XXX_Merge(src proto.Message) { - xxx_messageInfo_ValidatorSet.Merge(m, src) -} - -func (m *ValidatorSet) XXX_Size() int { - return m.Size() -} - -func (m *ValidatorSet) XXX_DiscardUnknown() { - xxx_messageInfo_ValidatorSet.DiscardUnknown(m) -} - -var xxx_messageInfo_ValidatorSet proto.InternalMessageInfo - -func (m *ValidatorSet) GetValidators() []*Validator { - if m != nil { - return m.Validators - } - return nil -} - -func (m *ValidatorSet) GetProposer() *Validator { - if m != nil { - return m.Proposer - } - return nil -} - -func (m *ValidatorSet) GetTotalVotingPower() int64 { - if m != nil { - return m.TotalVotingPower - } - return 0 -} - -type Validator struct { - Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - PubKey crypto.PublicKey `protobuf:"bytes,2,opt,name=pub_key,json=pubKey,proto3" json:"pub_key"` - VotingPower int64 `protobuf:"varint,3,opt,name=voting_power,json=votingPower,proto3" json:"voting_power,omitempty"` - ProposerPriority int64 `protobuf:"varint,4,opt,name=proposer_priority,json=proposerPriority,proto3" json:"proposer_priority,omitempty"` -} - -func (m *Validator) Reset() { *m = Validator{} } -func (m *Validator) String() string { return proto.CompactTextString(m) } -func (*Validator) ProtoMessage() {} -func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_4e92274df03d3088, []int{1} -} - -func (m *Validator) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Validator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Validator.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 *Validator) XXX_Merge(src proto.Message) { - xxx_messageInfo_Validator.Merge(m, src) -} - -func (m *Validator) XXX_Size() int { - return m.Size() -} - -func (m *Validator) XXX_DiscardUnknown() { - xxx_messageInfo_Validator.DiscardUnknown(m) -} - -var xxx_messageInfo_Validator proto.InternalMessageInfo - -func (m *Validator) GetAddress() []byte { - if m != nil { - return m.Address - } - return nil -} - -func (m *Validator) GetPubKey() crypto.PublicKey { - if m != nil { - return m.PubKey - } - return crypto.PublicKey{} -} - -func (m *Validator) GetVotingPower() int64 { - if m != nil { - return m.VotingPower - } - return 0 -} - -func (m *Validator) GetProposerPriority() int64 { - if m != nil { - return m.ProposerPriority - } - return 0 -} - -type SimpleValidator struct { - PubKey *crypto.PublicKey `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"` - VotingPower int64 `protobuf:"varint,2,opt,name=voting_power,json=votingPower,proto3" json:"voting_power,omitempty"` -} - -func (m *SimpleValidator) Reset() { *m = SimpleValidator{} } -func (m *SimpleValidator) String() string { return proto.CompactTextString(m) } -func (*SimpleValidator) ProtoMessage() {} -func (*SimpleValidator) Descriptor() ([]byte, []int) { - return fileDescriptor_4e92274df03d3088, []int{2} -} - -func (m *SimpleValidator) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *SimpleValidator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SimpleValidator.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 *SimpleValidator) XXX_Merge(src proto.Message) { - xxx_messageInfo_SimpleValidator.Merge(m, src) -} - -func (m *SimpleValidator) XXX_Size() int { - return m.Size() -} - -func (m *SimpleValidator) XXX_DiscardUnknown() { - xxx_messageInfo_SimpleValidator.DiscardUnknown(m) -} - -var xxx_messageInfo_SimpleValidator proto.InternalMessageInfo - -func (m *SimpleValidator) GetPubKey() *crypto.PublicKey { - if m != nil { - return m.PubKey - } - return nil -} - -func (m *SimpleValidator) GetVotingPower() int64 { - if m != nil { - return m.VotingPower - } - return 0 -} - -func init() { - proto.RegisterType((*ValidatorSet)(nil), "tendermint.types.ValidatorSet") - proto.RegisterType((*Validator)(nil), "tendermint.types.Validator") - proto.RegisterType((*SimpleValidator)(nil), "tendermint.types.SimpleValidator") -} - -func init() { proto.RegisterFile("tendermint/types/validator.proto", fileDescriptor_4e92274df03d3088) } - -var fileDescriptor_4e92274df03d3088 = []byte{ - // 361 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xcf, 0x4e, 0xc2, 0x40, - 0x10, 0xc6, 0xbb, 0x40, 0x40, 0x17, 0x12, 0x71, 0xe3, 0xa1, 0x41, 0x52, 0x2b, 0x27, 0x12, 0x4d, - 0x9b, 0x68, 0x0c, 0x07, 0x6e, 0x5c, 0xb9, 0x60, 0x49, 0x38, 0x78, 0x69, 0x5a, 0xba, 0xa9, 0x1b, - 0x0a, 0xbb, 0xd9, 0x6e, 0x31, 0xfb, 0x16, 0x3e, 0x8b, 0x4f, 0xc1, 0x91, 0xa3, 0x27, 0x63, 0xe0, - 0x45, 0x4c, 0x5b, 0xfa, 0x27, 0xa8, 0xe1, 0x36, 0x9d, 0xef, 0x9b, 0x99, 0x5f, 0x37, 0x1f, 0xd4, - 0x05, 0x5e, 0x79, 0x98, 0x2f, 0xc9, 0x4a, 0x98, 0x42, 0x32, 0x1c, 0x9a, 0x6b, 0x27, 0x20, 0x9e, - 0x23, 0x28, 0x37, 0x18, 0xa7, 0x82, 0xa2, 0x76, 0xe1, 0x30, 0x12, 0x47, 0xe7, 0xca, 0xa7, 0x3e, - 0x4d, 0x44, 0x33, 0xae, 0x52, 0x5f, 0xa7, 0x5b, 0xda, 0x34, 0xe7, 0x92, 0x09, 0x6a, 0x2e, 0xb0, - 0x0c, 0x53, 0xb5, 0xf7, 0x01, 0x60, 0x6b, 0x96, 0x6d, 0x9e, 0x62, 0x81, 0x86, 0x10, 0xe6, 0x97, - 0x42, 0x15, 0xe8, 0xd5, 0x7e, 0xf3, 0xe1, 0xda, 0x38, 0xbe, 0x65, 0xe4, 0x33, 0x56, 0xc9, 0x8e, - 0x06, 0xf0, 0x8c, 0x71, 0xca, 0x68, 0x88, 0xb9, 0x5a, 0xd1, 0xc1, 0xa9, 0xd1, 0xdc, 0x8c, 0xee, - 0x21, 0x12, 0x54, 0x38, 0x81, 0xbd, 0xa6, 0x82, 0xac, 0x7c, 0x9b, 0xd1, 0x37, 0xcc, 0xd5, 0xaa, - 0x0e, 0xfa, 0x55, 0xab, 0x9d, 0x28, 0xb3, 0x44, 0x98, 0xc4, 0xfd, 0x18, 0xfa, 0x3c, 0xdf, 0x82, - 0x54, 0xd8, 0x70, 0x3c, 0x8f, 0xe3, 0x30, 0xc6, 0x05, 0xfd, 0x96, 0x95, 0x7d, 0xa2, 0x21, 0x6c, - 0xb0, 0xc8, 0xb5, 0x17, 0x58, 0x1e, 0x68, 0xba, 0x65, 0x9a, 0xf4, 0x31, 0x8c, 0x49, 0xe4, 0x06, - 0x64, 0x3e, 0xc6, 0x72, 0x54, 0xdb, 0x7c, 0xdd, 0x28, 0x56, 0x9d, 0x45, 0xee, 0x18, 0x4b, 0x74, - 0x0b, 0x5b, 0x7f, 0xc0, 0x34, 0xd7, 0x05, 0x07, 0xba, 0x83, 0x97, 0xd9, 0x1f, 0xd8, 0x8c, 0x13, - 0xca, 0x89, 0x90, 0x6a, 0x2d, 0x85, 0xce, 0x84, 0xc9, 0xa1, 0xdf, 0x5b, 0xc0, 0x8b, 0x29, 0x59, - 0xb2, 0x00, 0x17, 0xe4, 0x4f, 0x05, 0x1f, 0x38, 0xcd, 0xf7, 0x2f, 0x59, 0xe5, 0x17, 0xd9, 0xe8, - 0x79, 0xb3, 0xd3, 0xc0, 0x76, 0xa7, 0x81, 0xef, 0x9d, 0x06, 0xde, 0xf7, 0x9a, 0xb2, 0xdd, 0x6b, - 0xca, 0xe7, 0x5e, 0x53, 0x5e, 0x06, 0x3e, 0x11, 0xaf, 0x91, 0x6b, 0xcc, 0xe9, 0xd2, 0x2c, 0x67, - 0xac, 0x28, 0xd3, 0x04, 0x1d, 0xe7, 0xcf, 0xad, 0x27, 0xfd, 0xc7, 0x9f, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x48, 0xbf, 0x34, 0x35, 0x9a, 0x02, 0x00, 0x00, -} - -func (m *ValidatorSet) 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 *ValidatorSet) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ValidatorSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.TotalVotingPower != 0 { - i = encodeVarintValidator(dAtA, i, uint64(m.TotalVotingPower)) - i-- - dAtA[i] = 0x18 - } - if m.Proposer != nil { - { - size, err := m.Proposer.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintValidator(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Validators) > 0 { - for iNdEx := len(m.Validators) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Validators[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintValidator(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *Validator) 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 *Validator) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.ProposerPriority != 0 { - i = encodeVarintValidator(dAtA, i, uint64(m.ProposerPriority)) - i-- - dAtA[i] = 0x20 - } - if m.VotingPower != 0 { - i = encodeVarintValidator(dAtA, i, uint64(m.VotingPower)) - i-- - dAtA[i] = 0x18 - } - { - size, err := m.PubKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintValidator(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintValidator(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SimpleValidator) 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 *SimpleValidator) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SimpleValidator) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.VotingPower != 0 { - i = encodeVarintValidator(dAtA, i, uint64(m.VotingPower)) - i-- - dAtA[i] = 0x10 - } - if m.PubKey != nil { - { - size, err := m.PubKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintValidator(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintValidator(dAtA []byte, offset int, v uint64) int { - offset -= sovValidator(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *ValidatorSet) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Validators) > 0 { - for _, e := range m.Validators { - l = e.Size() - n += 1 + l + sovValidator(uint64(l)) - } - } - if m.Proposer != nil { - l = m.Proposer.Size() - n += 1 + l + sovValidator(uint64(l)) - } - if m.TotalVotingPower != 0 { - n += 1 + sovValidator(uint64(m.TotalVotingPower)) - } - return n -} - -func (m *Validator) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovValidator(uint64(l)) - } - l = m.PubKey.Size() - n += 1 + l + sovValidator(uint64(l)) - if m.VotingPower != 0 { - n += 1 + sovValidator(uint64(m.VotingPower)) - } - if m.ProposerPriority != 0 { - n += 1 + sovValidator(uint64(m.ProposerPriority)) - } - return n -} - -func (m *SimpleValidator) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PubKey != nil { - l = m.PubKey.Size() - n += 1 + l + sovValidator(uint64(l)) - } - if m.VotingPower != 0 { - n += 1 + sovValidator(uint64(m.VotingPower)) - } - return n -} - -func sovValidator(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozValidator(x uint64) (n int) { - return sovValidator(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *ValidatorSet) 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 ErrIntOverflowValidator - } - 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: ValidatorSet: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ValidatorSet: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validators", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowValidator - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthValidator - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthValidator - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validators = append(m.Validators, &Validator{}) - if err := m.Validators[len(m.Validators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proposer", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowValidator - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthValidator - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthValidator - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Proposer == nil { - m.Proposer = &Validator{} - } - if err := m.Proposer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalVotingPower", wireType) - } - m.TotalVotingPower = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowValidator - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalVotingPower |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipValidator(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthValidator - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Validator) 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 ErrIntOverflowValidator - } - 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: Validator: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Validator: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowValidator - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthValidator - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthValidator - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = append(m.Address[:0], dAtA[iNdEx:postIndex]...) - if m.Address == nil { - m.Address = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKey", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowValidator - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthValidator - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthValidator - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field VotingPower", wireType) - } - m.VotingPower = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowValidator - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.VotingPower |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ProposerPriority", wireType) - } - m.ProposerPriority = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowValidator - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ProposerPriority |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipValidator(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthValidator - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *SimpleValidator) 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 ErrIntOverflowValidator - } - 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: SimpleValidator: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SimpleValidator: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKey", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowValidator - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthValidator - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthValidator - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.PubKey == nil { - m.PubKey = &crypto.PublicKey{} - } - if err := m.PubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field VotingPower", wireType) - } - m.VotingPower = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowValidator - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.VotingPower |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipValidator(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthValidator - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipValidator(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, ErrIntOverflowValidator - } - 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, ErrIntOverflowValidator - } - 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, ErrIntOverflowValidator - } - 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, ErrInvalidLengthValidator - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupValidator - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthValidator - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthValidator = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowValidator = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupValidator = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/types/validator.proto b/third_party/proto/tendermint/types/validator.proto deleted file mode 100644 index 49860b96d6..0000000000 --- a/third_party/proto/tendermint/types/validator.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; -package tendermint.types; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; - -import "gogoproto/gogo.proto"; -import "tendermint/crypto/keys.proto"; - -message ValidatorSet { - repeated Validator validators = 1; - Validator proposer = 2; - int64 total_voting_power = 3; -} - -message Validator { - bytes address = 1; - tendermint.crypto.PublicKey pub_key = 2 [(gogoproto.nullable) = false]; - int64 voting_power = 3; - int64 proposer_priority = 4; -} - -message SimpleValidator { - tendermint.crypto.PublicKey pub_key = 1; - int64 voting_power = 2; -} diff --git a/third_party/proto/tendermint/version/types.pb.go b/third_party/proto/tendermint/version/types.pb.go deleted file mode 100644 index 33e74d817a..0000000000 --- a/third_party/proto/tendermint/version/types.pb.go +++ /dev/null @@ -1,596 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: tendermint/version/types.proto - -package version - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = 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 - -// App includes the protocol and software version for the application. -// This information is included in ResponseInfo. The App.Protocol can be -// updated in ResponseEndBlock. -type App struct { - Protocol uint64 `protobuf:"varint,1,opt,name=protocol,proto3" json:"protocol,omitempty"` - Software string `protobuf:"bytes,2,opt,name=software,proto3" json:"software,omitempty"` -} - -func (m *App) Reset() { *m = App{} } -func (m *App) String() string { return proto.CompactTextString(m) } -func (*App) ProtoMessage() {} -func (*App) Descriptor() ([]byte, []int) { - return fileDescriptor_f9b42966edc5edad, []int{0} -} - -func (m *App) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *App) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_App.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 *App) XXX_Merge(src proto.Message) { - xxx_messageInfo_App.Merge(m, src) -} - -func (m *App) XXX_Size() int { - return m.Size() -} - -func (m *App) XXX_DiscardUnknown() { - xxx_messageInfo_App.DiscardUnknown(m) -} - -var xxx_messageInfo_App proto.InternalMessageInfo - -func (m *App) GetProtocol() uint64 { - if m != nil { - return m.Protocol - } - return 0 -} - -func (m *App) GetSoftware() string { - if m != nil { - return m.Software - } - return "" -} - -// Consensus captures the consensus rules for processing a block in the blockchain, -// including all blockchain data structures and the rules of the application's -// state transition machine. -type Consensus struct { - Block uint64 `protobuf:"varint,1,opt,name=block,proto3" json:"block,omitempty"` - App uint64 `protobuf:"varint,2,opt,name=app,proto3" json:"app,omitempty"` -} - -func (m *Consensus) Reset() { *m = Consensus{} } -func (m *Consensus) String() string { return proto.CompactTextString(m) } -func (*Consensus) ProtoMessage() {} -func (*Consensus) Descriptor() ([]byte, []int) { - return fileDescriptor_f9b42966edc5edad, []int{1} -} - -func (m *Consensus) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} - -func (m *Consensus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Consensus.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 *Consensus) XXX_Merge(src proto.Message) { - xxx_messageInfo_Consensus.Merge(m, src) -} - -func (m *Consensus) XXX_Size() int { - return m.Size() -} - -func (m *Consensus) XXX_DiscardUnknown() { - xxx_messageInfo_Consensus.DiscardUnknown(m) -} - -var xxx_messageInfo_Consensus proto.InternalMessageInfo - -func (m *Consensus) GetBlock() uint64 { - if m != nil { - return m.Block - } - return 0 -} - -func (m *Consensus) GetApp() uint64 { - if m != nil { - return m.App - } - return 0 -} - -func init() { - proto.RegisterType((*App)(nil), "tendermint.version.App") - proto.RegisterType((*Consensus)(nil), "tendermint.version.Consensus") -} - -func init() { proto.RegisterFile("tendermint/version/types.proto", fileDescriptor_f9b42966edc5edad) } - -var fileDescriptor_f9b42966edc5edad = []byte{ - // 218 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2b, 0x49, 0xcd, 0x4b, - 0x49, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0x2f, 0x4b, 0x2d, 0x2a, 0xce, 0xcc, 0xcf, 0xd3, 0x2f, - 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x42, 0xc8, 0xeb, 0x41, - 0xe5, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xd2, 0xfa, 0x20, 0x16, 0x44, 0xa5, 0x92, 0x2d, - 0x17, 0xb3, 0x63, 0x41, 0x81, 0x90, 0x14, 0x17, 0x07, 0x98, 0x9f, 0x9c, 0x9f, 0x23, 0xc1, 0xa8, - 0xc0, 0xa8, 0xc1, 0x12, 0x04, 0xe7, 0x83, 0xe4, 0x8a, 0xf3, 0xd3, 0x4a, 0xca, 0x13, 0x8b, 0x52, - 0x25, 0x98, 0x14, 0x18, 0x35, 0x38, 0x83, 0xe0, 0x7c, 0x25, 0x4b, 0x2e, 0x4e, 0xe7, 0xfc, 0xbc, - 0xe2, 0xd4, 0xbc, 0xe2, 0xd2, 0x62, 0x21, 0x11, 0x2e, 0xd6, 0xa4, 0x9c, 0xfc, 0xe4, 0x6c, 0xa8, - 0x09, 0x10, 0x8e, 0x90, 0x00, 0x17, 0x73, 0x62, 0x41, 0x01, 0x58, 0x27, 0x4b, 0x10, 0x88, 0x69, - 0xc5, 0xf2, 0x62, 0x81, 0x3c, 0xa3, 0x53, 0xf0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, - 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, - 0x31, 0x44, 0x59, 0xa6, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x23, 0x79, - 0x14, 0x89, 0x09, 0xf1, 0x06, 0x66, 0x20, 0x24, 0xb1, 0x81, 0x65, 0x8c, 0x01, 0x01, 0x00, 0x00, - 0xff, 0xff, 0x42, 0x43, 0x65, 0xc7, 0x21, 0x01, 0x00, 0x00, -} - -func (this *Consensus) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Consensus) - if !ok { - that2, ok := that.(Consensus) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Block != that1.Block { - return false - } - if this.App != that1.App { - return false - } - return true -} - -func (m *App) 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 *App) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *App) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Software) > 0 { - i -= len(m.Software) - copy(dAtA[i:], m.Software) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Software))) - i-- - dAtA[i] = 0x12 - } - if m.Protocol != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Protocol)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Consensus) 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 *Consensus) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Consensus) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.App != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.App)) - i-- - dAtA[i] = 0x10 - } - if m.Block != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Block)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { - offset -= sovTypes(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - -func (m *App) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Protocol != 0 { - n += 1 + sovTypes(uint64(m.Protocol)) - } - l = len(m.Software) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *Consensus) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Block != 0 { - n += 1 + sovTypes(uint64(m.Block)) - } - if m.App != 0 { - n += 1 + sovTypes(uint64(m.App)) - } - return n -} - -func sovTypes(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} - -func sozTypes(x uint64) (n int) { - return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func (m *App) 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 ErrIntOverflowTypes - } - 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: App: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: App: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) - } - m.Protocol = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Protocol |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Software", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Software = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func (m *Consensus) 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 ErrIntOverflowTypes - } - 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: Consensus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Consensus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Block", wireType) - } - m.Block = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Block |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field App", wireType) - } - m.App = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.App |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} - -func skipTypes(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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrIntOverflowTypes - } - 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, ErrInvalidLengthTypes - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTypes - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTypes - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") -) diff --git a/third_party/proto/tendermint/version/types.proto b/third_party/proto/tendermint/version/types.proto deleted file mode 100644 index 6061868bd4..0000000000 --- a/third_party/proto/tendermint/version/types.proto +++ /dev/null @@ -1,24 +0,0 @@ -syntax = "proto3"; -package tendermint.version; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/version"; - -import "gogoproto/gogo.proto"; - -// App includes the protocol and software version for the application. -// This information is included in ResponseInfo. The App.Protocol can be -// updated in ResponseEndBlock. -message App { - uint64 protocol = 1; - string software = 2; -} - -// Consensus captures the consensus rules for processing a block in the blockchain, -// including all blockchain data structures and the rules of the application's -// state transition machine. -message Consensus { - option (gogoproto.equal) = true; - - uint64 block = 1; - uint64 app = 2; -} diff --git a/x/wasm/types/genesis.pb.go b/x/wasm/types/genesis.pb.go index 17970ef90b..926b74c81c 100644 --- a/x/wasm/types/genesis.pb.go +++ b/x/wasm/types/genesis.pb.go @@ -9,7 +9,7 @@ import ( math "math" math_bits "math/bits" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" ) diff --git a/x/wasm/types/ibc.pb.go b/x/wasm/types/ibc.pb.go index 64d22ee35b..bedc1954ab 100644 --- a/x/wasm/types/ibc.pb.go +++ b/x/wasm/types/ibc.pb.go @@ -9,7 +9,7 @@ import ( math "math" math_bits "math/bits" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" ) diff --git a/x/wasm/types/proposal.pb.go b/x/wasm/types/proposal.pb.go index 7532a84e70..0e87ce5fca 100644 --- a/x/wasm/types/proposal.pb.go +++ b/x/wasm/types/proposal.pb.go @@ -12,7 +12,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" ) diff --git a/x/wasm/types/query.pb.go b/x/wasm/types/query.pb.go index 0a45c5de82..dea3e53b01 100644 --- a/x/wasm/types/query.pb.go +++ b/x/wasm/types/query.pb.go @@ -12,7 +12,7 @@ import ( math_bits "math/bits" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" github_com_tendermint_tendermint_libs_bytes "github.com/tendermint/tendermint/libs/bytes" diff --git a/x/wasm/types/query.pb.gw.go b/x/wasm/types/query.pb.gw.go index d50c1a5d8e..1fa96f457a 100644 --- a/x/wasm/types/query.pb.gw.go +++ b/x/wasm/types/query.pb.gw.go @@ -20,6 +20,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" ) @@ -32,6 +33,7 @@ var ( _ = runtime.String _ = utilities.NewDoubleArray _ = descriptor.ForMessage + _ = metadata.Join ) func request_Query_ContractInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -573,11 +575,13 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal // 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 (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +// 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_ContractInfo_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 { @@ -585,6 +589,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_ContractInfo_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) @@ -597,6 +602,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_ContractHistory_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 { @@ -604,6 +611,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_ContractHistory_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) @@ -616,6 +624,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_ContractsByCode_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 { @@ -623,6 +633,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_ContractsByCode_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) @@ -635,6 +646,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_AllContractState_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 { @@ -642,6 +655,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_AllContractState_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) @@ -654,6 +668,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_RawContractState_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 { @@ -661,6 +677,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_RawContractState_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) @@ -673,6 +690,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_SmartContractState_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 { @@ -680,6 +699,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_SmartContractState_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) @@ -692,6 +712,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Code_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 { @@ -699,6 +721,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Code_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) @@ -711,6 +734,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Codes_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 { @@ -718,6 +743,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Codes_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) @@ -730,6 +756,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_PinnedCodes_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 { @@ -737,6 +765,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_PinnedCodes_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) @@ -749,6 +778,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Params_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 { @@ -756,6 +787,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Params_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) @@ -999,25 +1031,25 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } var ( - pattern_Query_ContractInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"cosmwasm", "wasm", "v1", "contract", "address"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ContractInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"cosmwasm", "wasm", "v1", "contract", "address"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_ContractHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"cosmwasm", "wasm", "v1", "contract", "address", "history"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ContractHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"cosmwasm", "wasm", "v1", "contract", "address", "history"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_ContractsByCode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"cosmwasm", "wasm", "v1", "code", "code_id", "contracts"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ContractsByCode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"cosmwasm", "wasm", "v1", "code", "code_id", "contracts"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_AllContractState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"cosmwasm", "wasm", "v1", "contract", "address", "state"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_AllContractState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"cosmwasm", "wasm", "v1", "contract", "address", "state"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_RawContractState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6}, []string{"cosmwasm", "wasm", "v1", "contract", "address", "raw", "query_data"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_RawContractState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6}, []string{"cosmwasm", "wasm", "v1", "contract", "address", "raw", "query_data"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_SmartContractState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6}, []string{"cosmwasm", "wasm", "v1", "contract", "address", "smart", "query_data"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_SmartContractState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6}, []string{"cosmwasm", "wasm", "v1", "contract", "address", "smart", "query_data"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_Code_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"cosmwasm", "wasm", "v1", "code", "code_id"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_Code_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"cosmwasm", "wasm", "v1", "code", "code_id"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_Codes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"cosmwasm", "wasm", "v1", "code"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_Codes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"cosmwasm", "wasm", "v1", "code"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_PinnedCodes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"cosmwasm", "wasm", "v1", "codes", "pinned"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_PinnedCodes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"cosmwasm", "wasm", "v1", "codes", "pinned"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"cosmwasm", "wasm", "v1", "codes", "params"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"cosmwasm", "wasm", "v1", "codes", "params"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( diff --git a/x/wasm/types/tx.pb.go b/x/wasm/types/tx.pb.go index cf90465b69..f81b1106e0 100644 --- a/x/wasm/types/tx.pb.go +++ b/x/wasm/types/tx.pb.go @@ -12,7 +12,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/wasm/types/types.pb.go b/x/wasm/types/types.pb.go index f7dc08b405..7b41c98394 100644 --- a/x/wasm/types/types.pb.go +++ b/x/wasm/types/types.pb.go @@ -10,10 +10,10 @@ import ( math "math" math_bits "math/bits" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" github_com_tendermint_tendermint_libs_bytes "github.com/tendermint/tendermint/libs/bytes" ) From 67a2ef1650b505e55e2ef74793d1d48afca30922 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Mon, 10 Oct 2022 15:01:48 +0200 Subject: [PATCH 90/94] Validate incoming messages --- x/wasm/genesis_test.go | 1 + x/wasm/keeper/msg_server.go | 25 +++++++++++++++++++++++++ x/wasm/module.go | 2 +- x/wasm/module_test.go | 3 +++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/x/wasm/genesis_test.go b/x/wasm/genesis_test.go index 9b97213db5..d2bb8dc458 100644 --- a/x/wasm/genesis_test.go +++ b/x/wasm/genesis_test.go @@ -43,6 +43,7 @@ func TestInitGenesis(t *testing.T) { CodeID: firstCodeID, Msg: initMsgBz, Funds: deposit, + Label: "testing", } res, err = h(data.ctx, &initCmd) require.NoError(t, err) diff --git a/x/wasm/keeper/msg_server.go b/x/wasm/keeper/msg_server.go index d3051f4307..c91ff2124d 100644 --- a/x/wasm/keeper/msg_server.go +++ b/x/wasm/keeper/msg_server.go @@ -20,6 +20,9 @@ func NewMsgServerImpl(k types.ContractOpsKeeper) types.MsgServer { } func (m msgServer) StoreCode(goCtx context.Context, msg *types.MsgStoreCode) (*types.MsgStoreCodeResponse, error) { + if err := msg.ValidateBasic(); err != nil { + return nil, err + } ctx := sdk.UnwrapSDKContext(goCtx) senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) if err != nil { @@ -45,6 +48,9 @@ func (m msgServer) StoreCode(goCtx context.Context, msg *types.MsgStoreCode) (*t // InstantiateContract instantiate a new contract with classic sequence based address generation func (m msgServer) InstantiateContract(goCtx context.Context, msg *types.MsgInstantiateContract) (*types.MsgInstantiateContractResponse, error) { + if err := msg.ValidateBasic(); err != nil { + return nil, err + } ctx := sdk.UnwrapSDKContext(goCtx) senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) @@ -77,6 +83,9 @@ func (m msgServer) InstantiateContract(goCtx context.Context, msg *types.MsgInst // InstantiateContract2 instantiate a new contract with predicatable address generated func (m msgServer) InstantiateContract2(goCtx context.Context, msg *types.MsgInstantiateContract2) (*types.MsgInstantiateContract2Response, error) { + if err := msg.ValidateBasic(); err != nil { + return nil, err + } ctx := sdk.UnwrapSDKContext(goCtx) senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) @@ -107,6 +116,10 @@ func (m msgServer) InstantiateContract2(goCtx context.Context, msg *types.MsgIns } func (m msgServer) ExecuteContract(goCtx context.Context, msg *types.MsgExecuteContract) (*types.MsgExecuteContractResponse, error) { + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + ctx := sdk.UnwrapSDKContext(goCtx) senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) if err != nil { @@ -134,6 +147,10 @@ func (m msgServer) ExecuteContract(goCtx context.Context, msg *types.MsgExecuteC } func (m msgServer) MigrateContract(goCtx context.Context, msg *types.MsgMigrateContract) (*types.MsgMigrateContractResponse, error) { + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + ctx := sdk.UnwrapSDKContext(goCtx) senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) if err != nil { @@ -161,6 +178,10 @@ func (m msgServer) MigrateContract(goCtx context.Context, msg *types.MsgMigrateC } func (m msgServer) UpdateAdmin(goCtx context.Context, msg *types.MsgUpdateAdmin) (*types.MsgUpdateAdminResponse, error) { + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + ctx := sdk.UnwrapSDKContext(goCtx) senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) if err != nil { @@ -189,6 +210,10 @@ func (m msgServer) UpdateAdmin(goCtx context.Context, msg *types.MsgUpdateAdmin) } func (m msgServer) ClearAdmin(goCtx context.Context, msg *types.MsgClearAdmin) (*types.MsgClearAdminResponse, error) { + if err := msg.ValidateBasic(); err != nil { + return nil, err + } + ctx := sdk.UnwrapSDKContext(goCtx) senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) if err != nil { diff --git a/x/wasm/module.go b/x/wasm/module.go index d03fdeb02f..956887dabe 100644 --- a/x/wasm/module.go +++ b/x/wasm/module.go @@ -8,6 +8,7 @@ import ( "runtime/debug" "strings" + wasmvm "github.com/CosmWasm/wasmvm" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -27,7 +28,6 @@ import ( "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/CosmWasm/wasmd/x/wasm/simulation" "github.com/CosmWasm/wasmd/x/wasm/types" - wasmvm "github.com/CosmWasm/wasmvm" ) var ( diff --git a/x/wasm/module_test.go b/x/wasm/module_test.go index 66591aba27..5ca0a88178 100644 --- a/x/wasm/module_test.go +++ b/x/wasm/module_test.go @@ -175,6 +175,7 @@ func TestHandleInstantiate(t *testing.T) { CodeID: firstCodeID, Msg: initMsgBz, Funds: nil, + Label: "testing", } res, err = h(data.ctx, &initCmd) require.NoError(t, err) @@ -234,6 +235,7 @@ func TestHandleExecute(t *testing.T) { CodeID: firstCodeID, Msg: initMsgBz, Funds: deposit, + Label: "testing", } res, err = h(data.ctx, &initCmd) require.NoError(t, err) @@ -368,6 +370,7 @@ func TestHandleExecuteEscrow(t *testing.T) { CodeID: firstCodeID, Msg: initMsgBz, Funds: deposit, + Label: "testing", } res, err = h(data.ctx, &initCmd) require.NoError(t, err) From 319a9482a4b690cabe379ac3ee03880116904173 Mon Sep 17 00:00:00 2001 From: Alexander Peters Date: Mon, 10 Oct 2022 16:14:48 +0200 Subject: [PATCH 91/94] Changelog updates (#1024) * Changelog updates * Revert module version bump * Update changelog * Set release date * Update changelog * Update changelog * Add buf repo tag for releases --- CHANGELOG.md | 19 +++++++++++-------- README.md | 6 ++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 176b032eed..aa8937acb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,14 +4,15 @@ [Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.29.0...HEAD) -## [v0.29.0-rc1](https://github.com/CosmWasm/wasmd/tree/v0.29.0-rc1) (2022-09-22) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.28.0...v0.29.0-rc1) +## [v0.29.0](https://github.com/CosmWasm/wasmd/tree/v0.29.0) (2022-10-10) +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.28.0...v0.29.0) +- Add dependencies for protobuf and remove third_party forlder [/#1030](https://github.com/CosmWasm/wasmd/pull/1030) +- Check wasmvm version on startup [\#1029](https://github.com/CosmWasm/wasmd/pull/1029/) - Allow AccessConfig to use a list of addresses instead of just a single address [\#945](https://github.com/CosmWasm/wasmd/issues/945) - Make contract addresses predictable \("deterministic"\) [\#942](https://github.com/CosmWasm/wasmd/issues/942) - Add query for the total supply of a coin [\#903](https://github.com/CosmWasm/wasmd/pull/903) ([larry0x](https://github.com/larry0x)) -- Upgrade go to v1.18 [\#866]https://github.com/CosmWasm/wasmd/pull/866/) ([faddat](https://github.com/faddat)) +- Upgrade go to v1.18 [\#866](https://github.com/CosmWasm/wasmd/pull/866/) ([faddat](https://github.com/faddat)) - Upgrade to ibc-go v3.3.0 REQUIRES [MIGRATION](https://github.com/cosmos/ibc-go/blob/v3.2.3/docs/migrations/support-denoms-with-slashes.md) [\#1016](https://github.com/CosmWasm/wasmd/pull/1016) - Upgrade to cosmos-sdk v0.45.8 [\#964](https://github.com/CosmWasm/wasmd/pull/964/) ([faddat](https://github.com/faddat)) - Upgrade wasmvm to v1.1.1 [\#1012](https://github.com/CosmWasm/wasmd/pull/1012), see [wasmvm v1.1.1](https://github.com/CosmWasm/wasmvm/releases/tag/v1.1.1) @@ -21,15 +22,17 @@ - Add gRPC query for WASM params [\#889](https://github.com/CosmWasm/wasmd/issues/889) - Expose Keepers in app.go? [\#881](https://github.com/CosmWasm/wasmd/issues/881) - Remove unused `flagProposalType` flag in gov proposals [\#849](https://github.com/CosmWasm/wasmd/issues/849) -- Restrict code access config modifications [\#901](https://github.com/CosmWasm/wasmd/pull/901) ([alpe](https://github.com/alpe)) -- Prevent migration to a restricted code [\#900](https://github.com/CosmWasm/wasmd/pull/900) ([alpe](https://github.com/alpe)) -- Charge gas to unzip wasm code [\#898](https://github.com/CosmWasm/wasmd/pull/898) ([alpe](https://github.com/alpe)) +- Restrict code access config modifications [\#901](https://github.com/CosmWasm/wasmd/pull/901) +- Prevent migration to a restricted code [\#900](https://github.com/CosmWasm/wasmd/pull/900) +- Charge gas to unzip wasm code [\#898](https://github.com/CosmWasm/wasmd/pull/898) ### Notable changes: - BaseAccount and pruned vesting account types can be re-used for contracts addresses - A new [MsgInstantiateContract2](https://github.com/CosmWasm/wasmd/pull/1014/files#diff-bf58b9da4b674719f07dd5421c532c1ead13a15f8896b59c1f724215d2064b73R75) was introduced which is an additional value for `message` type events -- Store event contains new attribute with code checksum now +- Store event contains a new attribute with the code checksum now - New `wasmd tx wasm instantiate2` CLI command for predictable addresses on instantiation +- New `cosmwasm_1_1` CosmWasm capability (former "feature") was introduced in [cosmwasm/#1356](https://github.com/CosmWasm/cosmwasm/pull/1356) to support total supply queries +- Protobuf files are published to [buf.build](https://buf.build/cosmwasm/wasmd/docs/main:cosmwasm.wasm.v1) ### Migration notes: - See ibc-go [migration notes](https://github.com/cosmos/ibc-go/blob/v3.3.0/docs/migrations/support-denoms-with-slashes.md) diff --git a/README.md b/README.md index e5c24f1d81..c8fc9549f5 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,12 @@ make test if you are using a linux without X or headless linux, look at [this article](https://ahelpme.com/linux/dbusexception-could-not-get-owner-of-name-org-freedesktop-secrets-no-such-name) or [#31](https://github.com/CosmWasm/wasmd/issues/31#issuecomment-577058321). ## Protobuf +The protobuf files for this project are published automatically to the [buf repository](https://buf.build/) to make integration easier: + +| wasmd version | buf tag | +|---------------|---------------------------------------------------------------------------------------------------------------------------------------------| +| 0.26.x | [51931206dbe09529c1819a8a2863d291035a2549](https://buf.build/cosmwasm/wasmd/tree/51931206dbe09529c1819a8a2863d291035a2549:cosmwasm/wasm/v1) | + Generate protobuf ```shell script make proto-gen From 7b25435b395ff5a6580920a91b0e438b2df04a61 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Fri, 14 Oct 2022 19:44:35 +0400 Subject: [PATCH 92/94] update cosmos-sdk to v45.9, add dragonberry. --- app/test_helpers.go | 4 ---- go.mod | 6 +++--- go.sum | 12 ++++++------ x/wasm/simulation/sim_utils.go | 1 - 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/app/test_helpers.go b/app/test_helpers.go index e37db12789..ceff625168 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -5,7 +5,6 @@ import ( "encoding/hex" "encoding/json" "fmt" - "math/rand" "path/filepath" "strconv" "testing" @@ -318,7 +317,6 @@ func SignCheckDeliver( chainID string, accNums, accSeqs []uint64, expSimPass, expPass bool, priv ...cryptotypes.PrivKey, ) (sdk.GasInfo, *sdk.Result, error) { tx, err := helpers.GenTx( - rand.New(rand.NewSource(time.Now().UnixNano())), txCfg, msgs, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}, @@ -368,7 +366,6 @@ func SignAndDeliver( chainID string, accNums, accSeqs []uint64, expSimPass, expPass bool, priv ...cryptotypes.PrivKey, ) (sdk.GasInfo, *sdk.Result, error) { tx, err := helpers.GenTx( - rand.New(rand.NewSource(time.Now().UnixNano())), txCfg, msgs, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}, @@ -406,7 +403,6 @@ func GenSequenceOfTxs(txGen client.TxConfig, msgs []sdk.Msg, accNums []uint64, i var err error for i := 0; i < numToGenerate; i++ { txs[i], err = helpers.GenTx( - rand.New(rand.NewSource(time.Now().UnixNano())), txGen, msgs, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}, diff --git a/go.mod b/go.mod index 2ada37be67..216c2e57e7 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,9 @@ go 1.18 require ( github.com/CosmWasm/wasmvm v1.1.1 github.com/cosmos/cosmos-proto v1.0.0-alpha7 - github.com/cosmos/cosmos-sdk v0.45.8 + github.com/cosmos/cosmos-sdk v0.45.9 github.com/cosmos/gogoproto v1.4.2 - github.com/cosmos/iavl v0.19.1 + github.com/cosmos/iavl v0.19.3 github.com/cosmos/ibc-go/v3 v3.3.0 github.com/cosmos/interchain-accounts v0.1.0 github.com/dvsekhvalnov/jose2go v1.5.0 @@ -128,6 +128,7 @@ require ( ) replace ( + github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 @@ -135,5 +136,4 @@ replace ( // the following version across all dependencies. github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 google.golang.org/grpc => google.golang.org/grpc v1.33.2 - ) diff --git a/go.sum b/go.sum index 7d6e085333..235a94278b 100644 --- a/go.sum +++ b/go.sum @@ -151,8 +151,6 @@ github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:z github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go v0.7.0 h1:lmTO/JEpCvZgpbkOITL95rA80CPKb5CtMzLaqF2mCNg= github.com/coinbase/rosetta-sdk-go v0.7.0/go.mod h1:7nD3oBPIiHqhRprqvMgPoGxe/nyq3yftRmpsy29coWE= -github.com/confio/ics23/go v0.7.0 h1:00d2kukk7sPoHWL4zZBZwzxnpA2pec1NPdwbSokJ5w8= -github.com/confio/ics23/go v0.7.0/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= @@ -164,8 +162,10 @@ github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= github.com/cosmos/cosmos-proto v1.0.0-alpha7 h1:yqYUOHF2jopwZh4dVQp3xgqwftE5/2hkrwIV6vkUbO0= github.com/cosmos/cosmos-proto v1.0.0-alpha7/go.mod h1:dosO4pSAbJF8zWCzCoTWP7nNsjcvSUBQmniFxDg5daw= -github.com/cosmos/cosmos-sdk v0.45.8 h1:UHO5LTkOYLK1pvu9WELCxnp8zw/YcjoNGqqcYiLQ4pE= -github.com/cosmos/cosmos-sdk v0.45.8/go.mod h1:+OKZMhLj+Y6LCzCDsyIvpul/xk7n9lVUn8sikLWD0Jo= +github.com/cosmos/cosmos-sdk v0.45.9 h1:Z4s1EZL/mfM8uSSZr8WmyEbWp4hqbWVI5sAIFR432KY= +github.com/cosmos/cosmos-sdk v0.45.9/go.mod h1:Z5M4TX7PsHNHlF/1XanI2DIpORQ+Q/st7oaeufEjnvU= +github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 h1:iKclrn3YEOwk4jQHT2ulgzuXyxmzmPczUalMwW4XH9k= +github.com/cosmos/cosmos-sdk/ics23/go v0.8.0/go.mod h1:2a4dBq88TUoqoWAU5eu0lGvpFP3wWDPgdHPargtyw30= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -173,8 +173,8 @@ github.com/cosmos/gogoproto v1.4.2 h1:UeGRcmFW41l0G0MiefWhkPEVEwvu78SZsHBvI78dAY github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.19.1 h1:3gaq9b6SjiB0KBTygRnAvEGml2pQlu1TH8uma5g63Ys= -github.com/cosmos/iavl v0.19.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= +github.com/cosmos/iavl v0.19.3 h1:cESO0OwTTxQm5rmyESKW+zESheDUYI7CcZDWWDwnuxg= +github.com/cosmos/iavl v0.19.3/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= github.com/cosmos/ibc-go/v3 v3.3.0 h1:r8gYUvQreMQrf4R5RgedK9gcbjLk4uE2q6fuZGjf4n0= github.com/cosmos/ibc-go/v3 v3.3.0/go.mod h1:VUWLHw0C3USmTQZnTdkuXXdUdLbW8zsK3lV1Ieposog= github.com/cosmos/interchain-accounts v0.1.0 h1:QmuwNsf1Hxl3P5GSGt7Z+JeuHPiZw4Z34R/038P5T6s= diff --git a/x/wasm/simulation/sim_utils.go b/x/wasm/simulation/sim_utils.go index b29c18cf28..4f9a00b0bf 100644 --- a/x/wasm/simulation/sim_utils.go +++ b/x/wasm/simulation/sim_utils.go @@ -31,7 +31,6 @@ func GenAndDeliverTxWithRandFees(txCtx simulation.OperationInput, gas uint64) (s func GenAndDeliverTx(txCtx simulation.OperationInput, fees sdk.Coins, gas uint64) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { account := txCtx.AccountKeeper.GetAccount(txCtx.Context, txCtx.SimAccount.Address) tx, err := helpers.GenTx( - txCtx.R, txCtx.TxGen, []sdk.Msg{txCtx.Msg}, fees, From 93d34dd5e00f8a54aeee0bc96cbf92becf00f539 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Fri, 14 Oct 2022 20:01:21 +0400 Subject: [PATCH 93/94] fix test. --- x/wasm/types/iavl_range_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/wasm/types/iavl_range_test.go b/x/wasm/types/iavl_range_test.go index 1e5bdc92ab..85a4a18c95 100644 --- a/x/wasm/types/iavl_range_test.go +++ b/x/wasm/types/iavl_range_test.go @@ -15,7 +15,7 @@ import ( // and designed to ensure the IAVL store handles bounds the same way as the mock storage we use in Rust contract tests func TestIavlRangeBounds(t *testing.T) { memdb := dbm.NewMemDB() - tree, err := iavl2.NewMutableTree(memdb, 50) + tree, err := iavl2.NewMutableTree(memdb, 50, false) require.NoError(t, err) kvstore := iavl.UnsafeNewStore(tree) From 9aa38c22fbba035e8ffd69eb9b5301f47bf82f82 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Fri, 14 Oct 2022 20:30:41 +0400 Subject: [PATCH 94/94] fix test. --- benchmarks/app_test.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/benchmarks/app_test.go b/benchmarks/app_test.go index e1e8954f5c..88773e6b42 100644 --- a/benchmarks/app_test.go +++ b/benchmarks/app_test.go @@ -2,7 +2,6 @@ package benchmarks import ( "encoding/json" - "math/rand" "os" "testing" "time" @@ -126,8 +125,7 @@ func InitializeWasmApp(b testing.TB, db dbm.DB, numAccounts int) AppInfo { Sender: addr.String(), WASMByteCode: cw20Code, } - storeTx, err := helpers.GenTx(rand.New(rand.NewSource(time.Now().UnixNano())), - txGen, []sdk.Msg{&storeMsg}, nil, 55123123, "", []uint64{0}, []uint64{0}, minter) + storeTx, err := helpers.GenTx(txGen, []sdk.Msg{&storeMsg}, nil, 55123123, "", []uint64{0}, []uint64{0}, minter) require.NoError(b, err) _, res, err := wasmApp.Deliver(txGen.TxEncoder(), storeTx) require.NoError(b, err) @@ -161,8 +159,7 @@ func InitializeWasmApp(b testing.TB, db dbm.DB, numAccounts int) AppInfo { Msg: initBz, } gasWanted := 500000 + 10000*uint64(numAccounts) - initTx, err := helpers.GenTx(rand.New(rand.NewSource(time.Now().UnixNano())), - txGen, []sdk.Msg{&initMsg}, nil, gasWanted, "", []uint64{0}, []uint64{1}, minter) + initTx, err := helpers.GenTx(txGen, []sdk.Msg{&initMsg}, nil, gasWanted, "", []uint64{0}, []uint64{1}, minter) require.NoError(b, err) _, res, err = wasmApp.Deliver(txGen.TxEncoder(), initTx) require.NoError(b, err) @@ -195,7 +192,6 @@ func GenSequenceOfTxs(b testing.TB, info *AppInfo, msgGen func(*AppInfo) ([]sdk. msgs, err := msgGen(info) require.NoError(b, err) txs[i], err = helpers.GenTx( - rand.New(rand.NewSource(time.Now().UnixNano())), info.TxConfig, msgs, fees,

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�qd$b8;*CQ*wnE>W=6jPr;l^U# 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