From 48fe175f983925ff6202d492a363d2b2e3a62497 Mon Sep 17 00:00:00 2001 From: Aleksandr Bezobchuk Date: Tue, 13 Dec 2022 14:50:07 -0500 Subject: [PATCH] feat!: ABCI 1.0 Integration (#345) --- CONTRIBUTING.md | 2 +- Makefile | 70 +- baseapp/abci.go | 92 +- baseapp/abci_test.go | 1414 +++- baseapp/baseapp.go | 243 +- baseapp/baseapp_test.go | 2542 +------ baseapp/grpcrouter.go | 35 +- baseapp/grpcrouter_helpers.go | 10 +- baseapp/grpcrouter_test.go | 8 +- baseapp/grpcserver.go | 4 +- baseapp/msg_service_router.go | 10 +- baseapp/options.go | 64 +- baseapp/params.go | 3 +- baseapp/params_test.go | 11 +- baseapp/testutil/buf.gen.yaml | 5 + baseapp/testutil/buf.lock | 11 + baseapp/testutil/buf.yaml | 4 + baseapp/testutil/messages.go | 63 + baseapp/testutil/messages.pb.go | 1293 ++++ baseapp/testutil/messages.proto | 39 + baseapp/utils_test.go | 322 + buf.lock | 2 + buf.work.yaml | 6 + client/config/config_test.go | 5 +- client/context.go | 2 +- client/grpc/reflection/reflection.pb.go | 4 +- client/grpc/reflection/reflection.pb.gw.go | 10 +- client/grpc/tmservice/query.pb.go | 6 +- client/grpc/tmservice/query.pb.gw.go | 22 +- client/grpc/tmservice/service.go | 2 +- client/grpc_query.go | 69 +- client/tx/tx.go | 2 +- codec/amino_codec.go | 12 +- codec/any_test.go | 27 +- codec/codec.go | 11 +- codec/codec_common_test.go | 2 +- codec/json.go | 4 +- codec/proto_codec.go | 87 +- codec/proto_codec_test.go | 2 +- codec/types/any.go | 13 +- codec/types/any.pb.go | 4 +- codec/types/any_internal_test.go | 8 +- codec/types/any_test.go | 11 +- codec/types/compat.go | 4 +- codec/types/interface_registry.go | 28 +- codec/types/types_test.go | 4 +- codec/unknownproto/benchmarks_test.go | 2 +- codec/unknownproto/unknown_fields.go | 8 +- codec/unknownproto/unknown_fields_test.go | 2 +- codec/yaml.go | 2 +- contrib/devtools/dockerfile | 45 +- contrib/rosetta/README.md | 14 +- contrib/rosetta/configuration/bootstrap.json | 2 +- contrib/rosetta/docker-compose.yaml | 36 +- contrib/rosetta/node/Dockerfile | 3 +- contrib/rosetta/node/data.tar.gz | Bin 40571 -> 43144 bytes contrib/rosetta/rosetta-ci/Dockerfile | 31 + contrib/rosetta/rosetta-ci/data.tar.gz | Bin 0 -> 44165 bytes contrib/rosetta/rosetta-cli/Dockerfile | 4 +- crypto/keys/ed25519/keys.pb.go | 4 +- crypto/keys/multisig/keys.pb.go | 4 +- crypto/keys/multisig/multisig_test.go | 7 +- crypto/keys/secp256k1/keys.pb.go | 4 +- crypto/keys/secp256r1/keys.pb.go | 4 +- .../keys/secp256r1/privkey_internal_test.go | 2 +- crypto/keys/secp256r1/pubkey.go | 2 +- crypto/keys/secp256r1/pubkey_internal_test.go | 23 +- crypto/types/multisig.pb.go | 4 +- crypto/types/types.go | 2 +- .../adr-019-protobuf-state-encoding.md | 6 +- .../adr-021-protobuf-query-encoding.md | 4 +- ...27-deterministic-protobuf-serialization.md | 2 +- docs/basics/app-anatomy.md | 2 +- docs/core/encoding.md | 4 +- docs/run-node/interact-node.md | 13 +- go.mod | 55 +- go.sum | 180 +- proto/buf.gen.gogo.yaml | 8 + proto/buf.gen.swagger.yaml | 5 + proto/buf.lock | 15 + proto/buf.md | 3 + proto/buf.yaml | 23 + .../tendermint/abci/types.proto | 169 +- .../tendermint/crypto/keys.proto | 0 .../tendermint/crypto/proof.proto | 0 .../tendermint/libs/bits/types.proto | 0 .../tendermint/p2p/types.proto | 0 .../tendermint/types/block.proto | 0 .../tendermint/types/evidence.proto | 18 +- .../tendermint/types/params.proto | 17 +- .../tendermint/types/types.proto | 8 +- .../tendermint/types/validator.proto | 0 .../tendermint/version/types.proto | 0 scripts/protocgen-any.sh | 2 +- scripts/protocgen.sh | 52 +- server/api/server.go | 2 +- server/export.go | 14 +- server/export_test.go | 6 +- .../grpc/gogoreflection/fix_registration.go | 32 +- .../grpc/gogoreflection/serverreflection.go | 7 +- server/grpc/reflection/v2alpha1/reflection.go | 2 +- .../grpc/reflection/v2alpha1/reflection.pb.go | 4 +- .../reflection/v2alpha1/reflection.pb.gw.go | 22 +- server/grpc/server.go | 2 + server/grpc/server_test.go | 2 + server/mock/app.go | 86 +- server/mock/app_test.go | 17 +- server/mock/helpers.go | 9 +- server/mock/store.go | 69 +- server/mock/store_test.go | 4 +- server/mock/tx.go | 113 +- server/rosetta/converter.go | 22 +- server/types/app.go | 5 +- simapp/abci.go | 35 + simapp/app.go | 13 + simapp/test_helpers.go | 6 +- snapshots/helpers_test.go | 2 +- snapshots/store.go | 2 +- snapshots/stream.go | 4 +- snapshots/types/convert.go | 2 +- snapshots/types/snapshot.pb.go | 5 +- snapshots/types/snapshotter.go | 2 +- snapshots/types/util.go | 2 +- store/rootmulti/store.go | 9 +- store/types/commit_info.pb.go | 4 +- store/types/listening.pb.go | 2 +- tests/mocks/grpc_server.go | 2 +- testutil/context.go | 35 +- testutil/testdata/animal.go | 2 +- testutil/testdata/buf.gen.yaml | 5 + testutil/testdata/buf.lock | 11 + testutil/testdata/buf.yaml | 4 + testutil/testdata/grpc_query.go | 2 +- testutil/testdata/query.pb.go | 4 +- testutil/testdata/testdata.pb.go | 4 +- testutil/testdata/tx.pb.go | 6 +- testutil/testdata/unknonwnproto.pb.go | 13 +- testutil/testdata/unknonwnproto.proto | 43 +- third_party/proto/confio/proofs.proto | 234 - 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 - types/abci.go | 6 + types/abci.pb.go | 4 +- types/coin.pb.go | 4 +- types/context.go | 30 +- types/context_test.go | 2 +- types/events.go | 12 +- types/events_test.go | 32 +- types/kv/kv.pb.go | 4 +- types/mempool/mempool.go | 42 + types/mempool/mempool_test.go | 228 + types/mempool/sender_nonce.go | 233 + types/mempool/sender_nonce_property_test.go | 124 + types/mempool/sender_nonce_test.go | 193 + types/mempool/skip_list_test.go | 55 + types/module/configurator.go | 2 +- types/proto.go | 2 +- types/query/pagination.pb.go | 18 +- types/result.go | 2 +- types/result_test.go | 12 +- types/tx/service.pb.go | 28 +- types/tx/service.pb.gw.go | 16 +- types/tx/signing/signing.pb.go | 3 +- types/tx/tx.pb.go | 5 +- types/tx_msg.go | 6 +- x/auth/client/tx.go | 2 +- x/auth/keeper/keeper.go | 2 +- x/auth/keeper/migrations.go | 2 +- x/auth/legacy/v043/store.go | 4 +- x/auth/simulation/decoder.go | 2 +- x/auth/simulation/decoder_test.go | 2 +- x/auth/tx/builder.go | 15 +- x/auth/tx/encoder.go | 2 +- x/auth/tx/service.go | 2 +- x/auth/tx/service_test.go | 32 +- x/auth/types/account.go | 3 +- x/auth/types/auth.pb.go | 18 +- x/auth/types/genesis.go | 2 +- x/auth/types/genesis.pb.go | 4 +- x/auth/types/genesis_test.go | 2 +- x/auth/types/query.pb.go | 8 +- x/auth/types/query.pb.gw.go | 16 +- x/auth/vesting/client/cli/cli_test.go | 2 +- x/auth/vesting/client/testutil/suite.go | 2 +- x/auth/vesting/types/tx.pb.go | 6 +- x/auth/vesting/types/vesting.pb.go | 4 +- x/authz/authorization_grant.go | 2 +- x/authz/authorizations.go | 2 +- x/authz/authz.pb.go | 34 +- x/authz/client/testutil/tx.go | 2 +- x/authz/event.pb.go | 2 +- x/authz/genesis.pb.go | 14 +- x/authz/keeper/grpc_query.go | 2 +- x/authz/keeper/keeper.go | 2 +- x/authz/msgs.go | 8 +- x/authz/query.pb.go | 4 +- x/authz/query.pb.gw.go | 7 +- x/authz/tx.pb.go | 8 +- x/bank/client/rest/grpc_query_test.go | 3 +- x/bank/client/testutil/suite.go | 2 +- x/bank/keeper/keeper_test.go | 20 +- x/bank/types/authz.pb.go | 10 +- x/bank/types/bank.pb.go | 75 +- x/bank/types/genesis.pb.go | 4 +- x/bank/types/query.pb.go | 6 +- x/bank/types/query.pb.gw.go | 34 +- x/bank/types/tx.pb.go | 6 +- x/capability/types/capability.pb.go | 4 +- x/capability/types/genesis.pb.go | 4 +- x/crisis/client/testsuite/suite.go | 2 +- x/crisis/types/genesis.pb.go | 4 +- x/crisis/types/tx.pb.go | 6 +- x/distribution/client/rest/grpc_query_test.go | 2 +- x/distribution/client/testutil/suite.go | 2 +- x/distribution/keeper/store.go | 2 +- x/distribution/types/distribution.pb.go | 15 +- x/distribution/types/genesis.pb.go | 4 +- x/distribution/types/query.pb.go | 6 +- x/distribution/types/query.pb.gw.go | 31 +- x/distribution/types/tx.pb.go | 6 +- x/evidence/abci.go | 2 +- x/evidence/exported/evidence.go | 2 +- x/evidence/genesis.go | 2 +- x/evidence/keeper/grpc_query.go | 2 +- x/evidence/types/evidence.go | 2 +- x/evidence/types/evidence.pb.go | 12 +- x/evidence/types/evidence_test.go | 4 +- x/evidence/types/genesis.go | 2 +- x/evidence/types/genesis.pb.go | 2 +- x/evidence/types/msgs.go | 4 +- x/evidence/types/query.pb.go | 6 +- x/evidence/types/query.pb.gw.go | 10 +- x/evidence/types/tx.pb.go | 8 +- x/feegrant/client/testutil/suite.go | 2 +- x/feegrant/feegrant.pb.go | 97 +- x/feegrant/filtered_fee.go | 2 +- x/feegrant/genesis.pb.go | 4 +- x/feegrant/grant.go | 3 +- x/feegrant/keeper/grpc_query.go | 2 +- x/feegrant/msgs.go | 4 +- x/feegrant/query.pb.go | 4 +- x/feegrant/query.pb.gw.go | 10 +- x/feegrant/tx.pb.go | 8 +- x/genutil/client/cli/migrate.go | 2 - x/genutil/collect_test.go | 2 +- x/genutil/legacy/v040/migrate.go | 200 - x/genutil/legacy/v040/types.go | 5 - x/genutil/types/genesis.pb.go | 4 +- x/gov/client/testutil/suite.go | 2 +- x/gov/keeper/proposal.go | 2 +- x/gov/keeper/proposal_test.go | 5 +- x/gov/legacy/v040/migrate.go | 2 +- x/gov/types/genesis.pb.go | 4 +- x/gov/types/gov.pb.go | 258 +- x/gov/types/msgs.go | 7 +- x/gov/types/proposal.go | 2 +- x/gov/types/query.pb.go | 6 +- x/gov/types/query.pb.gw.go | 28 +- x/gov/types/tx.pb.go | 8 +- x/mint/client/rest/grpc_query_test.go | 3 +- x/mint/types/genesis.pb.go | 4 +- x/mint/types/mint.pb.go | 4 +- x/mint/types/query.pb.go | 6 +- x/mint/types/query.pb.gw.go | 13 +- x/params/client/rest/grpc_query_test.go | 2 +- x/params/keeper/consensus_params.go | 3 +- x/params/types/proposal/params.pb.go | 4 +- x/params/types/proposal/query.pb.go | 6 +- x/params/types/proposal/query.pb.gw.go | 7 +- x/simulation/mock_tendermint.go | 10 +- x/simulation/params.go | 9 +- x/simulation/simulate.go | 2 +- x/slashing/abci_test.go | 6 +- x/slashing/client/rest/grpc_query_test.go | 2 +- x/slashing/client/testutil/suite.go | 2 +- x/slashing/keeper/signing_info.go | 2 +- x/slashing/simulation/decoder.go | 2 +- x/slashing/simulation/decoder_test.go | 2 +- x/slashing/types/genesis.pb.go | 4 +- x/slashing/types/query.pb.go | 6 +- x/slashing/types/query.pb.gw.go | 13 +- x/slashing/types/slashing.pb.go | 18 +- x/slashing/types/tx.pb.go | 6 +- x/staking/client/rest/grpc_query_test.go | 3 +- x/staking/client/testutil/suite.go | 2 +- x/staking/handler_test.go | 8 +- x/staking/keeper/val_state_change.go | 2 +- x/staking/keeper/validator.go | 2 +- x/staking/legacy/v040/genesis.pb.go | 944 --- x/staking/legacy/v040/keys.go | 330 - x/staking/legacy/v040/migrate.go | 142 - x/staking/legacy/v040/migrate_test.go | 97 - x/staking/legacy/v040/staking.pb.go | 6621 ----------------- x/staking/legacy/v040/types.go | 409 +- x/staking/types/authz.pb.go | 58 +- x/staking/types/genesis.pb.go | 4 +- x/staking/types/historical_info.go | 2 +- x/staking/types/query.pb.go | 6 +- x/staking/types/query.pb.gw.go | 46 +- x/staking/types/staking.pb.go | 1149 ++- x/staking/types/tx.pb.go | 22 +- x/upgrade/types/query.pb.go | 4 +- x/upgrade/types/query.pb.gw.go | 16 +- x/upgrade/types/upgrade.pb.go | 12 +- 308 files changed, 7565 insertions(+), 13717 deletions(-) create mode 100644 baseapp/testutil/buf.gen.yaml create mode 100644 baseapp/testutil/buf.lock create mode 100644 baseapp/testutil/buf.yaml create mode 100644 baseapp/testutil/messages.go create mode 100644 baseapp/testutil/messages.pb.go create mode 100644 baseapp/testutil/messages.proto create mode 100644 baseapp/utils_test.go create mode 100644 buf.lock create mode 100644 buf.work.yaml create mode 100644 contrib/rosetta/rosetta-ci/Dockerfile create mode 100644 contrib/rosetta/rosetta-ci/data.tar.gz create mode 100644 proto/buf.gen.gogo.yaml create mode 100644 proto/buf.gen.swagger.yaml create mode 100644 proto/buf.lock create mode 100644 proto/buf.md create mode 100644 proto/buf.yaml rename {third_party/proto => proto}/tendermint/abci/types.proto (70%) rename {third_party/proto => proto}/tendermint/crypto/keys.proto (100%) rename {third_party/proto => proto}/tendermint/crypto/proof.proto (100%) rename {third_party/proto => proto}/tendermint/libs/bits/types.proto (100%) rename {third_party/proto => proto}/tendermint/p2p/types.proto (100%) rename {third_party/proto => proto}/tendermint/types/block.proto (100%) rename {third_party/proto => proto}/tendermint/types/evidence.proto (57%) rename {third_party/proto => proto}/tendermint/types/params.proto (80%) rename {third_party/proto => proto}/tendermint/types/types.proto (94%) rename {third_party/proto => proto}/tendermint/types/validator.proto (100%) rename {third_party/proto => proto}/tendermint/version/types.proto (100%) create mode 100644 simapp/abci.go create mode 100644 testutil/testdata/buf.gen.yaml create mode 100644 testutil/testdata/buf.lock create mode 100644 testutil/testdata/buf.yaml delete mode 100644 third_party/proto/confio/proofs.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 create mode 100644 types/mempool/mempool.go create mode 100644 types/mempool/mempool_test.go create mode 100644 types/mempool/sender_nonce.go create mode 100644 types/mempool/sender_nonce_property_test.go create mode 100644 types/mempool/sender_nonce_test.go create mode 100644 types/mempool/skip_list_test.go delete mode 100644 x/genutil/legacy/v040/migrate.go delete mode 100644 x/genutil/legacy/v040/types.go delete mode 100644 x/staking/legacy/v040/genesis.pb.go delete mode 100644 x/staking/legacy/v040/keys.go delete mode 100644 x/staking/legacy/v040/migrate.go delete mode 100644 x/staking/legacy/v040/migrate_test.go delete mode 100644 x/staking/legacy/v040/staking.pb.go diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 168f1419c37b..c594d58b2e6e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -173,7 +173,7 @@ build, in which case we can fall back on `go mod tidy -v`. ## Protobuf -We use [Protocol Buffers](https://developers.google.com/protocol-buffers) along with [gogoproto](https://github.com/gogo/protobuf) to generate code for use in Cosmos SDK. +We use [Protocol Buffers](https://developers.google.com/protocol-buffers) along with [gogoproto](https://github.com/cosmos/gogoproto) to generate code for use in Cosmos SDK. For determinstic behavior around Protobuf tooling, everything is containerized using Docker. Make sure to have Docker installed on your machine, or head to [Docker's website](https://docs.docker.com/get-docker/) to install it. diff --git a/Makefile b/Makefile index 3fdcd3400cd2..cb4698bf781e 100644 --- a/Makefile +++ b/Makefile @@ -152,7 +152,7 @@ mocks: $(MOCKS_DIR) $(mockgen_cmd) -source=types/module/module.go -package mocks -destination tests/mocks/types_module_module.go $(mockgen_cmd) -source=types/invariant.go -package mocks -destination tests/mocks/types_invariant.go $(mockgen_cmd) -source=types/router.go -package mocks -destination tests/mocks/types_router.go - $(mockgen_cmd) -package mocks -destination tests/mocks/grpc_server.go github.com/gogo/protobuf/grpc Server + $(mockgen_cmd) -package mocks -destination tests/mocks/grpc_server.go github.com/cosmos/gogoproto/grpc Server $(mockgen_cmd) -package mocks -destination tests/mocks/tendermint_tendermint_libs_log_DB.go github.com/tendermint/tendermint/libs/log Logger .PHONY: mocks @@ -382,69 +382,41 @@ devdoc-update: ### Protobuf ### ############################################################################### -containerProtoVer=v0.2 -containerProtoImage=tendermintdev/sdk-proto-gen:$(containerProtoVer) -containerProtoGen=cosmos-sdk-proto-gen-$(containerProtoVer) -containerProtoGenSwagger=cosmos-sdk-proto-gen-swagger-$(containerProtoVer) -containerProtoFmt=cosmos-sdk-proto-fmt-$(containerProtoVer) +protoVer=0.11.2 +protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer) +protoImage=$(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace $(protoImageName) proto-all: proto-format proto-lint proto-gen proto-gen: @echo "Generating Protobuf files" - @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoGen}$$"; then docker start -a $(containerProtoGen); else docker run --name $(containerProtoGen) -v $(CURDIR):/workspace --workdir /workspace $(containerProtoImage) \ - sh ./scripts/protocgen.sh; fi - -# This generates the SDK's custom wrapper for google.protobuf.Any. It should only be run manually when needed -proto-gen-any: - @echo "Generating Protobuf Any" - $(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace $(containerProtoImage) sh ./scripts/protocgen-any.sh + @$(protoImage) sh ./scripts/protocgen.sh proto-swagger-gen: @echo "Generating Protobuf Swagger" - @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoGenSwagger}$$"; then docker start -a $(containerProtoGenSwagger); else docker run --name $(containerProtoGenSwagger) -v $(CURDIR):/workspace --workdir /workspace $(containerProtoImage) \ - sh ./scripts/protoc-swagger-gen.sh; fi + @$(protoImage) sh ./scripts/protoc-swagger-gen.sh proto-format: - @echo "Formatting Protobuf files" - @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoFmt}$$"; then docker start -a $(containerProtoFmt); else docker run --name $(containerProtoFmt) -v $(CURDIR):/workspace --workdir /workspace tendermintdev/docker-build-proto \ - find ./ -not -path "./third_party/*" -name "*.proto" -exec clang-format -i {} \; ; fi - + @$(protoImage) find ./ -name "*.proto" -exec clang-format -i {} \; proto-lint: - @$(DOCKER_BUF) lint --error-format=json + @$(protoImage) buf lint --error-format=json proto-check-breaking: - @$(DOCKER_BUF) breaking --against $(HTTPS_GIT)#branch=v0.44.3x-osmo-v5 - + @$(protoImage) buf breaking --against $(HTTPS_GIT)#branch=osmosis-main -TM_URL = https://raw.githubusercontent.com/tendermint/tendermint/v0.34.0-rc6/proto/tendermint -GOGO_PROTO_URL = https://raw.githubusercontent.com/regen-network/protobuf/cosmos -COSMOS_PROTO_URL = https://raw.githubusercontent.com/regen-network/cosmos-proto/master -CONFIO_URL = https://raw.githubusercontent.com/confio/ics23/v0.6.3 +TM_URL = https://raw.githubusercontent.com/tendermint/tendermint/v0.37.0-rc1/proto/tendermint -TM_CRYPTO_TYPES = third_party/proto/tendermint/crypto -TM_ABCI_TYPES = third_party/proto/tendermint/abci -TM_TYPES = third_party/proto/tendermint/types -TM_VERSION = third_party/proto/tendermint/version -TM_LIBS = third_party/proto/tendermint/libs/bits -TM_P2P = third_party/proto/tendermint/p2p - -GOGO_PROTO_TYPES = third_party/proto/gogoproto -COSMOS_PROTO_TYPES = third_party/proto/cosmos_proto -CONFIO_TYPES = third_party/proto/confio +TM_CRYPTO_TYPES = proto/tendermint/crypto +TM_ABCI_TYPES = proto/tendermint/abci +TM_TYPES = proto/tendermint/types +TM_VERSION = proto/tendermint/version +TM_LIBS = proto/tendermint/libs/bits +TM_P2P = proto/tendermint/p2p proto-update-deps: - @mkdir -p $(GOGO_PROTO_TYPES) - @curl -sSL $(GOGO_PROTO_URL)/gogoproto/gogo.proto > $(GOGO_PROTO_TYPES)/gogo.proto - - @mkdir -p $(COSMOS_PROTO_TYPES) - @curl -sSL $(COSMOS_PROTO_URL)/cosmos.proto > $(COSMOS_PROTO_TYPES)/cosmos.proto + @echo "Updating Protobuf dependencies" -## Importing of tendermint protobuf definitions currently requires the -## use of `sed` in order to build properly with cosmos-sdk's proto file layout -## (which is the standard Buf.build FILE_LAYOUT) -## Issue link: https://github.com/tendermint/tendermint/issues/5021 @mkdir -p $(TM_ABCI_TYPES) @curl -sSL $(TM_URL)/abci/types.proto > $(TM_ABCI_TYPES)/types.proto @@ -468,13 +440,9 @@ proto-update-deps: @mkdir -p $(TM_P2P) @curl -sSL $(TM_URL)/p2p/types.proto > $(TM_P2P)/types.proto - @mkdir -p $(CONFIO_TYPES) - @curl -sSL $(CONFIO_URL)/proofs.proto > $(CONFIO_TYPES)/proofs.proto -## insert go package option into proofs.proto file -## Issue link: https://github.com/confio/ics23/issues/32 - @sed -i '4ioption go_package = "github.com/confio/ics23/go";' $(CONFIO_TYPES)/proofs.proto + $(DOCKER) run --rm -v $(CURDIR)/proto:/workspace --workdir /workspace $(protoImageName) buf mod update -.PHONY: proto-all proto-gen proto-gen-any proto-swagger-gen proto-format proto-lint proto-check-breaking proto-update-deps +.PHONY: proto-all proto-gen proto-swagger-gen proto-format proto-lint proto-check-breaking proto-update-deps ############################################################################### ### Localnet ### diff --git a/baseapp/abci.go b/baseapp/abci.go index ac56a0c284bb..c3b88db13e74 100644 --- a/baseapp/abci.go +++ b/baseapp/abci.go @@ -11,7 +11,7 @@ import ( "syscall" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "google.golang.org/grpc/codes" @@ -43,6 +43,8 @@ func (app *BaseApp) InitChain(req abci.RequestInitChain) (res abci.ResponseInitC // req.InitialHeight is 1 by default. initHeader := tmproto.Header{ChainID: req.ChainId, Time: req.Time} + app.logger.Info("InitChain", "initialHeight", req.InitialHeight, "chainID", req.ChainId) + // If req.InitialHeight is > 1, then we set the initial version in the // stores. if req.InitialHeight > 1 { @@ -54,9 +56,11 @@ func (app *BaseApp) InitChain(req abci.RequestInitChain) (res abci.ResponseInitC } } - // initialize the deliver state and check state with a correct header + // initialize states with a correct header app.setDeliverState(initHeader) app.setCheckState(initHeader) + app.setPrepareProposalState(initHeader) + app.setProcessProposalState(initHeader) if err := app.SetAppVersion(initialAppVersion); err != nil { panic(err) @@ -66,10 +70,10 @@ func (app *BaseApp) InitChain(req abci.RequestInitChain) (res abci.ResponseInitC // done after the deliver state and context have been set as it's persisted // to state. if req.ConsensusParams != nil { - // When InitChain is called, the app version should either be absent and determined by the application - // or set to 0. Panic if it's not. - if req.ConsensusParams.Version != nil && req.ConsensusParams.Version.AppVersion != initialAppVersion { - panic(AppVersionError{Actual: req.ConsensusParams.Version.AppVersion, Initial: initialAppVersion}) + // When InitChain is called, the app version should either be absent and + // determined by the application or set to 0. Panic if it's not. + if req.ConsensusParams.Version != nil && req.ConsensusParams.Version.App != initialAppVersion { + panic(AppVersionError{Actual: req.ConsensusParams.Version.App, Initial: initialAppVersion}) } app.StoreConsensusParams(app.deliverState.ctx, req.ConsensusParams) @@ -147,12 +151,6 @@ func (app *BaseApp) Info(req abci.RequestInfo) abci.ResponseInfo { } } -// SetOption implements the ABCI interface. -func (app *BaseApp) SetOption(req abci.RequestSetOption) (res abci.ResponseSetOption) { - // TODO: Implement! - return -} - // FilterPeerByAddrPort filters peers by address/port. func (app *BaseApp) FilterPeerByAddrPort(info string) abci.ResponseQuery { if app.addrPeerFilter != nil { @@ -200,21 +198,20 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg // add block gas meter var gasMeter sdk.GasMeter - if maxGas := app.getMaximumBlockGas(app.deliverState.ctx); maxGas > 0 { + if maxGas := app.GetMaximumBlockGas(app.deliverState.ctx); maxGas > 0 { gasMeter = sdk.NewGasMeter(maxGas) } else { gasMeter = sdk.NewInfiniteGasMeter() } // NOTE: header hash is not set in NewContext, so we manually set it here - app.deliverState.ctx = app.deliverState.ctx. WithBlockGasMeter(gasMeter). WithHeaderHash(req.Hash). WithConsensusParams(app.GetConsensusParams(app.deliverState.ctx)) - // we also set block gas meter to checkState in case the application needs to - // verify gas consumption during (Re)CheckTx + // We also set block gas meter to checkState in case the application needs to + // verify gas consumption during (Re)CheckTx. if app.checkState != nil { app.checkState.ctx = app.checkState.ctx. WithBlockGasMeter(gasMeter). @@ -250,6 +247,59 @@ func (app *BaseApp) EndBlock(req abci.RequestEndBlock) (res abci.ResponseEndBloc return res } +// PrepareProposal implements the PrepareProposal ABCI method and returns a +// ResponsePrepareProposal object to the client. The PrepareProposal method is +// responsible for allowing the block proposer to perform application-dependent +// work in a block before proposing it. +// +// Transactions can be modified, removed, or added by the application. Since the +// application maintains its own local mempool, it will ignore the transactions +// provided to it in RequestPrepareProposal. Instead, it will determine which +// transactions to return based on the mempool's semantics and the MaxTxBytes +// provided by the client's request. +// +// Note, there is no need to execute the transactions for validity as they have +// already passed CheckTx. +// +// Ref: https://github.com/cosmos/cosmos-sdk/blob/main/docs/architecture/adr-060-abci-1.0.md +// Ref: https://github.com/tendermint/tendermint/blob/main/spec/abci/abci%2B%2B_basic_concepts.md +func (app *BaseApp) PrepareProposal(req abci.RequestPrepareProposal) abci.ResponsePrepareProposal { + ctx := app.getContextForTx(runTxPrepareProposal, []byte{}) + if app.prepareProposal == nil { + panic("PrepareProposal method not set") + } + + return app.prepareProposal(ctx, req) +} + +// ProcessProposal implements the ProcessProposal ABCI method and returns a +// ResponseProcessProposal object to the client. The ProcessProposal method is +// responsible for allowing execution of application-dependent work in a proposed +// block. Note, the application defines the exact implementation details of +// ProcessProposal. In general, the application must at the very least ensure +// that all transactions are valid. If all transactions are valid, then we inform +// Tendermint that the Status is ACCEPT. However, the application is also able +// to implement optimizations such as executing the entire proposed block +// immediately. It may even execute the block in parallel. +// +// Ref: https://github.com/cosmos/cosmos-sdk/blob/main/docs/architecture/adr-060-abci-1.0.md +// Ref: https://github.com/tendermint/tendermint/blob/main/spec/abci/abci%2B%2B_basic_concepts.md +func (app *BaseApp) ProcessProposal(req abci.RequestProcessProposal) abci.ResponseProcessProposal { + if app.processProposal == nil { + panic("app.ProcessProposal is not set") + } + + ctx := app.processProposalState.ctx. + WithVoteInfos(app.voteInfos). + WithBlockHeight(req.Height). + WithBlockTime(req.Time). + WithHeaderHash(req.Hash). + WithProposer(req.ProposerAddress). + WithConsensusParams(app.GetConsensusParams(app.processProposalState.ctx)) + + return app.processProposal(ctx, req) +} + // CheckTx implements the ABCI interface and executes a tx in CheckTx mode. In // CheckTx mode, messages are not executed. This means messages are only validated // and only the AnteHandler is executed. State is persisted to the BaseApp's @@ -343,6 +393,8 @@ func (app *BaseApp) Commit() (res abci.ResponseCommit) { // NOTE: This is safe because Tendermint holds a lock on the mempool for // Commit. Use the header from this latest block. app.setCheckState(header) + app.setPrepareProposalState(header) + app.setProcessProposalState(header) // empty/reset the deliver state app.deliverState = nil @@ -568,7 +620,7 @@ func (app *BaseApp) ApplySnapshotChunk(req abci.RequestApplySnapshotChunk) abci. } func (app *BaseApp) handleQueryGRPC(handler GRPCQueryHandler, req abci.RequestQuery) abci.ResponseQuery { - ctx, err := app.createQueryContext(req.Height, req.Prove) + ctx, err := app.CreateQueryContext(req.Height, req.Prove) if err != nil { return sdkerrors.QueryResultWithDebug(err, app.trace) } @@ -614,9 +666,9 @@ func checkNegativeHeight(height int64) error { return nil } -// createQueryContext creates a new sdk.Context for a query, taking as args +// CreateQueryContext creates a new sdk.Context for a query, taking as args // the block height and whether the query needs a proof or not. -func (app *BaseApp) createQueryContext(height int64, prove bool) (sdk.Context, error) { +func (app *BaseApp) CreateQueryContext(height int64, prove bool) (sdk.Context, error) { if err := checkNegativeHeight(height); err != nil { return sdk.Context{}, err } @@ -897,7 +949,7 @@ func handleQueryCustom(app *BaseApp, path []string, req abci.RequestQuery) abci. return sdkerrors.QueryResultWithDebug(sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "no custom querier found for route %s", path[1]), app.trace) } - ctx, err := app.createQueryContext(req.Height, req.Prove) + ctx, err := app.CreateQueryContext(req.Height, req.Prove) if err != nil { return sdkerrors.QueryResultWithDebug(err, app.trace) } diff --git a/baseapp/abci_test.go b/baseapp/abci_test.go index ead6c5e68fb3..e4897efdcc26 100644 --- a/baseapp/abci_test.go +++ b/baseapp/abci_test.go @@ -1,106 +1,1289 @@ -package baseapp +package baseapp_test import ( + "bytes" "fmt" + "strings" "testing" + "github.com/cosmos/gogoproto/jsonpb" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" - tmprototypes "github.com/tendermint/tendermint/proto/tendermint/types" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" + "github.com/cosmos/cosmos-sdk/baseapp" + baseapptestutil "github.com/cosmos/cosmos-sdk/baseapp/testutil" pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" "github.com/cosmos/cosmos-sdk/snapshots" snapshottypes "github.com/cosmos/cosmos-sdk/snapshots/types" - "github.com/cosmos/cosmos-sdk/testutil/mock" - snaphotstestutil "github.com/cosmos/cosmos-sdk/testutil/snapshots" + "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/types/mempool" + "github.com/cosmos/cosmos-sdk/x/auth/signing" ) -func TestGetBlockRentionHeight(t *testing.T) { +func TestABCI_Info(t *testing.T) { + suite := NewBaseAppSuite(t) + + reqInfo := abci.RequestInfo{} + res := suite.baseApp.Info(reqInfo) + + require.Equal(t, "", res.Version) + require.Equal(t, t.Name(), res.GetData()) + require.Equal(t, int64(0), res.LastBlockHeight) + require.Equal(t, []uint8(nil), res.LastBlockAppHash) + + appVersion, err := suite.baseApp.GetAppVersion() + require.NoError(t, err) + + require.Equal(t, appVersion, res.AppVersion) +} + +func TestABCI_InitChain(t *testing.T) { + name := t.Name() + db := dbm.NewMemDB() logger := defaultLogger() + app := baseapp.NewBaseApp(name, logger, db, nil) + + capKey := sdk.NewKVStoreKey("main") + capKey2 := sdk.NewKVStoreKey("key2") + app.MountStores(capKey, capKey2) + + // set a value in the store on init chain + key, value := []byte("hello"), []byte("goodbye") + var initChainer sdk.InitChainer = func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + store := ctx.KVStore(capKey) + store.Set(key, value) + return abci.ResponseInitChain{} + } + + query := abci.RequestQuery{ + Path: "/store/main/key", + Data: key, + } + + // initChain is nil - nothing happens + app.InitChain(abci.RequestInitChain{}) + res := app.Query(query) + require.Equal(t, 0, len(res.Value)) + + // set initChainer and try again - should see the value + app.SetInitChainer(initChainer) + + // stores are mounted and private members are set - sealing baseapp + err := app.LoadLatestVersion() // needed to make stores non-nil + require.Nil(t, err) + require.Equal(t, int64(0), app.LastBlockHeight()) + + initChainRes := app.InitChain(abci.RequestInitChain{AppStateBytes: []byte("{}"), ChainId: "test-chain-id"}) // must have valid JSON genesis file, even if empty + + // The AppHash returned by a new chain is the sha256 hash of "". + // $ echo -n '' | sha256sum + // e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + require.Equal( + t, + []byte{0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}, + initChainRes.AppHash, + ) + + // assert that chainID is set correctly in InitChain + chainID := getDeliverStateCtx(app).ChainID() + require.Equal(t, "test-chain-id", chainID, "ChainID in deliverState not set correctly in InitChain") + + chainID = getCheckStateCtx(app).ChainID() + require.Equal(t, "test-chain-id", chainID, "ChainID in checkState not set correctly in InitChain") + + app.Commit() + res = app.Query(query) + require.Equal(t, int64(1), app.LastBlockHeight()) + require.Equal(t, value, res.Value) + + // reload app + app = baseapp.NewBaseApp(name, logger, db, nil) + app.SetInitChainer(initChainer) + app.MountStores(capKey, capKey2) + err = app.LoadLatestVersion() // needed to make stores non-nil + require.Nil(t, err) + require.Equal(t, int64(1), app.LastBlockHeight()) + + // ensure we can still query after reloading + res = app.Query(query) + require.Equal(t, value, res.Value) + + // commit and ensure we can still query + header := tmproto.Header{Height: app.LastBlockHeight() + 1} + app.BeginBlock(abci.RequestBeginBlock{Header: header}) + app.Commit() + + res = app.Query(query) + require.Equal(t, value, res.Value) +} + +func TestABCI_InitChain_WithInitialHeight(t *testing.T) { + name := t.Name() db := dbm.NewMemDB() + logger := defaultLogger() + app := baseapp.NewBaseApp(name, logger, db, nil) + + app.InitChain( + abci.RequestInitChain{ + InitialHeight: 3, + }, + ) + app.Commit() + + require.Equal(t, int64(3), app.LastBlockHeight()) +} + +func TestABCI_BeginBlock_WithInitialHeight(t *testing.T) { name := t.Name() + db := dbm.NewMemDB() + logger := defaultLogger() + app := baseapp.NewBaseApp(name, logger, db, nil) + + app.InitChain( + abci.RequestInitChain{ + InitialHeight: 3, + }, + ) + + require.PanicsWithError(t, "invalid height: 4; expected: 3", func() { + app.BeginBlock(abci.RequestBeginBlock{ + Header: tmproto.Header{ + Height: 4, + }, + }) + }) + + app.BeginBlock(abci.RequestBeginBlock{ + Header: tmproto.Header{ + Height: 3, + }, + }) + app.Commit() + + require.Equal(t, int64(3), app.LastBlockHeight()) +} + +func TestABCI_GRPCQuery(t *testing.T) { + grpcQueryOpt := func(bapp *baseapp.BaseApp) { + testdata.RegisterQueryServer( + bapp.GRPCQueryRouter(), + testdata.QueryImpl{}, + ) + } + + suite := NewBaseAppSuite(t, grpcQueryOpt) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) - snapshotStore, err := snapshots.NewStore(dbm.NewMemDB(), snaphotstestutil.GetTempDir(t)) + header := tmproto.Header{Height: suite.baseApp.LastBlockHeight() + 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + suite.baseApp.Commit() + + req := testdata.SayHelloRequest{Name: "foo"} + reqBz, err := req.Marshal() require.NoError(t, err) + reqQuery := abci.RequestQuery{ + Data: reqBz, + Path: "/testdata.Query/SayHello", + } + + resQuery := suite.baseApp.Query(reqQuery) + require.Equal(t, abci.CodeTypeOK, resQuery.Code, resQuery) + + var res testdata.SayHelloResponse + require.NoError(t, res.Unmarshal(resQuery.Value)) + require.Equal(t, "Hello foo!", res.Greeting) +} + +func TestABCI_P2PQuery(t *testing.T) { + addrPeerFilterOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAddrPeerFilter(func(addrport string) abci.ResponseQuery { + require.Equal(t, "1.1.1.1:8000", addrport) + return abci.ResponseQuery{Code: uint32(3)} + }) + } + + idPeerFilterOpt := func(bapp *baseapp.BaseApp) { + bapp.SetIDPeerFilter(func(id string) abci.ResponseQuery { + require.Equal(t, "testid", id) + return abci.ResponseQuery{Code: uint32(4)} + }) + } + + suite := NewBaseAppSuite(t, addrPeerFilterOpt, idPeerFilterOpt) + + addrQuery := abci.RequestQuery{ + Path: "/p2p/filter/addr/1.1.1.1:8000", + } + res := suite.baseApp.Query(addrQuery) + require.Equal(t, uint32(3), res.Code) + + idQuery := abci.RequestQuery{ + Path: "/p2p/filter/id/testid", + } + res = suite.baseApp.Query(idQuery) + require.Equal(t, uint32(4), res.Code) +} + +func TestABCI_ListSnapshots(t *testing.T) { + ssCfg := SnapshotsConfig{ + blocks: 5, + blockTxs: 4, + snapshotInterval: 2, + snapshotKeepRecent: 2, + pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), + } + + suite := NewBaseAppSuiteWithSnapshots(t, ssCfg) + + resp := suite.baseApp.ListSnapshots(abci.RequestListSnapshots{}) + for _, s := range resp.Snapshots { + require.NotEmpty(t, s.Hash) + require.NotEmpty(t, s.Metadata) + + s.Hash = nil + s.Metadata = nil + } + + require.Equal(t, abci.ResponseListSnapshots{Snapshots: []*abci.Snapshot{ + {Height: 4, Format: snapshottypes.CurrentFormat, Chunks: 2}, + {Height: 2, Format: snapshottypes.CurrentFormat, Chunks: 1}, + }}, resp) +} + +func TestABCI_SnapshotWithPruning(t *testing.T) { testCases := map[string]struct { - bapp *BaseApp + ssCfg SnapshotsConfig + expectedSnapshots []*abci.Snapshot + }{ + "prune nothing with snapshot": { + ssCfg: SnapshotsConfig{ + blocks: 20, + blockTxs: 2, + snapshotInterval: 5, + snapshotKeepRecent: 1, + pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), + }, + expectedSnapshots: []*abci.Snapshot{ + {Height: 20, Format: snapshottypes.CurrentFormat, Chunks: 5}, + }, + }, + "prune everything with snapshot": { + ssCfg: SnapshotsConfig{ + blocks: 20, + blockTxs: 2, + snapshotInterval: 5, + snapshotKeepRecent: 1, + pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningEverything), + }, + expectedSnapshots: []*abci.Snapshot{ + {Height: 20, Format: snapshottypes.CurrentFormat, Chunks: 5}, + }, + }, + "default pruning with snapshot": { + ssCfg: SnapshotsConfig{ + blocks: 20, + blockTxs: 2, + snapshotInterval: 5, + snapshotKeepRecent: 1, + pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningDefault), + }, + expectedSnapshots: []*abci.Snapshot{ + {Height: 20, Format: snapshottypes.CurrentFormat, Chunks: 5}, + }, + }, + "custom": { + ssCfg: SnapshotsConfig{ + blocks: 25, + blockTxs: 2, + snapshotInterval: 5, + snapshotKeepRecent: 2, + pruningOpts: pruningtypes.NewCustomPruningOptions(12, 12), + }, + expectedSnapshots: []*abci.Snapshot{ + {Height: 25, Format: snapshottypes.CurrentFormat, Chunks: 6}, + {Height: 20, Format: snapshottypes.CurrentFormat, Chunks: 5}, + }, + }, + "no snapshots": { + ssCfg: SnapshotsConfig{ + blocks: 10, + blockTxs: 2, + snapshotInterval: 0, // 0 implies disable snapshots + pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), + }, + expectedSnapshots: []*abci.Snapshot{}, + }, + "keep all snapshots": { + ssCfg: SnapshotsConfig{ + blocks: 10, + blockTxs: 2, + snapshotInterval: 3, + snapshotKeepRecent: 0, // 0 implies keep all snapshots + pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), + }, + expectedSnapshots: []*abci.Snapshot{ + {Height: 9, Format: snapshottypes.CurrentFormat, Chunks: 2}, + {Height: 6, Format: snapshottypes.CurrentFormat, Chunks: 2}, + {Height: 3, Format: snapshottypes.CurrentFormat, Chunks: 1}, + }, + }, + } + + for name, tc := range testCases { + t.Run(name, func(t *testing.T) { + suite := NewBaseAppSuiteWithSnapshots(t, tc.ssCfg) + + resp := suite.baseApp.ListSnapshots(abci.RequestListSnapshots{}) + for _, s := range resp.Snapshots { + require.NotEmpty(t, s.Hash) + require.NotEmpty(t, s.Metadata) + + s.Hash = nil + s.Metadata = nil + } + + require.Equal(t, abci.ResponseListSnapshots{Snapshots: tc.expectedSnapshots}, resp) + + // Validate that heights were pruned correctly by querying the state at the last height that should be present relative to latest + // and the first height that should be pruned. + // + // Exceptions: + // * Prune nothing: should be able to query all heights (we only test first and latest) + // * Prune default: should be able to query all heights (we only test first and latest) + // * The reason for default behaving this way is that we only commit 20 heights but default has 100_000 keep-recent + var lastExistingHeight int64 + if tc.ssCfg.pruningOpts.GetPruningStrategy() == pruningtypes.PruningNothing || tc.ssCfg.pruningOpts.GetPruningStrategy() == pruningtypes.PruningDefault { + lastExistingHeight = 1 + } else { + // Integer division rounds down so by multiplying back we get the last height at which we pruned + lastExistingHeight = int64((tc.ssCfg.blocks/tc.ssCfg.pruningOpts.Interval)*tc.ssCfg.pruningOpts.Interval - tc.ssCfg.pruningOpts.KeepRecent) + } + + // Query 1 + res := suite.baseApp.Query(abci.RequestQuery{Path: fmt.Sprintf("/store/%s/key", capKey2.Name()), Data: []byte("0"), Height: lastExistingHeight}) + require.NotNil(t, res, "height: %d", lastExistingHeight) + require.NotNil(t, res.Value, "height: %d", lastExistingHeight) + + // Query 2 + res = suite.baseApp.Query(abci.RequestQuery{Path: fmt.Sprintf("/store/%s/key", capKey2.Name()), Data: []byte("0"), Height: lastExistingHeight - 1}) + require.NotNil(t, res, "height: %d", lastExistingHeight-1) + + if tc.ssCfg.pruningOpts.GetPruningStrategy() == pruningtypes.PruningNothing || tc.ssCfg.pruningOpts.GetPruningStrategy() == pruningtypes.PruningDefault { + // With prune nothing or default, we query height 0 which translates to the latest height. + require.NotNil(t, res.Value, "height: %d", lastExistingHeight-1) + } + }) + } +} + +func TestABCI_LoadSnapshotChunk(t *testing.T) { + ssCfg := SnapshotsConfig{ + blocks: 2, + blockTxs: 5, + snapshotInterval: 2, + snapshotKeepRecent: snapshottypes.CurrentFormat, + pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), + } + suite := NewBaseAppSuiteWithSnapshots(t, ssCfg) + + testCases := map[string]struct { + height uint64 + format uint32 + chunk uint32 + expectEmpty bool + }{ + "Existing snapshot": {2, snapshottypes.CurrentFormat, 1, false}, + "Missing height": {100, snapshottypes.CurrentFormat, 1, true}, + "Missing format": {2, snapshottypes.CurrentFormat + 1, 1, true}, + "Missing chunk": {2, snapshottypes.CurrentFormat, 9, true}, + "Zero height": {0, snapshottypes.CurrentFormat, 1, true}, + "Zero format": {2, 0, 1, true}, + "Zero chunk": {2, snapshottypes.CurrentFormat, 0, false}, + } + + for name, tc := range testCases { + t.Run(name, func(t *testing.T) { + resp := suite.baseApp.LoadSnapshotChunk(abci.RequestLoadSnapshotChunk{ + Height: tc.height, + Format: tc.format, + Chunk: tc.chunk, + }) + if tc.expectEmpty { + require.Equal(t, abci.ResponseLoadSnapshotChunk{}, resp) + return + } + + require.NotEmpty(t, resp.Chunk) + }) + } +} + +func TestABCI_OfferSnapshot_Errors(t *testing.T) { + ssCfg := SnapshotsConfig{ + blocks: 0, + blockTxs: 0, + snapshotInterval: 2, + snapshotKeepRecent: 2, + pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), + } + suite := NewBaseAppSuiteWithSnapshots(t, ssCfg) + + m := snapshottypes.Metadata{ChunkHashes: [][]byte{{1}, {2}, {3}}} + metadata, err := m.Marshal() + require.NoError(t, err) + + hash := []byte{1, 2, 3} + + testCases := map[string]struct { + snapshot *abci.Snapshot + result abci.ResponseOfferSnapshot_Result + }{ + "nil snapshot": {nil, abci.ResponseOfferSnapshot_REJECT}, + "invalid format": {&abci.Snapshot{ + Height: 1, Format: 9, Chunks: 3, Hash: hash, Metadata: metadata, + }, abci.ResponseOfferSnapshot_REJECT_FORMAT}, + "incorrect chunk count": {&abci.Snapshot{ + Height: 1, Format: snapshottypes.CurrentFormat, Chunks: 2, Hash: hash, Metadata: metadata, + }, abci.ResponseOfferSnapshot_REJECT}, + "no chunks": {&abci.Snapshot{ + Height: 1, Format: snapshottypes.CurrentFormat, Chunks: 0, Hash: hash, Metadata: metadata, + }, abci.ResponseOfferSnapshot_REJECT}, + "invalid metadata serialization": {&abci.Snapshot{ + Height: 1, Format: snapshottypes.CurrentFormat, Chunks: 0, Hash: hash, Metadata: []byte{3, 1, 4}, + }, abci.ResponseOfferSnapshot_REJECT}, + } + for name, tc := range testCases { + tc := tc + t.Run(name, func(t *testing.T) { + resp := suite.baseApp.OfferSnapshot(abci.RequestOfferSnapshot{Snapshot: tc.snapshot}) + require.Equal(t, tc.result, resp.Result) + }) + } + + // Offering a snapshot after one has been accepted should error + resp := suite.baseApp.OfferSnapshot(abci.RequestOfferSnapshot{Snapshot: &abci.Snapshot{ + Height: 1, + Format: snapshottypes.CurrentFormat, + Chunks: 3, + Hash: []byte{1, 2, 3}, + Metadata: metadata, + }}) + require.Equal(t, abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_ACCEPT}, resp) + + resp = suite.baseApp.OfferSnapshot(abci.RequestOfferSnapshot{Snapshot: &abci.Snapshot{ + Height: 2, + Format: snapshottypes.CurrentFormat, + Chunks: 3, + Hash: []byte{1, 2, 3}, + Metadata: metadata, + }}) + require.Equal(t, abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_ABORT}, resp) +} + +func TestABCI_ApplySnapshotChunk(t *testing.T) { + srcCfg := SnapshotsConfig{ + blocks: 4, + blockTxs: 10, + snapshotInterval: 2, + snapshotKeepRecent: 2, + pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), + } + srcSuite := NewBaseAppSuiteWithSnapshots(t, srcCfg) + + targetCfg := SnapshotsConfig{ + blocks: 0, + blockTxs: 0, + snapshotInterval: 2, + snapshotKeepRecent: 2, + pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), + } + targetSuite := NewBaseAppSuiteWithSnapshots(t, targetCfg) + + // fetch latest snapshot to restore + respList := srcSuite.baseApp.ListSnapshots(abci.RequestListSnapshots{}) + require.NotEmpty(t, respList.Snapshots) + snapshot := respList.Snapshots[0] + + // make sure the snapshot has at least 3 chunks + require.GreaterOrEqual(t, snapshot.Chunks, uint32(3), "Not enough snapshot chunks") + + // begin a snapshot restoration in the target + respOffer := targetSuite.baseApp.OfferSnapshot(abci.RequestOfferSnapshot{Snapshot: snapshot}) + require.Equal(t, abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_ACCEPT}, respOffer) + + // We should be able to pass an invalid chunk and get a verify failure, before + // reapplying it. + respApply := targetSuite.baseApp.ApplySnapshotChunk(abci.RequestApplySnapshotChunk{ + Index: 0, + Chunk: []byte{9}, + Sender: "sender", + }) + require.Equal(t, abci.ResponseApplySnapshotChunk{ + Result: abci.ResponseApplySnapshotChunk_RETRY, + RefetchChunks: []uint32{0}, + RejectSenders: []string{"sender"}, + }, respApply) + + // fetch each chunk from the source and apply it to the target + for index := uint32(0); index < snapshot.Chunks; index++ { + respChunk := srcSuite.baseApp.LoadSnapshotChunk(abci.RequestLoadSnapshotChunk{ + Height: snapshot.Height, + Format: snapshot.Format, + Chunk: index, + }) + require.NotNil(t, respChunk.Chunk) + + respApply := targetSuite.baseApp.ApplySnapshotChunk(abci.RequestApplySnapshotChunk{ + Index: index, + Chunk: respChunk.Chunk, + }) + require.Equal(t, abci.ResponseApplySnapshotChunk{ + Result: abci.ResponseApplySnapshotChunk_ACCEPT, + }, respApply) + } + + // the target should now have the same hash as the source + require.Equal(t, srcSuite.baseApp.LastCommitID(), targetSuite.baseApp.LastCommitID()) +} + +func TestABCI_EndBlock(t *testing.T) { + db := dbm.NewMemDB() + name := t.Name() + logger := defaultLogger() + + cp := &tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ + MaxGas: 5000000, + }, + } + + app := baseapp.NewBaseApp(name, logger, db, nil) + app.SetParamStore(¶mStore{db: dbm.NewMemDB()}) + app.InitChain(abci.RequestInitChain{ + ConsensusParams: cp, + }) + + app.SetEndBlocker(func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + return abci.ResponseEndBlock{ + ValidatorUpdates: []abci.ValidatorUpdate{ + {Power: 100}, + }, + } + }) + app.Seal() + + res := app.EndBlock(abci.RequestEndBlock{}) + require.Len(t, res.GetValidatorUpdates(), 1) + require.Equal(t, int64(100), res.GetValidatorUpdates()[0].Power) + require.Equal(t, cp.Block.MaxGas, res.ConsensusParamUpdates.Block.MaxGas) +} + +func TestABCI_CheckTx(t *testing.T) { + // This ante handler reads the key and checks that the value matches the + // current counter. This ensures changes to the KVStore persist across + // successive CheckTx runs. + counterKey := []byte("counter-key") + anteOpt := func(bapp *baseapp.BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, counterKey)) } + suite := NewBaseAppSuite(t, anteOpt) + + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImpl{t, capKey1, counterKey}) + + nTxs := int64(5) + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) + + for i := int64(0); i < nTxs; i++ { + tx := newTxCounter(t, suite.txConfig, i, 0) // no messages + txBytes, err := suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) + + r := suite.baseApp.CheckTx(abci.RequestCheckTx{Tx: txBytes}) + require.True(t, r.IsOK(), fmt.Sprintf("%v", r)) + require.Empty(t, r.GetEvents()) + } + + checkStateStore := getCheckStateCtx(suite.baseApp).KVStore(capKey1) + storedCounter := getIntFromStore(t, checkStateStore, counterKey) + + // ensure AnteHandler ran + require.Equal(t, nTxs, storedCounter) + + // if a block is committed, CheckTx state should be reset + header := tmproto.Header{Height: 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header, Hash: []byte("hash")}) + + require.NotNil(t, getCheckStateCtx(suite.baseApp).BlockGasMeter(), "block gas meter should have been set to checkState") + require.NotEmpty(t, getCheckStateCtx(suite.baseApp).HeaderHash()) + + suite.baseApp.EndBlock(abci.RequestEndBlock{}) + suite.baseApp.Commit() + + checkStateStore = getCheckStateCtx(suite.baseApp).KVStore(capKey1) + storedBytes := checkStateStore.Get(counterKey) + require.Nil(t, storedBytes) +} + +func TestABCI_DeliverTx(t *testing.T) { + anteKey := []byte("ante-key") + anteOpt := func(bapp *baseapp.BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) } + suite := NewBaseAppSuite(t, anteOpt) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) + + deliverKey := []byte("deliver-key") + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImpl{t, capKey1, deliverKey}) + + nBlocks := 3 + txPerHeight := 5 + + for blockN := 0; blockN < nBlocks; blockN++ { + header := tmproto.Header{Height: int64(blockN) + 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + + for i := 0; i < txPerHeight; i++ { + counter := int64(blockN*txPerHeight + i) + tx := newTxCounter(t, suite.txConfig, counter, counter) + + txBytes, err := suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) + + res := suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) + + events := res.GetEvents() + require.Len(t, events, 3, "should contain ante handler, message type and counter events respectively") + require.Equal(t, sdk.MarkEventsToIndex(counterEvent("ante_handler", counter).ToABCIEvents(), map[string]struct{}{})[0], events[0], "ante handler event") + require.Equal(t, sdk.MarkEventsToIndex(counterEvent(sdk.EventTypeMessage, counter).ToABCIEvents(), map[string]struct{}{})[0], events[2], "msg handler update counter event") + } + + suite.baseApp.EndBlock(abci.RequestEndBlock{}) + suite.baseApp.Commit() + } +} + +func TestABCI_DeliverTx_MultiMsg(t *testing.T) { + anteKey := []byte("ante-key") + anteOpt := func(bapp *baseapp.BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) } + suite := NewBaseAppSuite(t, anteOpt) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) + + deliverKey := []byte("deliver-key") + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImpl{t, capKey1, deliverKey}) + + deliverKey2 := []byte("deliver-key2") + baseapptestutil.RegisterCounter2Server(suite.baseApp.MsgServiceRouter(), Counter2ServerImpl{t, capKey1, deliverKey2}) + + // run a multi-msg tx + // with all msgs the same route + header := tmproto.Header{Height: 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + + tx := newTxCounter(t, suite.txConfig, 0, 0, 1, 2) + txBytes, err := suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) + + res := suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) + + store := getDeliverStateCtx(suite.baseApp).KVStore(capKey1) + + // tx counter only incremented once + txCounter := getIntFromStore(t, store, anteKey) + require.Equal(t, int64(1), txCounter) + + // msg counter incremented three times + msgCounter := getIntFromStore(t, store, deliverKey) + require.Equal(t, int64(3), msgCounter) + + // replace the second message with a Counter2 + tx = newTxCounter(t, suite.txConfig, 1, 3) + + builder := suite.txConfig.NewTxBuilder() + msgs := tx.GetMsgs() + msgs = append(msgs, &baseapptestutil.MsgCounter2{Counter: 0}) + msgs = append(msgs, &baseapptestutil.MsgCounter2{Counter: 1}) + + builder.SetMsgs(msgs...) + builder.SetMemo(tx.GetMemo()) + setTxSignature(t, builder, 0) + + txBytes, err = suite.txConfig.TxEncoder()(builder.GetTx()) + require.NoError(t, err) + + res = suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) + + store = getDeliverStateCtx(suite.baseApp).KVStore(capKey1) + + // tx counter only incremented once + txCounter = getIntFromStore(t, store, anteKey) + require.Equal(t, int64(2), txCounter) + + // original counter increments by one + // new counter increments by two + msgCounter = getIntFromStore(t, store, deliverKey) + require.Equal(t, int64(4), msgCounter) + + msgCounter2 := getIntFromStore(t, store, deliverKey2) + require.Equal(t, int64(2), msgCounter2) +} + +func TestABCI_Query_SimulateTx(t *testing.T) { + gasConsumed := uint64(5) + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasConsumed)) + return + }) + } + suite := NewBaseAppSuite(t, anteOpt) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) + + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImplGasMeterOnly{gasConsumed}) + + nBlocks := 3 + for blockN := 0; blockN < nBlocks; blockN++ { + count := int64(blockN + 1) + header := tmproto.Header{Height: count} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + + tx := newTxCounter(t, suite.txConfig, count, count) + + txBytes, err := suite.txConfig.TxEncoder()(tx) + require.Nil(t, err) + + // simulate a message, check gas reported + gInfo, result, err := suite.baseApp.Simulate(txBytes) + require.NoError(t, err) + require.NotNil(t, result) + require.Equal(t, gasConsumed, gInfo.GasUsed) + + // simulate again, same result + gInfo, result, err = suite.baseApp.Simulate(txBytes) + require.NoError(t, err) + require.NotNil(t, result) + require.Equal(t, gasConsumed, gInfo.GasUsed) + + // simulate by calling Query with encoded tx + query := abci.RequestQuery{ + Path: "/app/simulate", + Data: txBytes, + } + queryResult := suite.baseApp.Query(query) + require.True(t, queryResult.IsOK(), queryResult.Log) + + var simRes sdk.SimulationResponse + require.NoError(t, jsonpb.Unmarshal(strings.NewReader(string(queryResult.Value)), &simRes)) + + require.Equal(t, gInfo, simRes.GasInfo) + require.Equal(t, result.Log, simRes.Result.Log) + require.Equal(t, result.Events, simRes.Result.Events) + require.True(t, bytes.Equal(result.Data, simRes.Result.Data)) + + suite.baseApp.EndBlock(abci.RequestEndBlock{}) + suite.baseApp.Commit() + } +} + +func TestABCI_InvalidTransaction(t *testing.T) { + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + return + }) + } + + suite := NewBaseAppSuite(t, anteOpt) + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImplGasMeterOnly{}) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) + + header := tmproto.Header{Height: 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + + // transaction with no messages + { + emptyTx := suite.txConfig.NewTxBuilder().GetTx() + _, result, err := suite.baseApp.Deliver(suite.txConfig.TxEncoder(), emptyTx) + require.Error(t, err) + require.Nil(t, result) + + space, code, _ := sdkerrors.ABCIInfo(err, false) + require.EqualValues(t, sdkerrors.ErrInvalidRequest.Codespace(), space, err) + require.EqualValues(t, sdkerrors.ErrInvalidRequest.ABCICode(), code, err) + } + + // transaction where ValidateBasic fails + { + testCases := []struct { + tx signing.Tx + fail bool + }{ + {newTxCounter(t, suite.txConfig, 0, 0), false}, + {newTxCounter(t, suite.txConfig, -1, 0), false}, + {newTxCounter(t, suite.txConfig, 100, 100), false}, + {newTxCounter(t, suite.txConfig, 100, 5, 4, 3, 2, 1), false}, + + {newTxCounter(t, suite.txConfig, 0, -1), true}, + {newTxCounter(t, suite.txConfig, 0, 1, -2), true}, + {newTxCounter(t, suite.txConfig, 0, 1, 2, -10, 5), true}, + } + + for _, testCase := range testCases { + tx := testCase.tx + _, result, err := suite.baseApp.Deliver(suite.txConfig.TxEncoder(), tx) + + if testCase.fail { + require.Error(t, err) + + space, code, _ := sdkerrors.ABCIInfo(err, false) + require.EqualValues(t, sdkerrors.ErrInvalidSequence.Codespace(), space, err) + require.EqualValues(t, sdkerrors.ErrInvalidSequence.ABCICode(), code, err) + } else { + require.NotNil(t, result) + } + } + } + + // transaction with no known route + { + txBuilder := suite.txConfig.NewTxBuilder() + txBuilder.SetMsgs(&baseapptestutil.MsgCounter2{}) + setTxSignature(t, txBuilder, 0) + unknownRouteTx := txBuilder.GetTx() + + _, result, err := suite.baseApp.Deliver(suite.txConfig.TxEncoder(), unknownRouteTx) + require.Error(t, err) + require.Nil(t, result) + + space, code, _ := sdkerrors.ABCIInfo(err, false) + require.EqualValues(t, sdkerrors.ErrUnknownRequest.Codespace(), space, err) + require.EqualValues(t, sdkerrors.ErrUnknownRequest.ABCICode(), code, err) + + txBuilder = suite.txConfig.NewTxBuilder() + txBuilder.SetMsgs(&baseapptestutil.MsgCounter{}, &baseapptestutil.MsgCounter2{}) + setTxSignature(t, txBuilder, 0) + unknownRouteTx = txBuilder.GetTx() + + _, result, err = suite.baseApp.Deliver(suite.txConfig.TxEncoder(), unknownRouteTx) + require.Error(t, err) + require.Nil(t, result) + + space, code, _ = sdkerrors.ABCIInfo(err, false) + require.EqualValues(t, sdkerrors.ErrUnknownRequest.Codespace(), space, err) + require.EqualValues(t, sdkerrors.ErrUnknownRequest.ABCICode(), code, err) + } + + // Transaction with an unregistered message + { + txBuilder := suite.txConfig.NewTxBuilder() + txBuilder.SetMsgs(&testdata.MsgCreateDog{}) + tx := txBuilder.GetTx() + + txBytes, err := suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) + + res := suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.EqualValues(t, sdkerrors.ErrTxDecode.ABCICode(), res.Code) + require.EqualValues(t, sdkerrors.ErrTxDecode.Codespace(), res.Codespace) + } +} + +func TestABCI_TxGasLimits(t *testing.T) { + gasGranted := uint64(10) + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasGranted)) + + // AnteHandlers must have their own defer/recover in order for the BaseApp + // to know how much gas was used! This is because the GasMeter is created in + // the AnteHandler, but if it panics the context won't be set properly in + // runTx's recover call. + defer func() { + if r := recover(); r != nil { + switch rType := r.(type) { + case sdk.ErrorOutOfGas: + err = sdkerrors.Wrapf(sdkerrors.ErrOutOfGas, "out of gas in location: %v", rType.Descriptor) + default: + panic(r) + } + } + }() + + count, _ := parseTxMemo(t, tx) + newCtx.GasMeter().ConsumeGas(uint64(count), "counter-ante") + + return newCtx, nil + }) + } + + suite := NewBaseAppSuite(t, anteOpt) + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImplGasMeterOnly{}) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) + + header := tmproto.Header{Height: 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + + testCases := []struct { + tx signing.Tx + gasUsed uint64 + fail bool + }{ + {newTxCounter(t, suite.txConfig, 0, 0), 0, false}, + {newTxCounter(t, suite.txConfig, 1, 1), 2, false}, + {newTxCounter(t, suite.txConfig, 9, 1), 10, false}, + {newTxCounter(t, suite.txConfig, 1, 9), 10, false}, + {newTxCounter(t, suite.txConfig, 10, 0), 10, false}, + {newTxCounter(t, suite.txConfig, 0, 10), 10, false}, + {newTxCounter(t, suite.txConfig, 0, 8, 2), 10, false}, + {newTxCounter(t, suite.txConfig, 0, 5, 1, 1, 1, 1, 1), 10, false}, + {newTxCounter(t, suite.txConfig, 0, 5, 1, 1, 1, 1), 9, false}, + + {newTxCounter(t, suite.txConfig, 9, 2), 11, true}, + {newTxCounter(t, suite.txConfig, 2, 9), 11, true}, + {newTxCounter(t, suite.txConfig, 9, 1, 1), 11, true}, + {newTxCounter(t, suite.txConfig, 1, 8, 1, 1), 11, true}, + {newTxCounter(t, suite.txConfig, 11, 0), 11, true}, + {newTxCounter(t, suite.txConfig, 0, 11), 11, true}, + {newTxCounter(t, suite.txConfig, 0, 5, 11), 16, true}, + } + + for i, tc := range testCases { + tx := tc.tx + gInfo, result, err := suite.baseApp.Deliver(suite.txConfig.TxEncoder(), tx) + + // check gas used and wanted + require.Equal(t, tc.gasUsed, gInfo.GasUsed, fmt.Sprintf("tc #%d; gas: %v, result: %v, err: %s", i, gInfo, result, err)) + + // check for out of gas + if !tc.fail { + require.NotNil(t, result, fmt.Sprintf("%d: %v, %v", i, tc, err)) + } else { + require.Error(t, err) + require.Nil(t, result) + + space, code, _ := sdkerrors.ABCIInfo(err, false) + require.EqualValues(t, sdkerrors.ErrOutOfGas.Codespace(), space, err) + require.EqualValues(t, sdkerrors.ErrOutOfGas.ABCICode(), code, err) + } + } +} + +func TestABCI_MaxBlockGasLimits(t *testing.T) { + gasGranted := uint64(10) + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasGranted)) + + defer func() { + if r := recover(); r != nil { + switch rType := r.(type) { + case sdk.ErrorOutOfGas: + err = sdkerrors.Wrapf(sdkerrors.ErrOutOfGas, "out of gas in location: %v", rType.Descriptor) + default: + panic(r) + } + } + }() + + count, _ := parseTxMemo(t, tx) + newCtx.GasMeter().ConsumeGas(uint64(count), "counter-ante") + + return + }) + } + + suite := NewBaseAppSuite(t, anteOpt) + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImplGasMeterOnly{}) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ + MaxGas: 100, + }, + }, + }) + + header := tmproto.Header{Height: 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + + testCases := []struct { + tx signing.Tx + numDelivers int + gasUsedPerDeliver uint64 + fail bool + failAfterDeliver int + }{ + {newTxCounter(t, suite.txConfig, 0, 0), 0, 0, false, 0}, + {newTxCounter(t, suite.txConfig, 9, 1), 2, 10, false, 0}, + {newTxCounter(t, suite.txConfig, 10, 0), 3, 10, false, 0}, + {newTxCounter(t, suite.txConfig, 10, 0), 10, 10, false, 0}, + {newTxCounter(t, suite.txConfig, 2, 7), 11, 9, false, 0}, + {newTxCounter(t, suite.txConfig, 10, 0), 10, 10, false, 0}, // hit the limit but pass + + {newTxCounter(t, suite.txConfig, 10, 0), 11, 10, true, 10}, + {newTxCounter(t, suite.txConfig, 10, 0), 15, 10, true, 10}, + {newTxCounter(t, suite.txConfig, 9, 0), 12, 9, true, 11}, // fly past the limit + } + + for i, tc := range testCases { + tx := tc.tx + + // reset the block gas + header := tmproto.Header{Height: suite.baseApp.LastBlockHeight() + 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + + // execute the transaction multiple times + for j := 0; j < tc.numDelivers; j++ { + _, result, err := suite.baseApp.Deliver(suite.txConfig.TxEncoder(), tx) + + ctx := getDeliverStateCtx(suite.baseApp) + + // check for failed transactions + if tc.fail && (j+1) > tc.failAfterDeliver { + require.Error(t, err, fmt.Sprintf("tc #%d; result: %v, err: %s", i, result, err)) + require.Nil(t, result, fmt.Sprintf("tc #%d; result: %v, err: %s", i, result, err)) + + space, code, _ := sdkerrors.ABCIInfo(err, false) + require.EqualValues(t, sdkerrors.ErrOutOfGas.Codespace(), space, err) + require.EqualValues(t, sdkerrors.ErrOutOfGas.ABCICode(), code, err) + require.True(t, ctx.BlockGasMeter().IsOutOfGas()) + } else { + // check gas used and wanted + blockGasUsed := ctx.BlockGasMeter().GasConsumed() + expBlockGasUsed := tc.gasUsedPerDeliver * uint64(j+1) + require.Equal( + t, expBlockGasUsed, blockGasUsed, + fmt.Sprintf("%d,%d: %v, %v, %v, %v", i, j, tc, expBlockGasUsed, blockGasUsed, result), + ) + + require.NotNil(t, result, fmt.Sprintf("tc #%d; currDeliver: %d, result: %v, err: %s", i, j, result, err)) + require.False(t, ctx.BlockGasMeter().IsPastLimit()) + } + } + } +} + +func TestABCI_GasConsumptionBadTx(t *testing.T) { + gasWanted := uint64(5) + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasWanted)) + + defer func() { + if r := recover(); r != nil { + switch rType := r.(type) { + case sdk.ErrorOutOfGas: + log := fmt.Sprintf("out of gas in location: %v", rType.Descriptor) + err = sdkerrors.Wrap(sdkerrors.ErrOutOfGas, log) + default: + panic(r) + } + } + }() + + counter, failOnAnte := parseTxMemo(t, tx) + newCtx.GasMeter().ConsumeGas(uint64(counter), "counter-ante") + if failOnAnte { + return newCtx, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "ante handler failure") + } + + return + }) + } + + suite := NewBaseAppSuite(t, anteOpt) + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImplGasMeterOnly{}) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ + MaxGas: 9, + }, + }, + }) + + header := tmproto.Header{Height: suite.baseApp.LastBlockHeight() + 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + + tx := newTxCounter(t, suite.txConfig, 5, 0) + tx = setFailOnAnte(t, suite.txConfig, tx, true) + txBytes, err := suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) + + res := suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) + + // require next tx to fail due to black gas limit + tx = newTxCounter(t, suite.txConfig, 5, 0) + txBytes, err = suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) + + res = suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) +} + +func TestABCI_Query(t *testing.T) { + key, value := []byte("hello"), []byte("goodbye") + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + store := ctx.KVStore(capKey1) + store.Set(key, value) + return + }) + } + + suite := NewBaseAppSuite(t, anteOpt) + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImplGasMeterOnly{}) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) + + // NOTE: "/store/key1" tells us KVStore + // and the final "/key" says to use the data as the + // key in the given KVStore ... + query := abci.RequestQuery{ + Path: "/store/key1/key", + Data: key, + } + tx := newTxCounter(t, suite.txConfig, 0, 0) + + // query is empty before we do anything + res := suite.baseApp.Query(query) + require.Equal(t, 0, len(res.Value)) + + // query is still empty after a CheckTx + _, resTx, err := suite.baseApp.Check(suite.txConfig.TxEncoder(), tx) + require.NoError(t, err) + require.NotNil(t, resTx) + + res = suite.baseApp.Query(query) + require.Equal(t, 0, len(res.Value)) + + // query is still empty after a DeliverTx before we commit + header := tmproto.Header{Height: suite.baseApp.LastBlockHeight() + 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + + _, resTx, err = suite.baseApp.Deliver(suite.txConfig.TxEncoder(), tx) + require.NoError(t, err) + require.NotNil(t, resTx) + + res = suite.baseApp.Query(query) + require.Equal(t, 0, len(res.Value)) + + // query returns correct value after Commit + suite.baseApp.Commit() + + res = suite.baseApp.Query(query) + require.Equal(t, value, res.Value) +} + +func TestABCI_GetBlockRetentionHeight(t *testing.T) { + logger := defaultLogger() + db := dbm.NewMemDB() + name := t.Name() + + snapshotStore, err := snapshots.NewStore(dbm.NewMemDB(), t.TempDir()) + require.NoError(t, err) + + testCases := map[string]struct { + bapp *baseapp.BaseApp maxAgeBlocks int64 commitHeight int64 expected int64 }{ "defaults": { - bapp: NewBaseApp(name, logger, db, nil), + bapp: baseapp.NewBaseApp(name, logger, db, nil), maxAgeBlocks: 0, commitHeight: 499000, expected: 0, }, "pruning unbonding time only": { - bapp: NewBaseApp(name, logger, db, nil, SetMinRetainBlocks(1)), + bapp: baseapp.NewBaseApp(name, logger, db, nil, baseapp.SetMinRetainBlocks(1)), maxAgeBlocks: 362880, commitHeight: 499000, expected: 136120, }, "pruning iavl snapshot only": { - bapp: NewBaseApp( + bapp: baseapp.NewBaseApp( name, logger, db, nil, - SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)), - SetMinRetainBlocks(1), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(10000, 1)), + baseapp.SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)), + baseapp.SetMinRetainBlocks(1), + baseapp.SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(10000, 1)), ), maxAgeBlocks: 0, commitHeight: 499000, expected: 489000, }, "pruning state sync snapshot only": { - bapp: NewBaseApp( + bapp: baseapp.NewBaseApp( name, logger, db, nil, - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(50000, 3)), - SetMinRetainBlocks(1), + baseapp.SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(50000, 3)), + baseapp.SetMinRetainBlocks(1), ), maxAgeBlocks: 0, commitHeight: 499000, expected: 349000, }, "pruning min retention only": { - bapp: NewBaseApp( + bapp: baseapp.NewBaseApp( name, logger, db, nil, - SetMinRetainBlocks(400000), + baseapp.SetMinRetainBlocks(400000), ), maxAgeBlocks: 0, commitHeight: 499000, expected: 99000, }, "pruning all conditions": { - bapp: NewBaseApp( + bapp: baseapp.NewBaseApp( name, logger, db, nil, - SetPruning(pruningtypes.NewCustomPruningOptions(0, 0)), - SetMinRetainBlocks(400000), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(50000, 3)), + baseapp.SetPruning(pruningtypes.NewCustomPruningOptions(0, 0)), + baseapp.SetMinRetainBlocks(400000), + baseapp.SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(50000, 3)), ), maxAgeBlocks: 362880, commitHeight: 499000, expected: 99000, }, "no pruning due to no persisted state": { - bapp: NewBaseApp( + bapp: baseapp.NewBaseApp( name, logger, db, nil, - SetPruning(pruningtypes.NewCustomPruningOptions(0, 0)), - SetMinRetainBlocks(400000), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(50000, 3)), + baseapp.SetPruning(pruningtypes.NewCustomPruningOptions(0, 0)), + baseapp.SetMinRetainBlocks(400000), + baseapp.SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(50000, 3)), ), maxAgeBlocks: 362880, commitHeight: 10000, expected: 0, }, "disable pruning": { - bapp: NewBaseApp( + bapp: baseapp.NewBaseApp( name, logger, db, nil, - SetPruning(pruningtypes.NewCustomPruningOptions(0, 0)), - SetMinRetainBlocks(0), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(50000, 3)), + baseapp.SetPruning(pruningtypes.NewCustomPruningOptions(0, 0)), + baseapp.SetMinRetainBlocks(0), + baseapp.SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(50000, 3)), ), maxAgeBlocks: 362880, commitHeight: 499000, @@ -111,10 +1294,10 @@ func TestGetBlockRentionHeight(t *testing.T) { for name, tc := range testCases { tc := tc - tc.bapp.SetParamStore(&mock.ParamStore{Db: dbm.NewMemDB()}) + tc.bapp.SetParamStore(¶mStore{db: dbm.NewMemDB()}) tc.bapp.InitChain(abci.RequestInitChain{ - ConsensusParams: &abci.ConsensusParams{ - Evidence: &tmprototypes.EvidenceParams{ + ConsensusParams: &tmproto.ConsensusParams{ + Evidence: &tmproto.EvidenceParams{ MaxAgeNumBlocks: tc.maxAgeBlocks, }, }, @@ -126,24 +1309,157 @@ func TestGetBlockRentionHeight(t *testing.T) { } } -// Test and ensure that negative heights always cause errors. -// See issue https://github.com/cosmos/cosmos-sdk/issues/7662. -func TestBaseAppCreateQueryContextRejectsNegativeHeights(t *testing.T) { - t.Parallel() +func TestABCI_Proposal_HappyPath(t *testing.T) { + anteKey := []byte("ante-key") + pool := mempool.NewSenderNonceMempool() + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) + } - logger := defaultLogger() - db := dbm.NewMemDB() - name := t.Name() - app := NewBaseApp(name, logger, db, nil) + suite := NewBaseAppSuite(t, anteOpt, baseapp.SetMempool(pool)) + baseapptestutil.RegisterKeyValueServer(suite.baseApp.MsgServiceRouter(), MsgKeyValueImpl{}) + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), NoopCounterServerImpl{}) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) - proves := []bool{ - false, true, + suite.baseApp.BeginBlock(abci.RequestBeginBlock{ + Header: tmproto.Header{Height: suite.baseApp.LastBlockHeight() + 1}, + }) + + tx := newTxCounter(t, suite.txConfig, 0, 1) + txBytes, err := suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) + + reqCheckTx := abci.RequestCheckTx{ + Tx: txBytes, + Type: abci.CheckTxType_New, } - for _, prove := range proves { - t.Run(fmt.Sprintf("prove=%t", prove), func(t *testing.T) { - sctx, err := app.createQueryContext(-10, true) - require.Error(t, err) - require.Equal(t, sctx, sdk.Context{}) - }) + suite.baseApp.CheckTx(reqCheckTx) + + tx2 := newTxCounter(t, suite.txConfig, 1, 1) + + tx2Bytes, err := suite.txConfig.TxEncoder()(tx2) + require.NoError(t, err) + + err = pool.Insert(sdk.Context{}, tx2) + require.NoError(t, err) + + reqPrepareProposal := abci.RequestPrepareProposal{ + MaxTxBytes: 1000, + } + resPrepareProposal := suite.baseApp.PrepareProposal(reqPrepareProposal) + require.Equal(t, 2, len(resPrepareProposal.Txs)) + + reqProposalTxBytes := [2][]byte{ + txBytes, + tx2Bytes, + } + reqProcessProposal := abci.RequestProcessProposal{ + Txs: reqProposalTxBytes[:], + } + + resProcessProposal := suite.baseApp.ProcessProposal(reqProcessProposal) + require.Equal(t, abci.ResponseProcessProposal_ACCEPT, resProcessProposal.Status) + + res := suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.Equal(t, 1, pool.CountTx()) + + require.NotEmpty(t, res.Events) + require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) +} + +func TestABCI_PrepareProposal_ReachedMaxBytes(t *testing.T) { + anteKey := []byte("ante-key") + pool := mempool.NewSenderNonceMempool() + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) + } + suite := NewBaseAppSuite(t, anteOpt, baseapp.SetMempool(pool)) + + baseapptestutil.RegisterKeyValueServer(suite.baseApp.MsgServiceRouter(), MsgKeyValueImpl{}) + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), NoopCounterServerImpl{}) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) + + for i := 0; i < 100; i++ { + tx2 := newTxCounter(t, suite.txConfig, int64(i), int64(i)) + err := pool.Insert(sdk.Context{}, tx2) + require.NoError(t, err) + } + + reqPrepareProposal := abci.RequestPrepareProposal{ + MaxTxBytes: 1500, + } + resPrepareProposal := suite.baseApp.PrepareProposal(reqPrepareProposal) + require.Equal(t, 10, len(resPrepareProposal.Txs)) +} + +func TestABCI_PrepareProposal_BadEncoding(t *testing.T) { + anteKey := []byte("ante-key") + pool := mempool.NewSenderNonceMempool() + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) + } + suite := NewBaseAppSuite(t, anteOpt, baseapp.SetMempool(pool)) + + baseapptestutil.RegisterKeyValueServer(suite.baseApp.MsgServiceRouter(), MsgKeyValueImpl{}) + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), NoopCounterServerImpl{}) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) + + tx := newTxCounter(t, suite.txConfig, 0, 0) + err := pool.Insert(sdk.Context{}, tx) + require.NoError(t, err) + + reqPrepareProposal := abci.RequestPrepareProposal{ + MaxTxBytes: 1000, + } + resPrepareProposal := suite.baseApp.PrepareProposal(reqPrepareProposal) + require.Equal(t, 1, len(resPrepareProposal.Txs)) +} + +func TestABCI_PrepareProposal_Failures(t *testing.T) { + anteKey := []byte("ante-key") + pool := mempool.NewSenderNonceMempool() + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) + } + suite := NewBaseAppSuite(t, anteOpt, baseapp.SetMempool(pool)) + + baseapptestutil.RegisterKeyValueServer(suite.baseApp.MsgServiceRouter(), MsgKeyValueImpl{}) + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), NoopCounterServerImpl{}) + + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) + + tx := newTxCounter(t, suite.txConfig, 0, 0) + txBytes, err := suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) + + reqCheckTx := abci.RequestCheckTx{ + Tx: txBytes, + Type: abci.CheckTxType_New, + } + checkTxRes := suite.baseApp.CheckTx(reqCheckTx) + require.True(t, checkTxRes.IsOK()) + + failTx := newTxCounter(t, suite.txConfig, 1, 1) + failTx = setFailOnAnte(t, suite.txConfig, failTx, true) + + err = pool.Insert(sdk.Context{}, failTx) + require.NoError(t, err) + require.Equal(t, 2, pool.CountTx()) + + req := abci.RequestPrepareProposal{ + MaxTxBytes: 1000, } + res := suite.baseApp.PrepareProposal(req) + require.Equal(t, 1, len(res.Txs)) } diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 7ad784b7074c..9d5a9556fcb0 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -1,11 +1,12 @@ package baseapp import ( + "errors" "fmt" "reflect" "strings" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto/tmhash" "github.com/tendermint/tendermint/libs/log" @@ -18,6 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/store/rootmulti" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/types/mempool" "github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx" upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/exported" ) @@ -27,6 +29,8 @@ const ( runTxModeReCheck // Recheck a (pending) transaction after a commit runTxModeSimulate // Simulate a transaction runTxModeDeliver // Deliver a transaction + runTxPrepareProposal + runTxProcessProposal ) var ( @@ -57,17 +61,21 @@ type BaseApp struct { // nolint: maligned grpcQueryRouter *GRPCQueryRouter // router for redirecting gRPC query calls msgServiceRouter *MsgServiceRouter // router for redirecting Msg service messages interfaceRegistry types.InterfaceRegistry - txDecoder sdk.TxDecoder // unmarshal []byte into sdk.Tx + txDecoder sdk.TxDecoder // unmarshal []byte into sdk.Tx + txEncoder sdk.TxEncoder // marshal sdk.Tx into []byte + mempool mempool.Mempool // application-side mempool anteHandler sdk.AnteHandler // ante handler for fee and auth postHandler sdk.AnteHandler // post handler, optional, e.g. for tips - initChainer sdk.InitChainer // initialize state with validators and state blob - beginBlocker sdk.BeginBlocker // logic to run before any txs - endBlocker sdk.EndBlocker // logic to run after all txs, and to determine valset changes - addrPeerFilter sdk.PeerFilter // filter peers by address and port - idPeerFilter sdk.PeerFilter // filter peers by node ID - fauxMerkleMode bool // if true, IAVL MountStores uses MountStoresDB for simulation speed. + initChainer sdk.InitChainer // initialize state with validators and state blob + prepareProposal sdk.PrepareProposalHandler // the handler which runs on ABCI PrepareProposal + processProposal sdk.ProcessProposalHandler // the handler which runs on ABCI ProcessProposal + beginBlocker sdk.BeginBlocker // logic to run before any txs + endBlocker sdk.EndBlocker // logic to run after all txs, and to determine valset changes + addrPeerFilter sdk.PeerFilter // filter peers by address and port + idPeerFilter sdk.PeerFilter // filter peers by node ID + fauxMerkleMode bool // if true, IAVL MountStores uses MountStoresDB for simulation speed. // manages snapshots, i.e. dumps of app state at certain intervals snapshotManager *snapshots.Manager @@ -76,8 +84,10 @@ type BaseApp struct { // nolint: maligned // // checkState is set on InitChain and reset on Commit // deliverState is set on InitChain and BeginBlock and set to nil on Commit - checkState *state // for CheckTx - deliverState *state // for DeliverTx + checkState *state // for CheckTx + deliverState *state // for DeliverTx + processProposalState *state // for ProcessProposal + prepareProposalState *state // for PrepareProposal // an inter-block write-through cache provided to the context during deliverState interBlockCache sdk.MultiStorePersistentCache @@ -159,6 +169,18 @@ func NewBaseApp( option(app) } + if app.mempool == nil { + app.SetMempool(mempool.NewSenderNonceMempool()) + } + + if app.prepareProposal == nil { + app.SetPrepareProposal(app.DefaultPrepareProposal()) + } + + if app.processProposal == nil { + app.SetProcessProposal(app.DefaultProcessProposal()) + } + if app.interBlockCache != nil { app.cms.SetInterBlockCache(app.interBlockCache) } @@ -191,6 +213,11 @@ func (app *BaseApp) Trace() bool { // MsgServiceRouter returns the MsgServiceRouter of a BaseApp. func (app *BaseApp) MsgServiceRouter() *MsgServiceRouter { return app.msgServiceRouter } +// SetMsgServiceRouter sets the MsgServiceRouter of a BaseApp. +func (app *BaseApp) SetMsgServiceRouter(msgServiceRouter *MsgServiceRouter) { + app.msgServiceRouter = msgServiceRouter +} + // MountStores mounts all IAVL or DB stores to the provided keys in the BaseApp // multistore. func (app *BaseApp) MountStores(keys ...sdk.StoreKey) { @@ -308,8 +335,16 @@ func (app *BaseApp) init() error { panic("cannot call initFromMainStore: baseapp already sealed") } - // needed for the export command which inits from store but never calls initchain - app.setCheckState(tmproto.Header{}) + emptyHeader := tmproto.Header{} + + // Needed for the export command which inits from store but never calls + // InitChain. + app.setCheckState(emptyHeader) + + // Needed for ABCI Replay Blocks mode which calls Prepare/Process proposal + // (InitChain is not called). + app.setPrepareProposalState(emptyHeader) + app.setProcessProposalState(emptyHeader) appVersion, err := app.GetAppVersion() if err != nil { @@ -319,6 +354,7 @@ func (app *BaseApp) init() error { if err := app.SetAppVersion(appVersion); err != nil { return err } + app.Seal() rms, ok := app.cms.(*rootmulti.Store) @@ -380,6 +416,28 @@ func (app *BaseApp) Seal() { app.sealed = true } // IsSealed returns true if the BaseApp is sealed and false otherwise. func (app *BaseApp) IsSealed() bool { return app.sealed } +// setPrepareProposalState sets the BaseApp's prepareProposalState with a +// branched multi-store (i.e. a CacheMultiStore) and a new Context with the +// same multi-store branch, and provided header. It is set on InitChain and Commit. +func (app *BaseApp) setPrepareProposalState(header tmproto.Header) { + ms := app.cms.CacheMultiStore() + app.prepareProposalState = &state{ + ms: ms, + ctx: sdk.NewContext(ms, header, false, app.logger), + } +} + +// setProcessProposalState sets the BaseApp's processProposalState with a +// branched multi-store (i.e. a CacheMultiStore) and a new Context with the +// same multi-store branch, and provided header. It is set on InitChain and Commit. +func (app *BaseApp) setProcessProposalState(header tmproto.Header) { + ms := app.cms.CacheMultiStore() + app.processProposalState = &state{ + ms: ms, + ctx: sdk.NewContext(ms, header, false, app.logger), + } +} + // setCheckState sets the BaseApp's checkState with a branched multi-store // (i.e. a CacheMultiStore) and a new Context with the same multi-store branch, // provided header, and minimum gas prices set. It is set on InitChain and reset @@ -406,15 +464,15 @@ func (app *BaseApp) setDeliverState(header tmproto.Header) { // GetConsensusParams returns the current consensus parameters from the BaseApp's // ParamStore. If the BaseApp has no ParamStore defined, nil is returned. -func (app *BaseApp) GetConsensusParams(ctx sdk.Context) *abci.ConsensusParams { +func (app *BaseApp) GetConsensusParams(ctx sdk.Context) *tmproto.ConsensusParams { if app.paramStore == nil { return nil } - cp := new(abci.ConsensusParams) + cp := new(tmproto.ConsensusParams) if app.paramStore.Has(ctx, ParamStoreKeyBlockParams) { - var bp abci.BlockParams + var bp tmproto.BlockParams app.paramStore.Get(ctx, ParamStoreKeyBlockParams, &bp) cp.Block = &bp @@ -439,7 +497,7 @@ func (app *BaseApp) GetConsensusParams(ctx sdk.Context) *abci.ConsensusParams { panic(err) } cp.Version = &tmproto.VersionParams{ - AppVersion: appVersion, + App: appVersion, } return cp } @@ -452,7 +510,7 @@ func (app *BaseApp) AddRunTxRecoveryHandler(handlers ...RecoveryHandler) { } // StoreConsensusParams sets the consensus parameters to the baseapp's param store. -func (app *BaseApp) StoreConsensusParams(ctx sdk.Context, cp *abci.ConsensusParams) { +func (app *BaseApp) StoreConsensusParams(ctx sdk.Context, cp *tmproto.ConsensusParams) { if app.paramStore == nil { panic("cannot store consensus params with no params store set") } @@ -471,10 +529,10 @@ func (app *BaseApp) StoreConsensusParams(ctx sdk.Context, cp *abci.ConsensusPara // deserialized by the state-synching node to be validated in Tendermint. } -// getMaximumBlockGas gets the maximum gas from the consensus params. It panics +// GetMaximumBlockGas gets the maximum gas from the consensus params. It panics // if maximum block gas is less than negative one and returns zero if negative // one. -func (app *BaseApp) getMaximumBlockGas(ctx sdk.Context) uint64 { +func (app *BaseApp) GetMaximumBlockGas(ctx sdk.Context) uint64 { cp := app.GetConsensusParams(ctx) if cp == nil || cp.Block == nil { return 0 @@ -506,7 +564,7 @@ func (app *BaseApp) validateHeight(req abci.RequestBeginBlock) error { // previous commit). The height we're expecting is the initial height. expectedHeight = app.initialHeight } else { - // This case can means two things: + // This case can mean two things: // - either there was already a previous commit in the store, in which // case we increment the version from there, // - or there was no previous commit, and initial version was not set, @@ -537,23 +595,35 @@ func validateBasicTxMsgs(msgs []sdk.Msg) error { return nil } -// Returns the applications's deliverState if app is in runTxModeDeliver, +// Returns the application's deliverState if app is in runTxModeDeliver, // otherwise it returns the application's checkstate. func (app *BaseApp) getState(mode runTxMode) *state { - if mode == runTxModeDeliver { + switch mode { + case runTxModeDeliver: return app.deliverState - } - return app.checkState + case runTxPrepareProposal: + return app.prepareProposalState + + case runTxProcessProposal: + return app.processProposalState + + default: + return app.checkState + } } // retrieve the context for the tx w/ txBytes and other memoized values. func (app *BaseApp) getContextForTx(mode runTxMode, txBytes []byte) sdk.Context { - ctx := app.getState(mode).ctx. - WithTxBytes(txBytes). - WithVoteInfos(app.voteInfos) + modeState := app.getState(mode) + if modeState == nil { + panic(fmt.Sprintf("state is nil for mode %v", mode)) + } - ctx = ctx.WithConsensusParams(app.GetConsensusParams(ctx)) + ctx := modeState.ctx. + WithTxBytes(txBytes). + WithVoteInfos(app.voteInfos). + WithConsensusParams(app.GetConsensusParams(modeState.ctx)) if mode == runTxModeReCheck { ctx = ctx.WithIsReCheckTx(true) @@ -595,7 +665,7 @@ func (app *BaseApp) cacheTxContext(ctx sdk.Context, txBytes []byte) (sdk.Context func (app *BaseApp) runTx(mode runTxMode, txBytes []byte) (gInfo sdk.GasInfo, result *sdk.Result, anteEvents []abci.Event, err error) { // NOTE: GasWanted should be returned by the AnteHandler. GasUsed is // determined by the GasMeter. We need access to the context to get the gas - // meter so we initialize upfront. + // meter, so we initialize upfront. var gasWanted uint64 ctx := app.getContextForTx(mode, txBytes) @@ -616,9 +686,11 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte) (gInfo sdk.GasInfo, re gInfo = sdk.GasInfo{GasWanted: gasWanted, GasUsed: ctx.GasMeter().GasConsumed()} }() - blockGasConsumed := false - // consumeBlockGas makes sure block gas is consumed at most once. It must happen after - // tx processing, and must be execute even if tx processing fails. Hence we use trick with `defer` + var blockGasConsumed bool + + // Note, consumeBlockGas makes sure block gas is consumed at most once. It + // must happen after tx processing, and must be executed even if tx processing + // fails. Hence, we use trick with `defer`. consumeBlockGas := func() { if !blockGasConsumed { blockGasConsumed = true @@ -687,6 +759,16 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte) (gInfo sdk.GasInfo, re anteEvents = events.ToABCIEvents() } + if mode == runTxModeCheck { + if err := app.mempool.Insert(ctx, tx); err != nil { + return gInfo, nil, anteEvents, err + } + } else if mode == runTxModeDeliver { + if err := app.mempool.Remove(tx); err != nil && !errors.Is(err, mempool.ErrTxNotFound) { + return gInfo, nil, anteEvents, fmt.Errorf("failed to remove tx from mempool: %w", err) + } + } + // Create a new Context based off of the existing Context with a MultiStore branch // in case message processing fails. At this point, the MultiStore // is a branch of a branch. @@ -699,7 +781,7 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte) (gInfo sdk.GasInfo, re if err == nil { // Run optional postHandlers. // - // Note: If the postHandler fails, we also revert the runMsgs state! + // Note: If the postHandler fails, we also revert the runMsgs state. if app.postHandler != nil { newCtx, err := app.postHandler(runMsgCtx, tx, mode == runTxModeSimulate) if err != nil { @@ -714,11 +796,11 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte) (gInfo sdk.GasInfo, re consumeBlockGas() msCache.Write() + } - if len(anteEvents) > 0 { - // append the events in the order of occurrence - result.Events = append(anteEvents, result.Events...) - } + if len(anteEvents) > 0 && (mode == runTxModeDeliver || mode == runTxModeSimulate) { + // append the events in the order of occurrence + result.Events = append(anteEvents, result.Events...) } } @@ -803,3 +885,90 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s Events: events.ToABCIEvents(), }, nil } + +// DefaultPrepareProposal returns the default implementation for processing an +// ABCI proposal. The application's mempool is enumerated and all valid +// transactions are added to the proposal. Transactions are valid if they: +// +// 1) Successfully encode to bytes. +// 2) Are valid (i.e. pass runTx, AnteHandler only). +// +// Enumeration is halted once RequestPrepareProposal.MaxBytes of transactions is +// reached or the mempool is exhausted. +// +// Note that step (2) is identical to the validation step performed in +// DefaultProcessProposal. It is very important that the same validation logic +// is used in both steps, and applications must ensure that this is the case in +// non-default handlers. +func (app *BaseApp) DefaultPrepareProposal() sdk.PrepareProposalHandler { + return func(ctx sdk.Context, req abci.RequestPrepareProposal) abci.ResponsePrepareProposal { + var ( + txsBytes [][]byte + byteCount int64 + ) + + iterator := app.mempool.Select(ctx, req.Txs) + for iterator != nil { + memTx := iterator.Tx() + + bz, err := app.txEncoder(memTx) + if err != nil { + panic(err) + } + + txSize := int64(len(bz)) + + // NOTE: Since runTx was already executed in CheckTx, which calls + // mempool.Insert, ideally everything in the pool should be valid. + // some mempool implementations may insert invalid txs, so we check again. + _, _, _, err = app.runTx(runTxPrepareProposal, bz) + if err != nil { + if err := app.mempool.Remove(memTx); err != nil && !errors.Is(err, mempool.ErrTxNotFound) { + panic(err) + } + + iterator = iterator.Next() + continue + } else if byteCount += txSize; byteCount <= req.MaxTxBytes { + txsBytes = append(txsBytes, bz) + } else { + break + } + + iterator = iterator.Next() + } + + return abci.ResponsePrepareProposal{Txs: txsBytes} + } +} + +// DefaultProcessProposal returns the default implementation for processing an +// ABCI proposal. +// +// Every transaction in the proposal must pass 2 conditions: +// +// 1. The transaction bytes must decode to a valid transaction. +// 2. The transaction must be valid (i.e. pass runTx, AnteHandler only). +// +// If any transaction fails to pass either condition, the proposal is rejected. +// Note that step (2) is identical to the validation step performed in +// DefaultPrepareProposal. It is very important that the same validation logic +// is used in both steps, and applications must ensure that this is the case in +// non-default handlers. +func (app *BaseApp) DefaultProcessProposal() sdk.ProcessProposalHandler { + return func(ctx sdk.Context, req abci.RequestProcessProposal) abci.ResponseProcessProposal { + for _, txBytes := range req.Txs { + _, err := app.txDecoder(txBytes) + if err != nil { + return abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_REJECT} + } + + _, _, _, err = app.runTx(runTxProcessProposal, txBytes) + if err != nil { + return abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_REJECT} + } + } + + return abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_ACCEPT} + } +} diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index 247ebc3a51ec..f6883bb3c0e8 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -1,38 +1,30 @@ -package baseapp +package baseapp_test import ( - "bytes" - "encoding/binary" - "encoding/json" "fmt" - "io/ioutil" "math/rand" - "os" - "strings" - "sync" "testing" "time" - "github.com/gogo/protobuf/jsonpb" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" + "github.com/cosmos/cosmos-sdk/baseapp" + baseapptestutil "github.com/cosmos/cosmos-sdk/baseapp/testutil" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" "github.com/cosmos/cosmos-sdk/snapshots" snapshottypes "github.com/cosmos/cosmos-sdk/snapshots/types" "github.com/cosmos/cosmos-sdk/store/rootmulti" storetypes "github.com/cosmos/cosmos-sdk/store/types" - "github.com/cosmos/cosmos-sdk/testutil/mock" - snaphotstestutil "github.com/cosmos/cosmos-sdk/testutil/snapshots" - "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx" + authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" ) var ( @@ -40,159 +32,138 @@ var ( capKey2 = sdk.NewKVStoreKey("key2") ) -type setupConfig struct { - blocks uint64 - blockTxs int - snapshotInterval uint64 - snapshotKeepEvery uint32 - pruningOpts pruningtypes.PruningOptions -} +type ( + BaseAppSuite struct { + baseApp *baseapp.BaseApp + cdc *codec.ProtoCodec + txConfig client.TxConfig + } -func defaultLogger() log.Logger { - return log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") -} + SnapshotsConfig struct { + blocks uint64 + blockTxs int + snapshotInterval uint64 + snapshotKeepRecent uint32 + pruningOpts pruningtypes.PruningOptions + } +) -func newBaseApp(name string, options ...func(*BaseApp)) *BaseApp { - db := dbm.NewMemDB() - return newBaseAppWithDB(name, db, options...) -} +func NewBaseAppSuite(t *testing.T, opts ...func(*baseapp.BaseApp)) *BaseAppSuite { + cdc := codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) + baseapptestutil.RegisterInterfaces(cdc.InterfaceRegistry()) -func newBaseAppWithDB(name string, db dbm.DB, options ...func(*BaseApp)) *BaseApp { + txConfig := authtx.NewTxConfig(cdc, authtx.DefaultSignModes) logger := defaultLogger() - codec := codec.NewLegacyAmino() - registerTestCodec(codec) - return NewBaseApp(name, logger, db, testTxDecoder(codec), options...) -} - -func registerTestCodec(cdc *codec.LegacyAmino) { - // register Tx, Msg - sdk.RegisterLegacyAminoCodec(cdc) - - // register test types - cdc.RegisterConcrete(&txTest{}, "cosmos-sdk/baseapp/txTest", nil) - cdc.RegisterConcrete(&msgCounter{}, "cosmos-sdk/baseapp/msgCounter", nil) - cdc.RegisterConcrete(&msgCounter2{}, "cosmos-sdk/baseapp/msgCounter2", nil) - cdc.RegisterConcrete(&msgKeyValue{}, "cosmos-sdk/baseapp/msgKeyValue", nil) - cdc.RegisterConcrete(&msgNoRoute{}, "cosmos-sdk/baseapp/msgNoRoute", nil) -} - -// aminoTxEncoder creates a amino TxEncoder for testing purposes. -func aminoTxEncoder() sdk.TxEncoder { - cdc := codec.NewLegacyAmino() - registerTestCodec(cdc) - - return legacytx.StdTxConfig{Cdc: cdc}.TxEncoder() -} + db := dbm.NewMemDB() -// simple one store baseapp -func setupBaseApp(t *testing.T, options ...func(*BaseApp)) (*BaseApp, error) { - app := newBaseApp(t.Name(), options...) + app := baseapp.NewBaseApp(t.Name(), logger, db, txConfig.TxDecoder(), opts...) require.Equal(t, t.Name(), app.Name()) + app.SetInterfaceRegistry(cdc.InterfaceRegistry()) + app.MsgServiceRouter().SetInterfaceRegistry(cdc.InterfaceRegistry()) app.MountStores(capKey1, capKey2) - app.SetParamStore(&mock.ParamStore{Db: dbm.NewMemDB()}) + app.SetParamStore(¶mStore{db: dbm.NewMemDB()}) + app.SetTxDecoder(txConfig.TxDecoder()) + app.SetTxEncoder(txConfig.TxEncoder()) - // stores are mounted - err := app.LoadLatestVersion() - return app, err -} + // mount stores and seal + require.Nil(t, app.LoadLatestVersion()) -// simple one store baseapp with data and snapshots. Each tx is 1 MB in size (uncompressed). -func setupBaseAppWithSnapshots(t *testing.T, config *setupConfig) (*BaseApp, func(), error) { - codec := codec.NewLegacyAmino() - registerTestCodec(codec) - routerOpt := func(bapp *BaseApp) { - bapp.Router().AddRoute(sdk.NewRoute(routeMsgKeyValue, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - kv := msg.(*msgKeyValue) - bapp.cms.GetCommitKVStore(capKey2).Set(kv.Key, kv.Value) - return &sdk.Result{}, nil - })) + return &BaseAppSuite{ + baseApp: app, + cdc: cdc, + txConfig: txConfig, } +} - snapshotTimeout := 90 * time.Second - snapshotDir, err := ioutil.TempDir("", "baseapp") +func NewBaseAppSuiteWithSnapshots(t *testing.T, cfg SnapshotsConfig, opts ...func(*baseapp.BaseApp)) *BaseAppSuite { + snapshotTimeout := 1 * time.Minute + snapshotStore, err := snapshots.NewStore(dbm.NewMemDB(), t.TempDir()) require.NoError(t, err) - snapshotStore, err := snapshots.NewStore(dbm.NewMemDB(), snapshotDir) - require.NoError(t, err) - teardown := func() { - os.RemoveAll(snapshotDir) - } - app, err := setupBaseApp(t, routerOpt, SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(config.snapshotInterval, uint32(config.snapshotKeepEvery))), SetPruning(config.pruningOpts)) - if err != nil { - return nil, nil, err - } + suite := NewBaseAppSuite( + t, + append( + opts, + baseapp.SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(cfg.snapshotInterval, cfg.snapshotKeepRecent)), + baseapp.SetPruning(cfg.pruningOpts), + )..., + ) + + baseapptestutil.RegisterKeyValueServer(suite.baseApp.MsgServiceRouter(), MsgKeyValueImpl{}) - app.InitChain(abci.RequestInitChain{}) + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) r := rand.New(rand.NewSource(3920758213583)) keyCounter := 0 - for height := int64(1); height <= int64(config.blocks); height++ { - app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: height}}) - for txNum := 0; txNum < config.blockTxs; txNum++ { - tx := txTest{Msgs: []sdk.Msg{}} + + for height := int64(1); height <= int64(cfg.blocks); height++ { + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: height}}) + + for txNum := 0; txNum < cfg.blockTxs; txNum++ { + msgs := []sdk.Msg{} for msgNum := 0; msgNum < 100; msgNum++ { key := []byte(fmt.Sprintf("%v", keyCounter)) value := make([]byte, 10000) + _, err := r.Read(value) require.NoError(t, err) - tx.Msgs = append(tx.Msgs, msgKeyValue{Key: key, Value: value}) + + msgs = append(msgs, &baseapptestutil.MsgKeyValue{Key: key, Value: value}) keyCounter++ } - txBytes, err := codec.Marshal(tx) + + builder := suite.txConfig.NewTxBuilder() + builder.SetMsgs(msgs...) + setTxSignature(t, builder, 0) + + txBytes, err := suite.txConfig.TxEncoder()(builder.GetTx()) require.NoError(t, err) - resp := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + + resp := suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) require.True(t, resp.IsOK(), "%v", resp.String()) } - app.EndBlock(abci.RequestEndBlock{Height: height}) - app.Commit() - // Wait for snapshot to be taken, since it happens asynchronously. - if config.snapshotInterval > 0 && uint64(height)%config.snapshotInterval == 0 { + suite.baseApp.EndBlock(abci.RequestEndBlock{Height: height}) + suite.baseApp.Commit() + + // wait for snapshot to be taken, since it happens asynchronously + if cfg.snapshotInterval > 0 && uint64(height)%cfg.snapshotInterval == 0 { start := time.Now() for { if time.Since(start) > snapshotTimeout { t.Errorf("timed out waiting for snapshot after %v", snapshotTimeout) } + snapshot, err := snapshotStore.Get(uint64(height), snapshottypes.CurrentFormat) require.NoError(t, err) + if snapshot != nil { break } + time.Sleep(100 * time.Millisecond) } } } - return app, teardown, nil -} - -func TestMountStores(t *testing.T) { - app, err := setupBaseApp(t) - require.NoError(t, err) - - // check both stores - store1 := app.cms.GetCommitKVStore(capKey1) - require.NotNil(t, store1) - store2 := app.cms.GetCommitKVStore(capKey2) - require.NotNil(t, store2) + return suite } -// Test that we can make commits and then reload old versions. -// Test that LoadLatestVersion actually does. func TestLoadVersion(t *testing.T) { logger := defaultLogger() - pruningOpt := SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)) + pruningOpt := baseapp.SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)) db := dbm.NewMemDB() name := t.Name() - app := NewBaseApp(name, logger, db, nil, pruningOpt) - app.SetParamStore(&mock.ParamStore{Db: db}) + app := baseapp.NewBaseApp(name, logger, db, nil, pruningOpt) // make a cap key and mount the store err := app.LoadLatestVersion() // needed to make stores non-nil require.Nil(t, err) - emptyCommitID := sdk.CommitID{} + emptyCommitID := storetypes.CommitID{} // fresh store has zero/empty last commit lastHeight := app.LastBlockHeight() @@ -204,75 +175,81 @@ func TestLoadVersion(t *testing.T) { header := tmproto.Header{Height: 1} app.BeginBlock(abci.RequestBeginBlock{Header: header}) res := app.Commit() - commitID1 := sdk.CommitID{Version: 1, Hash: res.Data} + commitID1 := storetypes.CommitID{Version: 1, Hash: res.Data} // execute a block, collect commit ID header = tmproto.Header{Height: 2} app.BeginBlock(abci.RequestBeginBlock{Header: header}) res = app.Commit() - commitID2 := sdk.CommitID{Version: 2, Hash: res.Data} + commitID2 := storetypes.CommitID{Version: 2, Hash: res.Data} // reload with LoadLatestVersion - app = NewBaseApp(name, logger, db, nil, pruningOpt) - app.SetParamStore(&mock.ParamStore{Db: db}) + app = baseapp.NewBaseApp(name, logger, db, nil, pruningOpt) app.MountStores() + err = app.LoadLatestVersion() require.Nil(t, err) + testLoadVersionHelper(t, app, int64(2), commitID2) - // reload with LoadVersion, see if you can commit the same block and get - // the same result - app = NewBaseApp(name, logger, db, nil, pruningOpt) - app.SetParamStore(&mock.ParamStore{Db: db}) + // Reload with LoadVersion, see if you can commit the same block and get + // the same result. + app = baseapp.NewBaseApp(name, logger, db, nil, pruningOpt) err = app.LoadVersion(1) require.Nil(t, err) + testLoadVersionHelper(t, app, int64(1), commitID1) + app.BeginBlock(abci.RequestBeginBlock{Header: header}) app.Commit() + testLoadVersionHelper(t, app, int64(2), commitID2) } -func useDefaultLoader(app *BaseApp) { - app.SetStoreLoader(DefaultStoreLoader) -} +func TestSetLoader(t *testing.T) { + useDefaultLoader := func(app *baseapp.BaseApp) { + app.SetStoreLoader(baseapp.DefaultStoreLoader) + } -func initStore(t *testing.T, db dbm.DB, storeKey string, k, v []byte) { - rs := rootmulti.NewStore(db, log.NewNopLogger()) - rs.SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)) - key := sdk.NewKVStoreKey(storeKey) - rs.MountStoreWithDB(key, storetypes.StoreTypeIAVL, nil) - err := rs.LoadLatestVersion() - require.Nil(t, err) - require.Equal(t, int64(0), rs.LastCommitID().Version) - - // write some data in substore - kv, _ := rs.GetStore(key).(storetypes.KVStore) - require.NotNil(t, kv) - kv.Set(k, v) - commitID := rs.Commit() - require.Equal(t, int64(1), commitID.Version) -} + initStore := func(t *testing.T, db dbm.DB, storeKey string, k, v []byte) { + rs := rootmulti.NewStore(db, log.NewNopLogger()) + rs.SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)) -func checkStore(t *testing.T, db dbm.DB, ver int64, storeKey string, k, v []byte) { - rs := rootmulti.NewStore(db, log.NewNopLogger()) - rs.SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningDefault)) - key := sdk.NewKVStoreKey(storeKey) - rs.MountStoreWithDB(key, storetypes.StoreTypeIAVL, nil) - err := rs.LoadLatestVersion() - require.Nil(t, err) - require.Equal(t, ver, rs.LastCommitID().Version) + key := sdk.NewKVStoreKey(storeKey) + rs.MountStoreWithDB(key, storetypes.StoreTypeIAVL, nil) - // query data in substore - kv, _ := rs.GetStore(key).(storetypes.KVStore) - require.NotNil(t, kv) - require.Equal(t, v, kv.Get(k)) -} + err := rs.LoadLatestVersion() + require.Nil(t, err) + require.Equal(t, int64(0), rs.LastCommitID().Version) -// Test that we can make commits and then reload old versions. -// Test that LoadLatestVersion actually does. -func TestSetLoader(t *testing.T) { - cases := map[string]struct { - setLoader func(*BaseApp) + // write some data in substore + kv, _ := rs.GetStore(key).(storetypes.KVStore) + require.NotNil(t, kv) + kv.Set(k, v) + + commitID := rs.Commit() + require.Equal(t, int64(1), commitID.Version) + } + + checkStore := func(t *testing.T, db dbm.DB, ver int64, storeKey string, k, v []byte) { + rs := rootmulti.NewStore(db, log.NewNopLogger()) + rs.SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningDefault)) + + key := sdk.NewKVStoreKey(storeKey) + rs.MountStoreWithDB(key, storetypes.StoreTypeIAVL, nil) + + err := rs.LoadLatestVersion() + require.Nil(t, err) + require.Equal(t, ver, rs.LastCommitID().Version) + + // query data in substore + kv, _ := rs.GetStore(key).(storetypes.KVStore) + require.NotNil(t, kv) + require.Equal(t, v, kv.Get(k)) + } + + testCases := map[string]struct { + setLoader func(*baseapp.BaseApp) origStoreKey string loadStoreKey string }{ @@ -290,20 +267,18 @@ func TestSetLoader(t *testing.T) { k := []byte("key") v := []byte("value") - for name, tc := range cases { - tc := tc + for name, tc := range testCases { t.Run(name, func(t *testing.T) { // prepare a db with some data db := dbm.NewMemDB() initStore(t, db, tc.origStoreKey, k, v) // load the app with the existing db - opts := []func(*BaseApp){SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing))} + opts := []func(*baseapp.BaseApp){baseapp.SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing))} if tc.setLoader != nil { opts = append(opts, tc.setLoader) } - app := NewBaseApp(t.Name(), defaultLogger(), db, nil, opts...) - app.SetParamStore(&mock.ParamStore{Db: db}) + app := baseapp.NewBaseApp(t.Name(), defaultLogger(), db, nil, opts...) app.MountStores(sdk.NewKVStoreKey(tc.loadStoreKey)) err := app.LoadLatestVersion() require.Nil(t, err) @@ -322,10 +297,10 @@ func TestSetLoader(t *testing.T) { func TestVersionSetterGetter(t *testing.T) { logger := defaultLogger() - pruningOpt := SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningDefault)) + pruningOpt := baseapp.SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningDefault)) db := dbm.NewMemDB() name := t.Name() - app := NewBaseApp(name, logger, db, nil, pruningOpt) + app := baseapp.NewBaseApp(name, logger, db, nil, pruningOpt) require.Equal(t, "", app.Version()) res := app.Query(abci.RequestQuery{Path: "app/version"}) @@ -335,6 +310,7 @@ func TestVersionSetterGetter(t *testing.T) { versionString := "1.0.0" app.SetVersion(versionString) require.Equal(t, versionString, app.Version()) + res = app.Query(abci.RequestQuery{Path: "app/version"}) require.True(t, res.IsOK()) require.Equal(t, versionString, string(res.Value)) @@ -342,11 +318,10 @@ func TestVersionSetterGetter(t *testing.T) { func TestLoadVersionInvalid(t *testing.T) { logger := log.NewNopLogger() - pruningOpt := SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)) + pruningOpt := baseapp.SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)) db := dbm.NewMemDB() name := t.Name() - app := NewBaseApp(name, logger, db, nil, pruningOpt) - app.SetParamStore(&mock.ParamStore{Db: db}) + app := baseapp.NewBaseApp(name, logger, db, nil, pruningOpt) err := app.LoadLatestVersion() require.Nil(t, err) @@ -358,11 +333,10 @@ func TestLoadVersionInvalid(t *testing.T) { header := tmproto.Header{Height: 1} app.BeginBlock(abci.RequestBeginBlock{Header: header}) res := app.Commit() - commitID1 := sdk.CommitID{Version: 1, Hash: res.Data} + commitID1 := storetypes.CommitID{Version: 1, Hash: res.Data} // create a new app with the stores mounted under the same cap key - app = NewBaseApp(name, logger, db, nil, pruningOpt) - app.SetParamStore(&mock.ParamStore{Db: db}) + app = baseapp.NewBaseApp(name, logger, db, nil, pruningOpt) // require we can load the latest version err = app.LoadVersion(1) @@ -374,2142 +348,252 @@ func TestLoadVersionInvalid(t *testing.T) { require.Error(t, err) } -func TestLoadVersionPruning(t *testing.T) { - logger := log.NewNopLogger() - pruningOptions := pruningtypes.NewCustomPruningOptions(10, 15) - pruningOpt := SetPruning(pruningOptions) - db := dbm.NewMemDB() - name := t.Name() - - snapshotStore, err := snapshots.NewStore(dbm.NewMemDB(), snaphotstestutil.GetTempDir(t)) - require.NoError(t, err) - snapshotOpt := SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(3, 1)) - - app := NewBaseApp(name, logger, db, nil, pruningOpt, snapshotOpt) - app.SetParamStore(&mock.ParamStore{Db: db}) - - // make a cap key and mount the store - capKey := sdk.NewKVStoreKey("key1") - app.MountStores(capKey) - - err = app.LoadLatestVersion() // needed to make stores non-nil - require.Nil(t, err) - - emptyCommitID := sdk.CommitID{} - - // fresh store has zero/empty last commit - lastHeight := app.LastBlockHeight() - lastID := app.LastCommitID() - require.Equal(t, int64(0), lastHeight) - require.Equal(t, emptyCommitID, lastID) - - var lastCommitID sdk.CommitID - - // Commit 15 blocks, of which 15 (latest) is kept in addition to 5-14 inclusive - // (keep recent) and 3 (snapshot-interval). - for i := int64(1); i <= 15; i++ { - app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: i}}) - res := app.Commit() - lastCommitID = sdk.CommitID{Version: i, Hash: res.Data} - } - - for _, v := range []int64{1, 2, 3, 4} { - _, err = app.cms.CacheMultiStoreWithVersion(v) - require.NoError(t, err) - } - - for _, v := range []int64{3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14} { - _, err = app.cms.CacheMultiStoreWithVersion(v) - require.NoError(t, err) +func TestOptionFunction(t *testing.T) { + testChangeNameHelper := func(name string) func(*baseapp.BaseApp) { + return func(bap *baseapp.BaseApp) { + bap.SetName(name) + } } - // reload with LoadLatestVersion, check it loads last version - app = NewBaseApp(name, logger, db, nil, pruningOpt, snapshotOpt) - app.SetParamStore(&mock.ParamStore{Db: db}) - app.MountStores(capKey) - - err = app.LoadLatestVersion() - require.Nil(t, err) - testLoadVersionHelper(t, app, int64(15), lastCommitID) -} - -func testLoadVersionHelper(t *testing.T, app *BaseApp, expectedHeight int64, expectedID sdk.CommitID) { - lastHeight := app.LastBlockHeight() - lastID := app.LastCommitID() - require.Equal(t, expectedHeight, lastHeight) - require.Equal(t, expectedID, lastID) -} - -func TestOptionFunction(t *testing.T) { logger := defaultLogger() db := dbm.NewMemDB() - bap := NewBaseApp("starting name", logger, db, nil, testChangeNameHelper("new name")) - require.Equal(t, bap.name, "new name", "BaseApp should have had name changed via option function") -} - -func testChangeNameHelper(name string) func(*BaseApp) { - return func(bap *BaseApp) { - bap.name = name - } -} - -// Test that txs can be unmarshalled and read and that -// correct error codes are returned when not -func TestTxDecoder(t *testing.T) { - codec := codec.NewLegacyAmino() - registerTestCodec(codec) - - app := newBaseApp(t.Name()) - tx := newTxCounter(1, 0) - txBytes := codec.MustMarshal(tx) - - dTx, err := app.txDecoder(txBytes) - require.NoError(t, err) - - cTx := dTx.(txTest) - require.Equal(t, tx.Counter, cTx.Counter) -} - -// Test that Info returns the latest committed state. -func TestInfo(t *testing.T) { - app := newBaseApp(t.Name()) - app.SetParamStore(&mock.ParamStore{Db: dbm.NewMemDB()}) - app.InitChain(abci.RequestInitChain{}) - - // ----- test an empty response ------- - reqInfo := abci.RequestInfo{} - res := app.Info(reqInfo) - - // should be empty - assert.Equal(t, "", res.Version) - assert.Equal(t, t.Name(), res.GetData()) - assert.Equal(t, int64(0), res.LastBlockHeight) - require.Equal(t, []uint8(nil), res.LastBlockAppHash) - - appVersion, err := app.GetAppVersion() - require.NoError(t, err) - - assert.Equal(t, appVersion, res.AppVersion) + bap := baseapp.NewBaseApp("starting name", logger, db, nil, testChangeNameHelper("new name")) + require.Equal(t, bap.Name(), "new name", "BaseApp should have had name changed via option function") } func TestBaseAppOptionSeal(t *testing.T) { - app, err := setupBaseApp(t) - require.NoError(t, err) + suite := NewBaseAppSuite(t) require.Panics(t, func() { - app.SetName("") - }) - require.Panics(t, func() { - app.SetVersion("") + suite.baseApp.SetName("") }) require.Panics(t, func() { - app.SetDB(nil) + suite.baseApp.SetVersion("") }) require.Panics(t, func() { - app.SetCMS(nil) + suite.baseApp.SetDB(nil) }) require.Panics(t, func() { - app.SetInitChainer(nil) + suite.baseApp.SetCMS(nil) }) require.Panics(t, func() { - app.SetBeginBlocker(nil) + suite.baseApp.SetInitChainer(nil) }) require.Panics(t, func() { - app.SetEndBlocker(nil) + suite.baseApp.SetBeginBlocker(nil) }) require.Panics(t, func() { - app.SetAnteHandler(nil) + suite.baseApp.SetEndBlocker(nil) }) require.Panics(t, func() { - app.SetAddrPeerFilter(nil) + suite.baseApp.SetAnteHandler(nil) }) require.Panics(t, func() { - app.SetIDPeerFilter(nil) + suite.baseApp.SetAddrPeerFilter(nil) }) require.Panics(t, func() { - app.SetFauxMerkleMode() + suite.baseApp.SetIDPeerFilter(nil) }) require.Panics(t, func() { - app.SetRouter(NewRouter()) + suite.baseApp.SetFauxMerkleMode() }) } -func TestSetMinGasPrices(t *testing.T) { - minGasPrices := sdk.DecCoins{sdk.NewInt64DecCoin("stake", 5000)} - app := newBaseApp(t.Name(), SetMinGasPrices(minGasPrices.String())) - require.Equal(t, minGasPrices, app.minGasPrices) -} - -func TestInitChainer(t *testing.T) { - name := t.Name() - // keep the db and logger ourselves so - // we can reload the same app later - db := dbm.NewMemDB() - logger := defaultLogger() - app := NewBaseApp(name, logger, db, nil) - app.SetParamStore(&mock.ParamStore{Db: db}) - capKey := sdk.NewKVStoreKey("main") - capKey2 := sdk.NewKVStoreKey("key2") - app.MountStores(capKey, capKey2) - - // set a value in the store on init chain - key, value := []byte("hello"), []byte("goodbye") - var initChainer sdk.InitChainer = func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - store := ctx.KVStore(capKey) - store.Set(key, value) - return abci.ResponseInitChain{} - } - - query := abci.RequestQuery{ - Path: "/store/main/key", - Data: key, - } +func TestTxDecoder(t *testing.T) { + cdc := codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) + baseapptestutil.RegisterInterfaces(cdc.InterfaceRegistry()) - // initChainer is nil - nothing happens - app.InitChain(abci.RequestInitChain{}) - res := app.Query(query) - require.Equal(t, 0, len(res.Value)) + // patch in TxConfig instead of using an output from x/auth/tx + txConfig := authtx.NewTxConfig(cdc, authtx.DefaultSignModes) - // set initChainer and try again - should see the value - app.SetInitChainer(initChainer) + tx := newTxCounter(t, txConfig, 1, 0) + txBytes, err := txConfig.TxEncoder()(tx) + require.NoError(t, err) - // stores are mounted and private members are set - sealing baseapp - err := app.LoadLatestVersion() // needed to make stores non-nil - require.Nil(t, err) - require.Equal(t, int64(0), app.LastBlockHeight()) + dTx, err := txConfig.TxDecoder()(txBytes) + require.NoError(t, err) - initChainRes := app.InitChain(abci.RequestInitChain{AppStateBytes: []byte("{}"), ChainId: "test-chain-id"}) // must have valid JSON genesis file, even if empty + counter, _ := parseTxMemo(t, tx) + dTxCounter, _ := parseTxMemo(t, dTx) + require.Equal(t, counter, dTxCounter) +} - // The AppHash returned by a new chain is the sha256 hash of "". - // $ echo -n '' | sha256sum - // e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - require.Equal( - t, - []byte{0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}, - initChainRes.AppHash, - ) +func TestCustomRunTxPanicHandler(t *testing.T) { + customPanicMsg := "test panic" + anteErr := sdkerrors.Register("fakeModule", 100500, "fakeError") + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + panic(sdkerrors.Wrap(anteErr, "anteHandler")) + }) + } + suite := NewBaseAppSuite(t, anteOpt) - // assert that chainID is set correctly in InitChain - chainID := app.deliverState.ctx.ChainID() - require.Equal(t, "test-chain-id", chainID, "ChainID in deliverState not set correctly in InitChain") + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) - chainID = app.checkState.ctx.ChainID() - require.Equal(t, "test-chain-id", chainID, "ChainID in checkState not set correctly in InitChain") + header := tmproto.Header{Height: 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) - app.Commit() - res = app.Query(query) - require.Equal(t, int64(1), app.LastBlockHeight()) - require.Equal(t, value, res.Value) - - // reload app - app = NewBaseApp(name, logger, db, nil) - app.SetInitChainer(initChainer) - app.SetParamStore(&mock.ParamStore{Db: db}) - app.MountStores(capKey, capKey2) - err = app.LoadLatestVersion() // needed to make stores non-nil - require.Nil(t, err) - require.Equal(t, int64(1), app.LastBlockHeight()) + suite.baseApp.AddRunTxRecoveryHandler(func(recoveryObj interface{}) error { + err, ok := recoveryObj.(error) + if !ok { + return nil + } - // ensure we can still query after reloading - res = app.Query(query) - require.Equal(t, value, res.Value) + if anteErr.Is(err) { + panic(customPanicMsg) + } else { + return nil + } + }) - // commit and ensure we can still query - header := tmproto.Header{Height: app.LastBlockHeight() + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - app.Commit() + // transaction should panic with custom handler above + { + tx := newTxCounter(t, suite.txConfig, 0, 0) - res = app.Query(query) - require.Equal(t, value, res.Value) + require.PanicsWithValue(t, customPanicMsg, func() { + suite.baseApp.Deliver(suite.txConfig.TxEncoder(), tx) + }) + } } -func TestInitChain_AppVersionSetToZero(t *testing.T) { - const expectedAppVersion = uint64(0) +func TestBaseAppAnteHandler(t *testing.T) { + anteKey := []byte("ante-key") + anteOpt := func(bapp *baseapp.BaseApp) { + bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) + } + suite := NewBaseAppSuite(t, anteOpt) - name := t.Name() - db := dbm.NewMemDB() - logger := defaultLogger() - app := NewBaseApp(name, logger, db, nil) - app.SetParamStore(&mock.ParamStore{Db: dbm.NewMemDB()}) + deliverKey := []byte("deliver-key") + baseapptestutil.RegisterCounterServer(suite.baseApp.MsgServiceRouter(), CounterServerImpl{t, capKey1, deliverKey}) - app.InitChain( - abci.RequestInitChain{ - InitialHeight: 3, - }, - ) + suite.baseApp.InitChain(abci.RequestInitChain{ + ConsensusParams: &tmproto.ConsensusParams{}, + }) - protocolVersion, err := app.GetAppVersion() - require.NoError(t, err) - require.Equal(t, expectedAppVersion, protocolVersion) + header := tmproto.Header{Height: suite.baseApp.LastBlockHeight() + 1} + suite.baseApp.BeginBlock(abci.RequestBeginBlock{Header: header}) - consensusParams := app.GetConsensusParams(app.checkState.ctx) + // execute a tx that will fail ante handler execution + // + // NOTE: State should not be mutated here. This will be implicitly checked by + // the next txs ante handler execution (anteHandlerTxTest). + tx := newTxCounter(t, suite.txConfig, 0, 0) + tx = setFailOnAnte(t, suite.txConfig, tx, true) - require.Equal(t, expectedAppVersion, consensusParams.Version.AppVersion) -} + txBytes, err := suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) -func TestInitChain_NonZeroAppVersionInRequestPanic(t *testing.T) { - name := t.Name() - db := dbm.NewMemDB() - logger := defaultLogger() - app := NewBaseApp(name, logger, db, nil) - app.SetParamStore(&mock.ParamStore{Db: dbm.NewMemDB()}) - - sut := func() { - app.InitChain( - abci.RequestInitChain{ - InitialHeight: 3, - ConsensusParams: &abci.ConsensusParams{ - Version: &tmproto.VersionParams{ - AppVersion: 10, - }, - }, - }, - ) - } - require.Panics(t, sut) -} + res := suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.Empty(t, res.Events) + require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) -func TestInitChain_WithInitialHeight(t *testing.T) { - name := t.Name() - db := dbm.NewMemDB() - logger := defaultLogger() - app := NewBaseApp(name, logger, db, nil) - app.SetParamStore(&mock.ParamStore{Db: dbm.NewMemDB()}) + ctx := getDeliverStateCtx(suite.baseApp) + store := ctx.KVStore(capKey1) + require.Equal(t, int64(0), getIntFromStore(t, store, anteKey)) - app.InitChain( - abci.RequestInitChain{ - InitialHeight: 3, - }, - ) - app.Commit() + // execute at tx that will pass the ante handler (the checkTx state should + // mutate) but will fail the message handler + tx = newTxCounter(t, suite.txConfig, 0, 0) + tx = setFailOnHandler(suite.txConfig, tx, true) - require.Equal(t, int64(3), app.LastBlockHeight()) -} + txBytes, err = suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) -func TestBeginBlock_WithInitialHeight(t *testing.T) { - name := t.Name() - db := dbm.NewMemDB() - logger := defaultLogger() - app := NewBaseApp(name, logger, db, nil) - app.SetParamStore(&mock.ParamStore{Db: dbm.NewMemDB()}) + res = suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.NotEmpty(t, res.Events) + require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) - app.InitChain( - abci.RequestInitChain{ - InitialHeight: 3, - }, - ) + ctx = getDeliverStateCtx(suite.baseApp) + store = ctx.KVStore(capKey1) + require.Equal(t, int64(1), getIntFromStore(t, store, anteKey)) + require.Equal(t, int64(0), getIntFromStore(t, store, deliverKey)) - require.PanicsWithError(t, "invalid height: 4; expected: 3", func() { - app.BeginBlock(abci.RequestBeginBlock{ - Header: tmproto.Header{ - Height: 4, - }, - }) - }) + // Execute a successful ante handler and message execution where state is + // implicitly checked by previous tx executions. + tx = newTxCounter(t, suite.txConfig, 1, 0) - app.BeginBlock(abci.RequestBeginBlock{ - Header: tmproto.Header{ - Height: 3, - }, - }) - app.Commit() + txBytes, err = suite.txConfig.TxEncoder()(tx) + require.NoError(t, err) - require.Equal(t, int64(3), app.LastBlockHeight()) -} + res = suite.baseApp.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.NotEmpty(t, res.Events) + require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) -// Simple tx with a list of Msgs. -type txTest struct { - Msgs []sdk.Msg - Counter int64 - FailOnAnte bool -} + ctx = getDeliverStateCtx(suite.baseApp) + store = ctx.KVStore(capKey1) + require.Equal(t, int64(2), getIntFromStore(t, store, anteKey)) + require.Equal(t, int64(1), getIntFromStore(t, store, deliverKey)) -func (tx *txTest) setFailOnAnte(fail bool) { - tx.FailOnAnte = fail + suite.baseApp.EndBlock(abci.RequestEndBlock{}) + suite.baseApp.Commit() } -func (tx *txTest) setFailOnHandler(fail bool) { - for i, msg := range tx.Msgs { - tx.Msgs[i] = msgCounter{msg.(msgCounter).Counter, fail} - } -} +// Test and ensure that invalid block heights always cause errors. +// See issues: +// - https://github.com/cosmos/cosmos-sdk/issues/11220 +// - https://github.com/cosmos/cosmos-sdk/issues/7662 +func TestABCI_CreateQueryContext(t *testing.T) { + t.Parallel() -// Implements Tx -func (tx txTest) GetMsgs() []sdk.Msg { return tx.Msgs } -func (tx txTest) ValidateBasic() error { return nil } + logger := defaultLogger() + db := dbm.NewMemDB() + name := t.Name() + app := baseapp.NewBaseApp(name, logger, db, nil) -const ( - routeMsgCounter = "msgCounter" - routeMsgCounter2 = "msgCounter2" - routeMsgKeyValue = "msgKeyValue" -) + app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: 1}}) + app.Commit() -// ValidateBasic() fails on negative counters. -// Otherwise it's up to the handlers -type msgCounter struct { - Counter int64 - FailOnHandler bool -} + app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: 2}}) + app.Commit() -// dummy implementation of proto.Message -func (msg msgCounter) Reset() {} -func (msg msgCounter) String() string { return "TODO" } -func (msg msgCounter) ProtoMessage() {} - -// Implements Msg -func (msg msgCounter) Route() string { return routeMsgCounter } -func (msg msgCounter) Type() string { return "counter1" } -func (msg msgCounter) GetSignBytes() []byte { return nil } -func (msg msgCounter) GetSigners() []sdk.AccAddress { return nil } -func (msg msgCounter) ValidateBasic() error { - if msg.Counter >= 0 { - return nil + testCases := []struct { + name string + height int64 + prove bool + expErr bool + }{ + {"valid height", 2, true, false}, + {"future height", 10, true, true}, + {"negative height, prove=true", -1, true, true}, + {"negative height, prove=false", -1, false, true}, } - return sdkerrors.Wrap(sdkerrors.ErrInvalidSequence, "counter should be a non-negative integer") -} -func newTxCounter(counter int64, msgCounters ...int64) *txTest { - msgs := make([]sdk.Msg, 0, len(msgCounters)) - for _, c := range msgCounters { - msgs = append(msgs, msgCounter{c, false}) + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + _, err := app.CreateQueryContext(tc.height, tc.prove) + if tc.expErr { + require.Error(t, err) + } else { + require.NoError(t, err) + } + }) } - - return &txTest{msgs, counter, false} -} - -// a msg we dont know how to route -type msgNoRoute struct { - msgCounter } -func (tx msgNoRoute) Route() string { return "noroute" } - -// a msg we dont know how to decode -type msgNoDecode struct { - msgCounter -} - -func (tx msgNoDecode) Route() string { return routeMsgCounter } - -// Another counter msg. Duplicate of msgCounter -type msgCounter2 struct { - Counter int64 -} +func TestSetMinGasPrices(t *testing.T) { + minGasPrices := sdk.DecCoins{sdk.NewInt64DecCoin("stake", 5000)} + suite := NewBaseAppSuite(t, baseapp.SetMinGasPrices(minGasPrices.String())) -// dummy implementation of proto.Message -func (msg msgCounter2) Reset() {} -func (msg msgCounter2) String() string { return "TODO" } -func (msg msgCounter2) ProtoMessage() {} - -// Implements Msg -func (msg msgCounter2) Route() string { return routeMsgCounter2 } -func (msg msgCounter2) Type() string { return "counter2" } -func (msg msgCounter2) GetSignBytes() []byte { return nil } -func (msg msgCounter2) GetSigners() []sdk.AccAddress { return nil } -func (msg msgCounter2) ValidateBasic() error { - if msg.Counter >= 0 { - return nil - } - return sdkerrors.Wrap(sdkerrors.ErrInvalidSequence, "counter should be a non-negative integer") + ctx := getCheckStateCtx(suite.baseApp) + require.Equal(t, minGasPrices, ctx.MinGasPrices()) } -// A msg that sets a key/value pair. -type msgKeyValue struct { - Key []byte - Value []byte -} +func TestGetMaximumBlockGas(t *testing.T) { + suite := NewBaseAppSuite(t) + suite.baseApp.InitChain(abci.RequestInitChain{}) + ctx := suite.baseApp.NewContext(true, tmproto.Header{}) -func (msg msgKeyValue) Reset() {} -func (msg msgKeyValue) String() string { return "TODO" } -func (msg msgKeyValue) ProtoMessage() {} -func (msg msgKeyValue) Route() string { return routeMsgKeyValue } -func (msg msgKeyValue) Type() string { return "keyValue" } -func (msg msgKeyValue) GetSignBytes() []byte { return nil } -func (msg msgKeyValue) GetSigners() []sdk.AccAddress { return nil } -func (msg msgKeyValue) ValidateBasic() error { - if msg.Key == nil { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "key cannot be nil") - } - if msg.Value == nil { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "value cannot be nil") - } - return nil -} + suite.baseApp.StoreConsensusParams(ctx, &tmproto.ConsensusParams{Block: &tmproto.BlockParams{MaxGas: 0}}) + require.Equal(t, uint64(0), suite.baseApp.GetMaximumBlockGas(ctx)) -// amino decode -func testTxDecoder(cdc *codec.LegacyAmino) sdk.TxDecoder { - return func(txBytes []byte) (sdk.Tx, error) { - var tx txTest - if len(txBytes) == 0 { - return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, "tx bytes are empty") - } + suite.baseApp.StoreConsensusParams(ctx, &tmproto.ConsensusParams{Block: &tmproto.BlockParams{MaxGas: -1}}) + require.Equal(t, uint64(0), suite.baseApp.GetMaximumBlockGas(ctx)) - err := cdc.Unmarshal(txBytes, &tx) - if err != nil { - return nil, sdkerrors.ErrTxDecode - } + suite.baseApp.StoreConsensusParams(ctx, &tmproto.ConsensusParams{Block: &tmproto.BlockParams{MaxGas: 5000000}}) + require.Equal(t, uint64(5000000), suite.baseApp.GetMaximumBlockGas(ctx)) - return tx, nil - } -} - -func anteHandlerTxTest(t *testing.T, capKey sdk.StoreKey, storeKey []byte) sdk.AnteHandler { - return func(ctx sdk.Context, tx sdk.Tx, simulate bool) (sdk.Context, error) { - store := ctx.KVStore(capKey) - txTest := tx.(txTest) - - if txTest.FailOnAnte { - return ctx, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "ante handler failure") - } - - _, err := incrementingCounter(t, store, storeKey, txTest.Counter) - if err != nil { - return ctx, err - } - - ctx.EventManager().EmitEvents( - counterEvent("ante_handler", txTest.Counter), - ) - - return ctx, nil - } -} - -func counterEvent(evType string, msgCount int64) sdk.Events { - return sdk.Events{ - sdk.NewEvent( - evType, - sdk.NewAttribute("update_counter", fmt.Sprintf("%d", msgCount)), - ), - } -} - -func handlerMsgCounter(t *testing.T, capKey sdk.StoreKey, deliverKey []byte) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - ctx = ctx.WithEventManager(sdk.NewEventManager()) - store := ctx.KVStore(capKey) - var msgCount int64 - - switch m := msg.(type) { - case *msgCounter: - if m.FailOnHandler { - return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "message handler failure") - } - - msgCount = m.Counter - case *msgCounter2: - msgCount = m.Counter - } - - ctx.EventManager().EmitEvents( - counterEvent(sdk.EventTypeMessage, msgCount), - ) - - res, err := incrementingCounter(t, store, deliverKey, msgCount) - if err != nil { - return nil, err - } - - res.Events = ctx.EventManager().Events().ToABCIEvents() - return res, nil - } -} - -func getIntFromStore(store sdk.KVStore, key []byte) int64 { - bz := store.Get(key) - if len(bz) == 0 { - return 0 - } - i, err := binary.ReadVarint(bytes.NewBuffer(bz)) - if err != nil { - panic(err) - } - return i -} - -func setIntOnStore(store sdk.KVStore, key []byte, i int64) { - bz := make([]byte, 8) - n := binary.PutVarint(bz, i) - store.Set(key, bz[:n]) -} - -// check counter matches what's in store. -// increment and store -func incrementingCounter(t *testing.T, store sdk.KVStore, counterKey []byte, counter int64) (*sdk.Result, error) { - storedCounter := getIntFromStore(store, counterKey) - require.Equal(t, storedCounter, counter) - setIntOnStore(store, counterKey, counter+1) - return &sdk.Result{}, nil -} - -//--------------------------------------------------------------------- -// Tx processing - CheckTx, DeliverTx, SimulateTx. -// These tests use the serialized tx as input, while most others will use the -// Check(), Deliver(), Simulate() methods directly. -// Ensure that Check/Deliver/Simulate work as expected with the store. - -// Test that successive CheckTx can see each others' effects -// on the store within a block, and that the CheckTx state -// gets reset to the latest committed state during Commit -func TestCheckTx(t *testing.T) { - // This ante handler reads the key and checks that the value matches the current counter. - // This ensures changes to the kvstore persist across successive CheckTx. - counterKey := []byte("counter-key") - - anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, counterKey)) } - routerOpt := func(bapp *BaseApp) { - // TODO: can remove this once CheckTx doesnt process msgs. - bapp.Router().AddRoute(sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - return &sdk.Result{}, nil - })) - } - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - - nTxs := int64(5) - app.InitChain(abci.RequestInitChain{}) - - // Create same codec used in txDecoder - codec := codec.NewLegacyAmino() - registerTestCodec(codec) - - for i := int64(0); i < nTxs; i++ { - tx := newTxCounter(i, 0) // no messages - txBytes, err := codec.Marshal(tx) - require.NoError(t, err) - r := app.CheckTx(abci.RequestCheckTx{Tx: txBytes}) - require.Empty(t, r.GetEvents()) - require.True(t, r.IsOK(), fmt.Sprintf("%v", r)) - } - - checkStateStore := app.checkState.ctx.KVStore(capKey1) - storedCounter := getIntFromStore(checkStateStore, counterKey) - - // Ensure AnteHandler ran - require.Equal(t, nTxs, storedCounter) - - // If a block is committed, CheckTx state should be reset. - header := tmproto.Header{Height: 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header, Hash: []byte("hash")}) - - require.NotNil(t, app.checkState.ctx.BlockGasMeter(), "block gas meter should have been set to checkState") - require.NotEmpty(t, app.checkState.ctx.HeaderHash()) - - app.EndBlock(abci.RequestEndBlock{}) - app.Commit() - - checkStateStore = app.checkState.ctx.KVStore(capKey1) - storedBytes := checkStateStore.Get(counterKey) - require.Nil(t, storedBytes) -} - -// Test that successive DeliverTx can see each others' effects -// on the store, both within and across blocks. -func TestDeliverTx(t *testing.T) { - // test increments in the ante - anteKey := []byte("ante-key") - anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) } - - // test increments in the handler - deliverKey := []byte("deliver-key") - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, handlerMsgCounter(t, capKey1, deliverKey)) - bapp.Router().AddRoute(r) - } - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - app.InitChain(abci.RequestInitChain{}) - - // Create same codec used in txDecoder - codec := codec.NewLegacyAmino() - registerTestCodec(codec) - - nBlocks := 3 - txPerHeight := 5 - - for blockN := 0; blockN < nBlocks; blockN++ { - header := tmproto.Header{Height: int64(blockN) + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - for i := 0; i < txPerHeight; i++ { - counter := int64(blockN*txPerHeight + i) - tx := newTxCounter(counter, counter) - - txBytes, err := codec.Marshal(tx) - require.NoError(t, err) - - res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) - events := res.GetEvents() - require.Len(t, events, 3, "should contain ante handler, message type and counter events respectively") - require.Equal(t, sdk.MarkEventsToIndex(counterEvent("ante_handler", counter).ToABCIEvents(), map[string]struct{}{})[0], events[0], "ante handler event") - require.Equal(t, sdk.MarkEventsToIndex(counterEvent(sdk.EventTypeMessage, counter).ToABCIEvents(), map[string]struct{}{})[0], events[2], "msg handler update counter event") - } - - app.EndBlock(abci.RequestEndBlock{}) - app.Commit() - } -} - -// Number of messages doesn't matter to CheckTx. -func TestMultiMsgCheckTx(t *testing.T) { - // TODO: ensure we get the same results - // with one message or many -} - -// One call to DeliverTx should process all the messages, in order. -func TestMultiMsgDeliverTx(t *testing.T) { - // increment the tx counter - anteKey := []byte("ante-key") - anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) } - - // increment the msg counter - deliverKey := []byte("deliver-key") - deliverKey2 := []byte("deliver-key2") - routerOpt := func(bapp *BaseApp) { - r1 := sdk.NewRoute(routeMsgCounter, handlerMsgCounter(t, capKey1, deliverKey)) - r2 := sdk.NewRoute(routeMsgCounter2, handlerMsgCounter(t, capKey1, deliverKey2)) - bapp.Router().AddRoute(r1) - bapp.Router().AddRoute(r2) - } - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - - // Create same codec used in txDecoder - codec := codec.NewLegacyAmino() - registerTestCodec(codec) - - // run a multi-msg tx - // with all msgs the same route - - header := tmproto.Header{Height: 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - tx := newTxCounter(0, 0, 1, 2) - txBytes, err := codec.Marshal(tx) - require.NoError(t, err) - res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) - - store := app.deliverState.ctx.KVStore(capKey1) - - // tx counter only incremented once - txCounter := getIntFromStore(store, anteKey) - require.Equal(t, int64(1), txCounter) - - // msg counter incremented three times - msgCounter := getIntFromStore(store, deliverKey) - require.Equal(t, int64(3), msgCounter) - - // replace the second message with a msgCounter2 - - tx = newTxCounter(1, 3) - tx.Msgs = append(tx.Msgs, msgCounter2{0}) - tx.Msgs = append(tx.Msgs, msgCounter2{1}) - txBytes, err = codec.Marshal(tx) - require.NoError(t, err) - res = app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) - - store = app.deliverState.ctx.KVStore(capKey1) - - // tx counter only incremented once - txCounter = getIntFromStore(store, anteKey) - require.Equal(t, int64(2), txCounter) - - // original counter increments by one - // new counter increments by two - msgCounter = getIntFromStore(store, deliverKey) - require.Equal(t, int64(4), msgCounter) - msgCounter2 := getIntFromStore(store, deliverKey2) - require.Equal(t, int64(2), msgCounter2) -} - -// Interleave calls to Check and Deliver and ensure -// that there is no cross-talk. Check sees results of the previous Check calls -// and Deliver sees that of the previous Deliver calls, but they don't see eachother. -func TestConcurrentCheckDeliver(t *testing.T) { - // TODO -} - -// Simulate a transaction that uses gas to compute the gas. -// Simulate() and Query("/app/simulate", txBytes) should give -// the same results. -func TestSimulateTx(t *testing.T) { - gasConsumed := uint64(5) - - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasConsumed)) - return - }) - } - - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - ctx.GasMeter().ConsumeGas(gasConsumed, "test") - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - - app.InitChain(abci.RequestInitChain{}) - - // Create same codec used in txDecoder - cdc := codec.NewLegacyAmino() - registerTestCodec(cdc) - - nBlocks := 3 - for blockN := 0; blockN < nBlocks; blockN++ { - count := int64(blockN + 1) - header := tmproto.Header{Height: count} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - tx := newTxCounter(count, count) - txBytes, err := cdc.Marshal(tx) - require.Nil(t, err) - - // simulate a message, check gas reported - gInfo, result, err := app.Simulate(txBytes) - require.NoError(t, err) - require.NotNil(t, result) - require.Equal(t, gasConsumed, gInfo.GasUsed) - - // simulate again, same result - gInfo, result, err = app.Simulate(txBytes) - require.NoError(t, err) - require.NotNil(t, result) - require.Equal(t, gasConsumed, gInfo.GasUsed) - - // simulate by calling Query with encoded tx - query := abci.RequestQuery{ - Path: "/app/simulate", - Data: txBytes, - } - queryResult := app.Query(query) - require.True(t, queryResult.IsOK(), queryResult.Log) - - var simRes sdk.SimulationResponse - require.NoError(t, jsonpb.Unmarshal(strings.NewReader(string(queryResult.Value)), &simRes)) - - require.Equal(t, gInfo, simRes.GasInfo) - require.Equal(t, result.Log, simRes.Result.Log) - require.Equal(t, result.Events, simRes.Result.Events) - require.True(t, bytes.Equal(result.Data, simRes.Result.Data)) - - app.EndBlock(abci.RequestEndBlock{}) - app.Commit() - } -} - -func TestRunInvalidTransaction(t *testing.T) { - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - return - }) - } - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - - header := tmproto.Header{Height: 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - // transaction with no messages - { - emptyTx := &txTest{} - _, result, err := app.Deliver(aminoTxEncoder(), emptyTx) - require.Error(t, err) - require.Nil(t, result) - - space, code, _ := sdkerrors.ABCIInfo(err, false) - require.EqualValues(t, sdkerrors.ErrInvalidRequest.Codespace(), space, err) - require.EqualValues(t, sdkerrors.ErrInvalidRequest.ABCICode(), code, err) - } - - // transaction where ValidateBasic fails - { - testCases := []struct { - tx *txTest - fail bool - }{ - {newTxCounter(0, 0), false}, - {newTxCounter(-1, 0), false}, - {newTxCounter(100, 100), false}, - {newTxCounter(100, 5, 4, 3, 2, 1), false}, - - {newTxCounter(0, -1), true}, - {newTxCounter(0, 1, -2), true}, - {newTxCounter(0, 1, 2, -10, 5), true}, - } - - for _, testCase := range testCases { - tx := testCase.tx - _, result, err := app.Deliver(aminoTxEncoder(), tx) - - if testCase.fail { - require.Error(t, err) - - space, code, _ := sdkerrors.ABCIInfo(err, false) - require.EqualValues(t, sdkerrors.ErrInvalidSequence.Codespace(), space, err) - require.EqualValues(t, sdkerrors.ErrInvalidSequence.ABCICode(), code, err) - } else { - require.NotNil(t, result) - } - } - } - - // transaction with no known route - { - unknownRouteTx := txTest{[]sdk.Msg{msgNoRoute{}}, 0, false} - _, result, err := app.Deliver(aminoTxEncoder(), unknownRouteTx) - require.Error(t, err) - require.Nil(t, result) - - space, code, _ := sdkerrors.ABCIInfo(err, false) - require.EqualValues(t, sdkerrors.ErrUnknownRequest.Codespace(), space, err) - require.EqualValues(t, sdkerrors.ErrUnknownRequest.ABCICode(), code, err) - - unknownRouteTx = txTest{[]sdk.Msg{msgCounter{}, msgNoRoute{}}, 0, false} - _, result, err = app.Deliver(aminoTxEncoder(), unknownRouteTx) - require.Error(t, err) - require.Nil(t, result) - - space, code, _ = sdkerrors.ABCIInfo(err, false) - require.EqualValues(t, sdkerrors.ErrUnknownRequest.Codespace(), space, err) - require.EqualValues(t, sdkerrors.ErrUnknownRequest.ABCICode(), code, err) - } - - // Transaction with an unregistered message - { - tx := newTxCounter(0, 0) - tx.Msgs = append(tx.Msgs, msgNoDecode{}) - - // new codec so we can encode the tx, but we shouldn't be able to decode - newCdc := codec.NewLegacyAmino() - registerTestCodec(newCdc) - newCdc.RegisterConcrete(&msgNoDecode{}, "cosmos-sdk/baseapp/msgNoDecode", nil) - - txBytes, err := newCdc.Marshal(tx) - require.NoError(t, err) - - res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.EqualValues(t, sdkerrors.ErrTxDecode.ABCICode(), res.Code) - require.EqualValues(t, sdkerrors.ErrTxDecode.Codespace(), res.Codespace) - } -} - -// Test that transactions exceeding gas limits fail -func TestTxGasLimits(t *testing.T) { - gasGranted := uint64(10) - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasGranted)) - - // AnteHandlers must have their own defer/recover in order for the BaseApp - // to know how much gas was used! This is because the GasMeter is created in - // the AnteHandler, but if it panics the context won't be set properly in - // runTx's recover call. - defer func() { - if r := recover(); r != nil { - switch rType := r.(type) { - case sdk.ErrorOutOfGas: - err = sdkerrors.Wrapf(sdkerrors.ErrOutOfGas, "out of gas in location: %v", rType.Descriptor) - default: - panic(r) - } - } - }() - - count := tx.(txTest).Counter - newCtx.GasMeter().ConsumeGas(uint64(count), "counter-ante") - - return newCtx, nil - }) - - } - - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - count := msg.(*msgCounter).Counter - ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler") - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - - header := tmproto.Header{Height: 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - testCases := []struct { - tx *txTest - gasUsed uint64 - fail bool - }{ - {newTxCounter(0, 0), 0, false}, - {newTxCounter(1, 1), 2, false}, - {newTxCounter(9, 1), 10, false}, - {newTxCounter(1, 9), 10, false}, - {newTxCounter(10, 0), 10, false}, - {newTxCounter(0, 10), 10, false}, - {newTxCounter(0, 8, 2), 10, false}, - {newTxCounter(0, 5, 1, 1, 1, 1, 1), 10, false}, - {newTxCounter(0, 5, 1, 1, 1, 1), 9, false}, - - {newTxCounter(9, 2), 11, true}, - {newTxCounter(2, 9), 11, true}, - {newTxCounter(9, 1, 1), 11, true}, - {newTxCounter(1, 8, 1, 1), 11, true}, - {newTxCounter(11, 0), 11, true}, - {newTxCounter(0, 11), 11, true}, - {newTxCounter(0, 5, 11), 16, true}, - } - - for i, tc := range testCases { - tx := tc.tx - gInfo, result, err := app.Deliver(aminoTxEncoder(), tx) - - // check gas used and wanted - require.Equal(t, tc.gasUsed, gInfo.GasUsed, fmt.Sprintf("tc #%d; gas: %v, result: %v, err: %s", i, gInfo, result, err)) - - // check for out of gas - if !tc.fail { - require.NotNil(t, result, fmt.Sprintf("%d: %v, %v", i, tc, err)) - } else { - require.Error(t, err) - require.Nil(t, result) - - space, code, _ := sdkerrors.ABCIInfo(err, false) - require.EqualValues(t, sdkerrors.ErrOutOfGas.Codespace(), space, err) - require.EqualValues(t, sdkerrors.ErrOutOfGas.ABCICode(), code, err) - } - } -} - -// Test that transactions exceeding gas limits fail -func TestMaxBlockGasLimits(t *testing.T) { - gasGranted := uint64(10) - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasGranted)) - - defer func() { - if r := recover(); r != nil { - switch rType := r.(type) { - case sdk.ErrorOutOfGas: - err = sdkerrors.Wrapf(sdkerrors.ErrOutOfGas, "out of gas in location: %v", rType.Descriptor) - default: - panic(r) - } - } - }() - - count := tx.(txTest).Counter - newCtx.GasMeter().ConsumeGas(uint64(count), "counter-ante") - - return - }) - } - - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - count := msg.(*msgCounter).Counter - ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler") - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - app.InitChain(abci.RequestInitChain{ - ConsensusParams: &abci.ConsensusParams{ - Block: &abci.BlockParams{ - MaxGas: 100, - }, - }, - }) - - testCases := []struct { - tx *txTest - numDelivers int - gasUsedPerDeliver uint64 - fail bool - failAfterDeliver int - }{ - {newTxCounter(0, 0), 0, 0, false, 0}, - {newTxCounter(9, 1), 2, 10, false, 0}, - {newTxCounter(10, 0), 3, 10, false, 0}, - {newTxCounter(10, 0), 10, 10, false, 0}, - {newTxCounter(2, 7), 11, 9, false, 0}, - {newTxCounter(10, 0), 10, 10, false, 0}, // hit the limit but pass - - {newTxCounter(10, 0), 11, 10, true, 10}, - {newTxCounter(10, 0), 15, 10, true, 10}, - {newTxCounter(9, 0), 12, 9, true, 11}, // fly past the limit - } - - for i, tc := range testCases { - tx := tc.tx - - // reset the block gas - header := tmproto.Header{Height: app.LastBlockHeight() + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - // execute the transaction multiple times - for j := 0; j < tc.numDelivers; j++ { - _, result, err := app.Deliver(aminoTxEncoder(), tx) - - ctx := app.getState(runTxModeDeliver).ctx - - // check for failed transactions - if tc.fail && (j+1) > tc.failAfterDeliver { - require.Error(t, err, fmt.Sprintf("tc #%d; result: %v, err: %s", i, result, err)) - require.Nil(t, result, fmt.Sprintf("tc #%d; result: %v, err: %s", i, result, err)) - - space, code, _ := sdkerrors.ABCIInfo(err, false) - require.EqualValues(t, sdkerrors.ErrOutOfGas.Codespace(), space, err) - require.EqualValues(t, sdkerrors.ErrOutOfGas.ABCICode(), code, err) - require.True(t, ctx.BlockGasMeter().IsOutOfGas()) - } else { - // check gas used and wanted - blockGasUsed := ctx.BlockGasMeter().GasConsumed() - expBlockGasUsed := tc.gasUsedPerDeliver * uint64(j+1) - require.Equal( - t, expBlockGasUsed, blockGasUsed, - fmt.Sprintf("%d,%d: %v, %v, %v, %v", i, j, tc, expBlockGasUsed, blockGasUsed, result), - ) - - require.NotNil(t, result, fmt.Sprintf("tc #%d; currDeliver: %d, result: %v, err: %s", i, j, result, err)) - require.False(t, ctx.BlockGasMeter().IsPastLimit()) - } - } - } -} - -// Test custom panic handling within app.DeliverTx method -func TestCustomRunTxPanicHandler(t *testing.T) { - const customPanicMsg = "test panic" - anteErr := sdkerrors.Register("fakeModule", 100500, "fakeError") - - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - panic(sdkerrors.Wrap(anteErr, "anteHandler")) - }) - } - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - - header := tmproto.Header{Height: 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - app.AddRunTxRecoveryHandler(func(recoveryObj interface{}) error { - err, ok := recoveryObj.(error) - if !ok { - return nil - } - - if anteErr.Is(err) { - panic(customPanicMsg) - } else { - return nil - } - }) - - // Transaction should panic with custom handler above - { - tx := newTxCounter(0, 0) - - require.PanicsWithValue(t, customPanicMsg, func() { app.Deliver(aminoTxEncoder(), tx) }) - } -} - -func TestBaseAppAnteHandler(t *testing.T) { - anteKey := []byte("ante-key") - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) - } - - deliverKey := []byte("deliver-key") - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, handlerMsgCounter(t, capKey1, deliverKey)) - bapp.Router().AddRoute(r) - } - - cdc := codec.NewLegacyAmino() - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - - app.InitChain(abci.RequestInitChain{}) - registerTestCodec(cdc) - - header := tmproto.Header{Height: app.LastBlockHeight() + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - // execute a tx that will fail ante handler execution - // - // NOTE: State should not be mutated here. This will be implicitly checked by - // the next txs ante handler execution (anteHandlerTxTest). - tx := newTxCounter(0, 0) - tx.setFailOnAnte(true) - txBytes, err := cdc.Marshal(tx) - require.NoError(t, err) - res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.Empty(t, res.Events) - require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) - - ctx := app.getState(runTxModeDeliver).ctx - store := ctx.KVStore(capKey1) - require.Equal(t, int64(0), getIntFromStore(store, anteKey)) - - // execute at tx that will pass the ante handler (the checkTx state should - // mutate) but will fail the message handler - tx = newTxCounter(0, 0) - tx.setFailOnHandler(true) - - txBytes, err = cdc.Marshal(tx) - require.NoError(t, err) - - res = app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - // should emit ante event - require.NotEmpty(t, res.Events) - require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) - - ctx = app.getState(runTxModeDeliver).ctx - store = ctx.KVStore(capKey1) - require.Equal(t, int64(1), getIntFromStore(store, anteKey)) - require.Equal(t, int64(0), getIntFromStore(store, deliverKey)) - - // execute a successful ante handler and message execution where state is - // implicitly checked by previous tx executions - tx = newTxCounter(1, 0) - - txBytes, err = cdc.Marshal(tx) - require.NoError(t, err) - - res = app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.NotEmpty(t, res.Events) - require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) - - ctx = app.getState(runTxModeDeliver).ctx - store = ctx.KVStore(capKey1) - require.Equal(t, int64(2), getIntFromStore(store, anteKey)) - require.Equal(t, int64(1), getIntFromStore(store, deliverKey)) - - // commit - app.EndBlock(abci.RequestEndBlock{}) - app.Commit() -} - -func TestGasConsumptionBadTx(t *testing.T) { - gasWanted := uint64(5) - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasWanted)) - - defer func() { - if r := recover(); r != nil { - switch rType := r.(type) { - case sdk.ErrorOutOfGas: - log := fmt.Sprintf("out of gas in location: %v", rType.Descriptor) - err = sdkerrors.Wrap(sdkerrors.ErrOutOfGas, log) - default: - panic(r) - } - } - }() - - txTest := tx.(txTest) - newCtx.GasMeter().ConsumeGas(uint64(txTest.Counter), "counter-ante") - if txTest.FailOnAnte { - return newCtx, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "ante handler failure") - } - - return - }) - } - - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - count := msg.(*msgCounter).Counter - ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler") - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - cdc := codec.NewLegacyAmino() - registerTestCodec(cdc) - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - app.InitChain(abci.RequestInitChain{ - ConsensusParams: &abci.ConsensusParams{ - Block: &abci.BlockParams{ - MaxGas: 9, - }, - }, - }) - - app.InitChain(abci.RequestInitChain{}) - - header := tmproto.Header{Height: app.LastBlockHeight() + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - tx := newTxCounter(5, 0) - tx.setFailOnAnte(true) - txBytes, err := cdc.Marshal(tx) - require.NoError(t, err) - - res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) - - // require next tx to fail due to black gas limit - tx = newTxCounter(5, 0) - txBytes, err = cdc.Marshal(tx) - require.NoError(t, err) - - res = app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) -} - -// Test that we can only query from the latest committed state. -func TestQuery(t *testing.T) { - key, value := []byte("hello"), []byte("goodbye") - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - store := ctx.KVStore(capKey1) - store.Set(key, value) - return - }) - } - - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - store := ctx.KVStore(capKey1) - store.Set(key, value) - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - - app.InitChain(abci.RequestInitChain{}) - - // NOTE: "/store/key1" tells us KVStore - // and the final "/key" says to use the data as the - // key in the given KVStore ... - query := abci.RequestQuery{ - Path: "/store/key1/key", - Data: key, - } - tx := newTxCounter(0, 0) - - // query is empty before we do anything - res := app.Query(query) - require.Equal(t, 0, len(res.Value)) - - // query is still empty after a CheckTx - _, resTx, err := app.Check(aminoTxEncoder(), tx) - require.NoError(t, err) - require.NotNil(t, resTx) - res = app.Query(query) - require.Equal(t, 0, len(res.Value)) - - // query is still empty after a DeliverTx before we commit - header := tmproto.Header{Height: app.LastBlockHeight() + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - _, resTx, err = app.Deliver(aminoTxEncoder(), tx) - require.NoError(t, err) - require.NotNil(t, resTx) - res = app.Query(query) - require.Equal(t, 0, len(res.Value)) - - // query returns correct value after Commit - app.Commit() - res = app.Query(query) - require.Equal(t, value, res.Value) -} - -func TestGRPCQuery(t *testing.T) { - grpcQueryOpt := func(bapp *BaseApp) { - testdata.RegisterQueryServer( - bapp.GRPCQueryRouter(), - testdata.QueryImpl{}, - ) - } - - app, err := setupBaseApp(t, grpcQueryOpt) - require.NoError(t, err) - - app.InitChain(abci.RequestInitChain{}) - header := tmproto.Header{Height: app.LastBlockHeight() + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - app.Commit() - - req := testdata.SayHelloRequest{Name: "foo"} - reqBz, err := req.Marshal() - require.NoError(t, err) - - reqQuery := abci.RequestQuery{ - Data: reqBz, - Path: "/testdata.Query/SayHello", - } - - resQuery := app.Query(reqQuery) - - require.Equal(t, abci.CodeTypeOK, resQuery.Code, resQuery) - - var res testdata.SayHelloResponse - err = res.Unmarshal(resQuery.Value) - require.NoError(t, err) - require.Equal(t, "Hello foo!", res.Greeting) -} - -// Test p2p filter queries -func TestP2PQuery(t *testing.T) { - addrPeerFilterOpt := func(bapp *BaseApp) { - bapp.SetAddrPeerFilter(func(addrport string) abci.ResponseQuery { - require.Equal(t, "1.1.1.1:8000", addrport) - return abci.ResponseQuery{Code: uint32(3)} - }) - } - - idPeerFilterOpt := func(bapp *BaseApp) { - bapp.SetIDPeerFilter(func(id string) abci.ResponseQuery { - require.Equal(t, "testid", id) - return abci.ResponseQuery{Code: uint32(4)} - }) - } - - app, err := setupBaseApp(t, addrPeerFilterOpt, idPeerFilterOpt) - require.NoError(t, err) - - addrQuery := abci.RequestQuery{ - Path: "/p2p/filter/addr/1.1.1.1:8000", - } - res := app.Query(addrQuery) - require.Equal(t, uint32(3), res.Code) - - idQuery := abci.RequestQuery{ - Path: "/p2p/filter/id/testid", - } - res = app.Query(idQuery) - require.Equal(t, uint32(4), res.Code) -} - -func TestGetMaximumBlockGas(t *testing.T) { - app, err := setupBaseApp(t) - require.NoError(t, err) - app.InitChain(abci.RequestInitChain{}) - ctx := app.NewContext(true, tmproto.Header{}) - - app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: 0}}) - require.Equal(t, uint64(0), app.getMaximumBlockGas(ctx)) - - app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: -1}}) - require.Equal(t, uint64(0), app.getMaximumBlockGas(ctx)) - - app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: 5000000}}) - require.Equal(t, uint64(5000000), app.getMaximumBlockGas(ctx)) - - app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: -5000000}}) - require.Panics(t, func() { app.getMaximumBlockGas(ctx) }) -} - -func TestListSnapshots(t *testing.T) { - setupConfig := &setupConfig{ - blocks: 5, - blockTxs: 4, - snapshotInterval: 2, - snapshotKeepEvery: 2, - pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - } - - app, teardown, err := setupBaseAppWithSnapshots(t, setupConfig) - require.NoError(t, err) - defer teardown() - - expected := abci.ResponseListSnapshots{Snapshots: []*abci.Snapshot{ - {Height: 4, Format: 2, Chunks: 2}, - {Height: 2, Format: 2, Chunks: 1}, - }} - - resp := app.ListSnapshots(abci.RequestListSnapshots{}) - queryResponse := app.Query(abci.RequestQuery{ - Path: "/app/snapshots", - }) - - queryListSnapshotsResp := abci.ResponseListSnapshots{} - err = json.Unmarshal(queryResponse.Value, &queryListSnapshotsResp) - require.NoError(t, err) - - for i, s := range resp.Snapshots { - querySnapshot := queryListSnapshotsResp.Snapshots[i] - // we check that the query snapshot and function snapshot are equal - // Then we check that the hash and metadata are not empty. We atm - // do not have a good way to generate the expected value for these. - assert.Equal(t, *s, *querySnapshot) - assert.NotEmpty(t, s.Hash) - assert.NotEmpty(t, s.Metadata) - // Set hash and metadata to nil, so we can check the other snapshot - // fields against expected - s.Hash = nil - s.Metadata = nil - } - assert.Equal(t, expected, resp) -} - -func TestSnapshotWithPruning(t *testing.T) { - testcases := map[string]struct { - config *setupConfig - expectedSnapshots []*abci.Snapshot - expectedErr error - }{ - "prune nothing with snapshot": { - config: &setupConfig{ - blocks: 20, - blockTxs: 2, - snapshotInterval: 5, - snapshotKeepEvery: 1, - pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - }, - expectedSnapshots: []*abci.Snapshot{ - {Height: 20, Format: 2, Chunks: 5}, - }, - }, - "prune everything with snapshot": { - config: &setupConfig{ - blocks: 20, - blockTxs: 2, - snapshotInterval: 5, - snapshotKeepEvery: 1, - pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningEverything), - }, - expectedSnapshots: []*abci.Snapshot{ - {Height: 20, Format: 2, Chunks: 5}, - }, - }, - "default pruning with snapshot": { - config: &setupConfig{ - blocks: 20, - blockTxs: 2, - snapshotInterval: 5, - snapshotKeepEvery: 1, - pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningDefault), - }, - expectedSnapshots: []*abci.Snapshot{ - {Height: 20, Format: 2, Chunks: 5}, - }, - }, - "custom": { - config: &setupConfig{ - blocks: 25, - blockTxs: 2, - snapshotInterval: 5, - snapshotKeepEvery: 2, - pruningOpts: pruningtypes.NewCustomPruningOptions(12, 12), - }, - expectedSnapshots: []*abci.Snapshot{ - {Height: 25, Format: 2, Chunks: 6}, - {Height: 20, Format: 2, Chunks: 5}, - }, - }, - "no snapshots": { - config: &setupConfig{ - blocks: 10, - blockTxs: 2, - snapshotInterval: 0, // 0 implies disable snapshots - pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - }, - expectedSnapshots: []*abci.Snapshot{}, - }, - "keep all snapshots": { - config: &setupConfig{ - blocks: 10, - blockTxs: 2, - snapshotInterval: 3, - snapshotKeepEvery: 0, // 0 implies keep all snapshots - pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - }, - expectedSnapshots: []*abci.Snapshot{ - {Height: 9, Format: 2, Chunks: 2}, - {Height: 6, Format: 2, Chunks: 2}, - {Height: 3, Format: 2, Chunks: 1}, - }, - }, - } - - for name, tc := range testcases { - t.Run(name, func(t *testing.T) { - app, teardown, err := setupBaseAppWithSnapshots(t, tc.config) - - if tc.expectedErr != nil { - require.Error(t, err) - require.Equal(t, tc.expectedErr.Error(), err.Error()) - return - } - require.NoError(t, err) - - defer teardown() - - resp := app.ListSnapshots(abci.RequestListSnapshots{}) - for _, s := range resp.Snapshots { - assert.NotEmpty(t, s.Hash) - assert.NotEmpty(t, s.Metadata) - s.Hash = nil - s.Metadata = nil - } - fmt.Println(resp) - assert.Equal(t, abci.ResponseListSnapshots{Snapshots: tc.expectedSnapshots}, resp) - - // Validate that heights were pruned correctly by querying the state at the last height that should be present relative to latest - // and the first height that should be pruned. - // - // Exceptions: - // * Prune nothing: should be able to query all heights (we only test first and latest) - // * Prune default: should be able to query all heights (we only test first and latest) - // * The reason for default behaving this way is that we only commit 20 heights but default has 100_000 keep-recent - var lastExistingHeight int64 - if tc.config.pruningOpts.GetPruningStrategy() == pruningtypes.PruningNothing || tc.config.pruningOpts.GetPruningStrategy() == pruningtypes.PruningDefault { - lastExistingHeight = 1 - } else { - // Integer division rounds down so by multiplying back we get the last height at which we pruned - lastExistingHeight = int64((tc.config.blocks/tc.config.pruningOpts.Interval)*tc.config.pruningOpts.Interval - tc.config.pruningOpts.KeepRecent) - } - - // Query 1 - res := app.Query(abci.RequestQuery{Path: fmt.Sprintf("/store/%s/key", capKey2.Name()), Data: []byte("0"), Height: lastExistingHeight}) - require.NotNil(t, res, "height: %d", lastExistingHeight) - require.NotNil(t, res.Value, "height: %d", lastExistingHeight) - - // Query 2 - res = app.Query(abci.RequestQuery{Path: fmt.Sprintf("/store/%s/key", capKey2.Name()), Data: []byte("0"), Height: lastExistingHeight - 1}) - require.NotNil(t, res, "height: %d", lastExistingHeight-1) - if tc.config.pruningOpts.GetPruningStrategy() == pruningtypes.PruningNothing || tc.config.pruningOpts.GetPruningStrategy() == pruningtypes.PruningDefault { - // With prune nothing or default, we query height 0 which translates to the latest height. - require.NotNil(t, res.Value, "height: %d", lastExistingHeight-1) - } - }) - } -} - -func TestLoadSnapshotChunk(t *testing.T) { - setupConfig := &setupConfig{ - blocks: 2, - blockTxs: 5, - snapshotInterval: 2, - snapshotKeepEvery: 2, - pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - } - app, teardown, err := setupBaseAppWithSnapshots(t, setupConfig) - require.NoError(t, err) - defer teardown() - - testcases := map[string]struct { - height uint64 - format uint32 - chunk uint32 - expectEmpty bool - }{ - "Existing snapshot": {2, 2, 1, false}, - "Missing height": {100, 2, 1, true}, - "Missing format": {2, 1, 1, true}, - "Missing chunk": {2, 2, 9, true}, - "Zero height": {0, 2, 1, true}, - "Zero format": {2, 0, 1, true}, - "Zero chunk": {2, 2, 0, false}, - } - for name, tc := range testcases { - tc := tc - t.Run(name, func(t *testing.T) { - resp := app.LoadSnapshotChunk(abci.RequestLoadSnapshotChunk{ - Height: tc.height, - Format: tc.format, - Chunk: tc.chunk, - }) - if tc.expectEmpty { - assert.Equal(t, abci.ResponseLoadSnapshotChunk{}, resp) - return - } - assert.NotEmpty(t, resp.Chunk) - }) - } -} - -func TestOfferSnapshot_Errors(t *testing.T) { - // Set up app before test cases, since it's fairly expensive. - setupConfig := &setupConfig{ - blocks: 0, - blockTxs: 0, - snapshotInterval: 2, - snapshotKeepEvery: 2, - pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - } - app, teardown, err := setupBaseAppWithSnapshots(t, setupConfig) - require.NoError(t, err) - defer teardown() - - m := snapshottypes.Metadata{ChunkHashes: [][]byte{{1}, {2}, {3}}} - metadata, err := m.Marshal() - require.NoError(t, err) - hash := []byte{1, 2, 3} - - testcases := map[string]struct { - snapshot *abci.Snapshot - result abci.ResponseOfferSnapshot_Result - }{ - "nil snapshot": {nil, abci.ResponseOfferSnapshot_REJECT}, - "invalid format": {&abci.Snapshot{ - Height: 1, Format: 9, Chunks: 3, Hash: hash, Metadata: metadata, - }, abci.ResponseOfferSnapshot_REJECT_FORMAT}, - "incorrect chunk count": {&abci.Snapshot{ - Height: 1, Format: 2, Chunks: 2, Hash: hash, Metadata: metadata, - }, abci.ResponseOfferSnapshot_REJECT}, - "no chunks": {&abci.Snapshot{ - Height: 1, Format: 2, Chunks: 0, Hash: hash, Metadata: metadata, - }, abci.ResponseOfferSnapshot_REJECT}, - "invalid metadata serialization": {&abci.Snapshot{ - Height: 1, Format: 2, Chunks: 0, Hash: hash, Metadata: []byte{3, 1, 4}, - }, abci.ResponseOfferSnapshot_REJECT}, - } - for name, tc := range testcases { - tc := tc - t.Run(name, func(t *testing.T) { - resp := app.OfferSnapshot(abci.RequestOfferSnapshot{Snapshot: tc.snapshot}) - assert.Equal(t, tc.result, resp.Result) - }) - } - - // Offering a snapshot after one has been accepted should error - resp := app.OfferSnapshot(abci.RequestOfferSnapshot{Snapshot: &abci.Snapshot{ - Height: 1, - Format: snapshottypes.CurrentFormat, - Chunks: 3, - Hash: []byte{1, 2, 3}, - Metadata: metadata, - }}) - require.Equal(t, abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_ACCEPT}, resp) - - resp = app.OfferSnapshot(abci.RequestOfferSnapshot{Snapshot: &abci.Snapshot{ - Height: 2, - Format: snapshottypes.CurrentFormat, - Chunks: 3, - Hash: []byte{1, 2, 3}, - Metadata: metadata, - }}) - require.Equal(t, abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_ABORT}, resp) -} - -func TestApplySnapshotChunk(t *testing.T) { - setupConfig1 := &setupConfig{ - blocks: 4, - blockTxs: 10, - snapshotInterval: 2, - snapshotKeepEvery: 2, - pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - } - source, teardown, err := setupBaseAppWithSnapshots(t, setupConfig1) - require.NoError(t, err) - defer teardown() - - setupConfig2 := &setupConfig{ - blocks: 0, - blockTxs: 0, - snapshotInterval: 2, - snapshotKeepEvery: 2, - pruningOpts: pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - } - target, teardown, err := setupBaseAppWithSnapshots(t, setupConfig2) - require.NoError(t, err) - defer teardown() - - // Fetch latest snapshot to restore - respList := source.ListSnapshots(abci.RequestListSnapshots{}) - require.NotEmpty(t, respList.Snapshots) - snapshot := respList.Snapshots[0] - - // Make sure the snapshot has at least 3 chunks - require.GreaterOrEqual(t, snapshot.Chunks, uint32(3), "Not enough snapshot chunks") - - // Begin a snapshot restoration in the target - respOffer := target.OfferSnapshot(abci.RequestOfferSnapshot{Snapshot: snapshot}) - require.Equal(t, abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_ACCEPT}, respOffer) - - // We should be able to pass an invalid chunk and get a verify failure, before reapplying it. - respApply := target.ApplySnapshotChunk(abci.RequestApplySnapshotChunk{ - Index: 0, - Chunk: []byte{9}, - Sender: "sender", - }) - require.Equal(t, abci.ResponseApplySnapshotChunk{ - Result: abci.ResponseApplySnapshotChunk_RETRY, - RefetchChunks: []uint32{0}, - RejectSenders: []string{"sender"}, - }, respApply) - - // Fetch each chunk from the source and apply it to the target - for index := uint32(0); index < snapshot.Chunks; index++ { - respChunk := source.LoadSnapshotChunk(abci.RequestLoadSnapshotChunk{ - Height: snapshot.Height, - Format: snapshot.Format, - Chunk: index, - }) - require.NotNil(t, respChunk.Chunk) - respApply := target.ApplySnapshotChunk(abci.RequestApplySnapshotChunk{ - Index: index, - Chunk: respChunk.Chunk, - }) - require.Equal(t, abci.ResponseApplySnapshotChunk{ - Result: abci.ResponseApplySnapshotChunk_ACCEPT, - }, respApply) - } - - // The target should now have the same hash as the source - assert.Equal(t, source.LastCommitID(), target.LastCommitID()) -} - -// NOTE: represents a new custom router for testing purposes of WithRouter() -type testCustomRouter struct { - routes sync.Map -} - -func (rtr *testCustomRouter) AddRoute(route sdk.Route) sdk.Router { - rtr.routes.Store(route.Path(), route.Handler()) - return rtr -} - -func (rtr *testCustomRouter) Route(ctx sdk.Context, path string) sdk.Handler { - if v, ok := rtr.routes.Load(path); ok { - if h, ok := v.(sdk.Handler); ok { - return h - } - } - return nil -} - -func TestWithRouter(t *testing.T) { - // test increments in the ante - anteKey := []byte("ante-key") - anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) } - - // test increments in the handler - deliverKey := []byte("deliver-key") - routerOpt := func(bapp *BaseApp) { - bapp.SetRouter(&testCustomRouter{routes: sync.Map{}}) - r := sdk.NewRoute(routeMsgCounter, handlerMsgCounter(t, capKey1, deliverKey)) - bapp.Router().AddRoute(r) - } - - app, err := setupBaseApp(t, anteOpt, routerOpt) - require.NoError(t, err) - app.InitChain(abci.RequestInitChain{}) - - // Create same codec used in txDecoder - codec := codec.NewLegacyAmino() - registerTestCodec(codec) - - nBlocks := 3 - txPerHeight := 5 - - for blockN := 0; blockN < nBlocks; blockN++ { - header := tmproto.Header{Height: int64(blockN) + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - for i := 0; i < txPerHeight; i++ { - counter := int64(blockN*txPerHeight + i) - tx := newTxCounter(counter, counter) - - txBytes, err := codec.Marshal(tx) - require.NoError(t, err) - - res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) - } - - app.EndBlock(abci.RequestEndBlock{}) - app.Commit() - } -} - -func TestBaseApp_EndBlock(t *testing.T) { - db := dbm.NewMemDB() - name := t.Name() - logger := defaultLogger() - - cp := &abci.ConsensusParams{ - Block: &abci.BlockParams{ - MaxGas: 5000000, - }, - } - - app := NewBaseApp(name, logger, db, nil) - app.SetParamStore(&mock.ParamStore{Db: dbm.NewMemDB()}) - app.InitChain(abci.RequestInitChain{ - ConsensusParams: cp, - }) - - app.SetEndBlocker(func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - return abci.ResponseEndBlock{ - ValidatorUpdates: []abci.ValidatorUpdate{ - {Power: 100}, - }, - } - }) - app.Seal() - - res := app.EndBlock(abci.RequestEndBlock{}) - require.Len(t, res.GetValidatorUpdates(), 1) - require.Equal(t, int64(100), res.GetValidatorUpdates()[0].Power) - require.Equal(t, cp.Block.MaxGas, res.ConsensusParamUpdates.Block.MaxGas) -} - -func TestBaseApp_Init_PruningAndSnapshot(t *testing.T) { - db := dbm.NewMemDB() - name := t.Name() - logger := defaultLogger() - - snapshotStore, err := snapshots.NewStore(dbm.NewMemDB(), snaphotstestutil.GetTempDir(t)) - require.NoError(t, err) - - testCases := map[string]struct { - bapp *BaseApp - expectedPruning pruningtypes.PruningOptions - expectedSnapshot snapshottypes.SnapshotOptions - expectedErr error - isSnapshotManagerNil bool - }{ - "snapshot but no pruning": { - NewBaseApp(name, logger, db, nil, - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(1500, 2)), - ), - pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - snapshottypes.NewSnapshotOptions(1500, 2), - // if no pruning is set, the default is PruneNothing - nil, - false, - }, - "nil snapshot store": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)), - SetSnapshot(nil, snapshottypes.NewSnapshotOptions(1500, 2)), - ), - pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - snapshottypes.SnapshotOptions{}, - nil, - true, - }, - "pruning everything only": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningEverything)), - ), - pruningtypes.NewPruningOptions(pruningtypes.PruningEverything), - snapshottypes.SnapshotOptions{}, - nil, - true, - }, - "pruning nothing only": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)), - ), - pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - snapshottypes.NewSnapshotOptions(snapshottypes.SnapshotIntervalOff, 0), - nil, - true, - }, - "pruning default only": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningDefault)), - ), - pruningtypes.NewPruningOptions(pruningtypes.PruningDefault), - snapshottypes.NewSnapshotOptions(snapshottypes.SnapshotIntervalOff, 0), - nil, - true, - }, - "pruning custom only": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewCustomPruningOptions(10, 10)), - ), - pruningtypes.NewCustomPruningOptions(10, 10), - snapshottypes.NewSnapshotOptions(snapshottypes.SnapshotIntervalOff, 0), - nil, - true, - }, - "pruning everything and snapshots": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningEverything)), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(1500, 2)), - ), - pruningtypes.NewPruningOptions(pruningtypes.PruningEverything), - snapshottypes.NewSnapshotOptions(1500, 2), - nil, - false, - }, - "pruning nothing and snapshots": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningNothing)), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(1500, 2)), - ), - pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), - snapshottypes.NewSnapshotOptions(1500, 2), - nil, - false, - }, - "pruning default and snapshots": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewPruningOptions(pruningtypes.PruningDefault)), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(1500, 2)), - ), - pruningtypes.NewPruningOptions(pruningtypes.PruningDefault), - snapshottypes.NewSnapshotOptions(1500, 2), - nil, - false, - }, - "pruning custom and snapshots": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewCustomPruningOptions(10, 10)), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(1500, 2)), - ), - pruningtypes.NewCustomPruningOptions(10, 10), - snapshottypes.NewSnapshotOptions(1500, 2), - nil, - false, - }, - "error custom pruning 0 interval": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewCustomPruningOptions(10, 0)), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(1500, 2)), - ), - pruningtypes.NewCustomPruningOptions(10, 0), - snapshottypes.NewSnapshotOptions(1500, 2), - pruningtypes.ErrPruningIntervalZero, - false, - }, - "error custom pruning too small interval": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewCustomPruningOptions(10, 9)), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(1500, 2)), - ), - pruningtypes.NewCustomPruningOptions(10, 9), - snapshottypes.NewSnapshotOptions(1500, 2), - pruningtypes.ErrPruningIntervalTooSmall, - false, - }, - "error custom pruning too small keep recent": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewCustomPruningOptions(9, 10)), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(1500, 2)), - ), - pruningtypes.NewCustomPruningOptions(9, 10), - snapshottypes.NewSnapshotOptions(1500, 2), - pruningtypes.ErrPruningKeepRecentTooSmall, - false, - }, - "snapshot zero interval - manager is set": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewCustomPruningOptions(10, 10)), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(0, 2)), - ), - pruningtypes.NewCustomPruningOptions(10, 10), - snapshottypes.NewSnapshotOptions(snapshottypes.SnapshotIntervalOff, 2), - nil, - false, - }, - "snapshot zero keep recent - allowed": { - NewBaseApp(name, logger, db, nil, - SetPruning(pruningtypes.NewCustomPruningOptions(10, 10)), - SetSnapshot(snapshotStore, snapshottypes.NewSnapshotOptions(1500, 0)), - ), - pruningtypes.NewCustomPruningOptions(10, 10), - snapshottypes.NewSnapshotOptions(1500, 0), // 0 snapshot-keep-recent means keep all - nil, - false, - }, - } - - for _, tc := range testCases { - tc.bapp.SetParamStore(&mock.ParamStore{db}) - - // Init and validate - require.Equal(t, tc.expectedErr, tc.bapp.init()) - if tc.expectedErr != nil { - continue - } - - // Check that settings were set correctly - actualPruning := tc.bapp.cms.GetPruning() - require.Equal(t, tc.expectedPruning, actualPruning) - - if tc.isSnapshotManagerNil { - require.Nil(t, tc.bapp.snapshotManager) - continue - } - - require.Equal(t, tc.expectedSnapshot.Interval, tc.bapp.snapshotManager.GetInterval()) - require.Equal(t, tc.expectedSnapshot.KeepRecent, tc.bapp.snapshotManager.GetKeepRecent()) - } -} - -func TestBaseApp_Init_AppVersion(t *testing.T) { - const versionNotSet = 0 - - testcases := []struct { - name string - protocolVersion uint64 - }{ - { - name: "no app version was set - set to 0", - protocolVersion: versionNotSet, - }, - { - name: "app version was set to 10 - 10 kept", - protocolVersion: 10, - }, - } - - for _, tc := range testcases { - t.Run(tc.name, func(t *testing.T) { - db := dbm.NewMemDB() - app := newBaseAppWithDB(t.Name(), db) - - if tc.protocolVersion != versionNotSet { - err := app.cms.SetAppVersion(tc.protocolVersion) - require.NoError(t, err) - } - - // recreate app - app = newBaseAppWithDB(t.Name(), db) - - require.NoError(t, app.init()) - - actualProtocolVersion, err := app.GetAppVersion() - require.NoError(t, err) - - require.Equal(t, tc.protocolVersion, actualProtocolVersion) - }) - } + suite.baseApp.StoreConsensusParams(ctx, &tmproto.ConsensusParams{Block: &tmproto.BlockParams{MaxGas: -5000000}}) + require.Panics(t, func() { suite.baseApp.GetMaximumBlockGas(ctx) }) } diff --git a/baseapp/grpcrouter.go b/baseapp/grpcrouter.go index 9c15b695176c..d311f085c0e4 100644 --- a/baseapp/grpcrouter.go +++ b/baseapp/grpcrouter.go @@ -3,25 +3,22 @@ package baseapp import ( "fmt" - "github.com/cosmos/cosmos-sdk/client/grpc/reflection" - - gogogrpc "github.com/gogo/protobuf/grpc" + gogogrpc "github.com/cosmos/gogoproto/grpc" abci "github.com/tendermint/tendermint/abci/types" "google.golang.org/grpc" "google.golang.org/grpc/encoding" - "google.golang.org/grpc/encoding/proto" + "github.com/cosmos/cosmos-sdk/client/grpc/reflection" + "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" ) -var protoCodec = encoding.GetCodec(proto.Name) - // GRPCQueryRouter routes ABCI Query requests to GRPC handlers type GRPCQueryRouter struct { - routes map[string]GRPCQueryHandler - interfaceRegistry codectypes.InterfaceRegistry - serviceData []serviceData + routes map[string]GRPCQueryHandler + cdc encoding.Codec + serviceData []serviceData } // serviceData represents a gRPC service, along with its handler. @@ -83,21 +80,15 @@ func (qrt *GRPCQueryRouter) RegisterService(sd *grpc.ServiceDesc, handler interf // call the method handler from the service description with the handler object, // a wrapped sdk.Context with proto-unmarshaled data from the ABCI request data res, err := methodHandler(handler, sdk.WrapSDKContext(ctx), func(i interface{}) error { - err := protoCodec.Unmarshal(req.Data, i) - if err != nil { - return err - } - if qrt.interfaceRegistry != nil { - return codectypes.UnpackInterfaces(i, qrt.interfaceRegistry) - } - return nil + return qrt.cdc.Unmarshal(req.Data, i) }, nil) if err != nil { return abci.ResponseQuery{}, err } // proto marshal the result bytes - resBytes, err := protoCodec.Marshal(res) + var resBytes []byte + resBytes, err = qrt.cdc.Marshal(res) if err != nil { return abci.ResponseQuery{}, err } @@ -119,11 +110,9 @@ func (qrt *GRPCQueryRouter) RegisterService(sd *grpc.ServiceDesc, handler interf // SetInterfaceRegistry sets the interface registry for the router. This will // also register the interface reflection gRPC service. func (qrt *GRPCQueryRouter) SetInterfaceRegistry(interfaceRegistry codectypes.InterfaceRegistry) { - qrt.interfaceRegistry = interfaceRegistry + // instantiate the codec + qrt.cdc = codec.NewProtoCodec(interfaceRegistry).GRPCCodec() // Once we have an interface registry, we can register the interface // registry reflection gRPC service. - reflection.RegisterReflectionServiceServer( - qrt, - reflection.NewReflectionServiceServer(interfaceRegistry), - ) + reflection.RegisterReflectionServiceServer(qrt, reflection.NewReflectionServiceServer(interfaceRegistry)) } diff --git a/baseapp/grpcrouter_helpers.go b/baseapp/grpcrouter_helpers.go index 2ea74b55fc65..9efe019517cc 100644 --- a/baseapp/grpcrouter_helpers.go +++ b/baseapp/grpcrouter_helpers.go @@ -4,7 +4,7 @@ import ( gocontext "context" "fmt" - gogogrpc "github.com/gogo/protobuf/grpc" + gogogrpc "github.com/cosmos/gogoproto/grpc" abci "github.com/tendermint/tendermint/abci/types" "google.golang.org/grpc" @@ -40,7 +40,7 @@ func (q *QueryServiceTestHelper) Invoke(_ gocontext.Context, method string, args if querier == nil { return fmt.Errorf("handler not found for %s", method) } - reqBz, err := protoCodec.Marshal(args) + reqBz, err := q.cdc.Marshal(args) if err != nil { return err } @@ -50,15 +50,11 @@ func (q *QueryServiceTestHelper) Invoke(_ gocontext.Context, method string, args return err } - err = protoCodec.Unmarshal(res.Value, reply) + err = q.cdc.Unmarshal(res.Value, reply) if err != nil { return err } - if q.interfaceRegistry != nil { - return types.UnpackInterfaces(reply, q.interfaceRegistry) - } - return nil } diff --git a/baseapp/grpcrouter_test.go b/baseapp/grpcrouter_test.go index 64b2a97b9b00..486d966351b3 100644 --- a/baseapp/grpcrouter_test.go +++ b/baseapp/grpcrouter_test.go @@ -16,7 +16,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -func TestGRPCGatewayRouter(t *testing.T) { +func TestGRPCQueryRouter(t *testing.T) { qr := baseapp.NewGRPCQueryRouter() interfaceRegistry := testdata.NewTestInterfaceRegistry() qr.SetInterfaceRegistry(interfaceRegistry) @@ -32,9 +32,9 @@ func TestGRPCGatewayRouter(t *testing.T) { require.NotNil(t, res) require.Equal(t, "hello", res.Message) - require.Panics(t, func() { - _, _ = client.Echo(context.Background(), nil) - }) + res, err = client.Echo(context.Background(), nil) + require.Nil(t, err) + require.Empty(t, res.Message) res2, err := client.SayHello(context.Background(), &testdata.SayHelloRequest{Name: "Foo"}) require.Nil(t, err) diff --git a/baseapp/grpcserver.go b/baseapp/grpcserver.go index 68cc14e66545..e3a09106abe1 100644 --- a/baseapp/grpcserver.go +++ b/baseapp/grpcserver.go @@ -4,7 +4,7 @@ import ( "context" "strconv" - gogogrpc "github.com/gogo/protobuf/grpc" + gogogrpc "github.com/cosmos/gogoproto/grpc" grpcmiddleware "github.com/grpc-ecosystem/go-grpc-middleware" grpcrecovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" "google.golang.org/grpc" @@ -47,7 +47,7 @@ func (app *BaseApp) RegisterGRPCServer(server gogogrpc.Server) { // Create the sdk.Context. Passing false as 2nd arg, as we can't // actually support proofs with gRPC right now. - sdkCtx, err := app.createQueryContext(height, false) + sdkCtx, err := app.CreateQueryContext(height, false) if err != nil { return nil, err } diff --git a/baseapp/msg_service_router.go b/baseapp/msg_service_router.go index 1b76bf49a211..269424e5fdb7 100644 --- a/baseapp/msg_service_router.go +++ b/baseapp/msg_service_router.go @@ -4,8 +4,8 @@ import ( "context" "fmt" - gogogrpc "github.com/gogo/protobuf/grpc" - "github.com/gogo/protobuf/proto" + gogogrpc "github.com/cosmos/gogoproto/grpc" + "github.com/cosmos/gogoproto/proto" "google.golang.org/grpc" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -46,9 +46,9 @@ func (msr *MsgServiceRouter) HandlerByTypeURL(typeURL string) MsgServiceHandler // service description, handler is an object which implements that gRPC service. // // This function PANICs: -// - if it is called before the service `Msg`s have been registered using -// RegisterInterfaces, -// - or if a service is being registered twice. +// - if it is called before the service `Msg`s have been registered using +// RegisterInterfaces, +// - or if a service is being registered twice. func (msr *MsgServiceRouter) RegisterService(sd *grpc.ServiceDesc, handler interface{}) { // Adds a top-level query handler based on the gRPC service name. for _, method := range sd.Methods { diff --git a/baseapp/options.go b/baseapp/options.go index bb6ccd890248..7df46f445122 100644 --- a/baseapp/options.go +++ b/baseapp/options.go @@ -12,6 +12,7 @@ import ( snapshottypes "github.com/cosmos/cosmos-sdk/snapshots/types" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/mempool" ) // File for storing in-package BaseApp optional functions, @@ -75,6 +76,21 @@ func SetSnapshot(snapshotStore *snapshots.Store, opts snapshottypes.SnapshotOpti return func(app *BaseApp) { app.SetSnapshot(snapshotStore, opts) } } +// SetPrepareProposal sets the PrepareProposal handler on the BaseApp. +func SetPrepareProposal(handler sdk.PrepareProposalHandler) func(*BaseApp) { + return func(app *BaseApp) { app.SetPrepareProposal(handler) } +} + +// SetProcessProposal sets the ProcessProposal handler on the BaseApp. +func SetProcessProposal(handler sdk.ProcessProposalHandler) func(*BaseApp) { + return func(app *BaseApp) { app.SetProcessProposal(handler) } +} + +// SetMempool sets the mempool on BaseApp. +func SetMempool(mempool mempool.Mempool) func(*BaseApp) { + return func(app *BaseApp) { app.SetMempool(mempool) } +} + func (app *BaseApp) SetName(name string) { if app.sealed { panic("SetName() on sealed BaseApp") @@ -125,7 +141,7 @@ func (app *BaseApp) SetDB(db dbm.DB) { func (app *BaseApp) SetCMS(cms store.CommitMultiStore) { if app.sealed { - panic("SetEndBlocker() on sealed BaseApp") + panic("SetCMS() on sealed BaseApp") } app.cms = cms @@ -237,3 +253,49 @@ func (app *BaseApp) SetInterfaceRegistry(registry types.InterfaceRegistry) { app.grpcQueryRouter.SetInterfaceRegistry(registry) app.msgServiceRouter.SetInterfaceRegistry(registry) } + +// SetMempool sets the application's mempool. +func (app *BaseApp) SetMempool(m mempool.Mempool) { + if app.sealed { + panic("SetMempool() called on sealed BaseApp") + } + + app.mempool = m +} + +// SetTxDecoder sets the TxDecoder if it wasn't provided in the BaseApp constructor. +func (app *BaseApp) SetTxDecoder(txDecoder sdk.TxDecoder) { + if app.sealed { + panic("SetTxDecoder() on sealed BaseApp") + } + + app.txDecoder = txDecoder +} + +// SetTxEncoder sets the TxEncoder if it wasn't provided in the BaseApp +// constructor. +func (app *BaseApp) SetTxEncoder(txEncoder sdk.TxEncoder) { + if app.sealed { + panic("SetTxEncoder() on sealed BaseApp") + } + + app.txEncoder = txEncoder +} + +// SetPrepareProposal sets the prepare proposal function for the BaseApp. +func (app *BaseApp) SetPrepareProposal(handler sdk.PrepareProposalHandler) { + if app.sealed { + panic("SetPrepareProposal() on sealed BaseApp") + } + + app.prepareProposal = handler +} + +// SetProcessProposal sets the process proposal function for the BaseApp. +func (app *BaseApp) SetProcessProposal(handler sdk.ProcessProposalHandler) { + if app.sealed { + panic("SetProcessProposal() on sealed BaseApp") + } + + app.processProposal = handler +} diff --git a/baseapp/params.go b/baseapp/params.go index b19c155d21ee..ca243bf61bad 100644 --- a/baseapp/params.go +++ b/baseapp/params.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" - abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -31,7 +30,7 @@ type ParamStore interface { // ValidateBlockParams defines a stateless validation on BlockParams. This function // is called whenever the parameters are updated or stored. func ValidateBlockParams(i interface{}) error { - v, ok := i.(abci.BlockParams) + v, ok := i.(tmproto.BlockParams) if !ok { return fmt.Errorf("invalid parameter type: %T", i) } diff --git a/baseapp/params_test.go b/baseapp/params_test.go index 6507e17a8aea..3f9d26a56f2f 100644 --- a/baseapp/params_test.go +++ b/baseapp/params_test.go @@ -4,7 +4,6 @@ import ( "testing" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/baseapp" @@ -16,11 +15,11 @@ func TestValidateBlockParams(t *testing.T) { expectErr bool }{ {nil, true}, - {&abci.BlockParams{}, true}, - {abci.BlockParams{}, true}, - {abci.BlockParams{MaxBytes: -1, MaxGas: -1}, true}, - {abci.BlockParams{MaxBytes: 2000000, MaxGas: -5}, true}, - {abci.BlockParams{MaxBytes: 2000000, MaxGas: 300000}, false}, + {&tmproto.BlockParams{}, true}, + {tmproto.BlockParams{}, true}, + {tmproto.BlockParams{MaxBytes: -1, MaxGas: -1}, true}, + {tmproto.BlockParams{MaxBytes: 2000000, MaxGas: -5}, true}, + {tmproto.BlockParams{MaxBytes: 2000000, MaxGas: 300000}, false}, } for _, tc := range testCases { diff --git a/baseapp/testutil/buf.gen.yaml b/baseapp/testutil/buf.gen.yaml new file mode 100644 index 000000000000..d7d17bbb26f8 --- /dev/null +++ b/baseapp/testutil/buf.gen.yaml @@ -0,0 +1,5 @@ +version: v1 +plugins: + - name: gocosmos + out: ../.. + opt: plugins=grpc,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types diff --git a/baseapp/testutil/buf.lock b/baseapp/testutil/buf.lock new file mode 100644 index 000000000000..259bd9ce82b1 --- /dev/null +++ b/baseapp/testutil/buf.lock @@ -0,0 +1,11 @@ +# 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: gogo-proto + commit: 6652e3443c3b4504bb3bf82e73a7e409 diff --git a/baseapp/testutil/buf.yaml b/baseapp/testutil/buf.yaml new file mode 100644 index 000000000000..e6f82c0cdcd7 --- /dev/null +++ b/baseapp/testutil/buf.yaml @@ -0,0 +1,4 @@ +version: v1 +deps: + - buf.build/cosmos/gogo-proto + - buf.build/cosmos/cosmos-proto diff --git a/baseapp/testutil/messages.go b/baseapp/testutil/messages.go new file mode 100644 index 000000000000..b98c192a7e00 --- /dev/null +++ b/baseapp/testutil/messages.go @@ -0,0 +1,63 @@ +package testutil + +import ( + "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/types/msgservice" +) + +func RegisterInterfaces(registry types.InterfaceRegistry) { + registry.RegisterImplementations( + (*sdk.Msg)(nil), + &MsgCounter{}, + &MsgCounter2{}, + &MsgKeyValue{}, + ) + msgservice.RegisterMsgServiceDesc(registry, &_Counter_serviceDesc) + msgservice.RegisterMsgServiceDesc(registry, &_Counter2_serviceDesc) + msgservice.RegisterMsgServiceDesc(registry, &_KeyValue_serviceDesc) + + codec.RegisterInterfaces(registry) +} + +var _ sdk.Msg = &MsgCounter{} + +func (msg *MsgCounter) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{} } +func (msg *MsgCounter) ValidateBasic() error { + if msg.Counter >= 0 { + return nil + } + return sdkerrors.Wrap(sdkerrors.ErrInvalidSequence, "counter should be a non-negative integer") +} + +var _ sdk.Msg = &MsgCounter2{} + +func (msg *MsgCounter2) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{} } +func (msg *MsgCounter2) ValidateBasic() error { + if msg.Counter >= 0 { + return nil + } + return sdkerrors.Wrap(sdkerrors.ErrInvalidSequence, "counter should be a non-negative integer") +} + +var _ sdk.Msg = &MsgKeyValue{} + +func (msg *MsgKeyValue) GetSigners() []sdk.AccAddress { + if len(msg.Signer) == 0 { + return []sdk.AccAddress{} + } + + return []sdk.AccAddress{sdk.MustAccAddressFromBech32(msg.Signer)} +} + +func (msg *MsgKeyValue) ValidateBasic() error { + if msg.Key == nil { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "key cannot be nil") + } + if msg.Value == nil { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "value cannot be nil") + } + return nil +} diff --git a/baseapp/testutil/messages.pb.go b/baseapp/testutil/messages.pb.go new file mode 100644 index 000000000000..55aa0b2daaae --- /dev/null +++ b/baseapp/testutil/messages.pb.go @@ -0,0 +1,1293 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: messages.proto + +package testutil + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/codec/types" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type MsgCounter struct { + Counter int64 `protobuf:"varint,1,opt,name=counter,proto3" json:"counter,omitempty"` + FailOnHandler bool `protobuf:"varint,2,opt,name=fail_on_handler,json=failOnHandler,proto3" json:"fail_on_handler,omitempty"` +} + +func (m *MsgCounter) Reset() { *m = MsgCounter{} } +func (m *MsgCounter) String() string { return proto.CompactTextString(m) } +func (*MsgCounter) ProtoMessage() {} +func (*MsgCounter) Descriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{0} +} +func (m *MsgCounter) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCounter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCounter.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 *MsgCounter) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCounter.Merge(m, src) +} +func (m *MsgCounter) XXX_Size() int { + return m.Size() +} +func (m *MsgCounter) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCounter.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCounter proto.InternalMessageInfo + +func (m *MsgCounter) GetCounter() int64 { + if m != nil { + return m.Counter + } + return 0 +} + +func (m *MsgCounter) GetFailOnHandler() bool { + if m != nil { + return m.FailOnHandler + } + return false +} + +type MsgCounter2 struct { + Counter int64 `protobuf:"varint,1,opt,name=counter,proto3" json:"counter,omitempty"` + FailOnHandler bool `protobuf:"varint,2,opt,name=fail_on_handler,json=failOnHandler,proto3" json:"fail_on_handler,omitempty"` +} + +func (m *MsgCounter2) Reset() { *m = MsgCounter2{} } +func (m *MsgCounter2) String() string { return proto.CompactTextString(m) } +func (*MsgCounter2) ProtoMessage() {} +func (*MsgCounter2) Descriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{1} +} +func (m *MsgCounter2) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCounter2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCounter2.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 *MsgCounter2) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCounter2.Merge(m, src) +} +func (m *MsgCounter2) XXX_Size() int { + return m.Size() +} +func (m *MsgCounter2) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCounter2.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCounter2 proto.InternalMessageInfo + +func (m *MsgCounter2) GetCounter() int64 { + if m != nil { + return m.Counter + } + return 0 +} + +func (m *MsgCounter2) GetFailOnHandler() bool { + if m != nil { + return m.FailOnHandler + } + return false +} + +type MsgCreateCounterResponse struct { +} + +func (m *MsgCreateCounterResponse) Reset() { *m = MsgCreateCounterResponse{} } +func (m *MsgCreateCounterResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateCounterResponse) ProtoMessage() {} +func (*MsgCreateCounterResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{2} +} +func (m *MsgCreateCounterResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateCounterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateCounterResponse.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 *MsgCreateCounterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateCounterResponse.Merge(m, src) +} +func (m *MsgCreateCounterResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateCounterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateCounterResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateCounterResponse proto.InternalMessageInfo + +type MsgKeyValue struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Signer string `protobuf:"bytes,3,opt,name=signer,proto3" json:"signer,omitempty"` +} + +func (m *MsgKeyValue) Reset() { *m = MsgKeyValue{} } +func (m *MsgKeyValue) String() string { return proto.CompactTextString(m) } +func (*MsgKeyValue) ProtoMessage() {} +func (*MsgKeyValue) Descriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{3} +} +func (m *MsgKeyValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgKeyValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgKeyValue.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 *MsgKeyValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgKeyValue.Merge(m, src) +} +func (m *MsgKeyValue) XXX_Size() int { + return m.Size() +} +func (m *MsgKeyValue) XXX_DiscardUnknown() { + xxx_messageInfo_MsgKeyValue.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgKeyValue proto.InternalMessageInfo + +func (m *MsgKeyValue) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *MsgKeyValue) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *MsgKeyValue) GetSigner() string { + if m != nil { + return m.Signer + } + return "" +} + +type MsgCreateKeyValueResponse struct { +} + +func (m *MsgCreateKeyValueResponse) Reset() { *m = MsgCreateKeyValueResponse{} } +func (m *MsgCreateKeyValueResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateKeyValueResponse) ProtoMessage() {} +func (*MsgCreateKeyValueResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{4} +} +func (m *MsgCreateKeyValueResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateKeyValueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateKeyValueResponse.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 *MsgCreateKeyValueResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateKeyValueResponse.Merge(m, src) +} +func (m *MsgCreateKeyValueResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateKeyValueResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateKeyValueResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateKeyValueResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgCounter)(nil), "testdata.MsgCounter") + proto.RegisterType((*MsgCounter2)(nil), "testdata.MsgCounter2") + proto.RegisterType((*MsgCreateCounterResponse)(nil), "testdata.MsgCreateCounterResponse") + proto.RegisterType((*MsgKeyValue)(nil), "testdata.MsgKeyValue") + proto.RegisterType((*MsgCreateKeyValueResponse)(nil), "testdata.MsgCreateKeyValueResponse") +} + +func init() { proto.RegisterFile("messages.proto", fileDescriptor_4dc296cbfe5ffcd5) } + +var fileDescriptor_4dc296cbfe5ffcd5 = []byte{ + // 378 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x92, 0xc1, 0x8a, 0x9b, 0x50, + 0x14, 0x86, 0x63, 0xa5, 0x89, 0x3d, 0x4d, 0xdb, 0x20, 0x69, 0x31, 0x16, 0x24, 0x58, 0x28, 0xd9, + 0x44, 0xc1, 0x3e, 0x41, 0xdb, 0x45, 0x5b, 0x5a, 0x1b, 0xb0, 0xd0, 0x61, 0x66, 0x13, 0xae, 0xe6, + 0xe4, 0x46, 0xa2, 0xf7, 0x8a, 0xf7, 0x3a, 0x90, 0xb7, 0x98, 0xc7, 0x9a, 0x65, 0x96, 0xb3, 0x1c, + 0x92, 0x17, 0x19, 0xd4, 0x98, 0x30, 0xc1, 0xc5, 0x2c, 0x66, 0xe5, 0x39, 0xff, 0x0f, 0xdf, 0xcf, + 0xf9, 0xbd, 0xf0, 0x36, 0x45, 0x21, 0x08, 0x45, 0xe1, 0x64, 0x39, 0x97, 0x5c, 0xd7, 0x24, 0x0a, + 0xb9, 0x20, 0x92, 0x98, 0x43, 0xca, 0x29, 0xaf, 0x44, 0xb7, 0x9c, 0x6a, 0xdf, 0x1c, 0x51, 0xce, + 0x69, 0x82, 0x6e, 0xb5, 0x85, 0xc5, 0xd2, 0x25, 0x6c, 0x53, 0x5b, 0xf6, 0x5f, 0x00, 0x5f, 0xd0, + 0xef, 0xbc, 0x60, 0x12, 0x73, 0xdd, 0x80, 0x5e, 0x54, 0x8f, 0x86, 0x32, 0x56, 0x26, 0x6a, 0xd0, + 0xac, 0xfa, 0x67, 0x78, 0xb7, 0x24, 0x71, 0x32, 0xe7, 0x6c, 0xbe, 0x22, 0x6c, 0x91, 0x60, 0x6e, + 0xbc, 0x18, 0x2b, 0x13, 0x2d, 0x78, 0x53, 0xca, 0x33, 0xf6, 0xb3, 0x16, 0xed, 0x19, 0xbc, 0x3e, + 0xf1, 0xbc, 0x67, 0x00, 0x9a, 0x60, 0x94, 0xc0, 0x1c, 0x89, 0xc4, 0x03, 0x36, 0x40, 0x91, 0x71, + 0x26, 0xd0, 0xf6, 0xab, 0xb0, 0xdf, 0xb8, 0xf9, 0x4f, 0x92, 0x02, 0xf5, 0x01, 0xa8, 0x6b, 0xdc, + 0x54, 0x41, 0xfd, 0xa0, 0x1c, 0xf5, 0x21, 0xbc, 0xbc, 0x2e, 0xad, 0x0a, 0xdd, 0x0f, 0xea, 0x45, + 0xff, 0x00, 0x5d, 0x11, 0x53, 0x86, 0xb9, 0xa1, 0x8e, 0x95, 0xc9, 0xab, 0xe0, 0xb0, 0xd9, 0x1f, + 0x61, 0x74, 0x8c, 0x6a, 0xa0, 0x4d, 0x96, 0x77, 0x01, 0xbd, 0xa6, 0xa5, 0x3f, 0x30, 0xf8, 0xc5, + 0xa2, 0x1c, 0x53, 0x64, 0xb2, 0xd1, 0x86, 0x4e, 0xf3, 0x0f, 0x9c, 0xd3, 0xfd, 0xa6, 0xfd, 0x58, + 0x6d, 0x3b, 0xc2, 0xbb, 0x04, 0xed, 0x58, 0x97, 0xdf, 0x42, 0x7e, 0xdf, 0x46, 0xf6, 0x9e, 0x84, + 0xf6, 0x41, 0x3b, 0x96, 0xf3, 0x15, 0xd4, 0x7f, 0x28, 0xcf, 0x68, 0x8d, 0x6b, 0x7e, 0x6a, 0xa1, + 0x9d, 0x57, 0xf0, 0xed, 0xc7, 0xed, 0xce, 0x52, 0xb6, 0x3b, 0x4b, 0xb9, 0xdf, 0x59, 0xca, 0xcd, + 0xde, 0xea, 0x6c, 0xf7, 0x56, 0xe7, 0x6e, 0x6f, 0x75, 0xae, 0xa6, 0x34, 0x96, 0xab, 0x22, 0x74, + 0x22, 0x9e, 0xba, 0x11, 0x17, 0x29, 0x17, 0x87, 0xcf, 0x54, 0x2c, 0xd6, 0x6e, 0x48, 0x04, 0x92, + 0x2c, 0x73, 0xcb, 0x88, 0x42, 0xc6, 0x49, 0xd8, 0xad, 0xde, 0xde, 0x97, 0x87, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x63, 0x31, 0xab, 0xcc, 0xc8, 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 + +// CounterClient is the client API for Counter service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type CounterClient interface { + IncrementCounter(ctx context.Context, in *MsgCounter, opts ...grpc.CallOption) (*MsgCreateCounterResponse, error) +} + +type counterClient struct { + cc grpc1.ClientConn +} + +func NewCounterClient(cc grpc1.ClientConn) CounterClient { + return &counterClient{cc} +} + +func (c *counterClient) IncrementCounter(ctx context.Context, in *MsgCounter, opts ...grpc.CallOption) (*MsgCreateCounterResponse, error) { + out := new(MsgCreateCounterResponse) + err := c.cc.Invoke(ctx, "/testdata.Counter/IncrementCounter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// CounterServer is the server API for Counter service. +type CounterServer interface { + IncrementCounter(context.Context, *MsgCounter) (*MsgCreateCounterResponse, error) +} + +// UnimplementedCounterServer can be embedded to have forward compatible implementations. +type UnimplementedCounterServer struct { +} + +func (*UnimplementedCounterServer) IncrementCounter(ctx context.Context, req *MsgCounter) (*MsgCreateCounterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method IncrementCounter not implemented") +} + +func RegisterCounterServer(s grpc1.Server, srv CounterServer) { + s.RegisterService(&_Counter_serviceDesc, srv) +} + +func _Counter_IncrementCounter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCounter) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CounterServer).IncrementCounter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/testdata.Counter/IncrementCounter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CounterServer).IncrementCounter(ctx, req.(*MsgCounter)) + } + return interceptor(ctx, in, info, handler) +} + +var _Counter_serviceDesc = grpc.ServiceDesc{ + ServiceName: "testdata.Counter", + HandlerType: (*CounterServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "IncrementCounter", + Handler: _Counter_IncrementCounter_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "messages.proto", +} + +// Counter2Client is the client API for Counter2 service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type Counter2Client interface { + IncrementCounter(ctx context.Context, in *MsgCounter2, opts ...grpc.CallOption) (*MsgCreateCounterResponse, error) +} + +type counter2Client struct { + cc grpc1.ClientConn +} + +func NewCounter2Client(cc grpc1.ClientConn) Counter2Client { + return &counter2Client{cc} +} + +func (c *counter2Client) IncrementCounter(ctx context.Context, in *MsgCounter2, opts ...grpc.CallOption) (*MsgCreateCounterResponse, error) { + out := new(MsgCreateCounterResponse) + err := c.cc.Invoke(ctx, "/testdata.Counter2/IncrementCounter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Counter2Server is the server API for Counter2 service. +type Counter2Server interface { + IncrementCounter(context.Context, *MsgCounter2) (*MsgCreateCounterResponse, error) +} + +// UnimplementedCounter2Server can be embedded to have forward compatible implementations. +type UnimplementedCounter2Server struct { +} + +func (*UnimplementedCounter2Server) IncrementCounter(ctx context.Context, req *MsgCounter2) (*MsgCreateCounterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method IncrementCounter not implemented") +} + +func RegisterCounter2Server(s grpc1.Server, srv Counter2Server) { + s.RegisterService(&_Counter2_serviceDesc, srv) +} + +func _Counter2_IncrementCounter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCounter2) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(Counter2Server).IncrementCounter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/testdata.Counter2/IncrementCounter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(Counter2Server).IncrementCounter(ctx, req.(*MsgCounter2)) + } + return interceptor(ctx, in, info, handler) +} + +var _Counter2_serviceDesc = grpc.ServiceDesc{ + ServiceName: "testdata.Counter2", + HandlerType: (*Counter2Server)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "IncrementCounter", + Handler: _Counter2_IncrementCounter_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "messages.proto", +} + +// KeyValueClient is the client API for KeyValue service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type KeyValueClient interface { + Set(ctx context.Context, in *MsgKeyValue, opts ...grpc.CallOption) (*MsgCreateKeyValueResponse, error) +} + +type keyValueClient struct { + cc grpc1.ClientConn +} + +func NewKeyValueClient(cc grpc1.ClientConn) KeyValueClient { + return &keyValueClient{cc} +} + +func (c *keyValueClient) Set(ctx context.Context, in *MsgKeyValue, opts ...grpc.CallOption) (*MsgCreateKeyValueResponse, error) { + out := new(MsgCreateKeyValueResponse) + err := c.cc.Invoke(ctx, "/testdata.KeyValue/Set", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// KeyValueServer is the server API for KeyValue service. +type KeyValueServer interface { + Set(context.Context, *MsgKeyValue) (*MsgCreateKeyValueResponse, error) +} + +// UnimplementedKeyValueServer can be embedded to have forward compatible implementations. +type UnimplementedKeyValueServer struct { +} + +func (*UnimplementedKeyValueServer) Set(ctx context.Context, req *MsgKeyValue) (*MsgCreateKeyValueResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Set not implemented") +} + +func RegisterKeyValueServer(s grpc1.Server, srv KeyValueServer) { + s.RegisterService(&_KeyValue_serviceDesc, srv) +} + +func _KeyValue_Set_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgKeyValue) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(KeyValueServer).Set(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/testdata.KeyValue/Set", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(KeyValueServer).Set(ctx, req.(*MsgKeyValue)) + } + return interceptor(ctx, in, info, handler) +} + +var _KeyValue_serviceDesc = grpc.ServiceDesc{ + ServiceName: "testdata.KeyValue", + HandlerType: (*KeyValueServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Set", + Handler: _KeyValue_Set_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "messages.proto", +} + +func (m *MsgCounter) 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 *MsgCounter) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCounter) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.FailOnHandler { + i-- + if m.FailOnHandler { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.Counter != 0 { + i = encodeVarintMessages(dAtA, i, uint64(m.Counter)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgCounter2) 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 *MsgCounter2) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCounter2) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.FailOnHandler { + i-- + if m.FailOnHandler { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.Counter != 0 { + i = encodeVarintMessages(dAtA, i, uint64(m.Counter)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateCounterResponse) 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 *MsgCreateCounterResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateCounterResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgKeyValue) 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 *MsgKeyValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgKeyValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintMessages(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0x1a + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintMessages(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintMessages(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateKeyValueResponse) 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 *MsgCreateKeyValueResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateKeyValueResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintMessages(dAtA []byte, offset int, v uint64) int { + offset -= sovMessages(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgCounter) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Counter != 0 { + n += 1 + sovMessages(uint64(m.Counter)) + } + if m.FailOnHandler { + n += 2 + } + return n +} + +func (m *MsgCounter2) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Counter != 0 { + n += 1 + sovMessages(uint64(m.Counter)) + } + if m.FailOnHandler { + n += 2 + } + return n +} + +func (m *MsgCreateCounterResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgKeyValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovMessages(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovMessages(uint64(l)) + } + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovMessages(uint64(l)) + } + return n +} + +func (m *MsgCreateKeyValueResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovMessages(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozMessages(x uint64) (n int) { + return sovMessages(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgCounter) 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 ErrIntOverflowMessages + } + 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: MsgCounter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCounter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Counter", wireType) + } + m.Counter = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Counter |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FailOnHandler", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.FailOnHandler = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCounter2) 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 ErrIntOverflowMessages + } + 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: MsgCounter2: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCounter2: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Counter", wireType) + } + m.Counter = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Counter |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FailOnHandler", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.FailOnHandler = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateCounterResponse) 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 ErrIntOverflowMessages + } + 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: MsgCreateCounterResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateCounterResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgKeyValue) 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 ErrIntOverflowMessages + } + 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: MsgKeyValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgKeyValue: 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 ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthMessages + } + 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 Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthMessages + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + 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 ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthMessages + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateKeyValueResponse) 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 ErrIntOverflowMessages + } + 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: MsgCreateKeyValueResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateKeyValueResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipMessages(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, ErrIntOverflowMessages + } + 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, ErrIntOverflowMessages + } + 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, ErrIntOverflowMessages + } + 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, ErrInvalidLengthMessages + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupMessages + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthMessages + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthMessages = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowMessages = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupMessages = fmt.Errorf("proto: unexpected end of group") +) diff --git a/baseapp/testutil/messages.proto b/baseapp/testutil/messages.proto new file mode 100644 index 000000000000..866e33666983 --- /dev/null +++ b/baseapp/testutil/messages.proto @@ -0,0 +1,39 @@ +syntax = "proto3"; +package testdata; + +import "gogoproto/gogo.proto"; +import "google/protobuf/any.proto"; + +option go_package = "github.com/cosmos/cosmos-sdk/baseapp/testutil"; + +message MsgCounter { + int64 counter = 1; + bool fail_on_handler = 2; +} + +message MsgCounter2 { + int64 counter = 1; + bool fail_on_handler = 2; +} + +message MsgCreateCounterResponse {} + +message MsgKeyValue { + bytes key = 1; + bytes value = 2; + string signer = 3; +} + +message MsgCreateKeyValueResponse {} + +service Counter { + rpc IncrementCounter(MsgCounter) returns (MsgCreateCounterResponse); +} + +service Counter2 { + rpc IncrementCounter(MsgCounter2) returns (MsgCreateCounterResponse); +} + +service KeyValue { + rpc Set(MsgKeyValue) returns (MsgCreateKeyValueResponse); +} \ No newline at end of file diff --git a/baseapp/utils_test.go b/baseapp/utils_test.go new file mode 100644 index 000000000000..1cd7edc05e60 --- /dev/null +++ b/baseapp/utils_test.go @@ -0,0 +1,322 @@ +package baseapp_test + +import ( + "bytes" + "context" + "encoding/binary" + "encoding/json" + "fmt" + "net/url" + "os" + "reflect" + "strconv" + "testing" + "unsafe" + + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + dbm "github.com/tendermint/tm-db" + + "github.com/cosmos/cosmos-sdk/baseapp" + baseapptestutil "github.com/cosmos/cosmos-sdk/baseapp/testutil" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/cosmos/cosmos-sdk/x/auth/signing" +) + +var ( + ParamStoreKey = []byte("paramstore") +) + +func defaultLogger() log.Logger { + if testing.Verbose() { + return log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "baseapp/test") + } + + return log.NewNopLogger() +} + +type MsgKeyValueImpl struct{} + +func (m MsgKeyValueImpl) Set(ctx context.Context, msg *baseapptestutil.MsgKeyValue) (*baseapptestutil.MsgCreateKeyValueResponse, error) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + sdkCtx.KVStore(capKey2).Set(msg.Key, msg.Value) + return &baseapptestutil.MsgCreateKeyValueResponse{}, nil +} + +type CounterServerImplGasMeterOnly struct { + gas uint64 +} + +func (m CounterServerImplGasMeterOnly) IncrementCounter(ctx context.Context, msg *baseapptestutil.MsgCounter) (*baseapptestutil.MsgCreateCounterResponse, error) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + gas := m.gas + + // if no gas is provided, use the counter as gas. This is useful for testing + if gas == 0 { + gas = uint64(msg.Counter) + } + + sdkCtx.GasMeter().ConsumeGas(gas, "test") + return &baseapptestutil.MsgCreateCounterResponse{}, nil +} + +type NoopCounterServerImpl struct{} + +func (m NoopCounterServerImpl) IncrementCounter( + _ context.Context, + _ *baseapptestutil.MsgCounter, +) (*baseapptestutil.MsgCreateCounterResponse, error) { + return &baseapptestutil.MsgCreateCounterResponse{}, nil +} + +type CounterServerImpl struct { + t *testing.T + capKey storetypes.StoreKey + deliverKey []byte +} + +func (m CounterServerImpl) IncrementCounter(ctx context.Context, msg *baseapptestutil.MsgCounter) (*baseapptestutil.MsgCreateCounterResponse, error) { + return incrementCounter(ctx, m.t, m.capKey, m.deliverKey, msg) +} + +type Counter2ServerImpl struct { + t *testing.T + capKey storetypes.StoreKey + deliverKey []byte +} + +func (m Counter2ServerImpl) IncrementCounter(ctx context.Context, msg *baseapptestutil.MsgCounter2) (*baseapptestutil.MsgCreateCounterResponse, error) { + return incrementCounter(ctx, m.t, m.capKey, m.deliverKey, msg) +} + +func incrementCounter(ctx context.Context, + t *testing.T, + capKey storetypes.StoreKey, + deliverKey []byte, + msg sdk.Msg, +) (*baseapptestutil.MsgCreateCounterResponse, error) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + store := sdkCtx.KVStore(capKey) + + sdkCtx.GasMeter().ConsumeGas(5, "test") + + var msgCount int64 + + switch m := msg.(type) { + case *baseapptestutil.MsgCounter: + if m.FailOnHandler { + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "message handler failure") + } + msgCount = m.Counter + case *baseapptestutil.MsgCounter2: + if m.FailOnHandler { + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "message handler failure") + } + msgCount = m.Counter + } + + sdkCtx.EventManager().EmitEvents( + counterEvent(sdk.EventTypeMessage, msgCount), + ) + + _, err := incrementingCounter(t, store, deliverKey, msgCount) + if err != nil { + return nil, err + } + + return &baseapptestutil.MsgCreateCounterResponse{}, nil +} + +func counterEvent(evType string, msgCount int64) sdk.Events { + return sdk.Events{ + sdk.NewEvent( + evType, + sdk.NewAttribute("update_counter", fmt.Sprintf("%d", msgCount)), + ), + } +} + +func anteHandlerTxTest(t *testing.T, capKey storetypes.StoreKey, storeKey []byte) sdk.AnteHandler { + return func(ctx sdk.Context, tx sdk.Tx, simulate bool) (sdk.Context, error) { + store := ctx.KVStore(capKey) + counter, failOnAnte := parseTxMemo(t, tx) + + if failOnAnte { + return ctx, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "ante handler failure") + } + + _, err := incrementingCounter(t, store, storeKey, counter) + if err != nil { + return ctx, err + } + + ctx.EventManager().EmitEvents( + counterEvent("ante_handler", counter), + ) + + return ctx, nil + } +} + +func incrementingCounter(t *testing.T, store sdk.KVStore, counterKey []byte, counter int64) (*sdk.Result, error) { + storedCounter := getIntFromStore(t, store, counterKey) + require.Equal(t, storedCounter, counter) + setIntOnStore(store, counterKey, counter+1) + return &sdk.Result{}, nil +} + +func setIntOnStore(store sdk.KVStore, key []byte, i int64) { + bz := make([]byte, 8) + n := binary.PutVarint(bz, i) + store.Set(key, bz[:n]) +} + +type paramStore struct { + db *dbm.MemDB +} + +func (ps *paramStore) Set(_ sdk.Context, key []byte, value interface{}) { + bz, err := json.Marshal(value) + if err != nil { + panic(err) + } + + ps.db.Set(key, bz) +} + +func (ps *paramStore) Has(_ sdk.Context, key []byte) bool { + ok, err := ps.db.Has(key) + if err != nil { + panic(err) + } + + return ok +} + +func (ps *paramStore) Get(_ sdk.Context, key []byte, ptr interface{}) { + bz, err := ps.db.Get(key) + if err != nil { + panic(err) + } + + if len(bz) == 0 { + return + } + + if err := json.Unmarshal(bz, ptr); err != nil { + panic(err) + } +} + +func setTxSignature(t *testing.T, builder client.TxBuilder, nonce uint64) { + privKey := secp256k1.GenPrivKeyFromSecret([]byte("test")) + pubKey := privKey.PubKey() + err := builder.SetSignatures( + signingtypes.SignatureV2{ + PubKey: pubKey, + Sequence: nonce, + Data: &signingtypes.SingleSignatureData{}, + }, + ) + require.NoError(t, err) +} + +func testLoadVersionHelper(t *testing.T, app *baseapp.BaseApp, expectedHeight int64, expectedID storetypes.CommitID) { + lastHeight := app.LastBlockHeight() + lastID := app.LastCommitID() + require.Equal(t, expectedHeight, lastHeight) + require.Equal(t, expectedID, lastID) +} + +func getCheckStateCtx(app *baseapp.BaseApp) sdk.Context { + v := reflect.ValueOf(app).Elem() + f := v.FieldByName("checkState") + rf := reflect.NewAt(f.Type(), unsafe.Pointer(f.UnsafeAddr())).Elem() + return rf.MethodByName("Context").Call(nil)[0].Interface().(sdk.Context) +} + +func getDeliverStateCtx(app *baseapp.BaseApp) sdk.Context { + v := reflect.ValueOf(app).Elem() + f := v.FieldByName("deliverState") + rf := reflect.NewAt(f.Type(), unsafe.Pointer(f.UnsafeAddr())).Elem() + return rf.MethodByName("Context").Call(nil)[0].Interface().(sdk.Context) +} + +func parseTxMemo(t *testing.T, tx sdk.Tx) (counter int64, failOnAnte bool) { + txWithMemo, ok := tx.(sdk.TxWithMemo) + require.True(t, ok) + + memo := txWithMemo.GetMemo() + vals, err := url.ParseQuery(memo) + require.NoError(t, err) + + counter, err = strconv.ParseInt(vals.Get("counter"), 10, 64) + require.NoError(t, err) + + failOnAnte = vals.Get("failOnAnte") == "true" + return counter, failOnAnte +} + +func newTxCounter(t *testing.T, cfg client.TxConfig, counter int64, msgCounters ...int64) signing.Tx { + msgs := make([]sdk.Msg, 0, len(msgCounters)) + for _, c := range msgCounters { + msg := &baseapptestutil.MsgCounter{Counter: c, FailOnHandler: false} + msgs = append(msgs, msg) + } + + builder := cfg.NewTxBuilder() + builder.SetMsgs(msgs...) + builder.SetMemo("counter=" + strconv.FormatInt(counter, 10) + "&failOnAnte=false") + setTxSignature(t, builder, uint64(counter)) + + return builder.GetTx() +} + +func getIntFromStore(t *testing.T, store sdk.KVStore, key []byte) int64 { + bz := store.Get(key) + if len(bz) == 0 { + return 0 + } + + i, err := binary.ReadVarint(bytes.NewBuffer(bz)) + require.NoError(t, err) + + return i +} + +func setFailOnAnte(t *testing.T, cfg client.TxConfig, tx signing.Tx, failOnAnte bool) signing.Tx { + builder := cfg.NewTxBuilder() + builder.SetMsgs(tx.GetMsgs()...) + + memo := tx.GetMemo() + vals, err := url.ParseQuery(memo) + require.NoError(t, err) + + vals.Set("failOnAnte", strconv.FormatBool(failOnAnte)) + memo = vals.Encode() + builder.SetMemo(memo) + setTxSignature(t, builder, 1) + + return builder.GetTx() +} + +func setFailOnHandler(cfg client.TxConfig, tx signing.Tx, fail bool) signing.Tx { + builder := cfg.NewTxBuilder() + builder.SetMemo(tx.GetMemo()) + + msgs := tx.GetMsgs() + for i, msg := range msgs { + msgs[i] = &baseapptestutil.MsgCounter{ + Counter: msg.(*baseapptestutil.MsgCounter).Counter, + FailOnHandler: fail, + } + } + + builder.SetMsgs(msgs...) + return builder.GetTx() +} diff --git a/buf.lock b/buf.lock new file mode 100644 index 000000000000..c91b5810c297 --- /dev/null +++ b/buf.lock @@ -0,0 +1,2 @@ +# Generated by buf. DO NOT EDIT. +version: v1 diff --git a/buf.work.yaml b/buf.work.yaml new file mode 100644 index 000000000000..dd13169eeed2 --- /dev/null +++ b/buf.work.yaml @@ -0,0 +1,6 @@ +# This workspace file points to the roots found in your +# previous "buf.yaml" configuration. +version: v1 +directories: + - proto + # - orm/internal diff --git a/client/config/config_test.go b/client/config/config_test.go index c058edf8301a..4d727714941c 100644 --- a/client/config/config_test.go +++ b/client/config/config_test.go @@ -12,6 +12,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/x/staking/client/cli" ) @@ -27,7 +29,8 @@ func initClientContext(t *testing.T, envVar string) (client.Context, func()) { home := t.TempDir() clientCtx := client.Context{}. WithHomeDir(home). - WithViper("") + WithViper(""). + WithCodec(codec.NewProtoCodec(codectypes.NewInterfaceRegistry())) clientCtx.Viper.BindEnv(nodeEnv) if envVar != "" { diff --git a/client/context.go b/client/context.go index d58d46a0287f..d87ad2a102fd 100644 --- a/client/context.go +++ b/client/context.go @@ -12,7 +12,7 @@ import ( "google.golang.org/grpc" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/pkg/errors" rpcclient "github.com/tendermint/tendermint/rpc/client" diff --git a/client/grpc/reflection/reflection.pb.go b/client/grpc/reflection/reflection.pb.go index 66dbef0c7105..3c207e94fefc 100644 --- a/client/grpc/reflection/reflection.pb.go +++ b/client/grpc/reflection/reflection.pb.go @@ -6,8 +6,8 @@ package reflection import ( context "context" fmt "fmt" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/client/grpc/reflection/reflection.pb.gw.go b/client/grpc/reflection/reflection.pb.gw.go index 7bb8a5e12836..5f4cad169cf0 100644 --- a/client/grpc/reflection/reflection.pb.gw.go +++ b/client/grpc/reflection/reflection.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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join func request_ReflectionService_ListAllInterfaces_0(ctx context.Context, marshaler runtime.Marshaler, client ReflectionServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ListAllInterfacesRequest @@ -106,12 +108,14 @@ func local_request_ReflectionService_ListImplementations_0(ctx context.Context, // RegisterReflectionServiceHandlerServer registers the http handlers for service ReflectionService to "mux". // UnaryRPC :call ReflectionServiceServer 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 RegisterReflectionServiceHandlerFromEndpoint instead. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterReflectionServiceHandlerFromEndpoint instead. func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ReflectionServiceServer) error { mux.Handle("GET", pattern_ReflectionService_ListAllInterfaces_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 { @@ -119,6 +123,7 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ReflectionService_ListAllInterfaces_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) @@ -132,6 +137,8 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ReflectionService_ListImplementations_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 { @@ -139,6 +146,7 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ReflectionService_ListImplementations_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) diff --git a/client/grpc/tmservice/query.pb.go b/client/grpc/tmservice/query.pb.go index 6510f3c3bc02..7bac1baf5029 100644 --- a/client/grpc/tmservice/query.pb.go +++ b/client/grpc/tmservice/query.pb.go @@ -8,9 +8,9 @@ import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" p2p "github.com/tendermint/tendermint/proto/tendermint/p2p" types1 "github.com/tendermint/tendermint/proto/tendermint/types" _ "google.golang.org/genproto/googleapis/api/annotations" diff --git a/client/grpc/tmservice/query.pb.gw.go b/client/grpc/tmservice/query.pb.gw.go index a53a31fccfc0..e7c294221045 100644 --- a/client/grpc/tmservice/query.pb.gw.go +++ b/client/grpc/tmservice/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join func request_Service_GetNodeInfo_0(ctx context.Context, marshaler runtime.Marshaler, client ServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq GetNodeInfoRequest @@ -250,12 +252,14 @@ func local_request_Service_GetValidatorSetByHeight_0(ctx context.Context, marsha // RegisterServiceHandlerServer registers the http handlers for service Service to "mux". // UnaryRPC :call ServiceServer 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 RegisterServiceHandlerFromEndpoint instead. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterServiceHandlerFromEndpoint instead. func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ServiceServer) error { mux.Handle("GET", pattern_Service_GetNodeInfo_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 { @@ -263,6 +267,7 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se return } resp, md, err := local_request_Service_GetNodeInfo_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) @@ -276,6 +281,8 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se mux.Handle("GET", pattern_Service_GetSyncing_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 { @@ -283,6 +290,7 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se return } resp, md, err := local_request_Service_GetSyncing_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) @@ -296,6 +304,8 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se mux.Handle("GET", pattern_Service_GetLatestBlock_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 { @@ -303,6 +313,7 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se return } resp, md, err := local_request_Service_GetLatestBlock_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) @@ -316,6 +327,8 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se mux.Handle("GET", pattern_Service_GetBlockByHeight_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 { @@ -323,6 +336,7 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se return } resp, md, err := local_request_Service_GetBlockByHeight_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) @@ -336,6 +350,8 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se mux.Handle("GET", pattern_Service_GetLatestValidatorSet_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 { @@ -343,6 +359,7 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se return } resp, md, err := local_request_Service_GetLatestValidatorSet_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) @@ -356,6 +373,8 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se mux.Handle("GET", pattern_Service_GetValidatorSetByHeight_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 { @@ -363,6 +382,7 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se return } resp, md, err := local_request_Service_GetValidatorSetByHeight_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) diff --git a/client/grpc/tmservice/service.go b/client/grpc/tmservice/service.go index cd6e7e5313ef..9e2fde9f90ef 100644 --- a/client/grpc/tmservice/service.go +++ b/client/grpc/tmservice/service.go @@ -3,7 +3,7 @@ package tmservice import ( "context" - gogogrpc "github.com/gogo/protobuf/grpc" + gogogrpc "github.com/cosmos/gogoproto/grpc" "github.com/grpc-ecosystem/grpc-gateway/runtime" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/client/grpc_query.go b/client/grpc_query.go index f3c878657488..0a808cd5b202 100644 --- a/client/grpc_query.go +++ b/client/grpc_query.go @@ -2,18 +2,20 @@ package client import ( gocontext "context" + "errors" "fmt" "reflect" "strconv" "strings" - gogogrpc "github.com/gogo/protobuf/grpc" + gogogrpc "github.com/cosmos/gogoproto/grpc" + "github.com/cosmos/gogoproto/proto" abci "github.com/tendermint/tendermint/abci/types" "google.golang.org/grpc" "google.golang.org/grpc/encoding" - "google.golang.org/grpc/encoding/proto" "google.golang.org/grpc/metadata" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" @@ -22,7 +24,10 @@ import ( var _ gogogrpc.ClientConn = Context{} -var protoCodec = encoding.GetCodec(proto.Name) +// fallBackCodec is used by Context in case Codec is not set. +// it can process every gRPC type, except the ones which contain +// interfaces in their types. +var fallBackCodec = codec.NewProtoCodec(failingInterfaceRegistry{}) // Invoke implements the grpc ClientConn.Invoke method func (ctx Context) Invoke(grpcCtx gocontext.Context, method string, req, reply interface{}, opts ...grpc.CallOption) (err error) { @@ -72,7 +77,7 @@ func (ctx Context) Invoke(grpcCtx gocontext.Context, method string, req, reply i } // Case 2-2. Querying state via abci query. - reqBz, err := protoCodec.Marshal(req) + reqBz, err := ctx.gRPCCodec().Marshal(req) if err != nil { return err } @@ -88,8 +93,7 @@ func (ctx Context) Invoke(grpcCtx gocontext.Context, method string, req, reply i return err } - err = protoCodec.Unmarshal(res.Value, reply) - if err != nil { + if err := ctx.gRPCCodec().Unmarshal(res.Value, reply); err != nil { return err } @@ -138,3 +142,56 @@ func selectHeight(clientContext Context, grpcCtx gocontext.Context) (int64, erro } return height, nil } + +// gRPCCodec checks if Context's Codec is codec.GRPCCodecProvider +// otherwise it returns fallBackCodec. +func (ctx Context) gRPCCodec() encoding.Codec { + if ctx.Codec == nil { + return fallBackCodec.GRPCCodec() + } + + pc, ok := ctx.Codec.(codec.GRPCCodecProvider) + if !ok { + return fallBackCodec.GRPCCodec() + } + + return pc.GRPCCodec() +} + +var _ types.InterfaceRegistry = failingInterfaceRegistry{} + +// failingInterfaceRegistry is used by the fallback codec +// in case Context's Codec is not set. +type failingInterfaceRegistry struct{} + +// errCodecNotSet is return by failingInterfaceRegistry in case there are attempt to decode +// or encode a type which contains an interface field. +var errCodecNotSet = errors.New("client: cannot encode or decode type which requires the application specific codec") + +func (f failingInterfaceRegistry) UnpackAny(any *types.Any, iface interface{}) error { + return errCodecNotSet +} + +func (f failingInterfaceRegistry) Resolve(typeUrl string) (proto.Message, error) { + return nil, errCodecNotSet +} + +func (f failingInterfaceRegistry) RegisterInterface(protoName string, iface interface{}, impls ...proto.Message) { + panic("cannot be called") +} + +func (f failingInterfaceRegistry) RegisterImplementations(iface interface{}, impls ...proto.Message) { + panic("cannot be called") +} + +func (f failingInterfaceRegistry) ListAllInterfaces() []string { + panic("cannot be called") +} + +func (f failingInterfaceRegistry) ListImplementations(ifaceTypeURL string) []string { + panic("cannot be called") +} + +func (f failingInterfaceRegistry) EnsureRegistered(iface interface{}) error { + panic("cannot be called") +} diff --git a/client/tx/tx.go b/client/tx/tx.go index 8e20be369bfd..44660693fa77 100644 --- a/client/tx/tx.go +++ b/client/tx/tx.go @@ -8,7 +8,7 @@ import ( "net/http" "os" - gogogrpc "github.com/gogo/protobuf/grpc" + gogogrpc "github.com/cosmos/gogoproto/grpc" "github.com/spf13/pflag" "github.com/cosmos/cosmos-sdk/client" diff --git a/codec/amino_codec.go b/codec/amino_codec.go index 69f4dc133d29..8c1eb9f85c45 100644 --- a/codec/amino_codec.go +++ b/codec/amino_codec.go @@ -1,7 +1,7 @@ package codec import ( - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" ) // AminoCodec defines a codec that utilizes Codec for both binary and JSON @@ -96,8 +96,9 @@ func (ac *AminoCodec) MarshalInterface(i proto.Message) ([]byte, error) { // NOTE: to unmarshal a concrete type, you should use Unmarshal instead // // Example: -// var x MyInterface -// err := cdc.UnmarshalInterface(bz, &x) +// +// var x MyInterface +// err := cdc.UnmarshalInterface(bz, &x) func (ac *AminoCodec) UnmarshalInterface(bz []byte, ptr interface{}) error { return ac.LegacyAmino.Unmarshal(bz, ptr) } @@ -117,8 +118,9 @@ func (ac *AminoCodec) MarshalInterfaceJSON(i proto.Message) ([]byte, error) { // NOTE: to unmarshal a concrete type, you should use UnmarshalJSON instead // // Example: -// var x MyInterface -// err := cdc.UnmarshalInterfaceJSON(bz, &x) +// +// var x MyInterface +// err := cdc.UnmarshalInterfaceJSON(bz, &x) func (ac *AminoCodec) UnmarshalInterfaceJSON(bz []byte, ptr interface{}) error { return ac.LegacyAmino.UnmarshalJSON(bz, ptr) } diff --git a/codec/any_test.go b/codec/any_test.go index 8b5ecaca3c07..1d5b17642aa2 100644 --- a/codec/any_test.go +++ b/codec/any_test.go @@ -26,35 +26,46 @@ func NewTestInterfaceRegistry() types.InterfaceRegistry { } func TestMarshalAny(t *testing.T) { - registry := types.NewInterfaceRegistry() + catRegistry := types.NewInterfaceRegistry() + catRegistry.RegisterImplementations((*testdata.Animal)(nil), &testdata.Cat{}) + registry := types.NewInterfaceRegistry() cdc := codec.NewProtoCodec(registry) kitty := &testdata.Cat{Moniker: "Kitty"} - bz, err := cdc.MarshalInterface(kitty) + emptyBz, err := cdc.MarshalInterface(kitty) + require.ErrorContains(t, err, "does not have a registered interface") + + catBz, err := codec.NewProtoCodec(catRegistry).MarshalInterface(kitty) require.NoError(t, err) + require.NotEmpty(t, catBz) var animal testdata.Animal - // empty registry should fail - err = cdc.UnmarshalInterface(bz, &animal) - require.Error(t, err) + // deserializing cat bytes should error in an empty registry + err = cdc.UnmarshalInterface(catBz, &animal) + require.ErrorContains(t, err, "no registered implementations of type testdata.Animal") + + // deserializing an empty byte array will return nil, but no error + err = cdc.UnmarshalInterface(emptyBz, &animal) + require.Nil(t, animal) + require.NoError(t, err) // wrong type registration should fail registry.RegisterImplementations((*testdata.Animal)(nil), &testdata.Dog{}) - err = cdc.UnmarshalInterface(bz, &animal) + err = cdc.UnmarshalInterface(catBz, &animal) require.Error(t, err) // should pass registry = NewTestInterfaceRegistry() cdc = codec.NewProtoCodec(registry) - err = cdc.UnmarshalInterface(bz, &animal) + err = cdc.UnmarshalInterface(catBz, &animal) require.NoError(t, err) require.Equal(t, kitty, animal) // nil should fail registry = NewTestInterfaceRegistry() - err = cdc.UnmarshalInterface(bz, nil) + err = cdc.UnmarshalInterface(catBz, nil) require.Error(t, err) } diff --git a/codec/codec.go b/codec/codec.go index 6da2f453f0c3..3088ffeb09bc 100644 --- a/codec/codec.go +++ b/codec/codec.go @@ -1,7 +1,8 @@ package codec import ( - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" + "google.golang.org/grpc/encoding" "github.com/cosmos/cosmos-sdk/codec/types" ) @@ -95,4 +96,12 @@ type ( MarshalAminoJSON() ([]byte, error) UnmarshalAminoJSON([]byte) error } + + // GRPCCodecProvider is implemented by the Codec implementations which return + // a gRPC encoding.Codec. + // + // And it is used to decode requests and encode responses passed through gRPC. + GRPCCodecProvider interface { + GRPCCodec() encoding.Codec + } ) diff --git a/codec/codec_common_test.go b/codec/codec_common_test.go index 59af923d7920..fc107b9928b5 100644 --- a/codec/codec_common_test.go +++ b/codec/codec_common_test.go @@ -3,7 +3,7 @@ package codec_test import ( "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/codec" diff --git a/codec/json.go b/codec/json.go index e01caa259936..2e913bfd11d8 100644 --- a/codec/json.go +++ b/codec/json.go @@ -3,8 +3,8 @@ package codec import ( "bytes" - "github.com/gogo/protobuf/jsonpb" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/jsonpb" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" ) diff --git a/codec/proto_codec.go b/codec/proto_codec.go index b75f1d8355c0..b1d4eb45183e 100644 --- a/codec/proto_codec.go +++ b/codec/proto_codec.go @@ -6,8 +6,12 @@ import ( "fmt" "strings" - "github.com/gogo/protobuf/jsonpb" - "github.com/gogo/protobuf/proto" + legacyproto "github.com/golang/protobuf/proto" //nolint:staticcheck + "google.golang.org/grpc/encoding" + "google.golang.org/protobuf/proto" + + "github.com/cosmos/gogoproto/jsonpb" + gogoproto "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" ) @@ -25,8 +29,10 @@ type ProtoCodec struct { interfaceRegistry types.InterfaceRegistry } -var _ Codec = &ProtoCodec{} -var _ ProtoCodecMarshaler = &ProtoCodec{} +var ( + _ Codec = &ProtoCodec{} + _ ProtoCodecMarshaler = &ProtoCodec{} +) // NewProtoCodec returns a reference to a new ProtoCodec func NewProtoCodec(interfaceRegistry types.InterfaceRegistry) *ProtoCodec { @@ -37,6 +43,11 @@ func NewProtoCodec(interfaceRegistry types.InterfaceRegistry) *ProtoCodec { // NOTE: this function must be used with a concrete type which // implements proto.Message. For interface please use the codec.MarshalInterface func (pc *ProtoCodec) Marshal(o ProtoMarshaler) ([]byte, error) { + // Size() check can catch the typed nil value. + if o == nil || o.Size() == 0 { + // return empty bytes instead of nil, because nil has special meaning in places like store.Set + return []byte{}, nil + } return o.Marshal() } @@ -126,7 +137,7 @@ func (pc *ProtoCodec) MustUnmarshalLengthPrefixed(bz []byte, ptr ProtoMarshaler) // it marshals to JSON using proto codec. // NOTE: this function must be used with a concrete type which // implements proto.Message. For interface please use the codec.MarshalInterfaceJSON -func (pc *ProtoCodec) MarshalJSON(o proto.Message) ([]byte, error) { +func (pc *ProtoCodec) MarshalJSON(o gogoproto.Message) ([]byte, error) { m, ok := o.(ProtoMarshaler) if !ok { return nil, fmt.Errorf("cannot protobuf JSON encode unsupported type: %T", o) @@ -139,7 +150,7 @@ func (pc *ProtoCodec) MarshalJSON(o proto.Message) ([]byte, error) { // it executes MarshalJSON except it panics upon failure. // NOTE: this function must be used with a concrete type which // implements proto.Message. For interface please use the codec.MarshalInterfaceJSON -func (pc *ProtoCodec) MustMarshalJSON(o proto.Message) []byte { +func (pc *ProtoCodec) MustMarshalJSON(o gogoproto.Message) []byte { bz, err := pc.MarshalJSON(o) if err != nil { panic(err) @@ -152,7 +163,7 @@ func (pc *ProtoCodec) MustMarshalJSON(o proto.Message) []byte { // it unmarshals from JSON using proto codec. // NOTE: this function must be used with a concrete type which // implements proto.Message. For interface please use the codec.UnmarshalInterfaceJSON -func (pc *ProtoCodec) UnmarshalJSON(bz []byte, ptr proto.Message) error { +func (pc *ProtoCodec) UnmarshalJSON(bz []byte, ptr gogoproto.Message) error { m, ok := ptr.(ProtoMarshaler) if !ok { return fmt.Errorf("cannot protobuf JSON decode unsupported type: %T", ptr) @@ -171,7 +182,7 @@ func (pc *ProtoCodec) UnmarshalJSON(bz []byte, ptr proto.Message) error { // it executes UnmarshalJSON except it panics upon failure. // NOTE: this function must be used with a concrete type which // implements proto.Message. For interface please use the codec.UnmarshalInterfaceJSON -func (pc *ProtoCodec) MustUnmarshalJSON(bz []byte, ptr proto.Message) { +func (pc *ProtoCodec) MustUnmarshalJSON(bz []byte, ptr gogoproto.Message) { if err := pc.UnmarshalJSON(bz, ptr); err != nil { panic(err) } @@ -180,7 +191,7 @@ func (pc *ProtoCodec) MustUnmarshalJSON(bz []byte, ptr proto.Message) { // MarshalInterface is a convenience function for proto marshalling interfaces. It packs // the provided value, which must be an interface, in an Any and then marshals it to bytes. // NOTE: to marshal a concrete type, you should use Marshal instead -func (pc *ProtoCodec) MarshalInterface(i proto.Message) ([]byte, error) { +func (pc *ProtoCodec) MarshalInterface(i gogoproto.Message) ([]byte, error) { if err := assertNotNil(i); err != nil { return nil, err } @@ -188,6 +199,10 @@ func (pc *ProtoCodec) MarshalInterface(i proto.Message) ([]byte, error) { if err != nil { return nil, err } + err = pc.interfaceRegistry.EnsureRegistered(i) + if err != nil { + return nil, err + } return pc.Marshal(any) } @@ -198,8 +213,9 @@ func (pc *ProtoCodec) MarshalInterface(i proto.Message) ([]byte, error) { // NOTE: to unmarshal a concrete type, you should use Unmarshal instead // // Example: -// var x MyInterface -// err := cdc.UnmarshalInterface(bz, &x) +// +// var x MyInterface +// err := cdc.UnmarshalInterface(bz, &x) func (pc *ProtoCodec) UnmarshalInterface(bz []byte, ptr interface{}) error { any := &types.Any{} err := pc.Unmarshal(bz, any) @@ -213,7 +229,7 @@ func (pc *ProtoCodec) UnmarshalInterface(bz []byte, ptr interface{}) error { // MarshalInterfaceJSON is a convenience function for proto marshalling interfaces. It // packs the provided value in an Any and then marshals it to bytes. // NOTE: to marshal a concrete type, you should use MarshalJSON instead -func (pc *ProtoCodec) MarshalInterfaceJSON(x proto.Message) ([]byte, error) { +func (pc *ProtoCodec) MarshalInterfaceJSON(x gogoproto.Message) ([]byte, error) { any, err := types.NewAnyWithValue(x) if err != nil { return nil, err @@ -227,8 +243,9 @@ func (pc *ProtoCodec) MarshalInterfaceJSON(x proto.Message) ([]byte, error) { // NOTE: to unmarshal a concrete type, you should use UnmarshalJSON instead // // Example: -// var x MyInterface // must implement proto.Message -// err := cdc.UnmarshalInterfaceJSON(&x, bz) +// +// var x MyInterface // must implement proto.Message +// err := cdc.UnmarshalInterfaceJSON(&x, bz) func (pc *ProtoCodec) UnmarshalInterfaceJSON(bz []byte, iface interface{}) error { any := &types.Any{} err := pc.UnmarshalJSON(bz, any) @@ -250,6 +267,48 @@ func (pc *ProtoCodec) InterfaceRegistry() types.InterfaceRegistry { return pc.interfaceRegistry } +// GRPCCodec returns the gRPC Codec for this specific ProtoCodec +func (pc *ProtoCodec) GRPCCodec() encoding.Codec { + return &grpcProtoCodec{cdc: pc} +} + +var errUnknownProtoType = errors.New("codec: unknown proto type") // sentinel error + +// grpcProtoCodec is the implementation of the gRPC proto codec. +type grpcProtoCodec struct { + cdc *ProtoCodec +} + +func (g grpcProtoCodec) Marshal(v interface{}) ([]byte, error) { + switch m := v.(type) { + case proto.Message: + return proto.Marshal(m) + case ProtoMarshaler: + return g.cdc.Marshal(m) + case legacyproto.Message: + return legacyproto.Marshal(m) + default: + return nil, fmt.Errorf("%w: cannot marshal type %T", errUnknownProtoType, v) + } +} + +func (g grpcProtoCodec) Unmarshal(data []byte, v interface{}) error { + switch m := v.(type) { + case proto.Message: + return proto.Unmarshal(data, m) + case ProtoMarshaler: + return g.cdc.Unmarshal(data, m) + case legacyproto.Message: + return legacyproto.Unmarshal(data, m) + default: + return fmt.Errorf("%w: cannot unmarshal type %T", errUnknownProtoType, v) + } +} + +func (g grpcProtoCodec) Name() string { + return "cosmos-sdk-grpc-codec" +} + func assertNotNil(i interface{}) error { if i == nil { return errors.New("can't marshal value") diff --git a/codec/proto_codec_test.go b/codec/proto_codec_test.go index 40d810deefc1..2f3930d85c21 100644 --- a/codec/proto_codec_test.go +++ b/codec/proto_codec_test.go @@ -5,7 +5,7 @@ import ( "fmt" "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/codec" diff --git a/codec/types/any.go b/codec/types/any.go index 07c8de98c81e..bd4887337119 100644 --- a/codec/types/any.go +++ b/codec/types/any.go @@ -3,7 +3,7 @@ package types import ( fmt "fmt" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) @@ -37,19 +37,14 @@ type Any struct { // Schemes other than `http`, `https` (or the empty scheme) might be // used with implementation specific semantics. - // nolint TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` + // Must be a valid serialized protocol buffer of the above specified type. Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - // nolint XXX_NoUnkeyedLiteral struct{} `json:"-"` - - // nolint - XXX_unrecognized []byte `json:"-"` - - // nolint - XXX_sizecache int32 `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` cachedValue interface{} diff --git a/codec/types/any.pb.go b/codec/types/any.pb.go index cb904a5af43c..8dc80f395291 100644 --- a/codec/types/any.pb.go +++ b/codec/types/any.pb.go @@ -6,8 +6,8 @@ package types import ( bytes "bytes" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/codec/types/any_internal_test.go b/codec/types/any_internal_test.go index b3e847965d59..9adab2946653 100644 --- a/codec/types/any_internal_test.go +++ b/codec/types/any_internal_test.go @@ -3,7 +3,7 @@ package types import ( "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/require" ) @@ -23,8 +23,10 @@ type Animal interface { Greet() string } -var _ Animal = (*Dog)(nil) -var _ proto.Message = (*Dog)(nil) +var ( + _ Animal = (*Dog)(nil) + _ proto.Message = (*Dog)(nil) +) func TestAnyPackUnpack(t *testing.T) { registry := NewInterfaceRegistry() diff --git a/codec/types/any_test.go b/codec/types/any_test.go index b9ddbe72ec39..5e2b29fcca22 100644 --- a/codec/types/any_test.go +++ b/codec/types/any_test.go @@ -5,7 +5,7 @@ import ( "runtime" "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" @@ -28,6 +28,15 @@ var eom = &errOnMarshal{} // Ensure that returning an error doesn't suddenly allocate and waste bytes. // See https://github.com/cosmos/cosmos-sdk/issues/8537 func TestNewAnyWithCustomTypeURLWithErrorNoAllocation(t *testing.T) { + // This tests continues to fail inconsistently. + // + // Example: https://github.com/cosmos/cosmos-sdk/pull/9246/checks?check_run_id=2643313958#step:6:118 + // Ref: https://github.com/cosmos/cosmos-sdk/issues/9010 + t.SkipNow() + + // make sure we're not in the middle of a GC. + runtime.GC() + var ms1, ms2 runtime.MemStats runtime.ReadMemStats(&ms1) any, err := types.NewAnyWithValue(eom) diff --git a/codec/types/compat.go b/codec/types/compat.go index 1de782849132..3b669385624f 100644 --- a/codec/types/compat.go +++ b/codec/types/compat.go @@ -5,8 +5,8 @@ import ( "reflect" "runtime/debug" - "github.com/gogo/protobuf/jsonpb" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/jsonpb" + "github.com/cosmos/gogoproto/proto" amino "github.com/tendermint/go-amino" ) diff --git a/codec/types/interface_registry.go b/codec/types/interface_registry.go index 5d7e72e890c0..b911cb6bf6e9 100644 --- a/codec/types/interface_registry.go +++ b/codec/types/interface_registry.go @@ -4,9 +4,8 @@ import ( "fmt" "reflect" - "github.com/gogo/protobuf/jsonpb" - - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/jsonpb" + "github.com/cosmos/gogoproto/proto" ) // AnyUnpacker is an interface which allows safely unpacking types packed @@ -52,6 +51,9 @@ type InterfaceRegistry interface { // ListImplementations lists the valid type URLs for the given interface name that can be used // for the provided interface type URL. ListImplementations(ifaceTypeURL string) []string + + // EnsureRegistered ensures there is a registered interface for the given concrete type. + EnsureRegistered(iface interface{}) error } // UnpackInterfacesMessage is meant to extend protobuf types (which implement @@ -81,6 +83,7 @@ type UnpackInterfacesMessage interface { type interfaceRegistry struct { interfaceNames map[string]reflect.Type interfaceImpls map[reflect.Type]interfaceMap + implInterfaces map[reflect.Type]reflect.Type typeURLMap map[string]reflect.Type } @@ -91,6 +94,7 @@ func NewInterfaceRegistry() InterfaceRegistry { return &interfaceRegistry{ interfaceNames: map[string]reflect.Type{}, interfaceImpls: map[reflect.Type]interfaceMap{}, + implInterfaces: map[reflect.Type]reflect.Type{}, typeURLMap: map[string]reflect.Type{}, } } @@ -100,10 +104,26 @@ func (registry *interfaceRegistry) RegisterInterface(protoName string, iface int if typ.Elem().Kind() != reflect.Interface { panic(fmt.Errorf("%T is not an interface type", iface)) } + registry.interfaceNames[protoName] = typ registry.RegisterImplementations(iface, impls...) } +// EnsureRegistered ensures there is a registered interface for the given concrete type. +// +// Returns an error if not, and nil if so. +func (registry *interfaceRegistry) EnsureRegistered(impl interface{}) error { + if reflect.ValueOf(impl).Kind() != reflect.Ptr { + return fmt.Errorf("%T is not a pointer", impl) + } + + if _, found := registry.implInterfaces[reflect.TypeOf(impl)]; !found { + return fmt.Errorf("%T does not have a registered interface", impl) + } + + return nil +} + // RegisterImplementations registers a concrete proto Message which implements // the given interface. // @@ -162,7 +182,7 @@ func (registry *interfaceRegistry) registerImpl(iface interface{}, typeURL strin imap[typeURL] = implType registry.typeURLMap[typeURL] = implType - + registry.implInterfaces[implType] = ityp registry.interfaceImpls[ityp] = imap } diff --git a/codec/types/types_test.go b/codec/types/types_test.go index 24c83b4eb5f9..3ae4a951a5c5 100644 --- a/codec/types/types_test.go +++ b/codec/types/types_test.go @@ -4,8 +4,8 @@ import ( "strings" "testing" - "github.com/gogo/protobuf/jsonpb" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/jsonpb" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/codec/unknownproto/benchmarks_test.go b/codec/unknownproto/benchmarks_test.go index 373dda7acfd5..4fc01a5f9f16 100644 --- a/codec/unknownproto/benchmarks_test.go +++ b/codec/unknownproto/benchmarks_test.go @@ -4,7 +4,7 @@ import ( "sync" "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/unknownproto" "github.com/cosmos/cosmos-sdk/testutil/testdata" diff --git a/codec/unknownproto/unknown_fields.go b/codec/unknownproto/unknown_fields.go index b9db6429628b..e6b63bd6234d 100644 --- a/codec/unknownproto/unknown_fields.go +++ b/codec/unknownproto/unknown_fields.go @@ -10,9 +10,9 @@ import ( "strings" "sync" - "github.com/gogo/protobuf/jsonpb" - "github.com/gogo/protobuf/proto" - "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" + "github.com/cosmos/gogoproto/jsonpb" + "github.com/cosmos/gogoproto/proto" + "github.com/cosmos/gogoproto/protoc-gen-gogo/descriptor" "google.golang.org/protobuf/encoding/protowire" "github.com/cosmos/cosmos-sdk/codec/types" @@ -111,7 +111,7 @@ func RejectUnknownFields(bz []byte, msg proto.Message, allowUnknownNonCriticals case descriptor.FieldDescriptorProto_TYPE_STRING, descriptor.FieldDescriptorProto_TYPE_BYTES: // At this point only TYPE_STRING is expected to be unregistered, since FieldDescriptorProto.IsScalar() returns false for // TYPE_BYTES and TYPE_STRING as per - // https://github.com/gogo/protobuf/blob/5628607bb4c51c3157aacc3a50f0ab707582b805/protoc-gen-gogo/descriptor/descriptor.go#L95-L118 + // https://github.com/cosmos/gogoproto/blob/5628607bb4c51c3157aacc3a50f0ab707582b805/protoc-gen-gogo/descriptor/descriptor.go#L95-L118 default: return hasUnknownNonCriticals, fmt.Errorf("failed to get typename for message of type %v, can only be TYPE_STRING or TYPE_BYTES", typ) } diff --git a/codec/unknownproto/unknown_fields_test.go b/codec/unknownproto/unknown_fields_test.go index ad3926cedb55..5a93c311b9bc 100644 --- a/codec/unknownproto/unknown_fields_test.go +++ b/codec/unknownproto/unknown_fields_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" diff --git a/codec/yaml.go b/codec/yaml.go index fc8b7d3f601e..6861154634b6 100644 --- a/codec/yaml.go +++ b/codec/yaml.go @@ -3,7 +3,7 @@ package codec import ( "encoding/json" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "gopkg.in/yaml.v2" ) diff --git a/contrib/devtools/dockerfile b/contrib/devtools/dockerfile index 10be41345386..3df9c7e0037e 100644 --- a/contrib/devtools/dockerfile +++ b/contrib/devtools/dockerfile @@ -1,27 +1,36 @@ -FROM bufbuild/buf:latest as BUILDER +## To test locally: +# docker build --pull --rm -f "contrib/devtools/Dockerfile" -t cosmossdk-proto:latest "contrib/devtools" +# docker run --rm -v $(pwd):/workspace --workdir /workspace cosmossdk-proto sh ./scripts/protocgen.sh -FROM golang:alpine +FROM bufbuild/buf:1.9.0 as BUILDER +FROM golang:1.19-alpine -ENV GOLANG_PROTOBUF_VERSION=1.3.5 \ - GOGO_PROTOBUF_VERSION=1.3.2 \ - GRPC_GATEWAY_VERSION=1.14.7 +RUN apk add --no-cache \ + nodejs \ + npm \ + git \ + make \ + clang-extra-tools +RUN npm install -g swagger-combine -RUN GO111MODULE=on go get \ - github.com/golang/protobuf/protoc-gen-go@v${GOLANG_PROTOBUF_VERSION} \ - github.com/gogo/protobuf/protoc-gen-gogo@v${GOGO_PROTOBUF_VERSION} \ - github.com/gogo/protobuf/protoc-gen-gogofast@v${GOGO_PROTOBUF_VERSION} \ - github.com/gogo/protobuf/protoc-gen-gogofaster@v${GOGO_PROTOBUF_VERSION} \ - github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway@v${GRPC_GATEWAY_VERSION} \ - github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger@v${GRPC_GATEWAY_VERSION} \ - github.com/regen-network/cosmos-proto/protoc-gen-gocosmos@latest +ARG UNAME=protobuild +ARG UID=1000 +RUN adduser -u $UID -s /bin/sh $UNAME -D +USER $UNAME -RUN GO111MODULE=on go get -u github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc +ENV GOLANG_PROTOBUF_VERSION=1.28.1 \ + GRPC_GATEWAY_VERSION=1.16.0 -RUN apk add --no-cache \ - nodejs \ - npm +RUN go install github.com/cosmos/cosmos-proto/cmd/protoc-gen-go-pulsar@latest +RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@v${GOLANG_PROTOBUF_VERSION} +RUN go install github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway@v${GRPC_GATEWAY_VERSION} \ + github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger@v${GRPC_GATEWAY_VERSION} -RUN npm install -g swagger-combine +# install all gogo protobuf binaries +RUN git clone https://github.com/cosmos/gogoproto.git; \ + cd gogoproto; \ + go mod download; \ + make install COPY --from=BUILDER /usr/local/bin /usr/local/bin diff --git a/contrib/rosetta/README.md b/contrib/rosetta/README.md index f408729581da..60c5059c1e28 100644 --- a/contrib/rosetta/README.md +++ b/contrib/rosetta/README.md @@ -6,16 +6,16 @@ This directory contains the files required to run the rosetta CI. It builds `sim Builds: -- cosmos-sdk simapp node, with prefixed data directory, keys etc. This is required to test historical balances. -- faucet is required so we can test construction API, it was literally impossible to put there a deterministic address to request funds for -- rosetta is the rosetta node used by rosetta-cli to interact with the cosmos-sdk app -- test_rosetta runs the rosetta-cli test against construction API and data API +* cosmos-sdk simapp node, with prefixed data directory, keys etc. This is required to test historical balances. +* faucet is required so we can test construction API, it was literally impossible to put there a deterministic address to request funds for +* rosetta is the rosetta node used by rosetta-cli to interact with the cosmos-sdk app +* test_rosetta runs the rosetta-cli test against construction API and data API ## configuration Contains the required files to set up rosetta cli and make it work against its workflows -## node +## Rosetta-ci Contains the files for a deterministic network, with fixed keys and some actions on there, to test parsing of msgs and historical balances. This image is used to run a simapp node and to run the rosetta server. @@ -25,5 +25,5 @@ The docker image for ./rosetta-cli/Dockerfile is on [docker hub](https://hub.doc ## Notes -- Keyring password is 12345678 -- data.sh creates node data, it's required in case consensus breaking changes are made to quickly recreate replicable node data for rosetta +* Keyring password is 12345678 +* data.sh creates node data, it's required in case consensus breaking changes are made to quickly recreate replicable node data for rosetta diff --git a/contrib/rosetta/configuration/bootstrap.json b/contrib/rosetta/configuration/bootstrap.json index e014a1043261..ddf504179711 100644 --- a/contrib/rosetta/configuration/bootstrap.json +++ b/contrib/rosetta/configuration/bootstrap.json @@ -1,7 +1,7 @@ [ { "account_identifier": { - "address":"cosmos1kezmr2chzy7w00nhh7qxhpqphdwum3j0mgdaw0" + "address":"cosmos1f3d3s7jjy5zune554w7fnhrhyuxhll7s7rps0h" }, "currency":{ "symbol":"stake", diff --git a/contrib/rosetta/docker-compose.yaml b/contrib/rosetta/docker-compose.yaml index fabb36b0aa6c..ba593f0f3f7c 100644 --- a/contrib/rosetta/docker-compose.yaml +++ b/contrib/rosetta/docker-compose.yaml @@ -3,7 +3,17 @@ version: "3" services: cosmos: image: rosetta-ci:latest - command: ["simd", "start", "--pruning", "nothing", "--grpc-web.enable", "true", "--grpc-web.address", "0.0.0.0:9091"] + command: + [ + "simd", + "start", + "--pruning", + "nothing", + "--grpc-web.enable", + "true", + "--grpc-web.address", + "0.0.0.0:9091" + ] ports: - 9090:9090 - 26657:26657 @@ -12,15 +22,21 @@ services: rosetta: image: rosetta-ci:latest - command: [ - "simd", - "rosetta", - "--blockchain", "app", - "--network", "network", - "--tendermint", "cosmos:26657", - "--grpc", "cosmos:9090", - "--addr", ":8080", - ] + command: + [ + "simd", + "rosetta", + "--blockchain", + "app", + "--network", + "network", + "--tendermint", + "cosmos:26657", + "--grpc", + "cosmos:9090", + "--addr", + ":8080" + ] ports: - 8080:8080 diff --git a/contrib/rosetta/node/Dockerfile b/contrib/rosetta/node/Dockerfile index 0887f522f656..31458884ce01 100644 --- a/contrib/rosetta/node/Dockerfile +++ b/contrib/rosetta/node/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.15-alpine as build +FROM golang:1.18-alpine as build RUN apk add --no-cache tar @@ -29,4 +29,3 @@ COPY --from=build /node/root /root/ WORKDIR /root/.simapp RUN chmod -R 0777 ./ - diff --git a/contrib/rosetta/node/data.tar.gz b/contrib/rosetta/node/data.tar.gz index 6ee2f76f449bd00e6b42cae149789b054e25fe0b..851620836dc76b7f0ee74bc4f4ddd1f498dc019f 100644 GIT binary patch literal 43144 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 z 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 ErHu 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ⅈe`8nA<>BM{HXpyWA-dqKG23@c1T) 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 E04|f)ivR!s literal 40571 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 z zW<>_OCa*;D$V!M!D;3-y;Jc)!p>t}RP=V9-ZT#Elzj1JHysX~W8OnfQUdr6=L5<0< z_FIB9btqEb(jG%45A0ch)my5jmO zL0;d|1f#opAdMiYc$@0`bm)oHQO+#a#)K0K>P>-@iS1 z`_(g)OT6ITL_J1fE8H9TU=}k~f z;!148b0}G;VJS4-3l@=Ydvqq`KDqD*Gg(J=yp zVAqwCVlQF~Vm@2Vq~w zZ16)BS~AZ-V7jInzIBV5UZ|(bbZ?0pX1nRffu@4UWzxq11+oQaUd0xO? zeCHta7k28HVQD9QV2k-Mznl*93X8|Yi(Dr(vgxRQMXP!4X(Ltz$$B|KYFznRA{_lDCw5&GsVJEIt46)z(qZ6&D9 zt9+o6oaxC#To&-w9Dyryt*LMJOzn-22TzX&d!xbe6OptNHU%cZc7kEOqy_{`kPrj; zNa({+6N2HT+ibpfq&x9*kJnFfUmSVfv83fj9t5@KPTe0D!rz>|JrgORf|V|)W6`Pd zEN_E?uw4;^np%6=p)V8qZF_@(ZqW5+gW;SCqoR`i3s)AvEj2CFIyHzXDpdb|JWtLK zgqX!Uf>f%)?^d?BbS)M<(Pr!YX2qOHe?kn7( zP&O*qoG1{eXWHYL-n0~{PF}el11~`~ZR{AzpPj<&8s4-|+=4*lJhO!$+BMh!HToir zoK6K#&BDedPdrIlMir#Y8Mdw#hMKzMeFE6FL{U2cs(&&Ciwm4j+fTe58eQ7iEF_ZM z8>YrxEN-|F47I#H?C}!ycWa>O>u>JCan7O=XHL~xRr_(XARXz|QLS8-shN0$CTMK5 zyd96}K$Q29VPv^p(}9mISS2?nOE;hR0ijl*t`re|&v2ylijwgz)Weje8j3?_ND1&~ z=$@RH+8TTN0q@;Q3Hj0_S0=tm4R@|?p;kK@7S&{Y!iM(+p@%+fln+l)i4pORs=01C z%sB-jRC$Ic6L#1rX*amkTvtVfUZoOsy$^DbOyPmf@07C2x#-uK^z~%F($QfWUrmVT z18dP0DH?qvwkgG&)LwPBlqXAOcZ)*?=yz=50Y}dXNz)EvcLh*9fXD0p%z>Ck$^)Sj-=7CU zffp=HbQ!F;uFk@R6{Pg1OzzmdDGQxB?enDHMGyUd@AG5tTW`4M&Bx3v)&6x*fr*sY z+fNTV{un3kGf@krqHYA)Kb&ZDUO6Z!4cxuc7n?Vs!w$DsQF1yd^}ZONzUYOCBr}9r zXd_^}L10&!to6ej#hx5IIox|HvFzN-!SPjNLHXQJEZ`{R?qHiA+KPt&Mi(f%i(MAG zb-%+Tnt16K@0C^3-B{WyIsn55BQ^=w#_yT%+ZNBn+;>BCvl8IAY4TWNLr$Ja?#0oC zE4mx>rF{|688E&_c#+&NsBKo2z=4Af`G4O(-^Zfi_r5T6%RW$(SEyq_uHH=86gj@5 z+8RyW6dLI}DV8@ZTR|0O^P?zDboNuw;ccbhaR)EG`iJfs2!Rlgc6W z5CbNb%G&@s@Qod0dOlvuFkr(Nct7jIhY!!xHyN8uEScw*wphkbj*p}%LX6ikjvgi? zo%3lTIs|%u+4M;Cf-UPI*Q?3tH$riK!85Z3&F3bLUUIa8{%zyY{85ek(eZi{2M>Y)O<{oBJh8~)h2!23y+5#-P!~cj^nyIUgN_GD zE#Gd=5I8z22*l8@5yP$=OJq{Mb;`$q!!fKte$8isHrGhvcwtbe7(^GY{dfSKU26_@ z)rOLT|ABg*I?G<^L}EH85rpAwDO-2|MRnUF-zKEBMF5ym`^O(~X+7?2RYXQ?j8Q&; za^KAr+*co4tC6UGRzMlOfbi0~rFH83)qnKqKx8ZjuBm*Xkpb%azFg(1upObN1UdGH z2Vt=)6kyCfH+I#|U-mJ>%9u;HyU7&q0(o|3Nv5+XVWN4JNh!4BQcb^zmX?Y0J@8`C zq0RK5R0adWrC&%2HU0vvTWdg5vFsf^U5u7nb&JbQ0IlM}jVFY1M$UT5o`d&jWSQ{D znn4)TAA8c2)eBv$Tdzq-)m-~k?fcQ9$}X|wK2y4|CH?MPk;@VC*(ujK`8(EWST1vp z*x&M2h4jog81J zd#iol&zALI0eT^SuY;k+32!K7rLQMiSYQu&&8pHs5Po>#>2213uI8jcdejuIih_G1 z^rXZ{U&|wuv?r;l*JD8T@IfFly^wHQGJ4tS*E~Qzq8%hjN93>doa6u=3?X4Z>kwCa zyQ+IN>elk_s=oBh%v?un*^82RzVSK%Kf6!Q?sfU-`b^3&EcMl>o`_6$YDz|t+_vCG zPxI_PJxec|q^2bMhz*|rW+FX4UcCgYiKRc-5Kw>cuaF42FxwX_$-}^gm-Qj&`V3HF6T06!{Aj$I^DWg;6~t{Yx{0So#+V|H7e>lIU-L z{ck`43N`b;{q=v;PGSav9Rjcx;V4Na>28Y$rom3XB~KHD>QNsf6Oa59nf&WOpD0yp zYw=#W{J4*jOvZk^Y<{O#A~kbbpOLBYm2b--hcNcwY`VkS;(+9iv&=G6{vV~s9E zwJ(EaN4p(&ndFljDzCBnYuX=rA^PTKpKRIqZUFD=64XWl0-(%fJIM>*5dbvdYZGrX zzHM~Ntw~L+>0ZD0jYpSK&#=Zi^_dXY;f|p64JSNmQjco-)I5k^m6$B`5BmqVjNJe9 z_S{9Q6>=i4y4{o5J}Ie{*Asr3jZoWQhC2*ynAnJ81rTK<6L*2OK`}bKBqlm_z>S z2mC8A{P$mO{@s^*{{GM5;rO3_|K~UP+^v89fB)(DXtej_SRWsb_0t2h7tao6hohq> zqj-ORbTmFZI6i)Qd_0c${KXw}-2eAq{+GRLdvPO6?{3dz$E&beGa15UNT4V$JMDE# zt}3Z?=@~E9t?jn^;=b53JxwF3rE0a@YDuk<`X)CR0{gas>>rQ|fqlwD$cqCZVR6U? zLSP}!$!iECmpXM*tJ`gPW}|wrTXjx-=YGz2zVDphk2HEZnIf+y z_%CC41}Yp5Rc8k(KLVl7ZVuG@J-9MAtCB7Orq=|iq&=_^AL>NEwe-ZIQ!k?8D()hy zGiuEiM}kox#nvEF5L#nKC0bFd*XWVdRPqZBYLgk6{&4JS9}Zhq@El>aN8i>+T8*Xy zKh9=URLLEONe3G_3D6R{=6}eSFv*J;MpO*y)ORCl0a=hPndd8x-Q0oQtX;Qg@l+l2 zhcDV)egccUrxm7aoet^GPCwf^>KyE4kGpke_wexfb5aHMzI9}scKgqF>qLfoYuhh_ zgn*WLuBhy8J-fe8M0NVxM6H9$@i$+!d(!E(6L!roO+A-*(%*heBF?B7U42yCc51s{ zm7cGyLH9xfEjR-Nn}oaMD*a^)UW2Qr)H&lm|klOPSpj`Yo_d|Sp8Oww57C7ge2L4T+)Xav%A zNpdZ?)I>THn4&A8aYz~9cy9&K8%R0u3~(2J((X@clBnU8;k8NnY{xLud%C|q^QouR zyF2CQJL%;7>ao!^TF+LWruLkbr-gFvtF_~1dhfBlQL1M4N+s-Ia7o_H3s`ID_^Cmv zYx575DvQgda-}rCS}v}WI)(8V1Zv6sz6O|Jl#G0qGs;q@~5@_$#Q9Lch~8znDcjz`l|)~VRNCd zk>5C7y}O>>O&5w^EiW!>&QZ$xQh%T|tA*Ne?!kd}aHu~&e6qgLEgbgNp3E=g@7+_k z&c5j?)34MMivLFMqg*ZiTeSYC8|jQs|0A=MIa&Y5@w{F9x2t_30MUdKg*wT-d;THM zt*gVw5IN+YKz5b^{nW~QDTaT<8#U^=q>;#C0dCw+9gf%qw~XvAJw-_Znbn|&_(9Wc z=LNLMi@hTN2 zwZ}b(|2f76w`E>qAQ)61H37s+m`9hK^4ls`h4TC*gGn=mNrUr_FjK=rDQpslRHlyo^%}h z>G8uSjm0~sEi!bMzQ`XO>@M`@%r8%lmmU=lH1~ElZIr1Ouvej8Qwr?15 zEfv>O>w0oFY0PTLgrR3mJ)8VWoq;cKy{|NC5W7c@SkV9mHz+ph3K&Z83+{`qpwE(Q zG8IUhgy2#yev%h>Iv396VqQpQG%c4#DI%EcZ6PqOyRRYhl}5W~RZuwEAXE%Iqj6OG z5G+uzY4)aN)or{rMZK^5Ti7o9V{tzz#>p62k4Y&s`|RwrHzUI4Bj=>k-^MGVFbBh@ zn=!7as?2VqvNu~^Ve~u_h&qe0*D4v!c)k#_po%x>ZFegkY#^Q-cpF9(1{6%Nm34{c zMiRqTG2I4%x<3XdJ-0R}Y9jRvxGwVebUIZr${Ub5on5daTB(C*GO#Yb)3`qU?YT z*F1?X`H;+*ZgW< z1x=N52Z}75uV`Xeds3=3;6CnlpLO7&T@_pi{TBEcdKQ*MOK1V_fSdt1vB6Itb}L;Q zE-ka~g1!RzyLJm!y3h|(!#;#Fb+xW_gx-MjMhvOR3S7&IDkKZr+zNc@dM-qQ%=#^j zUloohHri4_#BxI0zTbluh4b{Rgud@3-$u3C-|r)0L&f#uL`HY-j+`f$9kULP=9ZEl zA`B~~gyIWl`YRO6C)lOK)CcLEFE(i#G_ZRnTex5;<~VPBqJxnxEH@>*f~$1VvjTP9 z`KB((k>{J@f|Fd>x;KieFDS<2`wK}2^2Pmu3~N6q1?CvxBb0iYCx-AFMnwqv5~E@Y z{~{RW{Gn$drIcNe;f18WL?yy68CosERjEYyDx<#gxGy8-q>+jh>fw~9c~6}Me4cNz z8Z)UOUQp$dZqT4`?iUSjvA_U`aF&LBOT}KyfjUx)Fe^)Vj?d9dFiub@2uV0L?Dy7; ze_8=AuJR^sT(3aCPuH*6!t@&S-g@*)jC7vA*IoaxkY3%%bp!jSQLj^Yl&Mtq8egoh z1zpKQdfSEE%cG5d*8v@#Z|;;14P^o#YXM(%NOXU%3(r!-t|m-`zd!i(OZHlf2!98H zmDY8YE5cXqkHlQ(A&ZIYO7|}$XOTTmcDMUF*V}Wx58sV=^^x|WtcwT*ieCX@#vf@b zP_s!uqvzMI+C4jwq<<^nF}v)NzO~zKvTcVsOtDZ8?Owa$ z`yxbq=mreW!OAAJ1{(`fw#nqu6nX{GjgrGMW3^g+K=A3d4;y@&0NPEk1c8c+=sR!| zDQb@?vWAKjQ>sSEru*SO-%JkG-sBG&tRmoCZ1e~9HmL@mQb^#Q6XDyyz@FF&|{%R z_c_tfJ$BbLj2PJ(h?};ZE_Ewcq&q{biUSD^{hB6wo<8mNI7ldBV+mUYQAfcYAKPf1 zSJUFox-ie{Sv{5V)dI{??hP#x3-F-5!DM3v@ZBUVBZWv?Z8rjz+iT9K4H-hv%I?-k z-jED!-KQi z(t8(j!}mKxUqFRv;2QC%4}}}?W8-pyhWY;@*p)7w2DJMy|G(++|H1ih4gQ<>|Hkm3 z|4-U;>-lUltL2MnV=iAZGA8*Wo6^ieIh`$=x{)#R$wEp?GN+#Fw_q+MzQ2)A5a5nR z93Y7C;fVX&3vZpNd&@nuFf3u;(FI@1+mD|eZZAB#+uqkU%=z7Z@>#F5(W$QM_T8g{ z!WVOP`}k?ssAre=oV`c=V`FY_dFfF}FP$3ei$_m(o+O_by9GU4bsp~9r8Vp1$edrO zF(rF^1m*Ut6-XVMwnfBsWTPR@Uh<@psl|0!|ezT4BEWcI-ukaY`4 z4I5S4M|?+@8woo>60Po1Tn#w*2-tr%pd~T! zx~72J3UFz>vP1Ie&n65YN<}=&nA>=C&gDsY4)(1U#jJ80iSe>1pRzCFh!qH!7Omc= z6ih(`@$^28aq;(r=beKS0sm%~-7lx;Xh?4B?ETgEU&J z;NWX9&<-*p8ZF!L%$1&|Z}02?6oZQmN`1>j6o)&a@GOj!ge-#;C5IFn`aZ+;=ulD~ zKx3uytS%i~i06*N-ShMbW!|MlfaL;!QQCY!;&K2#YXI@FFW6cU4}{X+(0WVIg0enN zaUB?*9kQXaSY#EUVML?`I1GsM>mUveDMYKy%ivO6(2OS-YKB-f_ySACapYOX$s^!V z`II8_xC=}fQgA?JghXwt%K(04P!8G&xC}Zd0e6|z1;w$TwW0E{{{z*VK}YUm{%i=@ zC>7xK0EM83y`;k1rpyRu=XdL&JXpqVP-vK4(Szyqq6D9ErzsG z5-5uxY=EK1lHn7EKo~(rCB~pY{@mneBN7e@2L4a}hSYDP0~d(YEecE$XF@rd>b!N> z#L7YpV}~hSjs$4jATdbA*bG%Tp~PIOS6XivoAfPH+utVjO5)QBjWY=2Ojb9{%R|vd zDyFxFD9-CP0PXe2S~{BUeCur}&YL}+3#{uWUDB0E3(}#6ccBnbm_nl>k_srI0KJZX z#Q~l}phA}EsVUK^eZV@3NK4sagW7_lZV8Iv!p>Y#k`L0A;`DwMz^Ls}u3CrV-Qx_z z6s?4^%pidrWP+2U#TeZh%5dniL8d+za)o2V);xey6fU-dbpdln-RjqEm)MWg4BW1Q zqVw$HGlTrhAHhh97nzJL$NtZf(VA zZfQm092DCc_kKG6WPbGR^jn%1tWIM~>VUj8*_H)z$cUC)jfIV*Fu3KlBdZRmLXsGV zzw%%!F=Rb&>UfeHntRBrk+g9%Y*7L`)*>@zNOSNj<}nl*pXY zlF?da$u7VWr_e-JTMxhz35mnoxEJgQ{5uSPdeydS>l{K?lJ2|niBy3c_ZIdGe5-(X z$8iXbyRf)Am;ME?=#3!W!?qV9AH$^txO`GYg?8|9V@@`EeRGj?C|F zZ@S{KbZh8XUu~0lv1h$g6`)J=Fl4;*TwZkChmFe+S&`#&HmhZ+C1HtO?DmX9SWTG< zh)OcO^^IF9u8~rrU#c*$loK&2@;$tuGg1-)C;wdeJSGv&{$x;+=;n=>OS&u+7iO8N zwC$pga`q&v(Zme`|AwKcE${3!Vdo;X9;AF~%LN47ZXjugr}y)9DW~NG!r!W0JzR9^xE1o)Rjgw{ zdqp=pY?hU1G0{fE(0LQgWX_am*Pf7CEYQ^p$fx4_PMvR&_>DS|l{GTczfo3TFBq8* zvi$ERNGfE*oHS^TAigI@hMvl#vdMHRb9oTU$lh=(y0>B*eqnEq++AsrA( zR|+DTY{uHTJp48;-vxE1xRh^{SAo&r0FJh2rG%|AsEuLVG~Bog{BVrY28`Lj!^h2a zuq8ZU%sAXw$JXMYxe{!_j9qJ&8Q~~jPh2o0a3QXvg1dbjSBG!`rG-O6=C1MA2jZZD zN3NwzYZ3_@=}*DrnEEUNWWS6zE3#TZgGG{@zRsoTp$T(WkessD@neuVjI znN8S~TdKB)uG49V#0;hgQGA=}JT_~8&cJni7h|fF0>miHwK&=h+6mR@ zy~(;|L@9^+*b(rS79@q`K_eaR>zOeK(ak$HDDNEr|Fya;^cMD*VCFg?y|Ldy0!<1R z4u+v7?xcW77zkt>z`1vNqUJ!b25_}F6EX4W{sZ}Ia{gm1&mi_~ey=2LTA55n&*<45D_JwG9QmC~X_h)e;y|BZXIQ@}N1G(1%6bB}KeX#8?N9N4wB)4y$MOto ze~u54sBOPdU$}VtlT~Pf|2~#y)b^)Gbra2Y{o-kytN;1i-_TOJHqrma@r>I3i}|Jb zx$@e2oVC|Qp7Ztpw6FbjEtQ$H|2Uq%)Yj+JYg1F7AmdMMI{~gVu(1`}`*_---MxP8 zy{Y%F{qzt1{>HbiOhK zEwl9cRk?*H%wE4LST*{00sqD`h{|L8^((ll)$O*sO6m2hQn%gd*ev40>sJdfIVmfz zU#-~(Bmrgp^(#13P;Qd0YS*M3Wi>6ARBGGz@hAlR160*=c+wDrvG>823VGh#g6wJq z_`eE2PUuU%H(Z_%B@nzGv zu>PlK(y595He>G7M|ev_uc+S zf8*P||DR5#y!KxMEWnfTKaL0Q|GNlmCcW2>eBR_YVt}Yl&+Y&y2>rovt01~%9IO}% z#pJWjcJhI9km=?(Rvtf}Gc~(epI_VSK2BFthjT}IXR+=)yQ7^xXf5u{H}@XTHM?IP z7SrbXv;0B&q*g6t%p;@OC@wUTR`KZGJyj$nfV49iElc`^?uTJ7~{-=rk_w7GJ+8-O{k|tlzGhF{8J>Hb?A50DTAIPi8{6B{0 zU;gH!A1ODdrr1yTe=5fKAWH4(kCcIr9pW5v2#FcOC58yFLLhr)kP%|QxgZ8IiGoA{ z;c`D9^@ES|fr5me%}A)sgHVD8!S4`4>=5L2@Z^Q_Ih@VNEDi%dd&8#SYyh%JLD4V( zqD7aR0azF%UWNfjIE2L~$)3)j~AG0wq`&#;YKz)+JI1VTp~V zOi(XRkSZ{S5T!1_hk#6=J~~Xs?|I6rR3bP)@=wZYAXl@Op8(i1!ou{lJB_-<*(7Pspby zI>6vCR$=mNT$PNZJQ>VX%idXxnkD=-XWTA)Lp z&GcgRLVXG=cwu02izQi+w6sFjzDV;f;0<^<};~yRM&OEm_52`DD*N# zUXB7>j%wK`m}Q2tJQQ3x0$Vv6QaN&w^I<5%$ns$)k^m+i;HH&95|d5q+28%=Pk-`9*QTz^W`gg!`5_C?tp0K;_9FIq?4wV9@8zFu z|Ia`5e?EPG^Iv~|<D!=pR zCx7^z@BhW${^ZwtAICm?qpxpH{rh)+`>&O2Q|}GQrE&e{)PLPn&Ni-1y)Q@mNLVAD zVAsMDrDI0yH*dUr`Lo!~U-D<_7H8qTP)TkR<-W8Bq}u(A(Tt2Rok+(uBHEKyU3kf$|d~I%sEX> zGtHDn%kI2BKKOWgpZ9&<=Y784^StLguP#JJgDBgSi9qD$JP85PFxJ(+Tv!>eMcJ`` zt1tYIn$!Fr)ouegeSqy<0S{VrcHx9AO@_UZOa)`4#%qCIU=Pug|2+H~ zXfJ3CsEz+U6f(g%d=Sf*#fS=w3={AJ14APgg$G9jctwUqGXjF(fQTTz4~y@~59tR$ zeL*dZR6roi;2=D4oazUFZlJbEi|FYYLO?AHkyY3Id=L~*A}kn>>ZD0+O@kiq>^bYOa zTU%M&hCeKB6JirwbCwbS9l3G)E~&k^-4CGKfHb#UtEf}!3aP<~eG(pDul`@}_qDo{ zjBov2Q{+H?pb_^w^rbcc(JVGv4sq^j6jgB~XY;~WI!9}~zsj*D&gS?`C3-|oG>HW)A~?O(Bi z41kK!2d?hfdGyKZsYV|)`g~gG!$7bm`q-GI0Dag@Cc@$)2#d*9hCXZ-pT{)iFd0lP z%;qt8Y&Mg}U~~9#(MP#6eaJG4M$7J$GxUWT>Rtqr@sphHp7pmrF#b+^18SJ)+ zGnFcjZkhH-iROVK%?wi+%_>z*^4Yr-rKY+Hs3{wzrhjipaY3o6o-%66`Y>uroL;@r zav1^WA(xuoYoD4DMAYYjiDVnujE9gRdQl=g0rKaE-y&#(LUiVrp8vb$L3V=BA$+Hzjt2 zn=+o)54La_+K-%25NF-`%?GPYPHN`!C-(q)D(0rFWGZ+{ z7ovfKK*Q#PE740At&ea;b=#=dHNO^}BYQW$QGy?KNr9#4grK=hI3|UibTtDgU2-Vc zeEx~}Af7?|=%5%+-w-$?z|$*|72^{U9_1eGkGO|LvV8p`IT0NCccYuT!cS#dI%48c zMEo*|^svM%p}jHT%t3ZY9Xyil^pJ2!ZErkS4!%_{idLhQ_ApgVBWR&lM4)%8j>PZY zNKK)cvM5+*yfS;&7g}ZWQn)rcfNB> zbP(UcY@&S(hdteKqD$bMFxK=rJeI2$WA>y_mnp6SS1;S?h<{Wd&nIM7sGXC&S%|%( zjra6W$FXBkb*vWRCW3vjM?ng=HTpwym2v8h%@;-S-V(sqW=gQ#+@m9mx?}Fqu8yrr z`E-XB$THq8&R-#$?r7iU16q2apbzQdy$X>;ONuI1Cl}Pog?~+Qfy3uBxC)XBTqX}; z@Y#HX$5fVF;PRMkt|^1ZY!x%e?Z?J;?=BxhW!}yc?1W-7)KSlM76Q$uZ@?ZQmN{hU9`sGsjd$vr1L_^=$)%UYC0E)8Y0{g>~3#1MA?HiU60R7G;7l@+d!kP&)?(uIj$1HpO#_?X0c_EfuSXTJe*w@IIOP96;ZKl6=Hbe@^Cc_udXYC8D zFv%zv?lIQW{!5%(I8$Gjs7@|?Zpj6b2kke5s3mj5u3Yq5`d)Cq@5{K&)#uWq%Fesz zC0`qRr?zjpKkcvT>(?M*blCaF{WnvcZf3t*E^P4EcQ3Qw5#pX+wbC~j7&O+FvVsgi zijxa$^}&~#oBo@)DT@y?5CzV9sd}Z7e5hdbHxhxis$>+mtHkZSIVII3X z55CmgRLxD*-1M{Orul*sFHvr4pn#ilQEqysUtBE8O?xZjrkoGsrkX`WiZ9Ad`*fC@ zl0@8;$u?ZNzI504M~zOqXC^!ud}T;w{8M;S;^i8r*g8St3XGdpgU>SNtr$1N<;UC@ z;^k)}G?&@M)p$H^s(4svws=SS0+gFpi@9m?!PpcvH~rkWsb)tGzSbR&j2{2z_@%#4 zAdBGQrkDH|qnB%H#-zM7p4znXo4Y51n?I2Mw>1UzAG%WVRjP@8x>NOEnOqiEeg8wZ zG`eVv7Wy2`g_YEQ6$v4Ty!x+9HuJNq|Jt(uKfL6tR8xxoviE;5Ib8Mr?~bNm{ku}~ zRjMgn|F-pC(WhGutX}`_XzKc}|LrEb|C_7&sICO0$gw(k{}Yp=zW=9Nn&R~ruT7Ur zKz1Jgxh$T#{%^N5#p|z{6p+&Om&yO|7_j>Ok8Ww|{Lg>8Dc=98NdYO_|8nv_9QFS1 zp4O%O4;yCiSf5n>hs|N|U+F@TYgv4{X);rk{xn z1hGbi8B7-Z58d=5zsc@@&oI*{_dwO%{)6X#73_am{>Nr=x$69HceHlbAN{Q=9g5>W zlgs9@q~kx6EkYP|{O^YLXk2+Y`UeE+X>&Gm^-i-*P)e^fr8NZGcK~5+R8*3LrDEch@(r zsm(>D&q<^!v+kkNM*!#$0A>Ny3;;|6v}tI^Ew6YQtE{{t+^qH3xw`#;xn=LvAI5M) zW`x!FkDfOs-E6*YcCBAV7p{CKj)oJ1)w!V=tm;BoM^n1h}xiu09_`4=Lp!F$}L4B zTbFt?CO{gn()U!&l}b#Y`Tu^gtci1fbcs{+?F*IJC9y^&C6`>@%^o1|cYcxM*WXU5 zgcFUlBrgBEiV@?ZPM?muZed;SdiK_u9r-K6HE-lTD;Fl2%~3iIRg~ckmH)1=233Pj zqN4VqqDxLyy5xIP>t{&0XX0<$4#;y)Z&8{5QCAl^qSB=;PT#l-l|BPNCjsyT0OtbW zVL%(8sIuf|v#QinJJSGI?xZJJ-Vq)S-jUNp8yAMee)sn33r|7HL+8V1PKQPhKF+s_ z0n^6sF`Aam${J=+;pV&|Ro`H6YX9nq9{rE@dz5|l)fAn&=jNgsRwE=6TXONQbO7oH z_C?JAwKjwJV~23e{42P_VsfcVFYLq| zmLMBXV>&bzl1%NLaAZ(P(X2%QRE&y7t2`$wG-;s>pkWd>mke~}Ba2-)Po)YL%?xRA?ppgvnd>$XH z(=DRt*ya||Gw0S#i8a_c?#RHVqGzd2Pa8j-u&k`M>_-mEN72woRhi-GzS;yxt}?3B zQq#K}6EGxE=Ijk=m9C?>t-=Cj>$kVLf=`tXR6wqbX> z0n|2s`!9R?OrWfJecBvZ2;A3AAH~*!@H70<@oou#A&e2 z-FNo_w{E(=L;n*gB~uraCtb)dCp405zkKh9BMGMM#-&Y37?KcVki>19(PJD*FySlL z-X&p3Lf|Aia-=N!^4X!om_>>5kOcNWHwQ-&?8CIC%LkHLkYvfdk`f|?NCS2zMz6yi z7L(iXqG~VZutZrTaZBI44@VMA`byL7y>gI**ak^dQvd>P*1GD!y1gipyqGy4YtPBC zx;?#h=M4*?8e0@RFW0}O5v{w|#A(dV{}c3%P5L5@KkMwuNA_9U%AS_a-r3JLJ!N;2 zML^}t`9ro466)sZXlM|NB(tf!c{Uk`ccS~5sNq)WMv3el2w zX|}*Kz{f~yK<>RX!-AhHXZ`Q6?U<{9j-*?rbMKL^I-1iCB`)6h$9u!KLmF+S8C_ag z75nSz>g^@VZKwV?6L^?Y>(^aKqO20+M?{i?1Td2T{se%rfa2lZ&C+?)nR zFR6HBc@`p}E(i2O_dg{&vk%oW?jhAC$L(jb*}k(j(;Cw1rn?Qyf-a8CXFXYSaaT{v zVcvoZfB2ld9yOUHblm)1l+BnMPc|Pjo^!}?)ax~tQR{^m_7bQnb5(`d+iG*ryBtL^ z>{S*Xs=XEul?r7~ev98PFO-R~_wgO$Y#eeh>0_ri?U#eSsx4rHsmfn=Y+t*OQy&q! z9&E7n85EkF1s>)f;QIH4&Of@j^XuIXXJ4=26aIRx|I3|-&4tIZo|wg%n;nh+Lz5e= z8AGcMsak#ZTl=1R0uvJ)DKKr94&O?VMG6V_j?6D=kTOK^ovIW$*!wXIfqgCAjv;va zuk5=)iCpZ)Us;=3JfeZ8k>;^yn?uoRi@boNc3k&6-|N-A6)q|bsH*#t7Qgn;ui4qQ zhJEP?J`>ZT8aYkCDY9=Jj=eZ+#2-n;u$L%2qS6pW^OdeVwaHZNc6r!mC$_6cP<^d=VOnJ1i!bTyqUiJCJ0t_v8!v zF*x>O(syzy4#>e?QXA}5%?IwVMC+3WX(;x>x67NXS1?SREtfnTx_NQA!=Rf<5p^~j z=dRB8E2gZm`rfujQJ?wx1Rb;aTCrCP4V*@fUB;?^_rEWyPrmdTFifM&@COq96o>U& zng3h5^iv$Eou@bwUCMn_$S-J%udn*%&Wo%|#brX>qT@dt=|5mYVcEuC96V+fJM4m| z)O|WnamorMb)?u**Ph~tRFxTCA(FIOYI>Jr0)`~YoPD43L=CBp*>rKcP~OHABgyqA zjTLwR#iXAU?H0;G64jQQz*HUEoR`sV05!=N2AB@@Gcp@DbG6=sy)(9kkwYHVUZ^kF zNf?yf;6ChCZ?oG2=Gy$qv>0~^e0|UMmcg5Z|uCr+ExMdTlfM`d}PM zFl{@s&t_prLXts}%SI;}aU{XlXywUl3`t1w6P_-RvgoS&!d%Rvn(~mOVEL*N97!Hx ziW{$HwIIovADXTZDVj7OE9R90?y$Jrj%^1qht-rt5?JTpA{BRMW4$46i%{EA~ zSmP@`X?UZhj^IR6=ItVv)$;-^62h$RybW?1d34sjJZ#C9gxU%R9-aMn;`ra$RzGeG zoOE)&&#pJ4&sc8%F=*8ugIZWJ#`?T$6iEX7H{8h1b=lNNEy>H!q8KxyOYhDfGIG?Y z6n_3UoaExsvmUajVT0+j!M<~@=bIjPm|=W>_&4NJ!R4;YOijvl`D=MbIFexfHXVO@ zP#Q@z+d&ddx|I8<5G`o|$qyT~582N)9(0$zeO!{>cZ;Xc5|+Cm|Igl&1~hSPodE=d zDhMhFienUU!H}8k0TltQt+;^;6%eybFbc$yghk3%MXg)4E_E%6Ppqh|XkD<@_0_6% z*J>4asn)$(MPJ=MeRn1VlT0R)K!Ez1@rOWimV3@U%iKA0PKA2YfRgf;&Hg@-gs!bg z-Jb`#1lUdR79)v)s+qO+3A#u^x7qFZ6t>|m^7DU9PKq)^j^#Ay`+q3nc>k|nF3bAY z6=>A$`+ppS!x0$Nf3WfTUoOv4|6MQF?)Hg4`!#~}?XB=0z)&DDbvs2jmWBA4rK=ER zKocP+NMiW0QFlj{zO^F*vZ+@lz$?X40U`o30|G=MsEO#h;4z@LO%~0-k1&PD8?v%= z-B@eSoxm)1s~AfrEsW^C$*O9-S$p0@6a=i|&KBKT*SfL}bZaC+ecw-3b<@wNa?z*+NceK2DYU>>>Zyt-@kpyZ_??^&!op&^zWorhFb>7in z)U6pDws=RXNw{Xv(t5`lTWgKC8lAPi9WYxv^}W-?kZY9~$p0eFt(w?y05?o57}_ zz-E8G`x;WJYF=Jbk;}~CvOmlHXhdyk#Bqbl`U6X{wm2TS!GxW6;hYOdsd-kW)RQ3B zI!UP~8MEbTYuZJEw`)pG!ft&^O#-!dN=+hQOG-@wu8Wk~?z**iN^N=b)HbEIym>69 z)Fe=Qrqm?lwx!g%365saSeH^840tqy!%MMim;AUJ9B~CMs{P!!MiS4 z?PU_e>q2#{O#-=%l87`8=5@iLpPodzO0G@A!fba-6plWAS;T#E$Z@ zXx0E|B;7Dy>(&eWQS<6aqwYxcP*Jheno+*iZ4XKsOK1oAT1|jFYPXi_w>ZYvTHNBm zw^+PATy?hUhe-TYDdkTi!giJsP*Xc`P2bkwEQvG)_Wp+tIjgfV>$r)*X!- z%$GNV!TCF{KZZK=DF@ttJ8n16_tubGAI2tG6tlOh; z61iF(jgzp|*>Nq2QZ0_gNx16fw3bAsc1Pn4DC^oBjW>|6>*E!gclxsY{#V1z|KdC5 z|J2LnnE&<9zAW2+!_EJ4*nj<8wVMBhqQF)Et>%BBT!DyhVg47&VQUj*ugK*XDm2+kZpN|KdB||E`zIvi=)x{uj?N|Epdu$NaB<_C>aT;@(*e zBAwkPz~dXs#{Mrn;4U2fU+Uqa(?6k|T6Tc3?Eew2fXg=R{~{1L{C~Y%Jx2-p&V{P` zzu^BvjRuJkG21b=rXk1H^j|wV73*M)l0v!6akA8Oux9^V! zDl*hpbW~q4Pc9X35rII83FR^_A`!49AiRkl1iClpp7*{6X z%Gm-;#%7BUnG`~{9ViNK$$(spc0#n6O>CxYW#Nm%z+w$Qbcv4^Bk$@cj=%EyjBmq$ zTn!iGL4>4uJS4f`vzJ!K&)+!H334;>S>RUOF&f4(8m1ve!<^l4E$q*?kDK(~8of+- zYx}h1_dezl;Mm!JtDSw{W59gi^c$NxeT7JYNMx8?fyzaEj)J4$awJ?4hs_bn5%5P8 z<)WAZlS_mMpU*=viHI*?3weA*Boctnc|r(X_e0U)L%{QyIQ@6lt^caddjjH=r)iu* z-_@}di~KucAWpq!Ax=4U+R^RYE@!BTNu1({*^a?8j=?kk6Yre-&kvs2hbA>|>ML?PoyWL$`oxp87Ci0$4cvHhJ5g}acT z^&qx4GmY(>cXg0RRNP)Ii0wXx3o?oA&i+?sWPy87Uz6C*rMd@o47PC$wyE2}Hc@XD zUjg@^%}pW|S9cF;pAih^?m-R^FMo30N0@Ymy0-_|JBRosQ>+EUv&0w zj|yPh>wo!(!~W~%s#X0j!shVVf2;ama0kxiSg8L+I2@E~Q~fW(2a{+Exkc@F!pkBd(K_NV}^LH#eEjX3mQAD5&4_n&={?H~M* zrj!vqBJ5NET!Z>w0r-=n{G8UOeUiQ+VXUZ56h%R zk^o9oWl;hZqoJb^lk&$v90)(1NLN$B?G68HQkY3)WGftwXlzLZwQu^wIDtv|VLKd3 zu2kz9<>4J;sh|_C_1VN>7#AkC!J!oxmYONa&`?62gL{96GK>qzTH}y-834G2p#?q1_Yf|6|XxmI!!8n6!c-Q z)a#da4)0vqC-LI3eFcp>@}&K)N}OCQ5`^g_0n;sMO2{X7GfbWW8!$LL_6XAAeA1GV zwokiHDNNyS?>N!--*?(IpU%(Sw?FD9U!G1PIZ^9-w2rvsop3XtT^1Ubp_r|`Ofc9& zFOm0%j#pJu@qWdfn`-i;)_^GQ?$2lQiJJa1k0>q3VZKxSNH1 zsu|4G^9|E+3VBxpDRk!P$|p;87OQS!*t{I)1F@19t+HN^^VxwTDoUJ?`_v_z+l6- z#3OrHe@RY%EL{~n8bHc4fJ`GM%HuOj+U74G3E}`Hg*2MP$vB#)&7Q!&`qiHHfI=&RLcB6{7?!D2*%&m`RAA zgaHLnGB|gPU_|VXaoX#?5AOK1{V|%AF}7s+stb$fsGGd#&1g2eBkowp494qA_FVDi zwQS~D&y~J$AOup<`9L%>x4h*t<<7YsW8;5RK(YQOzJ2lNcSgTGPk(usQkv%n=y(xy zhU5TBvC4F%#+fN#Uflm_@f=`Bl!*KG9I$%#cPBd&5gZ&tRtjLi`o+psa~d`Q&fCsRW9 z4dhUwl4b1OsAHvN-5oMQp)?wCn{wY@bn&Dlb-ko-?FvwTa=98;{}q4Z>&%m9^ZNrEZcj?Z$1`k8l$)m_njW)8G}Uy)z`zG)(TI$<$&^ltIH6 zGoTKX6s|3MmQ{2ld{Eb4rmhTf{iD+>D0TK{*{^4ZJu9s^>Kbw{87QBM0!+7ln2!Hf z503?dO&?6j-q9nM{J2|ov^sPcc@XsUivO#j$-+zQYrh@2+p|2UL)LHjruQb;GvLc9 zG1=qU%eLbgP)AC{@Zomotg>5-$shdk`tbTL%I8z>wl7R-^HS69%N_UbI9K)rh<)+y zvG~0(@nB*Q0U46VOqb-ONOOrU*-R7#A%-pDGee0#r%LcYc0-u?fg={J{*nQOQ2VvL zWy`+jKZuxB8n^Gg71=SZg!!HNP4|_grqA9UrfOO85fHpN24Fgoz;sK?x&KY$xeTZi zC2P~49PXa_>gd`rc~fR3Pn}lj>%Fb4Y~u9WPqBfgwp@LV4Fi@(5;{z`lVG|P&r2RT zZ4m?NOvzWFn{2!L7k{YZ_DWXVyMOzeH>Hn?Z$<9B=rhV|PL8&NB+1pA%G_W&ZvxXU zy32QCH-Z$3lDjR1%td2!_LU7iAbxp|-Ha9g!-P@C|8?p7{GNZd7|dGnREs+Uy+V6e z-5%+5IzqRp@F<_5P1kj-Q|r2#^k&o{7ncz{^a|pKy5i0pNQ=DM=R>uN-#qyTH|ZuU~hT zr*=Dfcg%!YXP++L);51)^C!XmFI4#+v!r1>A8#N?&i<$v-qhwF=tXIyd1qYva zP1yeX!h)%B9;fGSZyB0C7}hS22~?{} z$NSwAE$Kt`?do+3W#%tG-guCf0kNnf@`~FP=Mx5~27JEtT*1MxxzGOW^Be2$z7jt zyYSn#A%WLMmXGhyVd=elH-~-^JXC-IrO?ra=|l(9t#H7@X^i;{h)v1n&U>#EKL(c{ zPI~Va>-?*b#Z!;}7O7qPljq0V7XRnM!yP#Zz(<);4otV_V7m2>zv8_mivb~&oHe@A zb@!nq6Jq`5S3Jz>+U4Q23od)o!=gVtt==e&WTD2MNaY@>fczRD$ zF(8zZc>JvQx)k5{T(MMrs!glQ=@}hb-n^K@j@u{R*g9YddsHeHPsxpl<6T0v8A?sA zMv_BNCC!Ls9_V<+3*_h=N~(`;M2p)r@j>~4CE)`WMvTgu@b%UB0egSiquTf&qQ#Y5 zB1fmB3e!mprd!pa=A0LD2E?UgaI9a->(hPqr@bk{b`C$i@p0EK*8)c`D{uab%c*AL z&U-KDOwviVQZrhfDan?|<(Zg4LiOT@P-Fw6dSoq`RJ&FQt-c)~zFC&`=j(&aMTaIG z-H^WfLEINB3d)Ygbi3VB14uQ)4>{!+(6>^fgBuAVfHEVc>TksO4U0~M&`W-@&goY{ zrHlhfuu5(wHsp_$2M5n%KzvHB=WKN8U$lSO$(9wUE`K+TwVXTb)|USJ z!!HyM2O1=E4b#aLrjy2qUjFC)#ef8qjCmb?o>+4D9DDUfC}6?UA-fk09oY2B`!n4} z4LMO6+AHd@0@yjN=3u%F3e&CshtFBf0iQx@t6x5;c#*hZLs8-Sdt3XiXf(g?x>cuF zcY5^s%!*&`ZLJJcfZT-E>R~#s2GfZnsn3G|{VV#(v-uMc#RCvj}4y=71Q}?R{8`i{&FM_l^f|By82)~>j zGt(-{ZpptlPJS`Vc4g#BGimr0gGIlFY_T zJ_kW~D4SVyZ=g5EfO=3;I56PGvzcA{&Fi0AE<1B)`PK2GI$fK;R-83#{D#+vG?d*1 z-!%k<_f?X#C}Mg79_#p|>GRAkryC!d!+?5H(#mo_5!G}eqv@{ugPp=de%*8>q4kO1 zZiw!D@Ns!dw`G^piPI7jS}?5$=vMI2v0ul4d?=EVEoaZfR#S#`lrl$uI4~~!i+&{^ zUp%mR#jT9}-)wmQPJFLOA|E0P8U8PCR~}DQ_w~=YndcBnbTVZqGL%q;5D`KmvvAFq zkO-BKG8B<{D3N$1rBW#+QfQJ2@sKpAlqQjq-?=W=z3x4B@B4XwZ-4o8_g?F}zI*Mx z)?Ry`b3jgmfb2DQwRZM^U>!_kdHrq+KW)wrV|KV`ltGX;s`$P@XDIJe)$Kl&()Tx( zI4&m!#7Sfur@u#GLP|wwGLe;HxdNxIquSPEYLift!#PXlJ?UM6v)XGHxUx0+sGpgj z#zjjXPW2#ttt@)lyag?Q9)g)T6m4B#6_r5u1TdR3Bh{A{Dyfdy-|;3-+lywH(<(k z9bPdaz}z$LzvXd6UCi%f0nN$_rek*`<@aUS-jlkYvIS*&mTUw>0s;bT{B87p76cn$ zqVo4fcG#cbTUhO^_2+epR7m@SD#v#|p>Ywfx2^OO;;wQ;XB{TZ2*`U7kkKU$jWFt; zhM4#|+nqoEZYU9V6su|8S0V1osZ*A-MzH;j#7^VD4dcb))@W8jJNFRKVuFC|wsIOB z@qyrtn7~X3-cC!?>Mc$`>Ra`Wdu%+Fo8iVPL#1ENiLdc4``bEJqOKxBKDO5L-$e-a z@^d$G@$%K1DuHl`t)_HNN&V-wJ0REyQzM-Eua;BaYc~6)1Kp0%9qvregr8>S^wpM2 z+wOSj(|>(6u}n|ah&qv_mj}V!4P7U#y$Ejpy9DSb4y{S)dvYPz7*nr8@+wd5+ar~C za`8PuJX=p>NwnL%7=9V;>ErWxq%M2Ql2;CT)V5)J; z;W=Pbb%y;~+@%=Cl%=EU_dAYh-WarMd-0|Dg7D$ZlN;k1HN-zQ1d={@r{}+OJMsRw z2Wh3I83(at>FvaQgej)-&8g;hel~2b=v%BPzU;PB)+INQs-s<^6TL%cFP_+GWs66L z0jL}SF@=C^JT@W=qwZpciPKVKTl1pGhtj?0-?{7 z_qBSZDn*FVefpXVG54YhGRk9WICQzRz!bmn<(}STr|s6Ou5_Kb9hvsHt*vB`zwMLD z5mwf7M@6_|C&M|7cmzZU0)kx=+-~a#!Iqf7hQ#(?ul=PKkkl`&-J^RbZKBxyK-*3y zyX?i4jS9z7A|_8-r-2!I5s!?$TwQ#L&rEo^2Qf}E4ZV9AYze_zFqM>Q7j$Pa+~G>t zoKqX9uDwKB!>g|Nt>?t)u-gy)>YqI$UV!19R)U6!De17PT~h9QG&!}xlx(~^w}nT@ z^kr0sOj`HbRHOahD^BYfjO`f=Jw`b05X)qP@=8ZC0x}x`K_01JZI}(gTQQMETV9Up zErVX>F)8ph_ux$x9EZyAzqYgUvoeclS~cHvLZ=%xu?Wav5Rm0b38UJm$6I3pY|i$t zLxetkNVV2uYbC~H6^qxucEjWmDPSy)CwIU!+5Rg?y ztldlOA=nlZ;00yLtik~UVgCF@iy~v(HP<%`e9RK`{ZRTf-q$xegn#KQS}fgt@p|sQ z?jDn=$vm-@Vscko4A6~=9i|EuCu8T-)|zV;JLAhbpMDNLHTF}`3C$01cWzP{4VCdbS@9Qa4-c5IH2z6r-0)=A)lyx8=24Yfdh4UfU855=OuI%5r`3pLB zeLtb|Qz`6)-q?GXkTmpIKcw$;p(yJgS2k%t!jFJ9GYE)@BVk&F$q?*<39@@AQvE~t z$=o^#!G1NIaify>!LR2^!|uh(b+vQZY;dsRFr=wIBA|*Y0y6!LkI=JW7I^yLG6{a3JNg?&NwWD{gwD3(HWpnlq~M;AR!ls2BP<3R5JEbUXw@0&T5=7+Vx+ zrW&XSGes?J4TyBT9VCWC0ru)cHLf&!eF}~x={2O;BBC}^BcK^`h@1Tjd}VOTN; zf)C9BE5r4eZciNNBUTfo`s;!{N9+~bwW54EQygNr6`%Tbop2<=nnxFwE}O`#_qR^P z;pw-xim@RQQiCA^x=9l2bRW9iyE*c(d;A2m)8fjod`_wJ^+(x*FFue7%7WndIS^)P zUOJb=rV{gnovoXoo4C@mLP5b`9bU)%$+j0i)>aDGqkBFKgb0Xq1Y|z(OfdO`uxue){E}XfcEP5rSz4Z5MQG*3P^1WoAe)JgSUJ^1-6|ZyHLYTxHao<2@ zuDvakZwmycVhim!rSPhRd%0z$gK%jap*#_1{r%g;`pQ1jm5T{Oksqsx)l+ud%)^aj z`i}D-;!T3!G;Gnee9gu8tu)HAov(IrjhmiPl}5MzRB$=%r;>x4sR`bthT(0pqk41?wZ>LS94AUn+IAMB@&KyW6u@W2m}JYq|VE8RkuUrh>wH>51^WlsobT>JQ80%v?dXu2gj zs?@>}keLVwaA*D@H46yN!bX*TM(>~f+dT~yie$bC^8aO(qA>cU)<`RiF;agY&d$S0 z05zEvH~n-knaczj*LYNLHnw2xhHZnJt+m3r_62X`uh8p%&AUeGtnsV~$0zc~Id^fLjDA+k#ZY%r*!ij% z%Hxb+1Y{rr0$P4DxgSN8i;bu*q*G{FMh8>o=$4UF^Kbp(kPW>UF<7W^aKwV=kxj#U zGjwjuaEO2$0RdUK+Be?p5CrGV!O`8sy2$JhNA@eV>*~sV>JImn1)6^RqNC!*+7vAF zG2euVhde(J(9}ji_T63UvBw;O^XCXNndkR>{ca;3%*HiwGF*76t;H!>y~f^UhW0Nr z1zCdR7og6-g7a`EpnmU5_Jx?|@s~{?xBy%3ypm*J? zKR#UgvLo#XG9Q)8fJ679qUPZs;|z~ENY=}uycy>N^jr@zea#3P1p-;|AbZtAI|`d9DLT^~mn zY8q-~<1j&Kn-+_J3`0O57c4FHMnhH+HlD4*eS90GHyr1D{8oQLO8xo3hog009)6Qph55hk(W$0oi6;#!-r{hsD@vL|WecST_9CBU^@n6}g@e&CBR>yx-f8 zd8^d?tBZ78Q%LLKbe>4|*8^qeOwhS?3R`f-@qv5%9=z2P=MDZuo1}K5(>*frH!}F$ z+DGu~j}%SP+?v|Qk>w6s=5obDa0#~D$4e^8_mbA8yQ=zDz8VuueN+OM;h*(*2M$kc9& z8nY(J4I#bqnk-jZKD-kpunb$S8=>S>tkFsP0gJD;gdA3HqvBmvSzP6*>x<;%BU`+= zNCZyFML^aeAear$T!q8BwSgOQ1ZzWMZN8{12A>I4)!O@mTuGxr;{P&*`xKX& zq7#BlAOaeH1Y{r2ZI|b0;4H@m6r~ox&%KB>dHvTos3$7MT3d5vkU%c8fPsd@$3XRf z2s1QH&CCe|G@%iYfpIFkT~Lb7U?XaSb9i;T^WAU#sQx4rcF3;9f7>4kk7#cEl9hQ6 z7$iDOS&*4Pg@D2=0y3~rnSE~z4z8F2M0}S8ynqtW%%&NHjPx#r>3;ah-4z>-Jl|nH z+MjpN{0`6VPR!&fy9-hOJhS*F%wmKXDCRJh6xZf}IPJ!iDrP~PT1@9?G483>NNp-qHP}Xr9bGmiZ z6Uw+fVK%grohP>7e1pph{2%Wc-6)o`CQRu1i}sCtQQ&?-o;S-iLR%Ln5v z8KxnEPWM&49vmLLTgY{(saW%?v;n%Z!!QCe3;|)?-x{^w9)fQJ;H1AlyKz`Rszo+9 z=l4(3TWMO7RetC1|I;bmE~6M2HEJkKEKSmXn+epEyl)8Iw>AP)e3f8MQ)LZ%Wm-j0 zPXDGOxTM)tKiu3ZRJ7^(^18Faa;B&XIR?5a=>DfD3(UKSrW#NFciTIlo4ov4Vu?sEV54s;y;C#Vn*lL&~1BNw&(@*wyw z062G9-IY_H-nIswSy&%fr(X3k#rsOrHAaPPzgLgEIgzGdk49pQ5ko-Ehk#h=^5Ce& zLvRxSBkQsK>TG!;5)rR-xbzY)zUP!#y204C=&N!lI0HF~ZY}2oG*t z;&P=U1UCbeHA!&R*#BE#6Twotrtv&e?-tibH<9|*cuoH;KMf6-G>F&U1eoY5LzTp` zhZLjpqy?blrmwrP9_w8Jg}PFgy+TQ4tlWdk_(Pure3lM~)Oos4aB`k7)1N0f`n68z zz}^F>Sj1sgzrX06lqCOSxa&f|rOZuxg^jKL!`_w0L%IF`=NV%gLK9{0K~b{IjM;Q0 zN~Dlfl9UEBV;KfxS6$k*C?qLLo3>kNC9U_8ij+!OQj+T4N>}O1t(4y^mXT+i>3;9` z{(8N>_n*Y;JfH1+&gXodbKallQ+&rqt<|L9!Luge89X`*1Y`pQB>y3%(Ivi&l>iyf z&AwZ*?vJfXUCW+WJybk=$Dnd@@t?FR`q;*RJ6)>7J$Wv!S^H8nkkFzWtlz^dzRN*qe}^?O680!~%)rs;p+Z1rLuKOy+cAt&1$SLE)7K&MFB^&%*%F!;5y0l<%9E$J?Y!& za#y#h*v$adZk@2$wH`N|842vONe^VxLqqX@ z$88-VW7_*IIMN_~KVA-p{I)MP&sO;iiVp5dnDu z0#b*}xEswE?~!EjR@s-w89jdGOiJ3er{l>VcDRrY6>;yAe)!|J-7@}X;B~@e3f zo=<||)K_2d__?{nsCB>AvqveFN7Aw*)*7P9zPz~9r4@o7OXj@XM0E};l>J8cGEKjF zci3Yp@9h~~%bK9o3D*st-MA8YLQq{l4&5tI|CkJaYwz2?w34+4S$L(URm=?-xJk0s z_u}_x1l`Peh5Nvwyskio>6n&uX1iwRWlm*8*VaI^DlA`Xj63lf7FUMp-_8y;6km;| z7(7G*c4qs2`p|*o_%C)({@;$-M_cmFuYlkul6|r;i}iL-`g*s5O!LD@YtJ6vlyURw zBRwro!>Jwam+im&IF%nk`7VioRxAQ?ZbgmO=|>>AS+Xd$x-ZK^%fcT_!$u&)gvEJv z&*G1*$<_IA-|Mp0pD*8NM)0%$Z;1&AD83;eN>@e{D~)}!g*zl6Pxv-4cnC#6y95Fky4p!+m5-*1l=7L`lK;PWDV9fvay8OyY=oyNHV-^v%z4zI{ol6o8 zdOsT9u&7qRnD1b(g;o2>?@p}1V*cGV|J^nJrqwA;j|1Z56qDMS5d6FN<{&(C5NjI{ z=IU*M4=S!aDc|Ds*sJArs?I|UE$_~Z&&uVFKPOjr-4UWBg2DoraeW|0?3VI$2yX5E zUC@_8bjKw|w=bZB7>G6ku}4`#ZsM0PQuaC^x_OwcyA8o@;tC7l{etcqVN}l_mH+he zjKS7+E&1i$m(*%Kds~NRGw-(==rpLQ{cv!rAf?xU(Y|@U6ld7uG=j@Nix{FGGm1g9 zaODO>bC~x2{(>?Tycdqx8+TY7GChVD7Rn1q@QIx>tIsV(00HU^)gEI zerWL`|IwQ0j+WEWta(Q-JIF5f8LCh4$rb4}Z)lN2&3Qw|*VAG}^y86hPI`yyqi4=aF|)UG zXy1H1>mV*Zso{6K5(Hj!;rWfT5d0opZ~Lq2FP2xQ=_R#CZg=>^j(1&WShSxz&EIX- zm_zJx1M?)2-if|X#?5x@D6`m|xUNRGb@Sti6WUl(d7GV>w-Evew0IJg!VV3Mj)@{C z5Mr$vv2;2iIE)ubBM^eA31QYDVVbgd88$bj$F*{QW$fpBR0q2JlsP)3G0(@p(ksmx zp1g9A|G9iK@6IY~w}ob5L1FWUsE9lYO?(72D$Jo%-O0^o4;U_l4=~keDJK|i+vKd_) zS9!&=PGFauIm}~!y8@wBfmVcAP7IGl=WrsUCKtp@B(_B*4ALZMITwLpZS2fvf|Bd7eS!MUQ8{0R` zU1luuS~U3)(BvT?<0uSoQ9K91o#>LSNN>|ve*2}qneLm7Gk0;ur#?J*#QZM&2yyN( z(XHLFW0}abXbn9Ar84a#G1JoG!dWp4z8x8%Y-=hhp2MTE=;Q>e5GIF1_or}p%*co+ zh9-<3!eTOg{ka?t)1RL!G`uMxdO+}JbPWQp!iqtmwSUCyOEXV<;^VlGe1C36j_HII z?avS0x|Om@09_x(=5YNOoNk%iqC@?dkr)Me7xjDUX%PGcov`NzmkU`guj_p0CTh2N zt~DvJu+zPC!y!@GskCud*Q93Qck59IBOse1Ad!bFXJ_%9sS91M0{Ldki8J;rn;1yn zXB3iu;Io0;UbC2aD_*C%bmC80*oXoR+KeF}KSV$}uc_x2W(aUFsFK}US_;?u$?18V zyK`A%t^U#7e%qXr6q9bNJJ+kK9Hey$zaD`aXAn^IL_k{42~u(>!ood0-2@H3L?|bL zWPSN8NJLTfqTm@8YA%@sWB#AhNpT6$GN+X==6gsC#l=M1^zvZLcb-UzYk-ze1Y-W7 zj7VG%w8ayI`KPvNaY@j2tG^=2U)yiRB|!^y!I*z+dlJ3Q3q?WM4Frdo^1v>U#H6m5 zHjWUiG$61FJ|_^isB+k1Ex(qZ82%~ulgP^_jx})4F(2c-uU*4B>*kiVQ7VGVa+%&& zZjJ2Y#qkiV42!+u5A7k=7YjjDVO-BMEE(|^dQkUD;_!E_dM*&G+ReWYQQ6xo@oPjS zsEHyGsp5F^_*#hDM_2_f{4zjT?vA4KE4Rb)J9qm+&1*C+J?NUU?)R3Ixa9lppSC1# z**RW_q$K0;-Cr6I^d6&HldY)~8eV_k-^5RENVdCo9)MuHxH0j)ocpW^5&>4~eTW57 zF@H%GaPLRrrH6DX-;p%LZ7)RGh+3P986Mp5l(=nM2;l+-9wAOlhG$94l~sW8W;m<> zD~%t;|39#I9o_;bCjttK#)CfagD2n=dT_&{CqT8+coiJ3`(QSNALAjsB~HE@`YR#; z!jTJD_8@yjPk>H0@nl@T@F;o;1cnj_*1buJ9spgM;PE(>P-dua-x(TTI}#2j_PdY{ z@Gx*3PKFjf)0@B89+oJxf?h)A7AW;K!oTptXZH$H@vkRXXCZ0?(4e z5I6%y0giz1r~DvTOWcPCB!(DpVh9T1B-JfZmV4zfI^B!}jsDO8ek=3tZa12@;uZH? zF)>iB{B4+~f%{sT&FxEvsvFl@+^#T&FjyEuaQZ!s5;f=~E4ujCVnm?;g|x3pv)wME zv#dHbm)NwkjcyP_u zM|u6OQC{bo)NBMi(Sec%xRE_Phod_O8pF&JTAItxeAX;nUD(jF{@%D{+D8&Myl*i- zA2}f@UEu`JhwmGb;LRWdAs}tg1X{Jf!p3XX$8kSxTQc$IniZtF`0bvf#~ydP#L3L~ z@uTrlAFP}ttAnx3AZ^hEvR#<4$hgz-)WjOS*9U6n-!97>^E__xnW)L?W8FiiopcV6 zQ^A6O%OKxIKw86-1_;I#J4F%x1ntjYG_w>;fDmlZ0BM*2i#9+5q+tTWwF80g(l7y5 z0DuNa!=$f@V3J))YKsgOy_f)4Z6FOVV66&hfHX{iWmcd8(l7y)Y5{Axq+tT8+yR#M zNW%nF^#Cl37^DUQgMi{6Y7K-T7M$pz)<|Ig;~I%kSZUHEsmm3NvC?hkQWrEBVWrrq zrLK4&84vX}&{c%#-QJ)C4ZzwZJ(`&|=JxxXu2wz!6-{9a&YtL;ey94f^8Sob)<-Ex z?!xr%Z^Z|KK#yMun4dPO{>_2wZF>Ww&2DczQgiERfdMVIICtl5Lv8k!$yc*v`B@Lf zowQLFw?U>qQVCBpof*q`6 z;qafYEPlK0SeHrEbM@3`{{o)=TY#tje!Mb~#Y^v;f+Hw9lrL6FGPf&VwKt;fRF=&f zyt3AB^jlN;3ytr_K*%owS`c6H^=cSa7@D&DaODVXT-o8$IT{J;mrv8T)6$k%vCGc2 zJZCEZ%}Ibo1_c5Hq`+5v&s-eC4r+LFRO!0=TijNONOBVyEU_ z@q=Ke0jIs+L)fecFi?qS9u-yfMoxyip7%A_#NEXeH-*RAhdN)Z~sQ(=oem50+ zI9aiooG`m{wX3gBeFxEKy;A<3vXVnr3~Z<3#|saR`|g#{)q0*y>2(gGoy~(Uz6RcwVGxiq{cp>#e@!dkZ5iqH$XX~6 zg5AYu5v?Ny2HcTCijP2(PTtz*3dzDA-Rx9*XIR*}Aq<|b>+Pf|6aV83k3ugFy-cfa zvR0Yi61(-3>+GAy*3Ho5&#)XMd?Omtv*rc%Ad3?@@tR;5TC>Eaan#Tqam-v?P4%7$ z&;8xZ)RiwgROok&Veqpn9gI2}xJ5`A0ZD;Ov5Mgy$l_YYZpNl(c4Q7&@FKnTg8W=R zot1|Q?~|K~#HAUr&CO=tF{;t7ijAuZ+0~cx7VEl_Mm{OnwRGmtl2ai|E%++&r9p!= z2&GZ!c>|Okps4bdkI@!hGs4qv1lZKeY<517(Kge|+$%PE{*0pzOW7ISib^Dn%yp?C zYSj5;?;qJdVP%dl^{jF7u%BNTsHaflORh{R9fp8}7nf$M>8F>i4Yq5@>vNXud%vJA zZH;`Xf}h-%?5(~TTOYXjF!;%(4*Hw8NE*<*As~H4i&!YlfJLn6nqtwUdE$fWiTwdF z-Y+=6eay*eH6a$8?@y?uwFjF^ZDXsovH3J^T(e2Vc)@9 zD(wdI4KE>}0fP|-T`U7{o(Cf?!)^L93L3M#_O1Rjdv*-*oz-t?ypXD~!9dv-Mpj6xv*|KX70t0vaF+oI>J#aR}sR zuv+g!EK#UX#eNkmM)!>vWO=Azzgl}xzvs|EH^R}Ps4E;MDGWZ?c}0o8cQOX-oddqO zg^}`$Tcojp%;>!s`2W~D^LVJ*Hjd9`8bqZHspll6MV6UkEKynvN)amJQTFURX;FGC zl~RjXl2nQiB}qlJyk}GzW6X8X`+T1F{dE3_&&PeP>%Q)DZ`V2B z-<{2Oll|BxxlW01x_0dPOBq*n#G|G@m?^*B%(eBvh+`LG!e0m{hBu}gFJON&>gL4t z-krBDPL%Fa3$GB5Gc%s;9!?p>dP>$9t)-}M85FH#pCmI@yzKI+z|-v?lDavo9*O`w ztDZQuQ)RkzS%|TK53mOufT!(41-dy}pM*f|itlKB4N6}gHLe5i>1XN_Wt|8_C(ho_ z^XNkoeDoon1McWq`r8X@68QaXqiQjdujJm!BAFIZ`4|J#X|BH`ere$rT2X=st)LY?r`zB7-7-2n|a z{yY{5=CL>_9+Ev#=gANuqTBaAJe<%8JU@~!KySeLEu~~+-_VHQv}U0@>r!3A*Nh8! zGKo+p{~*nsK%x#MP88m}XZJ990n!6!X&Itht&HWB$OSkMGABP}UuE%r990vExfw3FgeCUsqTiD8PsgnnosBct zlly6#M*fNUV`mCQn`2vg-m*mmiVD=oaa3b?{DwVQej}&lewcUbQkZo}i(<~srW&gz zTf4OVs8yw^iMxApRoDYFE!%`sRwkz)20&>Vg() zcSjFr%kHTEi?TZsN06SE&uo1z`E>Haky0VWqHmI1R_cA4W?<&JT5?6~)^n@(etYCR zHEK}%fEqQ9YRD)iuXapcrOMdkw|dDVzX11&fp4D$3DE^7emXO0dCmoMs!%sgjX=Ex zfkNb{Myr<1+J(1{$YzJ=d|d~0N|8P=w~6XQVj{JYephlCwgo>1Q(@jY;wFGpEp~y;a^o0diDhJmZ+6V1#YO&EwAJh14An%dosB zFpY&ze5o=oSZU!*FsF%8yOG&IeFA|(B&z+W#*e)n>BrsB)*&K+lQ~hMGn7?vk;5_Bp=o=!1T-|d-Wy_;n?CC5FyF-n z7ac<{KJmMxuwO`2ify|m;PpLbhMCWK$_(-$_q7`v#v3jeue-lxmB%Wdvc+E-LN-3t z!InEB5rJYtpo;PG9bb0SdUQeElDg+cy7>xAC)O5{(_#u@&381FY`A*tNth-U3=Z&` zsi>^1tb~hO*GXnwza75iRfMlljo0Hh2r`jAo7KmJ@IO_6W1UR{!q6Yv_3*P!sT~kpIUg zp2yd=whB)uy<#0J>U@v5SmpYeh!G5@Y4(*DLQhU(KPVWyRz^`ZH71k0qw@x@A6LeV zioQN7^_HDv<%~UM*WPX#w&B|Ow|;-#5OAm|c$TBV_6dX6ygLUkhhM&UCnhrO*>_D9 zE-xGqcu~GKY@yxf%&Wd;i!88As@LE(6fLg`p&E1E&#vCQGuT?RIq-q@zKN`_FZaG0 zN|-n)&NC>>dVnoelnQ~@P~S$NsQK`hKNe>aNOwa8@Hhb_4p0F+P9O}uFPwUZ6Hqn) z6~N;Jk{-a?1RPGFH-s=di^B<|F@i-%IGjNG7+64q!wD!Gf(qbq0!chz4G0b=pfC(7 zz=yadBhbXhleiv3#j(ZXiCk0rj$BjmY>@CH*HnDVIDX`siert&ja)N~15P_N(TMTg zBiB14J@!w}*ONOKJl)N*Tr`iaXd&%#SCUb_*2{mHI_&_PXr_`389abGvUGpilXk}G za%0W@cA)NKrMB?6Qm@w^ zx8+u8Zxq&ApzawTOTV8Qr5bg|edAzrI#Oh2Z{zGRjyfW}E=lUj_NR*i&*)7lc9~Bp zm$$5=6wg;jPVHY6UHDb%^XO*XdE<&gD>mh9sN9_&tfwEgfLMRJ%JH89>J;BK{-LpO zjCj9oS0ZPLzIG(J5~kg5X&aH4UAIkCPO|woQ1{Oe&4qJoRZAyEHVn1N%(i5Fa2z^2 zPeS~(tK0TX4ujIipnAI4CKc<(Ah3);1A@zM^J7D?^UqHX4?b6F zq2PFv$UoOS01k)gasKw9uct7v%-=o)lEb7qPm-F9Ko5_bq-I13P=8PSzbF2G*Tj#9 zq-GSJ8eQN)ASUA>smZ^Lq-HeB#8?mJ1%@SQ7_ zqE8^6hDmBNPLi5YPA0NR>eOyX>UUadB5u};FRgMXyJ(7BRh9fucDypoWoboQR*}Y} z7v<{huY!Lv$4n&^HAPiaRZT^ygE?lZD4|S6Hg?QJmFRQ^U0F$qp@Q-tsXJy?i1~n_ z=&mF+8G(Z7Oj1*O7ZpfSGb*ny-M@@L%z#L0@-HE&88zlc_V1{~%?9;xv-bCcREF_`Ow~ zz`MWlrKXEd8FxqD&}^BtXpSCgIq^MNvo1Xzke%{8>VCkR z&=uDmA3RB)u%ut;3RL-9qj$?u5B<^T{nfBbmHm%e=hipMPIY0tax6=#Hc`{CVo^c@cS=>Pq@eUt)K0NKfq3A;G$~70${S)NvwKR+Nta@|XZfDG? zsZCk^8x0n)Km7e#dY;sko-ZnLlc;W1(UiTrLpAGS)$)XwA7lENy z*T8P*c_@P3((@ey0L1g50+0g;xrHHk-t;^ff!Y-(Jx}e+qsB$gGn{uk+vh|emV)#= z`Pb0%j2zL-R~JacGA??a5hp++|D@;1Vjw2OgPzCkf<9t&rsuI6pw}q4=y`I_=y`Ha z=y`IF>3KZnf70_(eq@TU3ZpZ z$=PElIiviNcCND2C+B2(uXRnI2bVC{GLrC zT;qv3NTnT?oYA|3qDMJY#_^<+Ww1?NNZ8&n77V>uL!Zw>{8 z)1w?p#O}UUqF2K788MTNW{k~Q7v6Gh%=0}NTgDe>(xsbDzs52g8omstOS4ZF$V;t= zNbs1g7CtXmuIb_3Az?434Rma>e6~GJWAS#M@6Fza3~sfRhah&SV2EUL=x?B^!-=l8r)_xkqbO(x%S}QuK_G2xZw%J9T5pbxWtDQ^}u_ zUf$k|B^$I~oNSQ0CL87^FFpq*6{oozEio`ZX3KoEZW!aC-|4@`S4@vBz4B24OEzfT zB^yu#y-hYc`XaP}fVcF312A2J3UrffP!OnHaV8tIzC3DN$p$+3?bEGTve5!28|wo6_QpZ!kM#QwMl5QXDk?+S5;I& z73nCR=Ci7wF6RGNMf#cCg}MgY4oRQT@*VzCwni)EE&3(gd+sq$EZQDH^H2!Ag60)f z0;h;?h)XEmZBQjdPRH!Gp}a{PwUnW)Qlud`_- z&Z#a=^y=zs#%Jusi8Hj4!dpjVLRckQekkMA7svCs|)-|}? zo9(si=^0z9C=G(x<>6HuiF6~N;JQo6xXI2=wOl@=`H!r=rGCBdqt?xA@K z0!@6pp?MmPEgny3p4NA0o`z?Ggddux;akS>L-RBoYcy_X9yN`+aJE2@DDnNHj|ia) zG;cY7&YQH4<1!|Bmk+o~9-=f&PJ0!#ejlS{j7Nm*4j(~XY;pf@9G`rn##wB6%Dg}C z-8#}L^u;vqWp`_H>qU8U_tJH0{ynGP zKB+9ZFP0qOeWO7lM$)M4HD6Q>JNld1{1vc%vGYN}3;j##g;V7j1ns^9GZ zh2pJAmEXn>3bObJG$6SAR<3AyQI%c&!N{ntc5|Dx?0ESFZ_qc-V@H%OvO2r@**sk= z6=I77pz)1B0dV;pwE0C*aOS9ihcrnOq$6G$u5NfWNaQfZOJ-n2Vxw~mNtfE6h6~n* z0^ss1xNzYYx1__{1`RY(cGGQ$FLIj_s+pio`6_zonnYgwVq4k}TAyKkC^+7*d&gP} zeN2U+b^i7tEkQ5E1|9Yx{RAwq;BOz&g}}lQo?-wB0(A~NM0{9ai8T?-2y zF#!6|PC~$gKpgjdN5@wTK>1~20JQP_z-ktOIG)oj4>14*j~D<|+sQJpCJ-lb8tWnk zp!8h~fUfs0S+7qZ%5gg4Ee4?A6a%1-TC7jF5Q*~NO>&C?&PE4>I+)%~_Pp!0Biym%NLs)ybz?lA^4Sp{{BCDomDhpNfU@fNf$dmI~QAP`56H|cK(jub~D{w z*=rNFs*wm}B889;nMoPS4ARYl}K?U!56qE-}!d);5rKcHoE)Vpp@3bHxLNt(tW2L%)q z&<*_h>ZEBpGqGQrnSRq`d~Seb!CJ|?*1I-;oY8-|OW!?e{`I#@4M&B$-A@(xh$sJjVzBf383H*#GbPlN80g{Qq4@2lcR9#JQ2HmQ{KV%7NmJ z3efY8M~*_TL7Z!XTEr*skSx4XDe4>*a6mbMb%E%00rqIDM^w}p4fLpsagW53QiK*G z5n@I5Tx;MvbKPRCkOt%+S|1gR)=I0Kyz6FASf!K(-3gZ#K|FF{bV9jN?0dtx$5e2L zKg5(EEW;rrRV6A*tS>^=2vD9`(|T#NquyiR=$AKZ16Ed^D{I+FBWaVd?p*B*eS1!j zd!-RQN>VRpOm0opLY5C>abZuq=*YmIHa?n7nsZwc`*U}g?G8j8)5L0k)CKT0#nPeK zHv3=_h8r7Om+T)_jtM3bFy?9UFh?yAyrZmBFr=WZ-tJ@Np}sh`W|pYh<3EnRQd}8#;@?@?hd2 zU3ks2?oT9S)%I~yfxZ_T5M;RILk4@alHuF2JzAy=>!nhVcb zQ%%i!li9;6J{h&wr&p#vs`y*?t6>P5c^WJ^=pwn`6PsGWZat3TTS1oW?Dj{ zG+6$^EsJciti}tNUoKiX!{&YM?Jg9A-5>|LT+v}Sa(SQ0E+3?I6k+0=MetZ&`;FJ8QO@tyNKPC85z0L}scZ5RZk diff --git a/contrib/rosetta/rosetta-ci/Dockerfile b/contrib/rosetta/rosetta-ci/Dockerfile new file mode 100644 index 000000000000..d4cfc58528e9 --- /dev/null +++ b/contrib/rosetta/rosetta-ci/Dockerfile @@ -0,0 +1,31 @@ +FROM golang:1.18-alpine as build + +RUN apk add --no-cache tar git + +# prepare node data +WORKDIR /node +COPY ./contrib/rosetta/rosetta-ci/data.tar.gz data.tar.gz +RUN tar -zxvf data.tar.gz -C . + +# build simd +WORKDIR /simd +COPY . ./ +RUN go build -o simd ./simapp/simd/ + +FROM alpine +RUN apk add gcc git libc-dev python3 --no-cache + +ENV PATH=$PATH:/bin + +COPY --from=build /simd/simd /bin/simd + +WORKDIR /rosetta +COPY ./contrib/rosetta/configuration ./ +RUN chmod +x run_tests.sh +RUN chmod +x send_funds.sh +RUN chmod +x faucet.py + +COPY --from=build /node/root /root/ +WORKDIR /root/.simapp + +RUN chmod -R 0777 ./ diff --git a/contrib/rosetta/rosetta-ci/data.tar.gz b/contrib/rosetta/rosetta-ci/data.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7ed3114345923c870cd7cc0b73a347088af7a4c6 GIT binary patch literal 44165 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 literal 0 HcmV?d00001 diff --git a/contrib/rosetta/rosetta-cli/Dockerfile b/contrib/rosetta/rosetta-cli/Dockerfile index f67070f6c42d..da6ef2879239 100644 --- a/contrib/rosetta/rosetta-cli/Dockerfile +++ b/contrib/rosetta/rosetta-cli/Dockerfile @@ -1,8 +1,8 @@ -FROM golang:1.15-alpine as build +FROM golang:1.18-alpine as build RUN apk add git gcc libc-dev --no-cache -ARG ROSETTA_VERSION="v0.6.7" +ARG ROSETTA_VERSION="v0.7.3" # build rosetta CLI WORKDIR /rosetta diff --git a/crypto/keys/ed25519/keys.pb.go b/crypto/keys/ed25519/keys.pb.go index 227b18701306..a80c9dae6a98 100644 --- a/crypto/keys/ed25519/keys.pb.go +++ b/crypto/keys/ed25519/keys.pb.go @@ -6,8 +6,8 @@ package ed25519 import ( crypto_ed25519 "crypto/ed25519" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/crypto/keys/multisig/keys.pb.go b/crypto/keys/multisig/keys.pb.go index 27ccf0fa5a27..dc715adb5b3c 100644 --- a/crypto/keys/multisig/keys.pb.go +++ b/crypto/keys/multisig/keys.pb.go @@ -6,8 +6,8 @@ package multisig import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/crypto/keys/multisig/multisig_test.go b/crypto/keys/multisig/multisig_test.go index 8fb93d3524c4..2d4f99a07260 100644 --- a/crypto/keys/multisig/multisig_test.go +++ b/crypto/keys/multisig/multisig_test.go @@ -345,15 +345,14 @@ func reorderPubKey(pk *kmultisig.LegacyAminoPubKey) (other *kmultisig.LegacyAmin func TestDisplay(t *testing.T) { require := require.New(t) pubKeys := generatePubKeys(3) + msig := kmultisig.NewLegacyAminoPubKey(2, pubKeys) + require.NotEmpty(msig.String()) - // LegacyAminoPubKey wraps PubKeys into Amino (for serialization) and Any String method doesn't work. - require.PanicsWithValue("reflect.Value.Interface: cannot return value obtained from unexported field or method", - func() { require.Empty(msig.String()) }, - ) ccfg := simapp.MakeTestEncodingConfig() bz, err := ccfg.Marshaler.MarshalInterfaceJSON(msig) require.NoError(err) + expectedPrefix := `{"@type":"/cosmos.crypto.multisig.LegacyAminoPubKey","threshold":2,"public_keys":[{"@type":"/cosmos.crypto.secp256k1.PubKey"` require.True(strings.HasPrefix(string(bz), expectedPrefix)) // Example output: diff --git a/crypto/keys/secp256k1/keys.pb.go b/crypto/keys/secp256k1/keys.pb.go index afcbab54b05d..ceec685b91eb 100644 --- a/crypto/keys/secp256k1/keys.pb.go +++ b/crypto/keys/secp256k1/keys.pb.go @@ -5,8 +5,8 @@ package secp256k1 import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/crypto/keys/secp256r1/keys.pb.go b/crypto/keys/secp256r1/keys.pb.go index 898f19a123cf..7bfb79ff77d4 100644 --- a/crypto/keys/secp256r1/keys.pb.go +++ b/crypto/keys/secp256r1/keys.pb.go @@ -5,8 +5,8 @@ package secp256r1 import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/crypto/keys/secp256r1/privkey_internal_test.go b/crypto/keys/secp256r1/privkey_internal_test.go index 74ad9ec1ac75..a44c484e4bfe 100644 --- a/crypto/keys/secp256r1/privkey_internal_test.go +++ b/crypto/keys/secp256r1/privkey_internal_test.go @@ -3,7 +3,7 @@ package secp256r1 import ( "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/tendermint/tendermint/crypto" diff --git a/crypto/keys/secp256r1/pubkey.go b/crypto/keys/secp256r1/pubkey.go index d462deff89c2..86d4fa685381 100644 --- a/crypto/keys/secp256r1/pubkey.go +++ b/crypto/keys/secp256r1/pubkey.go @@ -1,7 +1,7 @@ package secp256r1 import ( - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" tmcrypto "github.com/tendermint/tendermint/crypto" ecdsa "github.com/cosmos/cosmos-sdk/crypto/keys/internal/ecdsa" diff --git a/crypto/keys/secp256r1/pubkey_internal_test.go b/crypto/keys/secp256r1/pubkey_internal_test.go index 3df25ebedf0e..eecbbb24d7da 100644 --- a/crypto/keys/secp256r1/pubkey_internal_test.go +++ b/crypto/keys/secp256r1/pubkey_internal_test.go @@ -3,7 +3,7 @@ package secp256r1 import ( "testing" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/codec" @@ -79,11 +79,15 @@ func (suite *PKSuite) TestMarshalProto() { /**** test structure marshalling with codec ****/ pk = PubKey{} + emptyRegistry := types.NewInterfaceRegistry() + emptyCodec := codec.NewProtoCodec(emptyRegistry) registry := types.NewInterfaceRegistry() - cdc := codec.NewProtoCodec(registry) - bz, err = cdc.Marshal(suite.pk) + RegisterInterfaces(registry) + pubkeyCodec := codec.NewProtoCodec(registry) + + bz, err = emptyCodec.Marshal(suite.pk) require.NoError(err) - require.NoError(cdc.Unmarshal(bz, &pk)) + require.NoError(emptyCodec.Unmarshal(bz, &pk)) require.True(pk.Equals(suite.pk)) const bufSize = 100 @@ -101,18 +105,17 @@ func (suite *PKSuite) TestMarshalProto() { require.Equal(bz, bz2[(bufSize-pk.Size()):]) /**** test interface marshalling ****/ - bz, err = cdc.MarshalInterface(suite.pk) + bz, err = pubkeyCodec.MarshalInterface(suite.pk) require.NoError(err) var pkI cryptotypes.PubKey - err = cdc.UnmarshalInterface(bz, &pkI) + err = emptyCodec.UnmarshalInterface(bz, &pkI) require.EqualError(err, "no registered implementations of type types.PubKey") - RegisterInterfaces(registry) - require.NoError(cdc.UnmarshalInterface(bz, &pkI)) + RegisterInterfaces(emptyRegistry) + require.NoError(emptyCodec.UnmarshalInterface(bz, &pkI)) require.True(pkI.Equals(suite.pk)) - cdc.UnmarshalInterface(bz, nil) - require.Error(err, "nil should fail") + require.Error(emptyCodec.UnmarshalInterface(bz, nil), "nil should fail") } func (suite *PKSuite) TestSize() { diff --git a/crypto/types/multisig.pb.go b/crypto/types/multisig.pb.go index b9c907ade0a4..a5b750a17fbc 100644 --- a/crypto/types/multisig.pb.go +++ b/crypto/types/multisig.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/crypto/types/types.go b/crypto/types/types.go index eccdba73813d..0f86a592082a 100644 --- a/crypto/types/types.go +++ b/crypto/types/types.go @@ -1,7 +1,7 @@ package types import ( - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" tmcrypto "github.com/tendermint/tendermint/crypto" ) diff --git a/docs/architecture/adr-019-protobuf-state-encoding.md b/docs/architecture/adr-019-protobuf-state-encoding.md index cddf7092fb98..8f8410be0010 100644 --- a/docs/architecture/adr-019-protobuf-state-encoding.md +++ b/docs/architecture/adr-019-protobuf-state-encoding.md @@ -82,7 +82,7 @@ are encoded and persisted via their concrete Amino codec to Protobuf and have th `Marshaler` that will be a `ProtoCodec`. This migration is simple as things will just work as-is. Note, any business logic that needs to encode primitive types like `bool` or `int64` should use -[gogoprotobuf](https://github.com/gogo/protobuf) Value types. +[gogoprotobuf](https://github.com/cosmos/gogoproto) Value types. Example: @@ -149,8 +149,8 @@ and client developer UX. ### Safe usage of `Any` -By default, the [gogo protobuf implementation of `Any`](https://godoc.org/github.com/gogo/protobuf/types) -uses [global type registration]( https://github.com/gogo/protobuf/blob/master/proto/properties.go#L540) +By default, the [gogo protobuf implementation of `Any`](https://godoc.org/github.com/cosmos/gogoproto/types) +uses [global type registration]( https://github.com/cosmos/gogoproto/blob/master/proto/properties.go#L540) to decode values packed in `Any` into concrete go types. This introduces a vulnerability where any malicious module in the dependency tree could registry a type with the global protobuf registry diff --git a/docs/architecture/adr-021-protobuf-query-encoding.md b/docs/architecture/adr-021-protobuf-query-encoding.md index 60830de3ce16..e0c368de1f56 100644 --- a/docs/architecture/adr-021-protobuf-query-encoding.md +++ b/docs/architecture/adr-021-protobuf-query-encoding.md @@ -71,7 +71,7 @@ message AnyProposal { ### Custom Query Implementation -In order to implement the query service, we can reuse the existing [gogo protobuf](https://github.com/gogo/protobuf) +In order to implement the query service, we can reuse the existing [gogo protobuf](https://github.com/cosmos/gogoproto) grpc plugin, which for a service named `Query` generates an interface named `QueryServer` as below: @@ -204,7 +204,7 @@ type QueryClient interface { } ``` -Via a small patch to gogo protobuf ([gogo/protobuf#675](https://github.com/gogo/protobuf/pull/675)) +Via a small patch to gogo protobuf ([gogo/protobuf#675](https://github.com/cosmos/gogoproto/pull/675)) we have tweaked the grpc codegen to use an interface rather than concrete type for the generated client struct. This allows us to also reuse the GRPC infrastructure for ABCI client queries. diff --git a/docs/architecture/adr-027-deterministic-protobuf-serialization.md b/docs/architecture/adr-027-deterministic-protobuf-serialization.md index ab303e8d007a..c1fecede9bcb 100644 --- a/docs/architecture/adr-027-deterministic-protobuf-serialization.md +++ b/docs/architecture/adr-027-deterministic-protobuf-serialization.md @@ -127,7 +127,7 @@ There are three main implementation strategies, ordered from the least to the most custom development: - **Use a protobuf serializer that follows the above rules by default.** E.g. - [gogoproto](https://pkg.go.dev/github.com/gogo/protobuf/gogoproto) is known to + [gogoproto](https://pkg.go.dev/github.com/cosmos/gogoproto/gogoproto) is known to be compliant by in most cases, but not when certain annotations such as `nullable = false` are used. It might also be an option to configure an existing serializer accordingly. diff --git a/docs/basics/app-anatomy.md b/docs/basics/app-anatomy.md index 0373d24aafa5..838c7d4f8286 100644 --- a/docs/basics/app-anatomy.md +++ b/docs/basics/app-anatomy.md @@ -115,7 +115,7 @@ Here are descriptions of what each of the four fields means: - `InterfaceRegistry`: The `InterfaceRegistry` is used by the Protobuf codec to handle interfaces that are encoded and decoded (we also say "unpacked") using [`google.protobuf.Any`](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto). `Any` could be thought as a struct that contains a `type_url` (name of a concrete type implementing the interface) and a `value` (its encoded bytes). `InterfaceRegistry` provides a mechanism for registering interfaces and implementations that can be safely unpacked from `Any`. Each of the application's modules implements the `RegisterInterfaces` method that can be used to register the module's own interfaces and implementations. - You can read more about Any in [ADR-19](../architecture/adr-019-protobuf-state-encoding.md#usage-of-any-to-encode-interfaces). - - To go more into details, the SDK uses an implementation of the Protobuf specification called [`gogoprotobuf`](https://github.com/gogo/protobuf). By default, the [gogo protobuf implementation of `Any`](https://godoc.org/github.com/gogo/protobuf/types) uses [global type registration](https://github.com/gogo/protobuf/blob/master/proto/properties.go#L540) to decode values packed in `Any` into concrete Go types. This introduces a vulnerability where any malicious module in the dependency tree could registry a type with the global protobuf registry and cause it to be loaded and unmarshaled by a transaction that referenced it in the `type_url` field. For more information, please refer to [ADR-019](../architecture/adr-019-protobuf-state-encoding.md). + - To go more into details, the SDK uses an implementation of the Protobuf specification called [`gogoprotobuf`](https://github.com/cosmos/gogoproto). By default, the [gogo protobuf implementation of `Any`](https://godoc.org/github.com/cosmos/gogoproto/types) uses [global type registration](https://github.com/cosmos/gogoproto/blob/master/proto/properties.go#L540) to decode values packed in `Any` into concrete Go types. This introduces a vulnerability where any malicious module in the dependency tree could registry a type with the global protobuf registry and cause it to be loaded and unmarshaled by a transaction that referenced it in the `type_url` field. For more information, please refer to [ADR-019](../architecture/adr-019-protobuf-state-encoding.md). - `Marshaler`: the default codec used throughout the SDK. It is composed of a `BinaryCodec` used to encode and decode state, and a `JSONCodec` used to output data to the users (for example in the [CLI](#cli)). By default, the SDK uses Protobuf as `Marshaler`. - `TxConfig`: `TxConfig` defines an interface a client can utilize to generate an application-defined concrete transaction type. Currently, the SDK handles two transaction types: `SIGN_MODE_DIRECT` (which uses Protobuf binary as over-the-wire encoding) and `SIGN_MODE_LEGACY_AMINO_JSON` (which depends on Amino). Read more about transactions [here](../core/transactions.md). - `Amino`: Some legacy parts of the SDK still use Amino for backwards-compatibility. Each module exposes a `RegisterLegacyAmino` method to register the module's specific types within Amino. This `Amino` codec should not be used by app developers anymore, and will be removed in future releases. diff --git a/docs/core/encoding.md b/docs/core/encoding.md index 2565e579ebd0..d817fee3fc79 100644 --- a/docs/core/encoding.md +++ b/docs/core/encoding.md @@ -18,7 +18,7 @@ for more information on Proto3, which Amino is largely compatible with (but not Due to Amino having significant performance drawbacks, being reflection-based, and not having any meaningful cross-language/client support, Protocol Buffers, specifically -[gogoprotobuf](https://github.com/gogo/protobuf/), is being used in place of Amino. +[gogoprotobuf](https://github.com/cosmos/gogoproto/), is being used in place of Amino. Note, this process of using Protocol Buffers over Amino is still an ongoing process. Binary wire encoding of types in the Cosmos SDK can be broken down into two main @@ -87,7 +87,7 @@ which is required when signing this kind of messages using a Ledger. ### Gogoproto -Modules are encouraged to utilize Protobuf encoding for their respective types. In the SDK, we use the [Gogoproto](https://github.com/gogo/protobuf) specific implementation of the Protobuf spec that offers speed and DX improvements compared to the official [Google protobuf implementation](https://github.com/protocolbuffers/protobuf). +Modules are encouraged to utilize Protobuf encoding for their respective types. In the SDK, we use the [Gogoproto](https://github.com/cosmos/gogoproto) specific implementation of the Protobuf spec that offers speed and DX improvements compared to the official [Google protobuf implementation](https://github.com/protocolbuffers/protobuf). ### Guidelines for protobuf message definitions diff --git a/docs/run-node/interact-node.md b/docs/run-node/interact-node.md index 7c29170ec644..3e0bf7925c43 100644 --- a/docs/run-node/interact-node.md +++ b/docs/run-node/interact-node.md @@ -128,9 +128,16 @@ func queryState() error { // Create a connection to the gRPC server. grpcConn := grpc.Dial( - "127.0.0.1:9090", // your gRPC server address. - grpc.WithInsecure(), // The SDK doesn't support any transport security mechanism. - ) + // your gRPC server address + "127.0.0.1:9090", + // the Cosmos SDK doesn't support any transport security mechanism. + grpc.WithInsecure(), + // This instantiates a general gRPC codec which handles proto bytes. We + // pass in a nil interface registry if the request/response types contain + // interface instead of 'nil' you should pass the application specific + // codec. + grpc.WithDefaultCallOptions(grpc.ForceCodec(codec.NewProtoCodec(nil).GRPCCodec())), + ) defer grpcConn.Close() // This creates a gRPC client to query the x/bank service. diff --git a/go.mod b/go.mod index bf23b2faf555..f9f51ad837b9 100644 --- a/go.mod +++ b/go.mod @@ -10,11 +10,12 @@ require ( github.com/coinbase/rosetta-sdk-go v0.7.0 github.com/confio/ics23/go v0.7.0 github.com/cosmos/btcutil v1.0.4 + github.com/cosmos/cosmos-proto v1.0.0-alpha8 github.com/cosmos/go-bip39 v1.0.0 + github.com/cosmos/gogogateway v1.2.0 + github.com/cosmos/gogoproto v1.4.3 github.com/cosmos/iavl v0.19.4 github.com/cosmos/ledger-cosmos-go v0.11.1 - github.com/gogo/gateway v1.1.0 - github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 github.com/gorilla/handlers v1.5.1 @@ -23,39 +24,39 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/golang-lru v0.5.4 github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 + github.com/huandu/skiplist v1.2.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b github.com/magiconair/properties v1.8.6 - github.com/mattn/go-isatty v0.0.14 + github.com/mattn/go-isatty v0.0.16 github.com/otiai10/copy v1.7.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.12.2 - github.com/prometheus/common v0.34.0 + github.com/prometheus/client_golang v1.13.0 + github.com/prometheus/common v0.37.0 github.com/rakyll/statik v0.1.7 - github.com/regen-network/cosmos-proto v0.3.1 github.com/rs/zerolog v1.27.0 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/tendermint/btcd v0.1.1 github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 github.com/tendermint/go-amino v0.16.0 - github.com/tendermint/tendermint v0.34.21 + github.com/tendermint/tendermint v0.37.0-rc1 github.com/tendermint/tm-db v0.6.6 - golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e + golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa google.golang.org/genproto v0.0.0-20220725144611-272f38e5d71b - google.golang.org/grpc v1.49.0 + google.golang.org/grpc v1.50.1 google.golang.org/protobuf v1.28.1 gopkg.in/yaml.v2 v2.4.0 + pgregory.net/rapid v0.5.3 ) require ( filippo.io/edwards25519 v1.0.0-beta.2 // 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/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.1.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect @@ -76,6 +77,8 @@ require ( 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/googleapis v1.4.1-0.20201022092350-68b0159b7869 // indirect + github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.3 // indirect github.com/google/btree v1.0.0 // indirect github.com/google/orderedcode v0.0.1 // indirect @@ -89,50 +92,46 @@ require ( 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/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-colorable v0.1.13 // 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/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect 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 - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rs/cors v1.8.2 // indirect - github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa // indirect + github.com/sasha-s/go-deadlock v0.3.1 // 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/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca // indirect github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/zondax/hid v0.9.0 // indirect go.etcd.io/bbolt v1.3.6 // indirect golang.org/x/net v0.0.0-20220726230323-06994584191e // indirect - golang.org/x/sys v0.0.0-20220727055044-e65921a090b8 // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect golang.org/x/text v0.3.7 // 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 ) replace ( github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 - + // dgrijalva/jwt-go is deprecated and doesn't receive security updates. + // TODO: remove it: https://github.com/cosmos/cosmos-sdk/issues/13134 + github.com/dgrijalva/jwt-go => github.com/golang-jwt/jwt/v4 v4.4.2 // 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.8.1 - github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/jhump/protoreflect => github.com/jhump/protoreflect v1.9.0 github.com/tendermint/tm-db => github.com/osmosis-labs/tm-db v0.6.5-0.20210911033928-ba9154613417 - - // latest grpc doesn't work with with our modified proto compiler, so we need to enforce - // the following version across all dependencies. - google.golang.org/grpc => google.golang.org/grpc v1.33.2 ) diff --git a/go.sum b/go.sum index 2832e516d491..c89abe306818 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= @@ -70,8 +71,6 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrU 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.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.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= @@ -142,8 +141,16 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn 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/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/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-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/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= @@ -159,9 +166,16 @@ 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-alpha8 h1:d3pCRuMYYvGA5bM0ZbbjKn+AoQD4A7dyNG2wzwWalUw= +github.com/cosmos/cosmos-proto v1.0.0-alpha8/go.mod h1:6/p+Bc4O8JKeZqe0VqUGTX31eoYqemTT4C1hLCWsO7I= 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/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.4.3 h1:RP3yyVREh9snv/lsOvmsAPQt8f44LgL281X0IOIhhcI= +github.com/cosmos/gogoproto v1.4.3/go.mod h1:0hLIG5TR7IvV1fme1HCFKjfzW9X2x0Mo+RooWXCnOWU= github.com/cosmos/iavl v0.19.4 h1:t82sN+Y0WeqxDLJRSpNd8YFX5URIrT+p8n6oJbJ2Dok= github.com/cosmos/iavl v0.19.4/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 h1:DdzS1m6o/pCqeZ8VOAit/gyATedRgjvkVI+UCrLpyuU= @@ -193,7 +207,6 @@ github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDm 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/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= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -215,7 +228,15 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= 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.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= @@ -283,13 +304,22 @@ github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGF 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/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= -github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 h1:kRpU4zq+Pzh4feET49aEWPOzwQy3U2SsbZEQ7QEcif0= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= 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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 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= @@ -334,7 +364,8 @@ 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.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= 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 h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= @@ -362,7 +393,6 @@ 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/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= @@ -381,7 +411,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaD 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.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -425,6 +454,10 @@ github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 h1:uUj 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= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= 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= @@ -440,8 +473,12 @@ github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH 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/jhump/protoreflect v1.9.0/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= +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/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98= +github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= @@ -465,6 +502,8 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8 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.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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= @@ -488,29 +527,32 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= -github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/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/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= 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.8/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-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 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= 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.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-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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= @@ -518,8 +560,9 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 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/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/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= 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= @@ -557,7 +600,6 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neilotoole/errgroup v0.1.5/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= 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 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= @@ -608,13 +650,12 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 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.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/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= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -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/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -635,8 +676,8 @@ 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.11.0/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= @@ -653,8 +694,8 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 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.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= @@ -662,18 +703,15 @@ 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/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= -github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= -github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= -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/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/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= @@ -694,8 +732,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD 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/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= +github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= +github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= @@ -730,8 +768,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= @@ -750,11 +788,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/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= @@ -765,15 +802,13 @@ 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.21 h1:UiGGnBFHVrZhoQVQ7EfwSOLuCtarqCSsRf8VrklqB7s= -github.com/tendermint/tendermint v0.34.21/go.mod h1:XDvfg6U7grcFTDx7VkzxnhazQ/bspGJAn4DZ6DcLLjQ= +github.com/tendermint/tendermint v0.37.0-rc1 h1:+m+u7s10QD+7vPh5MORrnYjulCdYtGuzjaqKumDKofY= +github.com/tendermint/tendermint v0.37.0-rc1/go.mod h1:z0MZllXL+s0PgIMMpf2P0PrMttQufQio3kUjY2zebeo= 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/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -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= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= @@ -810,6 +845,7 @@ 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.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= @@ -838,8 +874,8 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/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-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-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/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= @@ -854,6 +890,7 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -879,6 +916,7 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -951,6 +989,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ 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/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1023,9 +1062,10 @@ golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBc 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= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/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-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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= @@ -1036,6 +1076,7 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -1043,7 +1084,11 @@ 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/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/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-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/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-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1083,15 +1128,12 @@ 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= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/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= @@ -1125,6 +1167,7 @@ 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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 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= @@ -1154,7 +1197,6 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1174,10 +1216,38 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D 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-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= 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.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= 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= @@ -1188,9 +1258,9 @@ 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= 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= @@ -1205,8 +1275,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= @@ -1220,6 +1290,7 @@ 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.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= @@ -1228,6 +1299,7 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C 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-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 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= @@ -1237,6 +1309,8 @@ 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.5.3 h1:163N50IHFqr1phZens4FQOdPgfJscR7a562mjQqeo4M= +pgregory.net/rapid v0.5.3/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/proto/buf.gen.gogo.yaml b/proto/buf.gen.gogo.yaml new file mode 100644 index 000000000000..9c8ba0a4b1fd --- /dev/null +++ b/proto/buf.gen.gogo.yaml @@ -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 diff --git a/proto/buf.gen.swagger.yaml b/proto/buf.gen.swagger.yaml new file mode 100644 index 000000000000..d0f7535b1a45 --- /dev/null +++ b/proto/buf.gen.swagger.yaml @@ -0,0 +1,5 @@ +version: v1 +plugins: + - name: swagger + out: ../tmp-swagger-gen + opt: logtostderr=true,fqn_for_swagger_name=true,simple_operation_ids=true diff --git a/proto/buf.lock b/proto/buf.lock new file mode 100644 index 000000000000..0513e364af15 --- /dev/null +++ b/proto/buf.lock @@ -0,0 +1,15 @@ +# 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: gogo-proto + commit: 34d970b699f84aa382f3c29773a60836 + - remote: buf.build + owner: googleapis + repository: googleapis + commit: 783e4b5374fa488ab068d08af9658438 diff --git a/proto/buf.md b/proto/buf.md new file mode 100644 index 000000000000..a44cb1bbfeec --- /dev/null +++ b/proto/buf.md @@ -0,0 +1,3 @@ +# Protobufs + +This is the public protocol buffers API for the [Cosmos SDK](https://github.com/cosmos/cosmos-sdk). diff --git a/proto/buf.yaml b/proto/buf.yaml new file mode 100644 index 000000000000..082a8587f9d8 --- /dev/null +++ b/proto/buf.yaml @@ -0,0 +1,23 @@ +# This module represents buf.build/cosmos/cosmos-sdk +version: v1 +name: buf.build/cosmos/cosmos-sdk +deps: + - buf.build/cosmos/cosmos-proto + - buf.build/cosmos/gogo-proto + - buf.build/googleapis/googleapis +breaking: + use: + - FILE +lint: + use: + - DEFAULT + - COMMENTS + - FILE_LOWER_SNAKE_CASE + except: + - UNARY_RPC + - COMMENT_FIELD + - SERVICE_SUFFIX + - PACKAGE_VERSION_SUFFIX + - RPC_REQUEST_STANDARD_NAME + ignore: + - tendermint diff --git a/third_party/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto similarity index 70% rename from third_party/proto/tendermint/abci/types.proto rename to proto/tendermint/abci/types.proto index 2cbcabb29b33..a03b6fbf23d8 100644 --- a/third_party/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -4,7 +4,7 @@ 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 +// https://github.com/cosmos/gogoproto/blob/master/extensions.md import "tendermint/crypto/proof.proto"; import "tendermint/types/types.proto"; import "tendermint/crypto/keys.proto"; @@ -14,7 +14,7 @@ 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 +// https://github.com/cosmos/gogoproto/blob/master/custom_types.md#warnings-and-issues //---------------------------------------- // Request types @@ -24,7 +24,6 @@ message Request { RequestEcho echo = 1; RequestFlush flush = 2; RequestInfo info = 3; - RequestSetOption set_option = 4; RequestInitChain init_chain = 5; RequestQuery query = 6; RequestBeginBlock begin_block = 7; @@ -36,7 +35,10 @@ message Request { RequestOfferSnapshot offer_snapshot = 13; RequestLoadSnapshotChunk load_snapshot_chunk = 14; RequestApplySnapshotChunk apply_snapshot_chunk = 15; + RequestPrepareProposal prepare_proposal = 16; + RequestProcessProposal process_proposal = 17; } + reserved 4; } message RequestEcho { @@ -49,22 +51,17 @@ message RequestInfo { string version = 1; uint64 block_version = 2; uint64 p2p_version = 3; -} - -// nondeterministic -message RequestSetOption { - string key = 1; - string value = 2; + string abci_version = 4; } 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; + string chain_id = 2; + tendermint.types.ConsensusParams consensus_params = 3; + repeated ValidatorUpdate validators = 4 [(gogoproto.nullable) = false]; + bytes app_state_bytes = 5; + int64 initial_height = 6; } message RequestQuery { @@ -77,8 +74,8 @@ message RequestQuery { 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]; + CommitInfo last_commit_info = 3 [(gogoproto.nullable) = false]; + repeated Misbehavior byzantine_validators = 4 [(gogoproto.nullable) = false]; } enum CheckTxType { @@ -102,8 +99,7 @@ message RequestEndBlock { message RequestCommit {} // lists available snapshots -message RequestListSnapshots { -} +message RequestListSnapshots {} // offers a snapshot to the application message RequestOfferSnapshot { @@ -125,6 +121,34 @@ message RequestApplySnapshotChunk { string sender = 3; } +message RequestPrepareProposal { + // the modified transactions cannot exceed this size. + int64 max_tx_bytes = 1; + // txs is an array of transactions that will be included in a block, + // sent to the app for possible modifications. + repeated bytes txs = 2; + ExtendedCommitInfo local_last_commit = 3 [(gogoproto.nullable) = false]; + repeated Misbehavior misbehavior = 4 [(gogoproto.nullable) = false]; + int64 height = 5; + google.protobuf.Timestamp time = 6 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + bytes next_validators_hash = 7; + // address of the public key of the validator proposing the block. + bytes proposer_address = 8; +} + +message RequestProcessProposal { + repeated bytes txs = 1; + CommitInfo proposed_last_commit = 2 [(gogoproto.nullable) = false]; + repeated Misbehavior misbehavior = 3 [(gogoproto.nullable) = false]; + // hash is the merkle root hash of the fields of the proposed block. + bytes hash = 4; + int64 height = 5; + google.protobuf.Timestamp time = 6 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + bytes next_validators_hash = 7; + // address of the public key of the original proposer of the block. + bytes proposer_address = 8; +} + //---------------------------------------- // Response types @@ -134,7 +158,6 @@ message Response { ResponseEcho echo = 2; ResponseFlush flush = 3; ResponseInfo info = 4; - ResponseSetOption set_option = 5; ResponseInitChain init_chain = 6; ResponseQuery query = 7; ResponseBeginBlock begin_block = 8; @@ -146,7 +169,10 @@ message Response { ResponseOfferSnapshot offer_snapshot = 14; ResponseLoadSnapshotChunk load_snapshot_chunk = 15; ResponseApplySnapshotChunk apply_snapshot_chunk = 16; + ResponsePrepareProposal prepare_proposal = 17; + ResponseProcessProposal process_proposal = 18; } + reserved 5; } // nondeterministic @@ -170,18 +196,10 @@ message ResponseInfo { 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; + tendermint.types.ConsensusParams consensus_params = 1; + repeated ValidatorUpdate validators = 2 [(gogoproto.nullable) = false]; + bytes app_hash = 3; } message ResponseQuery { @@ -212,6 +230,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 +245,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"]; + 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]; + tendermint.types.ConsensusParams consensus_param_updates = 2; + repeated Event events = 3 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; } @@ -276,31 +301,36 @@ message ResponseApplySnapshotChunk { } } -//---------------------------------------- -// 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; +message ResponsePrepareProposal { + repeated bytes txs = 1; } -// 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 ResponseProcessProposal { + ProposalStatus status = 1; + + enum ProposalStatus { + UNKNOWN = 0; + ACCEPT = 1; + REJECT = 2; + } } -message LastCommitInfo { +//---------------------------------------- +// Misc. + +message CommitInfo { int32 round = 1; repeated VoteInfo votes = 2 [(gogoproto.nullable) = false]; } +message ExtendedCommitInfo { + // The round at which the block proposer decided in the previous height. + int32 round = 1; + // List of validators' addresses in the last validator set with their voting + // information, including vote extensions. + repeated ExtendedVoteInfo 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. @@ -314,9 +344,9 @@ message Event { // EventAttribute is a single key-value pair, associated with an event. message EventAttribute { - bytes key = 1; - bytes value = 2; - bool index = 3; // nondeterministic + string key = 1; + string value = 2; + bool index = 3; // nondeterministic } // TxResult contains results of executing the transaction. @@ -351,23 +381,27 @@ message VoteInfo { bool signed_last_block = 2; } -enum EvidenceType { +message ExtendedVoteInfo { + Validator validator = 1 [(gogoproto.nullable) = false]; + bool signed_last_block = 2; + bytes vote_extension = 3; // Reserved for future use +} + +enum MisbehaviorType { UNKNOWN = 0; DUPLICATE_VOTE = 1; LIGHT_CLIENT_ATTACK = 2; } -message Evidence { - EvidenceType type = 1; +message Misbehavior { + MisbehaviorType 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 - ]; + 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 @@ -392,7 +426,6 @@ 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); @@ -402,6 +435,10 @@ 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); + rpc PrepareProposal(RequestPrepareProposal) returns (ResponsePrepareProposal); + rpc ProcessProposal(RequestProcessProposal) returns (ResponseProcessProposal); } diff --git a/third_party/proto/tendermint/crypto/keys.proto b/proto/tendermint/crypto/keys.proto similarity index 100% rename from third_party/proto/tendermint/crypto/keys.proto rename to proto/tendermint/crypto/keys.proto diff --git a/third_party/proto/tendermint/crypto/proof.proto b/proto/tendermint/crypto/proof.proto similarity index 100% rename from third_party/proto/tendermint/crypto/proof.proto rename to proto/tendermint/crypto/proof.proto diff --git a/third_party/proto/tendermint/libs/bits/types.proto b/proto/tendermint/libs/bits/types.proto similarity index 100% rename from third_party/proto/tendermint/libs/bits/types.proto rename to proto/tendermint/libs/bits/types.proto diff --git a/third_party/proto/tendermint/p2p/types.proto b/proto/tendermint/p2p/types.proto similarity index 100% rename from third_party/proto/tendermint/p2p/types.proto rename to proto/tendermint/p2p/types.proto diff --git a/third_party/proto/tendermint/types/block.proto b/proto/tendermint/types/block.proto similarity index 100% rename from third_party/proto/tendermint/types/block.proto rename to proto/tendermint/types/block.proto diff --git a/third_party/proto/tendermint/types/evidence.proto b/proto/tendermint/types/evidence.proto similarity index 57% rename from third_party/proto/tendermint/types/evidence.proto rename to proto/tendermint/types/evidence.proto index 3b234571ba67..451b8dca3c71 100644 --- a/third_party/proto/tendermint/types/evidence.proto +++ b/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/params.proto b/proto/tendermint/types/params.proto similarity index 80% rename from third_party/proto/tendermint/types/params.proto rename to proto/tendermint/types/params.proto index 0de7d846fbd3..195aa8d1737d 100644 --- a/third_party/proto/tendermint/types/params.proto +++ b/proto/tendermint/types/params.proto @@ -11,10 +11,10 @@ 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 block = 1; + EvidenceParams evidence = 2; + ValidatorParams validator = 3; + VersionParams version = 4; } // BlockParams contains limits on the block size. @@ -25,11 +25,8 @@ message BlockParams { // 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; + + reserved 3; // was TimeIotaMs see https://github.com/tendermint/tendermint/pull/5792 } // EvidenceParams determine how we handle evidence of malfeasance. @@ -68,7 +65,7 @@ message VersionParams { option (gogoproto.populate) = true; option (gogoproto.equal) = true; - uint64 app_version = 1; + uint64 app = 1; } // HashedParams is a subset of ConsensusParams. diff --git a/third_party/proto/tendermint/types/types.proto b/proto/tendermint/types/types.proto similarity index 94% rename from third_party/proto/tendermint/types/types.proto rename to proto/tendermint/types/types.proto index 7f7ea74cac21..8d4f009729dd 100644 --- a/third_party/proto/tendermint/types/types.proto +++ b/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. diff --git a/third_party/proto/tendermint/types/validator.proto b/proto/tendermint/types/validator.proto similarity index 100% rename from third_party/proto/tendermint/types/validator.proto rename to proto/tendermint/types/validator.proto diff --git a/third_party/proto/tendermint/version/types.proto b/proto/tendermint/version/types.proto similarity index 100% rename from third_party/proto/tendermint/version/types.proto rename to proto/tendermint/version/types.proto diff --git a/scripts/protocgen-any.sh b/scripts/protocgen-any.sh index 2a094265d3f9..d604c1a6511f 100755 --- a/scripts/protocgen-any.sh +++ b/scripts/protocgen-any.sh @@ -6,7 +6,7 @@ set -eo pipefail -go install github.com/gogo/protobuf/protoc-gen-gogotypes +go install github.com/cosmos/gogoproto/protoc-gen-gogotypes buf protoc -I "third_party/proto" --gogotypes_out=./codec/types third_party/proto/google/protobuf/any.proto mv codec/types/google/protobuf/any.pb.go codec/types diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index 20b8d7020069..f43705573e7a 100755 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -1,43 +1,35 @@ #!/usr/bin/env bash -set -eo pipefail +# How to run manually: +# docker build --pull --rm -f "contrib/devtools/Dockerfile" -t cosmossdk-proto:latest "contrib/devtools" +# docker run --rm -v $(pwd):/workspace --workdir /workspace cosmossdk-proto sh ./scripts/protocgen.sh -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 +set -e - go get github.com/regen-network/cosmos-proto/protoc-gen-gocosmos@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 ./cosmos -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,allow_colon_final_segments=true:. \ - $(find "${dir}" -maxdepth 1 -name '*.proto') - + for file in $(find "${dir}" -maxdepth 1 -name '*.proto'); do + # this regex checks if a proto file has its go_package set to cosmossdk.io/api/... + # gogo proto files SHOULD ONLY be generated if this is false + # we don't want gogo proto to run for proto files which are natively built for google.golang.org/protobuf + if grep -q "option go_package" "$file" && grep -H -o -c 'option go_package.*cosmossdk.io/api' "$file" | grep -q ':0$'; then + buf generate --template buf.gen.gogo.yaml $file + fi + done done -# command to generate docs using protoc-gen-doc -buf protoc \ - -I "proto" \ - -I "third_party/proto" \ - --doc_out=./docs/core \ - --doc_opt=./docs/protodoc-markdown.tmpl,proto-docs.md \ - $(find "$(pwd)/proto" -maxdepth 5 -name '*.proto') -go mod tidy +cd .. # generate codec/testdata proto code -buf protoc -I "proto" -I "third_party/proto" -I "testutil/testdata" --gocosmos_out=plugins=interfacetype+grpc,\ -Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types:. ./testutil/testdata/*.proto +(cd testutil/testdata; buf generate) + +# # generate baseapp test messages +# (cd baseapp/testutil; buf generate) # move proto files to the right places cp -r github.com/cosmos/cosmos-sdk/* ./ rm -rf github.com + +go mod tidy diff --git a/server/api/server.go b/server/api/server.go index c2987f860d1a..3b58e1c24cb3 100644 --- a/server/api/server.go +++ b/server/api/server.go @@ -7,7 +7,7 @@ import ( "strings" "time" - "github.com/gogo/gateway" + gateway "github.com/cosmos/gogogateway" "github.com/gorilla/handlers" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" diff --git a/server/export.go b/server/export.go index 2d5e83a8e20a..47f2e89d6c33 100644 --- a/server/export.go +++ b/server/export.go @@ -9,7 +9,6 @@ import ( "github.com/spf13/cobra" tmjson "github.com/tendermint/tendermint/libs/json" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/client/flags" @@ -83,18 +82,17 @@ func ExportCmd(appExporter types.AppExporter, defaultNodeHome string) *cobra.Com doc.AppState = exported.AppState doc.Validators = exported.Validators doc.InitialHeight = exported.Height - doc.ConsensusParams = &tmproto.ConsensusParams{ - Block: tmproto.BlockParams{ - MaxBytes: exported.ConsensusParams.Block.MaxBytes, - MaxGas: exported.ConsensusParams.Block.MaxGas, - TimeIotaMs: doc.ConsensusParams.Block.TimeIotaMs, + doc.ConsensusParams = &tmtypes.ConsensusParams{ + Block: tmtypes.BlockParams{ + MaxBytes: exported.ConsensusParams.Block.MaxBytes, + MaxGas: exported.ConsensusParams.Block.MaxGas, }, - Evidence: tmproto.EvidenceParams{ + Evidence: tmtypes.EvidenceParams{ MaxAgeNumBlocks: exported.ConsensusParams.Evidence.MaxAgeNumBlocks, MaxAgeDuration: exported.ConsensusParams.Evidence.MaxAgeDuration, MaxBytes: exported.ConsensusParams.Evidence.MaxBytes, }, - Validator: tmproto.ValidatorParams{ + Validator: tmtypes.ValidatorParams{ PubKeyTypes: exported.ConsensusParams.Validator.PubKeyTypes, }, } diff --git a/server/export_test.go b/server/export_test.go index fa59b9b72c37..3ef3745560ad 100644 --- a/server/export_test.go +++ b/server/export_test.go @@ -12,7 +12,6 @@ import ( "github.com/spf13/cobra" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" tmjson "github.com/tendermint/tendermint/libs/json" "github.com/tendermint/tendermint/libs/log" @@ -33,7 +32,7 @@ import ( func TestExportCmd_ConsensusParams(t *testing.T) { tempDir := t.TempDir() - _, ctx, genDoc, cmd := setupApp(t, tempDir) + _, ctx, _, cmd := setupApp(t, tempDir) output := &bytes.Buffer{} cmd.SetOut(output) @@ -46,13 +45,10 @@ func TestExportCmd_ConsensusParams(t *testing.T) { t.Fatalf("error unmarshaling exported genesis doc: %s", err) } - require.Equal(t, genDoc.ConsensusParams.Block.TimeIotaMs, exportedGenDoc.ConsensusParams.Block.TimeIotaMs) require.Equal(t, simapp.DefaultConsensusParams.Block.MaxBytes, exportedGenDoc.ConsensusParams.Block.MaxBytes) require.Equal(t, simapp.DefaultConsensusParams.Block.MaxGas, exportedGenDoc.ConsensusParams.Block.MaxGas) - require.Equal(t, simapp.DefaultConsensusParams.Evidence.MaxAgeDuration, exportedGenDoc.ConsensusParams.Evidence.MaxAgeDuration) require.Equal(t, simapp.DefaultConsensusParams.Evidence.MaxAgeNumBlocks, exportedGenDoc.ConsensusParams.Evidence.MaxAgeNumBlocks) - require.Equal(t, simapp.DefaultConsensusParams.Validator.PubKeyTypes, exportedGenDoc.ConsensusParams.Validator.PubKeyTypes) } diff --git a/server/grpc/gogoreflection/fix_registration.go b/server/grpc/gogoreflection/fix_registration.go index ab7750574845..48678203b948 100644 --- a/server/grpc/gogoreflection/fix_registration.go +++ b/server/grpc/gogoreflection/fix_registration.go @@ -6,18 +6,17 @@ import ( "fmt" "reflect" - _ "github.com/gogo/protobuf/gogoproto" // required so it does register the gogoproto file descriptor - gogoproto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" // required so it does register the gogoproto file descriptor + gogoproto "github.com/cosmos/gogoproto/proto" - // nolint: staticcheck - "github.com/golang/protobuf/proto" + _ "github.com/cosmos/cosmos-proto" // look above + "github.com/golang/protobuf/proto" //nolint:staticcheck dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" - _ "github.com/regen-network/cosmos-proto" // look above ) +// importsToFix lets us now that we're only fixing gogoproto/gogoproto.proto imports, we're not fixing cosmos protos. var importsToFix = map[string]string{ - "gogo.proto": "gogoproto/gogo.proto", - "cosmos.proto": "cosmos_proto/cosmos.proto", + "gogo.proto": "gogoproto/gogo.proto", } // fixRegistration is required because certain files register themselves in a way @@ -60,7 +59,8 @@ func init() { } // compress compresses the given file descriptor -// nolint: interfacer +// +//nolint:interfacer func compress(fd *dpb.FileDescriptorProto) ([]byte, error) { fdBytes, err := proto.Marshal(fd) if err != nil { @@ -70,6 +70,7 @@ func compress(fd *dpb.FileDescriptorProto) ([]byte, error) { cw := gzip.NewWriter(buf) _, err = cw.Write(fdBytes) if err != nil { + cw.Close() return nil, err } err = cw.Close() @@ -86,8 +87,8 @@ func getFileDescriptor(filePath string) []byte { if len(fd) != 0 { return fd } - // nolint: staticcheck - return proto.FileDescriptor(filePath) + + return proto.FileDescriptor(filePath) //nolint:staticcheck } func getMessageType(name string) reflect.Type { @@ -95,8 +96,8 @@ func getMessageType(name string) reflect.Type { if typ != nil { return typ } - // nolint: staticcheck - return proto.MessageType(name) + + return proto.MessageType(name) //nolint:staticcheck } func getExtension(extID int32, m proto.Message) *gogoproto.ExtensionDesc { @@ -106,8 +107,9 @@ func getExtension(extID int32, m proto.Message) *gogoproto.ExtensionDesc { return desc } } + // check into proto registry - // nolint: staticcheck + //nolint:staticcheck // Seems likely that we should refactor this file. for id, desc := range proto.RegisteredExtensions(m) { if id == extID { return &gogoproto.ExtensionDesc{ @@ -133,8 +135,8 @@ func getExtensionsNumbers(m proto.Message) []int32 { if len(out) != 0 { return out } - // nolint: staticcheck - protoExts := proto.RegisteredExtensions(m) + + protoExts := proto.RegisteredExtensions(m) //nolint:staticcheck out = make([]int32, 0, len(protoExts)) for id := range protoExts { out = append(out, id) diff --git a/server/grpc/gogoreflection/serverreflection.go b/server/grpc/gogoreflection/serverreflection.go index c2a0828e3bc2..ac1e3c2d0526 100644 --- a/server/grpc/gogoreflection/serverreflection.go +++ b/server/grpc/gogoreflection/serverreflection.go @@ -23,6 +23,7 @@ The service implemented is defined in: https://github.com/grpc/grpc/blob/master/src/proto/grpc/reflection/v1alpha/reflection.proto. To register server reflection on a gRPC server: + import "google.golang.org/grpc/reflection" s := grpc.NewServer() @@ -32,7 +33,6 @@ To register server reflection on a gRPC server: reflection.Register(s) s.Serve(lis) - */ package gogoreflection // import "google.golang.org/grpc/reflection" @@ -41,13 +41,12 @@ import ( "compress/gzip" "fmt" "io" - "io/ioutil" "log" "reflect" "sort" "sync" - // nolint: staticcheck + //nolint: staticcheck "github.com/golang/protobuf/proto" dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" "google.golang.org/grpc" @@ -219,7 +218,7 @@ func decompress(b []byte) ([]byte, error) { if err != nil { return nil, fmt.Errorf("bad gzipped descriptor: %v", err) } - out, err := ioutil.ReadAll(r) + out, err := io.ReadAll(r) if err != nil { return nil, fmt.Errorf("bad gzipped descriptor: %v", err) } diff --git a/server/grpc/reflection/v2alpha1/reflection.go b/server/grpc/reflection/v2alpha1/reflection.go index 789f9e35ff86..73290c2961f8 100644 --- a/server/grpc/reflection/v2alpha1/reflection.go +++ b/server/grpc/reflection/v2alpha1/reflection.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "google.golang.org/grpc" codectypes "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/server/grpc/reflection/v2alpha1/reflection.pb.go b/server/grpc/reflection/v2alpha1/reflection.pb.go index c75e6958ce32..360e4440e8f6 100644 --- a/server/grpc/reflection/v2alpha1/reflection.pb.go +++ b/server/grpc/reflection/v2alpha1/reflection.pb.go @@ -6,8 +6,8 @@ package v2alpha1 import ( context "context" fmt "fmt" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/server/grpc/reflection/v2alpha1/reflection.pb.gw.go b/server/grpc/reflection/v2alpha1/reflection.pb.gw.go index 02cd59b35dbc..d53b4fdaeb8c 100644 --- a/server/grpc/reflection/v2alpha1/reflection.pb.gw.go +++ b/server/grpc/reflection/v2alpha1/reflection.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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join func request_ReflectionService_GetAuthnDescriptor_0(ctx context.Context, marshaler runtime.Marshaler, client ReflectionServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq GetAuthnDescriptorRequest @@ -142,12 +144,14 @@ func local_request_ReflectionService_GetTxDescriptor_0(ctx context.Context, mars // RegisterReflectionServiceHandlerServer registers the http handlers for service ReflectionService to "mux". // UnaryRPC :call ReflectionServiceServer 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 RegisterReflectionServiceHandlerFromEndpoint instead. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterReflectionServiceHandlerFromEndpoint instead. func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ReflectionServiceServer) error { mux.Handle("GET", pattern_ReflectionService_GetAuthnDescriptor_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 { @@ -155,6 +159,7 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ReflectionService_GetAuthnDescriptor_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) @@ -168,6 +173,8 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ReflectionService_GetChainDescriptor_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 { @@ -175,6 +182,7 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ReflectionService_GetChainDescriptor_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) @@ -188,6 +196,8 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ReflectionService_GetCodecDescriptor_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 { @@ -195,6 +205,7 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ReflectionService_GetCodecDescriptor_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) @@ -208,6 +219,8 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ReflectionService_GetConfigurationDescriptor_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 { @@ -215,6 +228,7 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ReflectionService_GetConfigurationDescriptor_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) @@ -228,6 +242,8 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ReflectionService_GetQueryServicesDescriptor_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 { @@ -235,6 +251,7 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ReflectionService_GetQueryServicesDescriptor_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) @@ -248,6 +265,8 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ReflectionService_GetTxDescriptor_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 { @@ -255,6 +274,7 @@ func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ReflectionService_GetTxDescriptor_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) diff --git a/server/grpc/server.go b/server/grpc/server.go index 1e44b0d6099a..d7cd6002bee3 100644 --- a/server/grpc/server.go +++ b/server/grpc/server.go @@ -8,6 +8,7 @@ import ( "google.golang.org/grpc" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server/config" "github.com/cosmos/cosmos-sdk/server/grpc/gogoreflection" reflection "github.com/cosmos/cosmos-sdk/server/grpc/reflection/v2alpha1" @@ -30,6 +31,7 @@ func StartGRPCServer(clientCtx client.Context, app types.Application, cfg config grpcSrv := grpc.NewServer( grpc.MaxSendMsgSize(maxSendMsgSize), grpc.MaxRecvMsgSize(maxRecvMsgSize), + grpc.ForceServerCodec(codec.NewProtoCodec(clientCtx.InterfaceRegistry).GRPCCodec()), ) app.RegisterGRPCServer(grpcSrv) diff --git a/server/grpc/server_test.go b/server/grpc/server_test.go index d384ff093827..197f7eeeea41 100644 --- a/server/grpc/server_test.go +++ b/server/grpc/server_test.go @@ -19,6 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" reflectionv1 "github.com/cosmos/cosmos-sdk/client/grpc/reflection" clienttx "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/cosmos/cosmos-sdk/codec" reflectionv2 "github.com/cosmos/cosmos-sdk/server/grpc/reflection/v2alpha1" "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/testutil/network" @@ -57,6 +58,7 @@ func (s *IntegrationTestSuite) SetupSuite() { s.conn, err = grpc.Dial( val0.AppConfig.GRPC.Address, grpc.WithInsecure(), // Or else we get "no transport security set" + grpc.WithDefaultCallOptions(grpc.ForceCodec(codec.NewProtoCodec(s.app.InterfaceRegistry()).GRPCCodec())), ) s.Require().NoError(err) } diff --git a/server/mock/app.go b/server/mock/app.go index e73329e107fc..f32c42f1a60e 100644 --- a/server/mock/app.go +++ b/server/mock/app.go @@ -1,48 +1,59 @@ package mock import ( + "context" "encoding/json" "errors" "fmt" "path/filepath" - "github.com/tendermint/tendermint/types" - abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" + "github.com/tendermint/tendermint/types" + db "github.com/tendermint/tm-db" + "google.golang.org/grpc" bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/testutil/mock" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" ) // NewApp creates a simple mock kvstore app for testing. It should work // similar to a real app. Make sure rootDir is empty before running the test, -// in order to guarantee consistent results +// in order to guarantee consistent results. func NewApp(rootDir string, logger log.Logger) (abci.Application, error) { - db, err := sdk.NewLevelDB("mock", filepath.Join(rootDir, "data")) + db, err := db.NewGoLevelDB("mock", filepath.Join(rootDir, "data")) if err != nil { return nil, err } - // Capabilities key to access the main KVStore. capKeyMainStore := sdk.NewKVStoreKey("main") - - // Create BaseApp. baseApp := bam.NewBaseApp("kvstore", logger, db, decodeTx) - baseApp.SetParamStore(&mock.ParamStore{Db: db}) - - // Set mounts for BaseApp's MultiStore. baseApp.MountStores(capKeyMainStore) - baseApp.SetInitChainer(InitChainer(capKeyMainStore)) - // Set a Route. - baseApp.Router().AddRoute(sdk.NewRoute("kvstore", KVStoreHandler(capKeyMainStore))) + interfaceRegistry := codectypes.NewInterfaceRegistry() + interfaceRegistry.RegisterImplementations((*sdk.Msg)(nil), &kvstoreTx{}) + + router := bam.NewMsgServiceRouter() + router.SetInterfaceRegistry(interfaceRegistry) + + newDesc := &grpc.ServiceDesc{ + ServiceName: "test", + Methods: []grpc.MethodDesc{ + { + MethodName: "Test", + Handler: _Msg_Test_Handler, + }, + }, + } + + router.RegisterService(newDesc, &MsgServerImpl{capKeyMainStore}) + baseApp.SetMsgServiceRouter(router) - // Load latest version. if err := baseApp.LoadLatestVersion(); err != nil { return nil, err } @@ -51,10 +62,10 @@ func NewApp(rootDir string, logger log.Logger) (abci.Application, error) { } // KVStoreHandler is a simple handler that takes kvstoreTx and writes -// them to the db -func KVStoreHandler(storeKey sdk.StoreKey) sdk.Handler { +// them to the db. +func KVStoreHandler(storeKey storetypes.StoreKey) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - dTx, ok := msg.(kvstoreTx) + dTx, ok := msg.(*kvstoreTx) if !ok { return nil, errors.New("KVStoreHandler should only receive kvstoreTx") } @@ -85,7 +96,7 @@ type GenesisJSON struct { // InitChainer returns a function that can initialize the chain // with key/value pairs -func InitChainer(key sdk.StoreKey) func(sdk.Context, abci.RequestInitChain) abci.ResponseInitChain { +func InitChainer(key storetypes.StoreKey) func(sdk.Context, abci.RequestInitChain) abci.ResponseInitChain { return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { stateJSON := req.AppStateBytes @@ -106,8 +117,7 @@ func InitChainer(key sdk.StoreKey) func(sdk.Context, abci.RequestInitChain) abci // AppGenState can be passed into InitCmd, returns a static string of a few // key-values that can be parsed by InitChainer -func AppGenState(_ *codec.LegacyAmino, _ types.GenesisDoc, _ []json.RawMessage) (appState json. - RawMessage, err error) { +func AppGenState(_ *codec.LegacyAmino, _ types.GenesisDoc, _ []json.RawMessage) (appState json.RawMessage, err error) { appState = json.RawMessage(`{ "values": [ { @@ -124,8 +134,38 @@ func AppGenState(_ *codec.LegacyAmino, _ types.GenesisDoc, _ []json.RawMessage) } // AppGenStateEmpty returns an empty transaction state for mocking. -func AppGenStateEmpty(_ *codec.LegacyAmino, _ types.GenesisDoc, _ []json.RawMessage) ( - appState json.RawMessage, err error) { +func AppGenStateEmpty(_ *codec.LegacyAmino, _ types.GenesisDoc, _ []json.RawMessage) (appState json.RawMessage, err error) { appState = json.RawMessage(``) return } + +// Manually write the handlers for this custom message +type MsgServer interface { + Test(ctx context.Context, msg *kvstoreTx) (*sdk.Result, error) +} + +type MsgServerImpl struct { + capKeyMainStore *storetypes.KVStoreKey +} + +func _Msg_Test_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(kvstoreTx) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).Test(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/kvstoreTx", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).Test(ctx, req.(*kvstoreTx)) + } + return interceptor(ctx, in, info, handler) +} + +func (m MsgServerImpl) Test(ctx context.Context, msg *kvstoreTx) (*sdk.Result, error) { + return KVStoreHandler(m.capKeyMainStore)(sdk.UnwrapSDKContext(ctx), msg) +} diff --git a/server/mock/app_test.go b/server/mock/app_test.go index 2741925df026..2c9cc29d6e8c 100644 --- a/server/mock/app_test.go +++ b/server/mock/app_test.go @@ -1,12 +1,16 @@ package mock import ( + "math/rand" "testing" + "time" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/tendermint/tendermint/types" + + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" ) // TestInitApp makes sure we can initialize this thing without an error @@ -24,7 +28,7 @@ func TestInitApp(t *testing.T) { appState, err := AppGenState(nil, types.GenesisDoc{}, nil) require.NoError(t, err) - //TODO test validators in the init chain? + // TODO test validators in the init chain? req := abci.RequestInitChain{ AppStateBytes: appState, } @@ -49,11 +53,16 @@ func TestDeliverTx(t *testing.T) { if closer != nil { defer closer() } + require.NoError(t, err) key := "my-special-key" value := "top-secret-data!!" - tx := NewTx(key, value) + + r := rand.New(rand.NewSource(time.Now().UnixNano())) + randomAccounts := simtypes.RandomAccounts(r, 1) + + tx := NewTx(key, value, randomAccounts[0].Address) txBytes := tx.GetSignBytes() header := tmproto.Header{ @@ -61,9 +70,12 @@ func TestDeliverTx(t *testing.T) { Height: 1, } app.BeginBlock(abci.RequestBeginBlock{Header: header}) + dres := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) require.Equal(t, uint32(0), dres.Code, dres.Log) + app.EndBlock(abci.RequestEndBlock{}) + cres := app.Commit() require.NotEmpty(t, cres.Data) @@ -72,6 +84,7 @@ func TestDeliverTx(t *testing.T) { Path: "/store/main/key", Data: []byte(key), } + qres := app.Query(query) require.Equal(t, uint32(0), qres.Code, qres.Log) require.Equal(t, []byte(value), qres.Value) diff --git a/server/mock/helpers.go b/server/mock/helpers.go index 88aacb4d8e41..aab1be7cff29 100644 --- a/server/mock/helpers.go +++ b/server/mock/helpers.go @@ -2,19 +2,18 @@ package mock import ( "fmt" - "io/ioutil" "os" abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/log" + tmlog "github.com/tendermint/tendermint/libs/log" ) // SetupApp returns an application as well as a clean-up function // to be used to quickly setup a test case with an app func SetupApp() (abci.Application, func(), error) { - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)). - With("module", "mock") - rootDir, err := ioutil.TempDir("", "mock-sdk") + logger := tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout)).With("module", "mock") + + rootDir, err := os.MkdirTemp("", "mock-sdk") if err != nil { return nil, nil, err } diff --git a/server/mock/store.go b/server/mock/store.go index 948903c94bfa..8d040e90d1d8 100644 --- a/server/mock/store.go +++ b/server/mock/store.go @@ -3,19 +3,19 @@ package mock import ( "io" - protoio "github.com/gogo/protobuf/io" + protoio "github.com/cosmos/gogoproto/io" dbm "github.com/tendermint/tm-db" pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" snapshottypes "github.com/cosmos/cosmos-sdk/snapshots/types" - store "github.com/cosmos/cosmos-sdk/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" ) var _ sdk.MultiStore = multiStore{} type multiStore struct { - kv map[sdk.StoreKey]kvStore + kv map[storetypes.StoreKey]kvStore } func (ms multiStore) CacheMultiStore() sdk.CacheMultiStore { @@ -26,15 +26,15 @@ func (ms multiStore) CacheMultiStoreWithVersion(_ int64) (sdk.CacheMultiStore, e panic("not implemented") } -func (ms multiStore) CacheWrap() sdk.CacheWrap { +func (ms multiStore) CacheWrap() storetypes.CacheWrap { panic("not implemented") } -func (ms multiStore) CacheWrapWithTrace(_ io.Writer, _ sdk.TraceContext) sdk.CacheWrap { +func (ms multiStore) CacheWrapWithTrace(_ io.Writer, _ sdk.TraceContext) storetypes.CacheWrap { panic("not implemented") } -func (ms multiStore) CacheWrapWithListeners(_ store.StoreKey, _ []store.WriteListener) store.CacheWrap { +func (ms multiStore) CacheWrapWithListeners(_ storetypes.StoreKey, _ []storetypes.WriteListener) storetypes.CacheWrap { panic("not implemented") } @@ -50,19 +50,19 @@ func (ms multiStore) SetTracer(w io.Writer) sdk.MultiStore { panic("not implemented") } -func (ms multiStore) AddListeners(key store.StoreKey, listeners []store.WriteListener) { +func (ms multiStore) AddListeners(key storetypes.StoreKey, listeners []storetypes.WriteListener) { panic("not implemented") } -func (ms multiStore) ListeningEnabled(key store.StoreKey) bool { +func (ms multiStore) ListeningEnabled(key storetypes.StoreKey) bool { panic("not implemented") } -func (ms multiStore) Commit() sdk.CommitID { +func (ms multiStore) Commit() storetypes.CommitID { panic("not implemented") } -func (ms multiStore) LastCommitID() sdk.CommitID { +func (ms multiStore) LastCommitID() storetypes.CommitID { panic("not implemented") } @@ -74,11 +74,11 @@ func (ms multiStore) GetPruning() pruningtypes.PruningOptions { panic("not implemented") } -func (ms multiStore) GetCommitKVStore(key sdk.StoreKey) sdk.CommitKVStore { +func (ms multiStore) GetCommitKVStore(key storetypes.StoreKey) storetypes.CommitKVStore { panic("not implemented") } -func (ms multiStore) GetCommitInfoFromDB(ver int64) (*store.CommitInfo, error) { +func (ms multiStore) GetCommitInfoFromDB(ver int64) (*storetypes.CommitInfo, error) { panic("not implemented") } @@ -86,7 +86,15 @@ func (ms multiStore) GetCommitStore(key sdk.StoreKey) sdk.CommitStore { panic("not implemented") } -func (ms multiStore) MountStoreWithDB(key store.StoreKey, typ store.StoreType, db dbm.DB) { +func (ms multiStore) GetAppVersion() (uint64, error) { + panic("not implemented") +} + +func (ms multiStore) SetAppVersion(version uint64) error { + panic("not implemented") +} + +func (ms multiStore) MountStoreWithDB(key storetypes.StoreKey, typ storetypes.StoreType, db dbm.DB) { ms.kv[key] = kvStore{store: make(map[string][]byte)} } @@ -94,11 +102,11 @@ func (ms multiStore) LoadLatestVersion() error { return nil } -func (ms multiStore) LoadLatestVersionAndUpgrade(upgrades *store.StoreUpgrades) error { +func (ms multiStore) LoadLatestVersionAndUpgrade(upgrades *storetypes.StoreUpgrades) error { return nil } -func (ms multiStore) LoadVersionAndUpgrade(ver int64, upgrades *store.StoreUpgrades) error { +func (ms multiStore) LoadVersionAndUpgrade(ver int64, upgrades *storetypes.StoreUpgrades) error { panic("not implemented") } @@ -106,15 +114,15 @@ func (ms multiStore) LoadVersion(ver int64) error { panic("not implemented") } -func (ms multiStore) GetKVStore(key sdk.StoreKey) sdk.KVStore { +func (ms multiStore) GetKVStore(key storetypes.StoreKey) sdk.KVStore { return ms.kv[key] } -func (ms multiStore) GetStore(key sdk.StoreKey) sdk.Store { +func (ms multiStore) GetStore(key storetypes.StoreKey) sdk.Store { panic("not implemented") } -func (ms multiStore) GetStoreType() sdk.StoreType { +func (ms multiStore) GetStoreType() storetypes.StoreType { panic("not implemented") } @@ -122,18 +130,23 @@ func (ms multiStore) PruneSnapshotHeight(height int64) { panic("not implemented") } +func (ms multiStore) SetSnapshotInterval(snapshotInterval uint64) { + panic("not implemented") +} + func (ms multiStore) SetInterBlockCache(_ sdk.MultiStorePersistentCache) { panic("not implemented") } + func (ms multiStore) SetIAVLCacheSize(size int) { panic("not implemented") } -func (ms multiStore) SetInitialVersion(version int64) error { +func (ms multiStore) SetIAVLDisableFastNode(disable bool) { panic("not implemented") } -func (ms multiStore) SetSnapshotInterval(snapshotInterval uint64) { +func (ms multiStore) SetInitialVersion(version int64) error { panic("not implemented") } @@ -147,11 +160,11 @@ func (ms multiStore) Restore( panic("not implemented") } -func (ms multiStore) SetAppVersion(_ uint64) error { +func (ms multiStore) RollbackToVersion(version int64) error { panic("not implemented") } -func (ms multiStore) GetAppVersion() (uint64, error) { +func (ms multiStore) LatestVersion() int64 { panic("not implemented") } @@ -161,19 +174,19 @@ type kvStore struct { store map[string][]byte } -func (kv kvStore) CacheWrap() sdk.CacheWrap { +func (kv kvStore) CacheWrap() storetypes.CacheWrap { panic("not implemented") } -func (kv kvStore) CacheWrapWithTrace(w io.Writer, tc sdk.TraceContext) sdk.CacheWrap { +func (kv kvStore) CacheWrapWithTrace(w io.Writer, tc sdk.TraceContext) storetypes.CacheWrap { panic("not implemented") } -func (kv kvStore) CacheWrapWithListeners(_ store.StoreKey, _ []store.WriteListener) store.CacheWrap { +func (kv kvStore) CacheWrapWithListeners(_ storetypes.StoreKey, _ []storetypes.WriteListener) storetypes.CacheWrap { panic("not implemented") } -func (kv kvStore) GetStoreType() sdk.StoreType { +func (kv kvStore) GetStoreType() storetypes.StoreType { panic("not implemented") } @@ -191,7 +204,7 @@ func (kv kvStore) Has(key []byte) bool { } func (kv kvStore) Set(key, value []byte) { - store.AssertValidKey(key) + storetypes.AssertValidKey(key) kv.store[string(key)] = value } @@ -224,5 +237,5 @@ func (kv kvStore) ReverseSubspaceIterator(prefix []byte) sdk.Iterator { } func NewCommitMultiStore() sdk.CommitMultiStore { - return multiStore{kv: make(map[sdk.StoreKey]kvStore)} + return multiStore{kv: make(map[storetypes.StoreKey]kvStore)} } diff --git a/server/mock/store_test.go b/server/mock/store_test.go index b945cd30599f..fc5cd12e097e 100644 --- a/server/mock/store_test.go +++ b/server/mock/store_test.go @@ -4,9 +4,9 @@ import ( "testing" "github.com/stretchr/testify/require" - dbm "github.com/tendermint/tm-db" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -15,7 +15,7 @@ func TestStore(t *testing.T) { cms := NewCommitMultiStore() key := sdk.NewKVStoreKey("test") - cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) + cms.MountStoreWithDB(key, storetypes.StoreTypeIAVL, db) err := cms.LoadLatestVersion() require.Nil(t, err) diff --git a/server/mock/tx.go b/server/mock/tx.go index 0cb79c28986f..c4c8a778d6b7 100644 --- a/server/mock/tx.go +++ b/server/mock/tx.go @@ -1,79 +1,130 @@ -//nolint package mock import ( "bytes" "fmt" + "github.com/cosmos/cosmos-sdk/x/auth/signing" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + txsigning "github.com/cosmos/cosmos-sdk/types/tx/signing" ) // An sdk.Tx which is its own sdk.Msg. type kvstoreTx struct { - key []byte - value []byte - bytes []byte + key []byte + value []byte + bytes []byte + address sdk.AccAddress } -// dummy implementation of proto.Message -func (msg kvstoreTx) Reset() {} -func (msg kvstoreTx) String() string { return "TODO" } -func (msg kvstoreTx) ProtoMessage() {} +// testPubKey is a dummy implementation of PubKey used for testing. +type testPubKey struct { + address sdk.AccAddress +} -var _ sdk.Tx = kvstoreTx{} -var _ sdk.Msg = kvstoreTx{} +func (t testPubKey) Reset() { panic("not implemented") } -func NewTx(key, value string) kvstoreTx { - bytes := fmt.Sprintf("%s=%s", key, value) - return kvstoreTx{ - key: []byte(key), - value: []byte(value), - bytes: []byte(bytes), - } +func (t testPubKey) String() string { panic("not implemented") } + +func (t testPubKey) ProtoMessage() { panic("not implemented") } + +func (t testPubKey) Address() cryptotypes.Address { return t.address.Bytes() } + +func (t testPubKey) Bytes() []byte { panic("not implemented") } + +func (t testPubKey) VerifySignature(msg []byte, sig []byte) bool { panic("not implemented") } + +func (t testPubKey) Equals(key cryptotypes.PubKey) bool { panic("not implemented") } + +func (t testPubKey) Type() string { panic("not implemented") } + +func (msg *kvstoreTx) GetSignaturesV2() (res []txsigning.SignatureV2, err error) { + res = append(res, txsigning.SignatureV2{ + PubKey: testPubKey{address: msg.address}, + Data: nil, + Sequence: 1, + }) + + return res, nil } -func (tx kvstoreTx) Route() string { - return "kvstore" +func (msg *kvstoreTx) VerifySignature(msgByte []byte, sig []byte) bool { + panic("implement me") } -func (tx kvstoreTx) Type() string { - return "kvstore_tx" +func (msg *kvstoreTx) Address() cryptotypes.Address { + panic("implement me") } -func (tx kvstoreTx) GetMsgs() []sdk.Msg { - return []sdk.Msg{tx} +func (msg *kvstoreTx) Bytes() []byte { + panic("implement me") } -func (tx kvstoreTx) GetMemo() string { - return "" +func (msg *kvstoreTx) Equals(key cryptotypes.PubKey) bool { + panic("implement me") } -func (tx kvstoreTx) GetSignBytes() []byte { +// dummy implementation of proto.Message +func (msg *kvstoreTx) Reset() {} +func (msg *kvstoreTx) String() string { return "TODO" } +func (msg *kvstoreTx) ProtoMessage() {} + +var ( + _ sdk.Tx = &kvstoreTx{} + _ sdk.Msg = &kvstoreTx{} + _ signing.SigVerifiableTx = &kvstoreTx{} + _ cryptotypes.PubKey = &kvstoreTx{} + _ cryptotypes.PubKey = &testPubKey{} +) + +func NewTx(key, value string, accAddress sdk.AccAddress) *kvstoreTx { + bytes := fmt.Sprintf("%s=%s", key, value) + return &kvstoreTx{ + key: []byte(key), + value: []byte(value), + bytes: []byte(bytes), + address: accAddress, + } +} + +func (tx *kvstoreTx) Type() string { + return "kvstore_tx" +} + +func (tx *kvstoreTx) GetMsgs() []sdk.Msg { + return []sdk.Msg{tx} +} + +func (tx *kvstoreTx) GetSignBytes() []byte { return tx.bytes } // Should the app be calling this? Or only handlers? -func (tx kvstoreTx) ValidateBasic() error { +func (tx *kvstoreTx) ValidateBasic() error { return nil } -func (tx kvstoreTx) GetSigners() []sdk.AccAddress { +func (tx *kvstoreTx) GetSigners() []sdk.AccAddress { return nil } +func (tx *kvstoreTx) GetPubKeys() ([]cryptotypes.PubKey, error) { panic("GetPubKeys not implemented") } + // takes raw transaction bytes and decodes them into an sdk.Tx. An sdk.Tx has // all the signatures and can be used to authenticate. func decodeTx(txBytes []byte) (sdk.Tx, error) { var tx sdk.Tx split := bytes.Split(txBytes, []byte("=")) - if len(split) == 1 { + if len(split) == 1 { //nolint:gocritic k := split[0] - tx = kvstoreTx{k, k, txBytes} + tx = &kvstoreTx{k, k, txBytes, nil} } else if len(split) == 2 { k, v := split[0], split[1] - tx = kvstoreTx{k, v, txBytes} + tx = &kvstoreTx{k, v, txBytes, nil} } else { return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, "too many '='") } diff --git a/server/rosetta/converter.go b/server/rosetta/converter.go index b057a32a6e27..42ebeb7a2ef7 100644 --- a/server/rosetta/converter.go +++ b/server/rosetta/converter.go @@ -6,30 +6,24 @@ import ( "fmt" "reflect" - auth "github.com/cosmos/cosmos-sdk/x/auth/types" - - "github.com/tendermint/tendermint/crypto" - "github.com/btcsuite/btcd/btcec" - tmcoretypes "github.com/tendermint/tendermint/rpc/core/types" - - crgtypes "github.com/cosmos/cosmos-sdk/server/rosetta/lib/types" - - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - rosettatypes "github.com/coinbase/rosetta-sdk-go/types" abci "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/crypto" + tmcoretypes "github.com/tendermint/tendermint/rpc/core/types" tmtypes "github.com/tendermint/tendermint/types" - crgerrs "github.com/cosmos/cosmos-sdk/server/rosetta/lib/errors" - sdkclient "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + crgerrs "github.com/cosmos/cosmos-sdk/server/rosetta/lib/errors" + crgtypes "github.com/cosmos/cosmos-sdk/server/rosetta/lib/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" + auth "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ) @@ -367,7 +361,7 @@ func sdkEventToBalanceOperations(status string, event abci.Event) (operations [] // rosetta does not have the concept of burning coins, so we need to mock // the burn as a send to an address that cannot be resolved to anything case banktypes.EventTypeCoinBurn: - coins, err := sdk.ParseCoinsNormalized((string)(event.Attributes[1].Value)) + coins, err := sdk.ParseCoinsNormalized((event.Attributes[1].Value)) if err != nil { panic(err) } diff --git a/server/types/app.go b/server/types/app.go index a72fc759c975..c6c8d21089a0 100644 --- a/server/types/app.go +++ b/server/types/app.go @@ -5,10 +5,11 @@ import ( "io" "time" - "github.com/gogo/protobuf/grpc" + "github.com/cosmos/gogoproto/grpc" "github.com/spf13/cobra" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tm-db" @@ -70,7 +71,7 @@ type ( // Height is the app's latest block height. Height int64 // ConsensusParams are the exported consensus params for ABCI. - ConsensusParams *abci.ConsensusParams + ConsensusParams *tmproto.ConsensusParams } // AppExporter is a function that dumps all app state to diff --git a/simapp/abci.go b/simapp/abci.go new file mode 100644 index 000000000000..3e1b2880db1b --- /dev/null +++ b/simapp/abci.go @@ -0,0 +1,35 @@ +package simapp + +import ( + abci "github.com/tendermint/tendermint/abci/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/mempool" +) + +var _ mempool.Mempool = (*NoOpMempool)(nil) + +// NoOpMempool defines a no-op mempool. Transactions are completely discarded and +// ignored when BaseApp interacts with the mempool. +type NoOpMempool struct{} + +func (m NoOpMempool) Insert(sdk.Context, sdk.Tx) error { return nil } +func (m NoOpMempool) Select(sdk.Context, [][]byte) mempool.Iterator { return nil } +func (m NoOpMempool) CountTx() int { return 0 } +func (m NoOpMempool) Remove(sdk.Tx) error { return nil } + +// NoOpPrepareProposal defines a no-op PrepareProposal handler. It will always +// return the transactions sent by the client's request +func NoOpPrepareProposal() sdk.PrepareProposalHandler { + return func(_ sdk.Context, req abci.RequestPrepareProposal) abci.ResponsePrepareProposal { + return abci.ResponsePrepareProposal{Txs: req.Txs} + } +} + +// NoOpProcessProposal defines a no-op ProcessProposal Handler. It will always +// return ACCEPT. +func NoOpProcessProposal() sdk.ProcessProposalHandler { + return func(_ sdk.Context, _ abci.RequestProcessProposal) abci.ResponseProcessProposal { + return abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_ACCEPT} + } +} diff --git a/simapp/app.go b/simapp/app.go index 0d9775a108b5..7a371cd08f20 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -196,10 +196,23 @@ func NewSimApp( legacyAmino := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry + // A default nonce-based mempool is set automatically in BaseApp along with a + // default implementation of PrepareProposal and ProcessProposal. To override + // them, perform the following: + // + // baseAppOptions = append(baseAppOptions, baseapp.SetMempool(mp)) + // baseAppOptions = append(baseAppOptions, baseapp.SetPrepareProposal(prepareProposalHandler)) + // baseAppOptions = append(baseAppOptions, baseapp.SetProcessProposal(processProposalHandler)) + + baseAppOptions = append(baseAppOptions, baseapp.SetMempool(NoOpMempool{})) + baseAppOptions = append(baseAppOptions, baseapp.SetPrepareProposal(NoOpPrepareProposal())) + baseAppOptions = append(baseAppOptions, baseapp.SetProcessProposal(NoOpProcessProposal())) + bApp := baseapp.NewBaseApp(appName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) bApp.SetCommitMultiStoreTracer(traceStore) bApp.SetVersion(version.Version) bApp.SetInterfaceRegistry(interfaceRegistry) + bApp.SetTxEncoder(encodingConfig.TxConfig.TxEncoder()) keys := sdk.NewKVStoreKeys( authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, diff --git a/simapp/test_helpers.go b/simapp/test_helpers.go index 71efe19c7a8d..a75b97a7d0e3 100644 --- a/simapp/test_helpers.go +++ b/simapp/test_helpers.go @@ -35,8 +35,8 @@ import ( // DefaultConsensusParams defines the default Tendermint consensus params used in // SimApp testing. -var DefaultConsensusParams = &abci.ConsensusParams{ - Block: &abci.BlockParams{ +var DefaultConsensusParams = &tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ MaxBytes: 200000, MaxGas: 2000000, }, @@ -51,7 +51,7 @@ var DefaultConsensusParams = &abci.ConsensusParams{ }, }, Version: &tmproto.VersionParams{ - AppVersion: 0, // must be 0 during chain initialization. + App: 0, // must be 0 during chain initialization. }, } diff --git a/snapshots/helpers_test.go b/snapshots/helpers_test.go index 3204471ab1d1..207f842d2e9a 100644 --- a/snapshots/helpers_test.go +++ b/snapshots/helpers_test.go @@ -11,7 +11,7 @@ import ( "testing" "time" - protoio "github.com/gogo/protobuf/io" + protoio "github.com/cosmos/gogoproto/io" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" db "github.com/tendermint/tm-db" diff --git a/snapshots/store.go b/snapshots/store.go index c2d6dcd81a71..6a13b0406de7 100644 --- a/snapshots/store.go +++ b/snapshots/store.go @@ -10,7 +10,7 @@ import ( "strconv" "sync" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" db "github.com/tendermint/tm-db" "github.com/cosmos/cosmos-sdk/snapshots/types" diff --git a/snapshots/stream.go b/snapshots/stream.go index 80cd5c3dfdcb..c39815c72578 100644 --- a/snapshots/stream.go +++ b/snapshots/stream.go @@ -5,8 +5,8 @@ import ( "compress/zlib" "io" - protoio "github.com/gogo/protobuf/io" - "github.com/gogo/protobuf/proto" + protoio "github.com/cosmos/gogoproto/io" + "github.com/cosmos/gogoproto/proto" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) diff --git a/snapshots/types/convert.go b/snapshots/types/convert.go index d0db6e3dc170..b9ea9503c5c1 100644 --- a/snapshots/types/convert.go +++ b/snapshots/types/convert.go @@ -1,7 +1,7 @@ package types import ( - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" abci "github.com/tendermint/tendermint/abci/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" diff --git a/snapshots/types/snapshot.pb.go b/snapshots/types/snapshot.pb.go index bc37d780d84e..b1681a53ad01 100644 --- a/snapshots/types/snapshot.pb.go +++ b/snapshots/types/snapshot.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -150,6 +150,7 @@ type SnapshotItem struct { // item is the specific type of snapshot item. // // Types that are valid to be assigned to Item: + // // *SnapshotItem_Store // *SnapshotItem_IAVL // *SnapshotItem_Extension diff --git a/snapshots/types/snapshotter.go b/snapshots/types/snapshotter.go index 76f800484a49..0f8a88af727c 100644 --- a/snapshots/types/snapshotter.go +++ b/snapshots/types/snapshotter.go @@ -1,7 +1,7 @@ package types import ( - protoio "github.com/gogo/protobuf/io" + protoio "github.com/cosmos/gogoproto/io" ) // Snapshotter is something that can create and restore snapshots, consisting of streamed binary diff --git a/snapshots/types/util.go b/snapshots/types/util.go index 125ea6fb4610..bd0f5057ad05 100644 --- a/snapshots/types/util.go +++ b/snapshots/types/util.go @@ -1,7 +1,7 @@ package types import ( - protoio "github.com/gogo/protobuf/io" + protoio "github.com/cosmos/gogoproto/io" ) // WriteExtensionItem writes an item payload for current extention snapshotter. diff --git a/store/rootmulti/store.go b/store/rootmulti/store.go index 86a80f2346c2..054b98a00072 100644 --- a/store/rootmulti/store.go +++ b/store/rootmulti/store.go @@ -9,17 +9,18 @@ import ( "strings" "sync" - "github.com/cosmos/cosmos-sdk/pruning" - pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" + protoio "github.com/cosmos/gogoproto/io" + gogotypes "github.com/cosmos/gogoproto/types" iavltree "github.com/cosmos/iavl" - protoio "github.com/gogo/protobuf/io" - gogotypes "github.com/gogo/protobuf/types" "github.com/pkg/errors" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/proto/tendermint/crypto" dbm "github.com/tendermint/tm-db" + "github.com/cosmos/cosmos-sdk/pruning" + pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" + snapshottypes "github.com/cosmos/cosmos-sdk/snapshots/types" "github.com/cosmos/cosmos-sdk/store/cachemulti" "github.com/cosmos/cosmos-sdk/store/dbadapter" diff --git a/store/types/commit_info.pb.go b/store/types/commit_info.pb.go index 988804d2f307..d18987954efd 100644 --- a/store/types/commit_info.pb.go +++ b/store/types/commit_info.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/store/types/listening.pb.go b/store/types/listening.pb.go index 47d5a23a8367..7d144f0d674d 100644 --- a/store/types/listening.pb.go +++ b/store/types/listening.pb.go @@ -5,7 +5,7 @@ package types import ( fmt "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/tests/mocks/grpc_server.go b/tests/mocks/grpc_server.go index df4372c4bc9a..15ac3d877448 100644 --- a/tests/mocks/grpc_server.go +++ b/tests/mocks/grpc_server.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/gogo/protobuf/grpc (interfaces: Server) +// Source: github.com/cosmos/gogoproto/grpc (interfaces: Server) // Package mocks is a generated GoMock package. package mocks diff --git a/testutil/context.go b/testutil/context.go index bf1ef78a5471..3d70a36fc5bb 100644 --- a/testutil/context.go +++ b/testutil/context.go @@ -1,11 +1,15 @@ package testutil import ( + "testing" + + "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" "github.com/cosmos/cosmos-sdk/store" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -13,13 +17,38 @@ import ( func DefaultContext(key sdk.StoreKey, tkey sdk.StoreKey) sdk.Context { db := dbm.NewMemDB() cms := store.NewCommitMultiStore(db, log.NewNopLogger()) + cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) cms.MountStoreWithDB(tkey, sdk.StoreTypeTransient, db) - err := cms.LoadLatestVersion() - if err != nil { + + if err := cms.LoadLatestVersion(); err != nil { panic(err) } - ctx := sdk.NewContext(cms, tmproto.Header{}, false, log.NewNopLogger()) + ctx := sdk.NewContext(cms, tmproto.Header{}, false, log.NewNopLogger()) return ctx } + +type TestContext struct { + Ctx sdk.Context + DB *dbm.MemDB + CMS store.CommitMultiStore +} + +func DefaultContextWithDB(t *testing.T, keys, tKeys []storetypes.StoreKey) TestContext { + db := dbm.NewMemDB() + cms := store.NewCommitMultiStore(db, log.NewNopLogger()) + + for _, key := range keys { + cms.MountStoreWithDB(key, storetypes.StoreTypeIAVL, db) + } + + for _, tKey := range tKeys { + cms.MountStoreWithDB(tKey, storetypes.StoreTypeTransient, db) + } + + require.NoError(t, cms.LoadLatestVersion()) + ctx := sdk.NewContext(cms, tmproto.Header{}, false, log.NewNopLogger()) + + return TestContext{ctx, db, cms} +} diff --git a/testutil/testdata/animal.go b/testutil/testdata/animal.go index 96981a40b9b4..a291ac333f86 100644 --- a/testutil/testdata/animal.go +++ b/testutil/testdata/animal.go @@ -6,7 +6,7 @@ package testdata import ( "fmt" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" ) diff --git a/testutil/testdata/buf.gen.yaml b/testutil/testdata/buf.gen.yaml new file mode 100644 index 000000000000..d7d17bbb26f8 --- /dev/null +++ b/testutil/testdata/buf.gen.yaml @@ -0,0 +1,5 @@ +version: v1 +plugins: + - name: gocosmos + out: ../.. + opt: plugins=grpc,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types diff --git a/testutil/testdata/buf.lock b/testutil/testdata/buf.lock new file mode 100644 index 000000000000..88709c98ef99 --- /dev/null +++ b/testutil/testdata/buf.lock @@ -0,0 +1,11 @@ +# 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: gogo-proto + commit: 34d970b699f84aa382f3c29773a60836 diff --git a/testutil/testdata/buf.yaml b/testutil/testdata/buf.yaml new file mode 100644 index 000000000000..e6f82c0cdcd7 --- /dev/null +++ b/testutil/testdata/buf.yaml @@ -0,0 +1,4 @@ +version: v1 +deps: + - buf.build/cosmos/gogo-proto + - buf.build/cosmos/cosmos-proto diff --git a/testutil/testdata/grpc_query.go b/testutil/testdata/grpc_query.go index 6e2b64152995..d4f34319d3c5 100644 --- a/testutil/testdata/grpc_query.go +++ b/testutil/testdata/grpc_query.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" ) diff --git a/testutil/testdata/query.pb.go b/testutil/testdata/query.pb.go index e7d38dc7ceb8..2127724e24fa 100644 --- a/testutil/testdata/query.pb.go +++ b/testutil/testdata/query.pb.go @@ -7,8 +7,8 @@ import ( context "context" fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/testutil/testdata/testdata.pb.go b/testutil/testdata/testdata.pb.go index 400e64936810..51db80c5515f 100644 --- a/testutil/testdata/testdata.pb.go +++ b/testutil/testdata/testdata.pb.go @@ -6,8 +6,8 @@ package testdata import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/testutil/testdata/tx.pb.go b/testutil/testdata/tx.pb.go index 694a045fffae..d291b1ee1563 100644 --- a/testutil/testdata/tx.pb.go +++ b/testutil/testdata/tx.pb.go @@ -6,9 +6,9 @@ package testdata import ( context "context" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/testutil/testdata/unknonwnproto.pb.go b/testutil/testdata/unknonwnproto.pb.go index eb4abf1fff10..7e9f2b13039a 100644 --- a/testutil/testdata/unknonwnproto.pb.go +++ b/testutil/testdata/unknonwnproto.pb.go @@ -8,8 +8,8 @@ import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" tx "github.com/cosmos/cosmos-sdk/types/tx" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -715,6 +715,7 @@ type Customer3 struct { Surcharge float32 `protobuf:"fixed32,4,opt,name=surcharge,proto3" json:"surcharge,omitempty"` Destination string `protobuf:"bytes,5,opt,name=destination,proto3" json:"destination,omitempty"` // Types that are valid to be assigned to Payment: + // // *Customer3_CreditCardNo // *Customer3_ChequeNo Payment isCustomer3_Payment `protobuf_oneof:"payment"` @@ -848,6 +849,7 @@ type TestVersion1 struct { C []*TestVersion1 `protobuf:"bytes,4,rep,name=c,proto3" json:"c,omitempty"` D []TestVersion1 `protobuf:"bytes,5,rep,name=d,proto3" json:"d"` // Types that are valid to be assigned to Sum: + // // *TestVersion1_E // *TestVersion1_F Sum isTestVersion1_Sum `protobuf_oneof:"sum"` @@ -992,6 +994,7 @@ type TestVersion2 struct { C []*TestVersion2 `protobuf:"bytes,4,rep,name=c,proto3" json:"c,omitempty"` D []*TestVersion2 `protobuf:"bytes,5,rep,name=d,proto3" json:"d,omitempty"` // Types that are valid to be assigned to Sum: + // // *TestVersion2_E // *TestVersion2_F Sum isTestVersion2_Sum `protobuf_oneof:"sum"` @@ -1144,6 +1147,7 @@ type TestVersion3 struct { C []*TestVersion3 `protobuf:"bytes,4,rep,name=c,proto3" json:"c,omitempty"` D []*TestVersion3 `protobuf:"bytes,5,rep,name=d,proto3" json:"d,omitempty"` // Types that are valid to be assigned to Sum: + // // *TestVersion3_E // *TestVersion3_F Sum isTestVersion3_Sum `protobuf_oneof:"sum"` @@ -1296,6 +1300,7 @@ type TestVersion3LoneOneOfValue struct { C []*TestVersion3 `protobuf:"bytes,4,rep,name=c,proto3" json:"c,omitempty"` D []*TestVersion3 `protobuf:"bytes,5,rep,name=d,proto3" json:"d,omitempty"` // Types that are valid to be assigned to Sum: + // // *TestVersion3LoneOneOfValue_E Sum isTestVersion3LoneOneOfValue_Sum `protobuf_oneof:"sum"` G *types.Any `protobuf:"bytes,8,opt,name=g,proto3" json:"g,omitempty"` @@ -1435,6 +1440,7 @@ type TestVersion3LoneNesting struct { C []*TestVersion3 `protobuf:"bytes,4,rep,name=c,proto3" json:"c,omitempty"` D []*TestVersion3 `protobuf:"bytes,5,rep,name=d,proto3" json:"d,omitempty"` // Types that are valid to be assigned to Sum: + // // *TestVersion3LoneNesting_F Sum isTestVersion3LoneNesting_Sum `protobuf_oneof:"sum"` G *types.Any `protobuf:"bytes,8,opt,name=g,proto3" json:"g,omitempty"` @@ -1822,6 +1828,7 @@ type TestVersion4LoneNesting struct { C []*TestVersion3 `protobuf:"bytes,4,rep,name=c,proto3" json:"c,omitempty"` D []*TestVersion3 `protobuf:"bytes,5,rep,name=d,proto3" json:"d,omitempty"` // Types that are valid to be assigned to Sum: + // // *TestVersion4LoneNesting_F Sum isTestVersion4LoneNesting_Sum `protobuf_oneof:"sum"` G *types.Any `protobuf:"bytes,8,opt,name=g,proto3" json:"g,omitempty"` @@ -2206,6 +2213,7 @@ type TestVersionFD1 struct { X int64 `protobuf:"varint,1,opt,name=x,proto3" json:"x,omitempty"` A *TestVersion1 `protobuf:"bytes,2,opt,name=a,proto3" json:"a,omitempty"` // Types that are valid to be assigned to Sum: + // // *TestVersionFD1_E // *TestVersionFD1_F Sum isTestVersionFD1_Sum `protobuf_oneof:"sum"` @@ -2323,6 +2331,7 @@ type TestVersionFD1WithExtraAny struct { X int64 `protobuf:"varint,1,opt,name=x,proto3" json:"x,omitempty"` A *TestVersion1 `protobuf:"bytes,2,opt,name=a,proto3" json:"a,omitempty"` // Types that are valid to be assigned to Sum: + // // *TestVersionFD1WithExtraAny_E // *TestVersionFD1WithExtraAny_F Sum isTestVersionFD1WithExtraAny_Sum `protobuf_oneof:"sum"` diff --git a/testutil/testdata/unknonwnproto.proto b/testutil/testdata/unknonwnproto.proto index 7bf1ce6bba71..ecfa0cbe893f 100644 --- a/testutil/testdata/unknonwnproto.proto +++ b/testutil/testdata/unknonwnproto.proto @@ -101,9 +101,10 @@ message Customer3 { } message TestVersion1 { - int64 x = 1; - TestVersion1 a = 2; - TestVersion1 b = 3; // [(gogoproto.nullable) = false] generates invalid recursive structs; + int64 x = 1; + TestVersion1 a = 2; + TestVersion1 b = + 3; // [(gogoproto.nullable) = false] generates invalid recursive structs; repeated TestVersion1 c = 4; repeated TestVersion1 d = 5 [(gogoproto.nullable) = false]; oneof sum { @@ -111,7 +112,7 @@ message TestVersion1 { TestVersion1 f = 7; } google.protobuf.Any g = 8; - repeated TestVersion1 h = 9; // [(gogoproto.castrepeated) = "TestVersion1"]; + repeated TestVersion1 h = 9; // [(gogoproto.castrepeated) = "TestVersion1"]; // google.protobuf.Timestamp i = 10; // google.protobuf.Timestamp j = 11; // [(gogoproto.stdtime) = true]; Customer1 k = 12 [(gogoproto.embed) = true]; @@ -119,15 +120,15 @@ message TestVersion1 { message TestVersion2 { int64 x = 1; TestVersion2 a = 2; - TestVersion2 b = 3; // [(gogoproto.nullable) = false]; + TestVersion2 b = 3; // [(gogoproto.nullable) = false]; repeated TestVersion2 c = 4; - repeated TestVersion2 d = 5; // [(gogoproto.nullable) = false]; + repeated TestVersion2 d = 5; // [(gogoproto.nullable) = false]; oneof sum { int32 e = 6; TestVersion2 f = 7; } google.protobuf.Any g = 8; - repeated TestVersion1 h = 9; // [(gogoproto.castrepeated) = "TestVersion1"]; + repeated TestVersion1 h = 9; // [(gogoproto.castrepeated) = "TestVersion1"]; // google.protobuf.Timestamp i = 10; // google.protobuf.Timestamp j = 11; // [(gogoproto.stdtime) = true]; Customer1 k = 12 [(gogoproto.embed) = true]; @@ -136,15 +137,15 @@ message TestVersion2 { message TestVersion3 { int64 x = 1; TestVersion3 a = 2; - TestVersion3 b = 3; // [(gogoproto.nullable) = false]; + TestVersion3 b = 3; // [(gogoproto.nullable) = false]; repeated TestVersion3 c = 4; - repeated TestVersion3 d = 5; // [(gogoproto.nullable) = false]; + repeated TestVersion3 d = 5; // [(gogoproto.nullable) = false]; oneof sum { int32 e = 6; TestVersion3 f = 7; } google.protobuf.Any g = 8; - repeated TestVersion1 h = 9; //[(gogoproto.castrepeated) = "TestVersion1"]; + repeated TestVersion1 h = 9; //[(gogoproto.castrepeated) = "TestVersion1"]; // google.protobuf.Timestamp i = 10; // google.protobuf.Timestamp j = 11; // [(gogoproto.stdtime) = true]; Customer1 k = 12 [(gogoproto.embed) = true]; @@ -154,14 +155,14 @@ message TestVersion3 { message TestVersion3LoneOneOfValue { int64 x = 1; TestVersion3 a = 2; - TestVersion3 b = 3; // [(gogoproto.nullable) = false]; + TestVersion3 b = 3; // [(gogoproto.nullable) = false]; repeated TestVersion3 c = 4; - repeated TestVersion3 d = 5; // [(gogoproto.nullable) = false]; + repeated TestVersion3 d = 5; // [(gogoproto.nullable) = false]; oneof sum { int32 e = 6; } google.protobuf.Any g = 8; - repeated TestVersion1 h = 9; //[(gogoproto.castrepeated) = "TestVersion1"]; + repeated TestVersion1 h = 9; //[(gogoproto.castrepeated) = "TestVersion1"]; // google.protobuf.Timestamp i = 10; // google.protobuf.Timestamp j = 11; // [(gogoproto.stdtime) = true]; Customer1 k = 12 [(gogoproto.embed) = true]; @@ -171,14 +172,14 @@ message TestVersion3LoneOneOfValue { message TestVersion3LoneNesting { int64 x = 1; TestVersion3 a = 2; - TestVersion3 b = 3; // [(gogoproto.nullable) = false]; + TestVersion3 b = 3; // [(gogoproto.nullable) = false]; repeated TestVersion3 c = 4; - repeated TestVersion3 d = 5; // [(gogoproto.nullable) = false]; + repeated TestVersion3 d = 5; // [(gogoproto.nullable) = false]; oneof sum { TestVersion3LoneNesting f = 7; } google.protobuf.Any g = 8; - repeated TestVersion1 h = 9; //[(gogoproto.castrepeated) = "TestVersion1"]; + repeated TestVersion1 h = 9; //[(gogoproto.castrepeated) = "TestVersion1"]; // google.protobuf.Timestamp i = 10; // google.protobuf.Timestamp j = 11; // [(gogoproto.stdtime) = true]; Customer1 k = 12 [(gogoproto.embed) = true]; @@ -212,14 +213,14 @@ message TestVersion3LoneNesting { message TestVersion4LoneNesting { int64 x = 1; TestVersion3 a = 2; - TestVersion3 b = 3; // [(gogoproto.nullable) = false]; + TestVersion3 b = 3; // [(gogoproto.nullable) = false]; repeated TestVersion3 c = 4; - repeated TestVersion3 d = 5; // [(gogoproto.nullable) = false]; + repeated TestVersion3 d = 5; // [(gogoproto.nullable) = false]; oneof sum { TestVersion3LoneNesting f = 7; } google.protobuf.Any g = 8; - repeated TestVersion1 h = 9; //[(gogoproto.castrepeated) = "TestVersion1"]; + repeated TestVersion1 h = 9; //[(gogoproto.castrepeated) = "TestVersion1"]; // google.protobuf.Timestamp i = 10; // google.protobuf.Timestamp j = 11; // [(gogoproto.stdtime) = true]; Customer1 k = 12 [(gogoproto.embed) = true]; @@ -258,7 +259,7 @@ message TestVersionFD1 { TestVersion1 f = 7; } google.protobuf.Any g = 8; - repeated TestVersion1 h = 9; // [(gogoproto.castrepeated) = "TestVersion1"]; + repeated TestVersion1 h = 9; // [(gogoproto.castrepeated) = "TestVersion1"]; } message TestVersionFD1WithExtraAny { @@ -269,7 +270,7 @@ message TestVersionFD1WithExtraAny { TestVersion1 f = 7; } AnyWithExtra g = 8; - repeated TestVersion1 h = 9; // [(gogoproto.castrepeated) = "TestVersion1"]; + repeated TestVersion1 h = 9; // [(gogoproto.castrepeated) = "TestVersion1"]; } message AnyWithExtra { diff --git a/third_party/proto/confio/proofs.proto b/third_party/proto/confio/proofs.proto deleted file mode 100644 index da43503ecbd6..000000000000 --- a/third_party/proto/confio/proofs.proto +++ /dev/null @@ -1,234 +0,0 @@ -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. - NO_HASH = 0; - SHA256 = 1; - SHA512 = 2; - KECCAK = 3; - RIPEMD160 = 4; - BITCOIN = 5; // ripemd160(sha256(x)) -} - -/** -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_proto/cosmos.proto b/third_party/proto/cosmos_proto/cosmos.proto deleted file mode 100644 index 167b170757bc..000000000000 --- 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 49e78f99fe57..000000000000 --- 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 85c361b47fed..000000000000 --- 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 2bd3a19bfa54..000000000000 --- 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 4428515c1209..000000000000 --- 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 58b511583a8b..000000000000 --- 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/types/abci.go b/types/abci.go index 8f71362eda6d..5061032a3f80 100644 --- a/types/abci.go +++ b/types/abci.go @@ -19,3 +19,9 @@ type EndBlocker func(ctx Context, req abci.RequestEndBlock) abci.ResponseEndBloc // PeerFilter responds to p2p filtering queries from Tendermint type PeerFilter func(info string) abci.ResponseQuery + +// ProcessProposalHandler defines a function type alias for processing a proposer +type ProcessProposalHandler func(Context, abci.RequestProcessProposal) abci.ResponseProcessProposal + +// PrepareProposalHandler defines a function type alias for preparing a proposal +type PrepareProposalHandler func(Context, abci.RequestPrepareProposal) abci.ResponsePrepareProposal diff --git a/types/abci.pb.go b/types/abci.pb.go index 2e5a4604a7a4..e07b56d5f243 100644 --- a/types/abci.pb.go +++ b/types/abci.pb.go @@ -6,8 +6,8 @@ package types import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" types1 "github.com/tendermint/tendermint/abci/types" io "io" math "math" diff --git a/types/coin.pb.go b/types/coin.pb.go index df8d34d4f9d5..340b245a3158 100644 --- a/types/coin.pb.go +++ b/types/coin.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/types/context.go b/types/context.go index 642f371a99f7..bc1f2dd8aa09 100644 --- a/types/context.go +++ b/types/context.go @@ -4,7 +4,7 @@ import ( "context" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" abci "github.com/tendermint/tendermint/abci/types" tmbytes "github.com/tendermint/tendermint/libs/bytes" "github.com/tendermint/tendermint/libs/log" @@ -37,7 +37,7 @@ type Context struct { checkTx bool recheckTx bool // if recheckTx == true, then checkTx must also be true minGasPrice DecCoins - consParams *abci.ConsensusParams + consParams *tmproto.ConsensusParams eventManager *EventManager } @@ -74,13 +74,13 @@ func (c Context) HeaderHash() tmbytes.HexBytes { return hash } -func (c Context) ConsensusParams() *abci.ConsensusParams { - return proto.Clone(c.consParams).(*abci.ConsensusParams) +func (c Context) ConsensusParams() *tmproto.ConsensusParams { + return proto.Clone(c.consParams).(*tmproto.ConsensusParams) } // create a new context func NewContext(ms MultiStore, header tmproto.Header, isCheckTx bool, logger log.Logger) Context { - // https://github.com/gogo/protobuf/issues/519 + // https://github.com/cosmos/gogoproto/issues/519 header.Time = header.Time.UTC() return Context{ ctx: context.Background(), @@ -109,7 +109,7 @@ func (c Context) WithMultiStore(ms MultiStore) Context { // WithBlockHeader returns a Context with an updated tendermint block header in UTC time. func (c Context) WithBlockHeader(header tmproto.Header) Context { - // https://github.com/gogo/protobuf/issues/519 + // https://github.com/cosmos/gogoproto/issues/519 header.Time = header.Time.UTC() c.header = header return c @@ -127,7 +127,7 @@ func (c Context) WithHeaderHash(hash []byte) Context { // WithBlockTime returns a Context with an updated tendermint block header time in UTC time func (c Context) WithBlockTime(newTime time.Time) Context { newHeader := c.BlockHeader() - // https://github.com/gogo/protobuf/issues/519 + // https://github.com/cosmos/gogoproto/issues/519 newHeader.Time = newTime.UTC() return c.WithBlockHeader(newHeader) } @@ -211,7 +211,7 @@ func (c Context) WithMinGasPrices(gasPrices DecCoins) Context { } // WithConsensusParams returns a Context with an updated consensus params -func (c Context) WithConsensusParams(params *abci.ConsensusParams) Context { +func (c Context) WithConsensusParams(params *tmproto.ConsensusParams) Context { c.consParams = params return c } @@ -229,9 +229,12 @@ func (c Context) IsZero() bool { // WithValue is deprecated, provided for backwards compatibility // Please use -// ctx = ctx.WithContext(context.WithValue(ctx.Context(), key, false)) +// +// ctx = ctx.WithContext(context.WithValue(ctx.Context(), key, false)) +// // instead of -// ctx = ctx.WithValue(key, false) +// +// ctx = ctx.WithValue(key, false) func (c Context) WithValue(key, value interface{}) Context { c.ctx = context.WithValue(c.ctx, key, value) return c @@ -239,9 +242,12 @@ func (c Context) WithValue(key, value interface{}) Context { // Value is deprecated, provided for backwards compatibility // Please use -// ctx.Context().Value(key) +// +// ctx.Context().Value(key) +// // instead of -// ctx.Value(key) +// +// ctx.Value(key) func (c Context) Value(key interface{}) interface{} { return c.ctx.Value(key) } diff --git a/types/context_test.go b/types/context_test.go index 9533a52ee2e3..3052890a3f0c 100644 --- a/types/context_test.go +++ b/types/context_test.go @@ -127,7 +127,7 @@ func (s *contextTestSuite) TestContextWithCustom() { // test consensus param s.Require().Nil(ctx.ConsensusParams()) - cp := &abci.ConsensusParams{} + cp := &tmproto.ConsensusParams{} s.Require().Equal(cp, ctx.WithConsensusParams(cp).ConsensusParams()) // test inner context diff --git a/types/events.go b/types/events.go index 2239bab86c28..bd96f2177855 100644 --- a/types/events.go +++ b/types/events.go @@ -7,8 +7,8 @@ import ( "sort" "strings" - "github.com/gogo/protobuf/jsonpb" - proto "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/jsonpb" + proto "github.com/cosmos/gogoproto/proto" abci "github.com/tendermint/tendermint/abci/types" "github.com/cosmos/cosmos-sdk/codec" @@ -100,8 +100,8 @@ func TypedEventToEvent(tev proto.Message) (Event, error) { attrs := make([]abci.EventAttribute, 0, len(attrMap)) for k, v := range attrMap { attrs = append(attrs, abci.EventAttribute{ - Key: []byte(k), - Value: v, + Key: k, + Value: string(v), }) } @@ -132,7 +132,7 @@ func ParseTypedEvent(event abci.Event) (proto.Message, error) { attrMap := make(map[string]json.RawMessage) for _, attr := range event.Attributes { - attrMap[string(attr.Key)] = attr.Value + attrMap[attr.Key] = json.RawMessage(attr.Value) } attrBytes, err := json.Marshal(attrMap) @@ -191,7 +191,7 @@ func (a Attribute) String() string { // ToKVPair converts an Attribute object into a Tendermint key/value pair. func (a Attribute) ToKVPair() abci.EventAttribute { - return abci.EventAttribute{Key: []byte(a.Key), Value: []byte(a.Value)} + return abci.EventAttribute{Key: a.Key, Value: a.Value} } // AppendAttributes adds one or more attributes to an Event. diff --git a/types/events_test.go b/types/events_test.go index 2f2bacce8816..55ee07f62468 100644 --- a/types/events_test.go +++ b/types/events_test.go @@ -141,15 +141,15 @@ func (s *eventsTestSuite) TestMarkEventsToIndex() { { Type: "message", Attributes: []abci.EventAttribute{ - {Key: []byte("sender"), Value: []byte("foo")}, - {Key: []byte("recipient"), Value: []byte("bar")}, + {Key: "sender", Value: "foo"}, + {Key: "recipient", Value: "bar"}, }, }, { Type: "staking", Attributes: []abci.EventAttribute{ - {Key: []byte("deposit"), Value: []byte("5")}, - {Key: []byte("unbond"), Value: []byte("10")}, + {Key: "deposit", Value: "5"}, + {Key: "unbond", Value: "10"}, }, }, } @@ -165,15 +165,15 @@ func (s *eventsTestSuite) TestMarkEventsToIndex() { { Type: "message", Attributes: []abci.EventAttribute{ - {Key: []byte("sender"), Value: []byte("foo"), Index: true}, - {Key: []byte("recipient"), Value: []byte("bar"), Index: true}, + {Key: "sender", Value: "foo", Index: true}, + {Key: "recipient", Value: "bar", Index: true}, }, }, { Type: "staking", Attributes: []abci.EventAttribute{ - {Key: []byte("deposit"), Value: []byte("5"), Index: true}, - {Key: []byte("unbond"), Value: []byte("10"), Index: true}, + {Key: "deposit", Value: "5", Index: true}, + {Key: "unbond", Value: "10", Index: true}, }, }, }, @@ -185,15 +185,15 @@ func (s *eventsTestSuite) TestMarkEventsToIndex() { { Type: "message", Attributes: []abci.EventAttribute{ - {Key: []byte("sender"), Value: []byte("foo"), Index: true}, - {Key: []byte("recipient"), Value: []byte("bar")}, + {Key: "sender", Value: "foo", Index: true}, + {Key: "recipient", Value: "bar"}, }, }, { Type: "staking", Attributes: []abci.EventAttribute{ - {Key: []byte("deposit"), Value: []byte("5"), Index: true}, - {Key: []byte("unbond"), Value: []byte("10")}, + {Key: "deposit", Value: "5", Index: true}, + {Key: "unbond", Value: "10"}, }, }, }, @@ -208,15 +208,15 @@ func (s *eventsTestSuite) TestMarkEventsToIndex() { { Type: "message", Attributes: []abci.EventAttribute{ - {Key: []byte("sender"), Value: []byte("foo"), Index: true}, - {Key: []byte("recipient"), Value: []byte("bar"), Index: true}, + {Key: "sender", Value: "foo", Index: true}, + {Key: "recipient", Value: "bar", Index: true}, }, }, { Type: "staking", Attributes: []abci.EventAttribute{ - {Key: []byte("deposit"), Value: []byte("5"), Index: true}, - {Key: []byte("unbond"), Value: []byte("10"), Index: true}, + {Key: "deposit", Value: "5", Index: true}, + {Key: "unbond", Value: "10", Index: true}, }, }, }, diff --git a/types/kv/kv.pb.go b/types/kv/kv.pb.go index eedb948bf5ae..f03111ef6f9f 100644 --- a/types/kv/kv.pb.go +++ b/types/kv/kv.pb.go @@ -5,8 +5,8 @@ package kv import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/types/mempool/mempool.go b/types/mempool/mempool.go new file mode 100644 index 000000000000..3413d7cc9f8f --- /dev/null +++ b/types/mempool/mempool.go @@ -0,0 +1,42 @@ +package mempool + +import ( + "errors" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +type Mempool interface { + // Insert attempts to insert a Tx into the app-side mempool returning + // an error upon failure. + Insert(sdk.Context, sdk.Tx) error + + // Select returns an Iterator over the app-side mempool. If txs are specified, + // then they shall be incorporated into the Iterator. The Iterator must + // closed by the caller. + Select(sdk.Context, [][]byte) Iterator + + // CountTx returns the number of transactions currently in the mempool. + CountTx() int + + // Remove attempts to remove a transaction from the mempool, returning an error + // upon failure. + Remove(sdk.Tx) error +} + +// Iterator defines an app-side mempool iterator interface that is as minimal as +// possible. The order of iteration is determined by the app-side mempool +// implementation. +type Iterator interface { + // Next returns the next transaction from the mempool. If there are no more + // transactions, it returns nil. + Next() Iterator + + // Tx returns the transaction at the current position of the iterator. + Tx() sdk.Tx +} + +var ( + ErrTxNotFound = errors.New("tx not found in mempool") + ErrMempoolTxMaxCapacity = errors.New("pool reached max tx capacity") +) diff --git a/types/mempool/mempool_test.go b/types/mempool/mempool_test.go new file mode 100644 index 000000000000..c8d97dd6c00c --- /dev/null +++ b/types/mempool/mempool_test.go @@ -0,0 +1,228 @@ +package mempool_test + +import ( + "fmt" + "math/rand" + "testing" + + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/simapp" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/mempool" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + txsigning "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/cosmos/cosmos-sdk/x/auth/signing" +) + +var ( + msgWithdrawDelegatorReward = []byte("{\"body\":{\"messages\":[{\"@type\":\"\\/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward\",\"delegator_address\":\"cosmos16w6g0whmw703t8h2m9qmq2fd9dwaw6fjszzjsw\",\"validator_address\":\"cosmosvaloper1lzhlnpahvznwfv4jmay2tgaha5kmz5qxerarrl\"},{\"@type\":\"\\/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward\",\"delegator_address\":\"cosmos16w6g0whmw703t8h2m9qmq2fd9dwaw6fjszzjsw\",\"validator_address\":\"cosmosvaloper1sjllsnramtg3ewxqwwrwjxfgc4n4ef9u2lcnj0\"},{\"@type\":\"\\/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward\",\"delegator_address\":\"cosmos16w6g0whmw703t8h2m9qmq2fd9dwaw6fjszzjsw\",\"validator_address\":\"cosmosvaloper196ax4vc0lwpxndu9dyhvca7jhxp70rmcvrj90c\"},{\"@type\":\"\\/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward\",\"delegator_address\":\"cosmos16w6g0whmw703t8h2m9qmq2fd9dwaw6fjszzjsw\",\"validator_address\":\"cosmosvaloper1k2d9ed9vgfuk2m58a2d80q9u6qljkh4vfaqjfq\"},{\"@type\":\"\\/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward\",\"delegator_address\":\"cosmos16w6g0whmw703t8h2m9qmq2fd9dwaw6fjszzjsw\",\"validator_address\":\"cosmosvaloper1vygmh344ldv9qefss9ek7ggsnxparljlmj56q5\"},{\"@type\":\"\\/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward\",\"delegator_address\":\"cosmos16w6g0whmw703t8h2m9qmq2fd9dwaw6fjszzjsw\",\"validator_address\":\"cosmosvaloper1ej2es5fjztqjcd4pwa0zyvaevtjd2y5wxxp9gd\"}],\"memo\":\"\",\"timeout_height\":\"0\",\"extension_options\":[],\"non_critical_extension_options\":[]},\"auth_info\":{\"signer_infos\":[{\"public_key\":{\"@type\":\"\\/cosmos.crypto.secp256k1.PubKey\",\"key\":\"AmbXAy10a0SerEefTYQzqyGQdX5kiTEWJZ1PZKX1oswX\"},\"mode_info\":{\"single\":{\"mode\":\"SIGN_MODE_LEGACY_AMINO_JSON\"}},\"sequence\":\"119\"}],\"fee\":{\"amount\":[{\"denom\":\"uatom\",\"amount\":\"15968\"}],\"gas_limit\":\"638717\",\"payer\":\"\",\"granter\":\"\"}},\"signatures\":[\"ji+inUo4xGlN9piRQLdLCeJWa7irwnqzrMVPcmzJyG5y6NPc+ZuNaIc3uvk5NLDJytRB8AHX0GqNETR\\/Q8fz4Q==\"]}") + msgMultiSigMsgSubmitProposal = []byte("{\"body\":{\"messages\":[{\"@type\":\"\\/cosmos.gov.v1beta1.MsgSubmitProposal\",\"content\":{\"@type\":\"\\/cosmos.distribution.v1beta1.CommunityPoolSpendProposal\",\"title\":\"ATOM \\ud83e\\udd1d Osmosis: Allocate Community Pool to ATOM Liquidity Incentives\",\"description\":\"ATOMs should be the base money of Cosmos, just like ETH is the base money of the entire Ethereum DeFi ecosystem. ATOM is currently well positioned to play this role among Cosmos assets because it has the highest market cap, most liquidity, largest brand, and many integrations with fiat onramps. ATOM is the gateway to Cosmos.\\n\\nIn the Cosmos Hub Port City vision, ATOMs are pitched as equity in the Cosmos Hub. However, this alone is insufficient to establish ATOM as the base currency of the Cosmos ecosystem as a whole. Instead, the ATOM community must work to actively promote the use of ATOMs throughout the Cosmos ecosystem, rather than passively relying on the Hub's reputation to create ATOM's value.\\n\\nIn order to cement the role of ATOMs in Cosmos DeFi, the Cosmos Hub should leverage its community pool to help align incentives with other protocols within the Cosmos ecosystem. We propose beginning this initiative by using the community pool ATOMs to incentivize deep ATOM base pair liquidity pools on the Osmosis Network.\\n\\nOsmosis is the first IBC-enabled DeFi application. Within its 3 weeks of existence, it has already 100x\\u2019d the number of IBC transactions ever created, demonstrating the power of IBC and the ability of the Cosmos SDK to bootstrap DeFi protocols with $100M+ TVL in a short period of time. Since its announcement Osmosis has helped bring renewed attention and interest to Cosmos from the crypto community at large and kickstarted the era of Cosmos DeFi.\\n\\nOsmosis has already helped in establishing ATOM as the Schelling Point of the Cosmos ecosystem. The genesis distribution of OSMO was primarily based on an airdrop to ATOM holders specifically, acknowledging the importance of ATOM to all future projects within the Cosmos. Furthermore, the Osmosis LP rewards currently incentivize ATOMs to be one of the main base pairs of the platform.\\n\\nOsmosis has the ability to incentivize AMM liquidity, a feature not available on any other IBC-enabled DEX. Osmosis already uses its own native OSMO liquidity rewards to incentivize ATOMs to be one of the main base pairs, leading to ~2.2 million ATOMs already providing liquidity on the platform.\\n\\nIn addition to these native OSMO LP Rewards, the platform also includes a feature called \\u201cexternal incentives\\u201d that allows anyone to permissionlessly add additional incentives in any token to the LPs of any AMM pools they wish. You can read more about this mechanism here: https:\\/\\/medium.com\\/osmosis\\/osmosis-liquidity-mining-101-2fa58d0e9d4d#f413 . Pools containing Cosmos assets such as AKT and XPRT are already planned to receive incentives from their respective community pools and\\/or foundations.\\n\\nWe propose the Cosmos Hub dedicate 100,000 ATOMs from its Community Pool to be allocated towards liquidity incentives on Osmosis over the next 3 months. This community fund proposal will transfer 100,000 ATOMs to a multisig group who will then allocate the ATOMs to bonded liquidity gauges on Osmosis on a biweekly basis, according to direction given by Cosmos Hub governance. For simplicity, we propose setting the liquidity incentives to initially point to Osmosis Pool #1, the ATOM\\/OSMO pool, which is the pool with by far the highest TVL and Volume. Cosmos Hub governance can then use Text Proposals to further direct the multisig members to reallocate incentives to new pools.\\n\\nThe multisig will consist of a 2\\/3 key holder set consisting of the following individuals whom have all agreed to participate in this process shall this proposal pass:\\n\\n- Zaki Manian\\n- Federico Kunze\\n- Marko Baricevic\\n\\nThis is one small step for the Hub, but one giant leap for ATOM-aligned.\\n\",\"recipient\":\"cosmos157n0d38vwn5dvh64rc39q3lyqez0a689g45rkc\",\"amount\":[{\"denom\":\"uatom\",\"amount\":\"100000000000\"}]},\"initial_deposit\":[{\"denom\":\"uatom\",\"amount\":\"64000000\"}],\"proposer\":\"cosmos1ey69r37gfxvxg62sh4r0ktpuc46pzjrmz29g45\"}],\"memo\":\"\",\"timeout_height\":\"0\",\"extension_options\":[],\"non_critical_extension_options\":[]},\"auth_info\":{\"signer_infos\":[{\"public_key\":{\"@type\":\"\\/cosmos.crypto.multisig.LegacyAminoPubKey\",\"threshold\":2,\"public_keys\":[{\"@type\":\"\\/cosmos.crypto.secp256k1.PubKey\",\"key\":\"AldOvgv8dU9ZZzuhGydQD5FYreLhfhoBgrDKi8ZSTbCQ\"},{\"@type\":\"\\/cosmos.crypto.secp256k1.PubKey\",\"key\":\"AxUMR\\/GKoycWplR+2otzaQZ9zhHRQWJFt3h1bPg1ltha\"},{\"@type\":\"\\/cosmos.crypto.secp256k1.PubKey\",\"key\":\"AlI9yVj2Aejow6bYl2nTRylfU+9LjQLEl3keq0sERx9+\"},{\"@type\":\"\\/cosmos.crypto.secp256k1.PubKey\",\"key\":\"A0UvHPcvCCaIoFY9Ygh0Pxq9SZTAWtduOyinit\\/8uo+Q\"},{\"@type\":\"\\/cosmos.crypto.secp256k1.PubKey\",\"key\":\"As7R9fDUnwsUVLDr1cxspp+cY9UfXfUf7i9\\/w+N0EzKA\"}]},\"mode_info\":{\"multi\":{\"bitarray\":{\"extra_bits_stored\":5,\"elems\":\"SA==\"},\"mode_infos\":[{\"single\":{\"mode\":\"SIGN_MODE_LEGACY_AMINO_JSON\"}},{\"single\":{\"mode\":\"SIGN_MODE_LEGACY_AMINO_JSON\"}}]}},\"sequence\":\"102\"}],\"fee\":{\"amount\":[],\"gas_limit\":\"10000000\",\"payer\":\"\",\"granter\":\"\"}},\"signatures\":[\"CkB\\/KKWTFntEWbg1A0vu7DCHffJ4x4db\\/EI8dIVzRFFW7iuZBzvq+jYBtrcTlVpEVfmCY3ggIMnWfbMbb1egIlYbCkAmDf6Eaj1NbyXY8JZZtYAX3Qj81ZuKZUBeLW1ZvH1XqAg9sl\\/sqpLMnsJzKfmqEXvhoMwu1YxcSzrY6CJfuYL6\"]}") +) + +// testPubKey is a dummy implementation of PubKey used for testing. +type testPubKey struct { + address sdk.AccAddress +} + +func (t testPubKey) Reset() { panic("not implemented") } +func (t testPubKey) String() string { panic("not implemented") } +func (t testPubKey) ProtoMessage() { panic("not implemented") } +func (t testPubKey) Address() cryptotypes.Address { return t.address.Bytes() } +func (t testPubKey) Bytes() []byte { panic("not implemented") } +func (t testPubKey) VerifySignature(msg []byte, sig []byte) bool { panic("not implemented") } +func (t testPubKey) Equals(key cryptotypes.PubKey) bool { panic("not implemented") } +func (t testPubKey) Type() string { panic("not implemented") } + +// testTx is a dummy implementation of Tx used for testing. +type testTx struct { + id int + priority int64 + nonce uint64 + address sdk.AccAddress +} + +func (tx testTx) GetSigners() []sdk.AccAddress { panic("not implemented") } + +func (tx testTx) GetPubKeys() ([]cryptotypes.PubKey, error) { panic("not implemented") } + +func (tx testTx) GetSignaturesV2() (res []txsigning.SignatureV2, err error) { + res = append(res, txsigning.SignatureV2{ + PubKey: testPubKey{address: tx.address}, + Data: nil, + Sequence: tx.nonce, + }) + + return res, nil +} + +var ( + _ sdk.Tx = (*testTx)(nil) + _ signing.SigVerifiableTx = (*testTx)(nil) + _ cryptotypes.PubKey = (*testPubKey)(nil) +) + +func (tx testTx) GetMsgs() []sdk.Msg { return nil } + +func (tx testTx) ValidateBasic() error { return nil } + +func (tx testTx) String() string { + return fmt.Sprintf("tx a: %s, p: %d, n: %d", tx.address, tx.priority, tx.nonce) +} + +type sigErrTx struct { + getSigs func() ([]txsigning.SignatureV2, error) +} + +func (_ sigErrTx) Size() int64 { return 0 } +func (_ sigErrTx) GetMsgs() []sdk.Msg { return nil } +func (_ sigErrTx) ValidateBasic() error { return nil } +func (_ sigErrTx) GetSigners() []sdk.AccAddress { return nil } +func (_ sigErrTx) GetPubKeys() ([]cryptotypes.PubKey, error) { return nil, nil } +func (t sigErrTx) GetSignaturesV2() ([]txsigning.SignatureV2, error) { return t.getSigs() } + +type txSpec struct { + i int + p int + n int + a sdk.AccAddress +} + +func (tx txSpec) String() string { + return fmt.Sprintf("[tx i: %d, a: %s, p: %d, n: %d]", tx.i, tx.a, tx.p, tx.n) +} + +func fetchTxs(iterator mempool.Iterator, maxBytes int64) []sdk.Tx { + const txSize = 1 + var ( + txs []sdk.Tx + numBytes int64 + ) + for iterator != nil { + if numBytes += txSize; numBytes > maxBytes { + break + } + txs = append(txs, iterator.Tx()) + i := iterator.Next() + iterator = i + } + return txs +} + +func (s *MempoolTestSuite) TestDefaultMempool() { + t := s.T() + ctx := sdk.NewContext(nil, tmproto.Header{}, false, log.NewNopLogger()) + accounts := simtypes.RandomAccounts(rand.New(rand.NewSource(0)), 10) + txCount := 1000 + var txs []testTx + + for i := 0; i < txCount; i++ { + acc := accounts[i%len(accounts)] + tx := testTx{ + nonce: 0, + address: acc.Address, + priority: rand.Int63(), + } + txs = append(txs, tx) + } + + // empty mempool behavior + require.Equal(t, 0, s.mempool.CountTx()) + itr := s.mempool.Select(ctx, nil) + require.Nil(t, itr) + + // same sender-nonce just overwrites a tx + for _, tx := range txs { + err := s.mempool.Insert(ctx, tx) + require.NoError(t, err) + } + require.Equal(t, len(accounts), s.mempool.CountTx()) + + // distinct sender-nonce should not overwrite a tx + s.resetMempool() + for i, tx := range txs { + tx.nonce = uint64(i) + err := s.mempool.Insert(ctx, tx) + require.NoError(t, err) + } + require.Equal(t, txCount, s.mempool.CountTx()) + + itr = s.mempool.Select(ctx, nil) + sel := fetchTxs(itr, 13) + require.Equal(t, 13, len(sel)) + + // a tx which does not implement SigVerifiableTx should not be inserted + tx := &sigErrTx{getSigs: func() ([]txsigning.SignatureV2, error) { + return nil, fmt.Errorf("error") + }} + require.Error(t, s.mempool.Insert(ctx, tx)) + require.Error(t, s.mempool.Remove(tx)) + tx.getSigs = func() ([]txsigning.SignatureV2, error) { + return nil, nil + } + require.Error(t, s.mempool.Insert(ctx, tx)) + require.Error(t, s.mempool.Remove(tx)) + + // removing a tx not in the mempool should error + s.resetMempool() + require.NoError(t, s.mempool.Insert(ctx, txs[0])) + require.ErrorIs(t, s.mempool.Remove(txs[1]), mempool.ErrTxNotFound) + + // inserting a tx with a different priority should overwrite the old tx + newPriorityTx := testTx{ + address: txs[0].address, + priority: txs[0].priority + 1, + nonce: txs[0].nonce, + } + require.NoError(t, s.mempool.Insert(ctx, newPriorityTx)) + require.Equal(t, 1, s.mempool.CountTx()) +} + +type MempoolTestSuite struct { + suite.Suite + numTxs int + numAccounts int + iterations int + mempool mempool.Mempool +} + +func (s *MempoolTestSuite) resetMempool() { + s.iterations = 0 + s.mempool = mempool.NewSenderNonceMempool() +} + +func (s *MempoolTestSuite) SetupTest() { + s.numTxs = 1000 + s.numAccounts = 100 + s.resetMempool() +} + +func TestMempoolTestSuite(t *testing.T) { + suite.Run(t, new(MempoolTestSuite)) +} + +func (s *MempoolTestSuite) TestSampleTxs() { + ctxt := sdk.NewContext(nil, tmproto.Header{}, false, log.NewNopLogger()) + t := s.T() + s.resetMempool() + mp := s.mempool + delegatorTx, err := unmarshalTx(msgWithdrawDelegatorReward) + + require.NoError(t, err) + require.NoError(t, mp.Insert(ctxt, delegatorTx)) + require.Equal(t, 1, mp.CountTx()) + + proposalTx, err := unmarshalTx(msgMultiSigMsgSubmitProposal) + require.NoError(t, err) + require.NoError(t, mp.Insert(ctxt, proposalTx)) + require.Equal(t, 2, mp.CountTx()) +} + +func unmarshalTx(txBytes []byte) (sdk.Tx, error) { + cfg := simapp.MakeTestEncodingConfig() + return cfg.TxConfig.TxJSONDecoder()(txBytes) +} diff --git a/types/mempool/sender_nonce.go b/types/mempool/sender_nonce.go new file mode 100644 index 000000000000..82f5bbfc56f1 --- /dev/null +++ b/types/mempool/sender_nonce.go @@ -0,0 +1,233 @@ +package mempool + +import ( + crand "crypto/rand" // #nosec // crypto/rand is used for seed generation + "encoding/binary" + "fmt" + "math/rand" // #nosec // math/rand is used for random selection and seeded from crypto/rand + + "github.com/huandu/skiplist" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/signing" +) + +var ( + _ Mempool = (*senderNonceMempool)(nil) + _ Iterator = (*senderNonceMepoolIterator)(nil) +) + +var DefaultMaxTx = 0 + +// senderNonceMempool is a mempool that prioritizes transactions within a sender by nonce, the lowest first, +// but selects a random sender on each iteration. The mempool is iterated by: +// +// 1) Maintaining a separate list of nonce ordered txs per sender +// 2) For each select iteration, randomly choose a sender and pick the next nonce ordered tx from their list +// 3) Repeat 1,2 until the mempool is exhausted +// +// Note that PrepareProposal could choose to stop iteration before reaching the end if maxBytes is reached. +type senderNonceMempool struct { + senders map[string]*skiplist.SkipList + rnd *rand.Rand + maxTx int + existingTx map[txKey]bool +} + +type SenderNonceOptions func(mp *senderNonceMempool) + +type txKey struct { + address string + nonce uint64 +} + +// NewSenderNonceMempool creates a new mempool that prioritizes transactions by nonce, the lowest first. +func NewSenderNonceMempool(opts ...SenderNonceOptions) Mempool { + senderMap := make(map[string]*skiplist.SkipList) + existingTx := make(map[txKey]bool) + snp := &senderNonceMempool{ + senders: senderMap, + maxTx: DefaultMaxTx, + existingTx: existingTx, + } + + var seed int64 + if err := binary.Read(crand.Reader, binary.BigEndian, &seed); err != nil { + panic(err) + } + + snp.setSeed(seed) + + for _, opt := range opts { + opt(snp) + } + + return snp +} + +// SenderNonceSeedOpt Option To add a Seed for random type when calling the constructor NewSenderNonceMempool +// Example: +// > random_seed := int64(1000) +// > NewSenderNonceMempool(SenderNonceSeedTxOpt(random_seed)) +func SenderNonceSeedOpt(seed int64) SenderNonceOptions { + return func(snp *senderNonceMempool) { + snp.setSeed(seed) + } +} + +// SenderNonceMaxTxOpt Option To set limit of max tx when calling the constructor NewSenderNonceMempool +// Example: +// > NewSenderNonceMempool(SenderNonceMaxTxOpt(100)) +func SenderNonceMaxTxOpt(maxTx int) SenderNonceOptions { + return func(snp *senderNonceMempool) { + snp.maxTx = maxTx + } +} + +func (snm *senderNonceMempool) setSeed(seed int64) { + s1 := rand.NewSource(seed) + snm.rnd = rand.New(s1) //#nosec // math/rand is seeded from crypto/rand by default +} + +// Insert adds a tx to the mempool. It returns an error if the tx does not have at least one signer. +// priority is ignored. +func (snm *senderNonceMempool) Insert(_ sdk.Context, tx sdk.Tx) error { + if snm.maxTx > 0 && snm.CountTx() >= snm.maxTx { + return ErrMempoolTxMaxCapacity + } + if snm.maxTx < 0 { + return nil + } + sigs, err := tx.(signing.SigVerifiableTx).GetSignaturesV2() + if err != nil { + return err + } + if len(sigs) == 0 { + return fmt.Errorf("tx must have at least one signer") + } + + sig := sigs[0] + sender := sig.PubKey.Address().String() + nonce := sig.Sequence + senderTxs, found := snm.senders[sender] + if !found { + senderTxs = skiplist.New(skiplist.Uint64) + snm.senders[sender] = senderTxs + } + senderTxs.Set(nonce, tx) + key := txKey{nonce: nonce, address: sender} + snm.existingTx[key] = true + return nil +} + +// Select returns an iterator ordering transactions the mempool with the lowest nonce of a random selected sender first. +func (snm *senderNonceMempool) Select(_ sdk.Context, _ [][]byte) Iterator { + var senders []string + senderCursors := make(map[string]*skiplist.Element) + + orderedSenders := skiplist.New(skiplist.String) + + // #nosec + for s := range snm.senders { + orderedSenders.Set(s, s) + } + + s := orderedSenders.Front() + for s != nil { + sender := s.Value.(string) + senders = append(senders, sender) + senderCursors[sender] = snm.senders[sender].Front() + s = s.Next() + } + + iter := &senderNonceMepoolIterator{ + senders: senders, + rnd: snm.rnd, + senderCursors: senderCursors, + } + + return iter.Next() +} + +// CountTx returns the total count of txs in the mempool. +func (snm *senderNonceMempool) CountTx() int { + return len(snm.existingTx) +} + +// Remove removes a tx from the mempool. It returns an error if the tx does not have at least one signer or the tx +// was not found in the pool. +func (snm *senderNonceMempool) Remove(tx sdk.Tx) error { + sigs, err := tx.(signing.SigVerifiableTx).GetSignaturesV2() + if err != nil { + return err + } + if len(sigs) == 0 { + return fmt.Errorf("tx must have at least one signer") + } + + sig := sigs[0] + sender := sig.PubKey.Address().String() + nonce := sig.Sequence + senderTxs, found := snm.senders[sender] + if !found { + return ErrTxNotFound + } + + res := senderTxs.Remove(nonce) + if res == nil { + return ErrTxNotFound + } + + if senderTxs.Len() == 0 { + delete(snm.senders, sender) + } + + key := txKey{nonce: nonce, address: sender} + delete(snm.existingTx, key) + + return nil +} + +type senderNonceMepoolIterator struct { + rnd *rand.Rand + currentTx *skiplist.Element + senders []string + senderCursors map[string]*skiplist.Element +} + +// Next returns the next iterator state which will contain a tx with the next smallest nonce of a randomly +// selected sender. +func (i *senderNonceMepoolIterator) Next() Iterator { + for len(i.senders) > 0 { + senderIndex := i.rnd.Intn(len(i.senders)) + sender := i.senders[senderIndex] + senderCursor, found := i.senderCursors[sender] + if !found { + i.senders = removeAtIndex(i.senders, senderIndex) + continue + } + + if nextCursor := senderCursor.Next(); nextCursor != nil { + i.senderCursors[sender] = nextCursor + } else { + i.senders = removeAtIndex(i.senders, senderIndex) + } + + return &senderNonceMepoolIterator{ + senders: i.senders, + currentTx: senderCursor, + rnd: i.rnd, + senderCursors: i.senderCursors, + } + } + + return nil +} + +func (i *senderNonceMepoolIterator) Tx() sdk.Tx { + return i.currentTx.Value.(sdk.Tx) +} + +func removeAtIndex[T any](slice []T, index int) []T { + return append(slice[:index], slice[index+1:]...) +} diff --git a/types/mempool/sender_nonce_property_test.go b/types/mempool/sender_nonce_property_test.go new file mode 100644 index 000000000000..bcb7279c8dac --- /dev/null +++ b/types/mempool/sender_nonce_property_test.go @@ -0,0 +1,124 @@ +package mempool_test + +import ( + "sort" + + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + "pgregory.net/rapid" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + mempool "github.com/cosmos/cosmos-sdk/types/mempool" + "github.com/cosmos/cosmos-sdk/x/auth/signing" +) + +var ( + _ sdk.Tx = (*testTx)(nil) + _ signing.SigVerifiableTx = (*testTx)(nil) + _ cryptotypes.PubKey = (*testPubKey)(nil) +) + +// Property Based Testing +// Split the senders tx in independent slices and then test the following properties in each slice +// same elements input on the mempool should be in the output except for sender nonce duplicates, which are overwritten by the later duplicate entries. +// for every sender transaction tx_n, tx_0.nonce < tx_1.nonce ... < tx_n.nonce + +func AddressGenerator(t *rapid.T) *rapid.Generator[sdk.AccAddress] { + return rapid.Custom(func(t *rapid.T) sdk.AccAddress { + pkBz := rapid.SliceOfN(rapid.Byte(), 20, 20).Draw(t, "hex") + return sdk.AccAddress(pkBz) + }) +} + +func testMempoolProperties(t *rapid.T) { + ctx := sdk.NewContext(nil, tmproto.Header{}, false, log.NewNopLogger()) + mp := mempool.NewSenderNonceMempool() + + genMultipleAddress := rapid.SliceOfNDistinct(AddressGenerator(t), 1, 10, func(acc sdk.AccAddress) string { + return acc.String() + }) + + accounts := genMultipleAddress.Draw(t, "address") + genTx := rapid.Custom(func(t *rapid.T) testTx { + return testTx{ + priority: rapid.Int64Range(0, 1000).Draw(t, "priority"), + nonce: rapid.Uint64().Draw(t, "nonce"), + address: rapid.SampledFrom(accounts).Draw(t, "acc"), + } + }) + genMultipleTX := rapid.SliceOfN(genTx, 1, 5000) + + txs := genMultipleTX.Draw(t, "txs") + senderTxRaw := getSenderTxMap(txs) + + for _, tx := range txs { + err := mp.Insert(ctx, tx) + require.NoError(t, err) + } + + iter := mp.Select(ctx, nil) + orderTx := fetchAllTxs(iter) + require.Equal(t, len(orderTx), mp.CountTx()) + + senderTxOrdered := getSenderTxMap(orderTx) + + for key := range senderTxOrdered { + ordered, found := senderTxOrdered[key] + require.True(t, found) + + raw, found := senderTxRaw[key] + require.True(t, found) + + rawSet := mergeByNonce(raw) + sort.Slice(rawSet, func(i, j int) bool { return rawSet[i].nonce < rawSet[j].nonce }) + require.Equal(t, rawSet, ordered) + } +} + +func (s *MempoolTestSuite) TestProperties() { + t := s.T() + rapid.Check(t, testMempoolProperties) +} + +func getSenderTxMap(txs []testTx) map[string][]testTx { + senderTxs := make(map[string][]testTx) + for _, tx := range txs { + stx, found := senderTxs[tx.address.String()] + if !found { + stx = make([]testTx, 0) + } + + stx = append(stx, tx) + senderTxs[tx.address.String()] = stx + } + + return senderTxs +} + +func fetchAllTxs(iterator mempool.Iterator) []testTx { + var txs []testTx + for iterator != nil { + tx := iterator.Tx() + txs = append(txs, tx.(testTx)) + i := iterator.Next() + iterator = i + } + + return txs +} + +func mergeByNonce(raw []testTx) []testTx { + rawMap := make(map[uint64]testTx) + for _, v := range raw { + rawMap[v.nonce] = v + } + + result := make([]testTx, 0) + for _, v := range rawMap { + result = append(result, v) + } + + return result +} diff --git a/types/mempool/sender_nonce_test.go b/types/mempool/sender_nonce_test.go new file mode 100644 index 000000000000..7e37e1cb06a7 --- /dev/null +++ b/types/mempool/sender_nonce_test.go @@ -0,0 +1,193 @@ +package mempool_test + +import ( + "fmt" + "math/rand" + "testing" + + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/mempool" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" +) + +func (s *MempoolTestSuite) TestTxOrder() { + t := s.T() + ctx := sdk.NewContext(nil, tmproto.Header{}, false, log.NewNopLogger()) + accounts := simtypes.RandomAccounts(rand.New(rand.NewSource(0)), 5) + sa := accounts[0].Address + sb := accounts[1].Address + + tests := []struct { + txs []txSpec + order []int + fail bool + seed int64 + }{ + { + txs: []txSpec{ + {p: 21, n: 4, a: sa}, + {p: 8, n: 3, a: sa}, + {p: 6, n: 2, a: sa}, + {p: 15, n: 1, a: sb}, + {p: 20, n: 1, a: sa}, + }, + order: []int{3, 4, 2, 1, 0}, + // Index order base on seed 0: 0 0 1 0 1 0 0 + seed: 0, + }, + { + txs: []txSpec{ + {p: 3, n: 0, a: sa}, + {p: 5, n: 1, a: sa}, + {p: 9, n: 2, a: sa}, + {p: 6, n: 0, a: sb}, + {p: 5, n: 1, a: sb}, + {p: 8, n: 2, a: sb}, + }, + order: []int{3, 4, 0, 5, 1, 2}, + // Index order base on seed 0: 0 0 1 0 1 0 0 + seed: 0, + }, + { + txs: []txSpec{ + {p: 21, n: 4, a: sa}, + {p: 15, n: 1, a: sb}, + {p: 20, n: 1, a: sa}, + }, + order: []int{1, 2, 0}, + // Index order base on seed 0: 0 0 1 0 1 0 0 + seed: 0, + }, + { + txs: []txSpec{ + {p: 50, n: 3, a: sa}, + {p: 30, n: 2, a: sa}, + {p: 10, n: 1, a: sa}, + {p: 15, n: 1, a: sb}, + {p: 21, n: 2, a: sb}, + }, + order: []int{3, 4, 2, 1, 0}, + // Index order base on seed 0: 0 0 1 0 1 0 0 + seed: 0, + }, + { + txs: []txSpec{ + {p: 50, n: 3, a: sa}, + {p: 10, n: 2, a: sa}, + {p: 99, n: 1, a: sa}, + {p: 15, n: 1, a: sb}, + {p: 8, n: 2, a: sb}, + }, + order: []int{3, 4, 2, 1, 0}, + // Index order base on seed 0: 0 0 1 0 1 0 0 + seed: 0, + }, + { + txs: []txSpec{ + {p: 30, a: sa, n: 2}, + {p: 20, a: sb, n: 1}, + {p: 15, a: sa, n: 1}, + {p: 10, a: sa, n: 0}, + {p: 8, a: sb, n: 0}, + {p: 6, a: sa, n: 3}, + {p: 4, a: sb, n: 3}, + }, + order: []int{4, 1, 3, 6, 2, 0, 5}, + // Index order base on seed 0: 0 0 1 0 1 0 1 1 0 + seed: 0, + }, + { + txs: []txSpec{ + {p: 6, n: 1, a: sa}, + {p: 10, n: 2, a: sa}, + {p: 5, n: 1, a: sb}, + {p: 99, n: 2, a: sb}, + }, + order: []int{2, 3, 0, 1}, + // Index order base on seed 0: 0 0 1 0 1 0 1 1 0 + seed: 0, + }, + } + for i, tt := range tests { + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + pool := mempool.NewSenderNonceMempool(mempool.SenderNonceSeedOpt(tt.seed)) + // create test txs and insert into mempool + for i, ts := range tt.txs { + tx := testTx{id: i, priority: int64(ts.p), nonce: uint64(ts.n), address: ts.a} + err := pool.Insert(ctx, tx) + require.NoError(t, err) + } + + itr := pool.Select(ctx, nil) + orderedTxs := fetchTxs(itr, 1000) + var txOrder []int + for _, tx := range orderedTxs { + txOrder = append(txOrder, tx.(testTx).id) + } + for _, tx := range orderedTxs { + require.NoError(t, pool.Remove(tx)) + } + require.Equal(t, tt.order, txOrder) + require.Equal(t, 0, pool.CountTx()) + }) + } +} + +func (s *MempoolTestSuite) TestMaxTx() { + t := s.T() + ctx := sdk.NewContext(nil, tmproto.Header{}, false, log.NewNopLogger()) + accounts := simtypes.RandomAccounts(rand.New(rand.NewSource(0)), 1) + mp := mempool.NewSenderNonceMempool(mempool.SenderNonceMaxTxOpt(1)) + + tx := testTx{ + nonce: 0, + address: accounts[0].Address, + priority: rand.Int63(), + } + tx2 := testTx{ + nonce: 1, + address: accounts[0].Address, + priority: rand.Int63(), + } + + // empty mempool behavior + require.Equal(t, 0, s.mempool.CountTx()) + itr := mp.Select(ctx, nil) + require.Nil(t, itr) + + err := mp.Insert(ctx, tx) + require.NoError(t, err) + + err = mp.Insert(ctx, tx2) + require.Equal(t, mempool.ErrMempoolTxMaxCapacity, err) + +} + +func (s *MempoolTestSuite) TestTxNotFoundOnSender() { + t := s.T() + ctx := sdk.NewContext(nil, tmproto.Header{}, false, log.NewNopLogger()) + accounts := simtypes.RandomAccounts(rand.New(rand.NewSource(0)), 1) + mp := mempool.NewSenderNonceMempool() + + txSender := testTx{ + nonce: 0, + address: accounts[0].Address, + priority: rand.Int63(), + } + + tx := testTx{ + nonce: 1, + address: accounts[0].Address, + priority: rand.Int63(), + } + + err := mp.Insert(ctx, txSender) + require.NoError(t, err) + + err = mp.Remove(tx) + require.Equal(t, mempool.ErrTxNotFound, err) +} diff --git a/types/mempool/skip_list_test.go b/types/mempool/skip_list_test.go new file mode 100644 index 000000000000..f13f297f12e2 --- /dev/null +++ b/types/mempool/skip_list_test.go @@ -0,0 +1,55 @@ +package mempool_test + +import ( + "testing" + + huandu "github.com/huandu/skiplist" + "github.com/stretchr/testify/require" +) + +type collisionKey struct { + a int + b int +} + +func TestSkipListCollisions(t *testing.T) { + integerList := huandu.New(huandu.Int) + + integerList.Set(1, 1) + integerList.Set(2, 2) + integerList.Set(3, 3) + + k := integerList.Front() + i := 1 + for k != nil { + require.Equal(t, i, k.Key()) + require.Equal(t, i, k.Value) + i++ + k = k.Next() + } + + // a duplicate key will overwrite the previous value + integerList.Set(1, 4) + require.Equal(t, 3, integerList.Len()) + require.Equal(t, 4, integerList.Get(1).Value) + + // prove this again with a compound key + compoundList := huandu.New(huandu.LessThanFunc(func(x, y any) int { + kx := x.(collisionKey) + ky := y.(collisionKey) + if kx.a == ky.a { + return huandu.Int.Compare(kx.b, ky.b) + } + return huandu.Int.Compare(kx.a, ky.a) + })) + + compoundList.Set(collisionKey{a: 1, b: 1}, 1) + compoundList.Set(collisionKey{a: 1, b: 2}, 2) + compoundList.Set(collisionKey{a: 1, b: 3}, 3) + + require.Equal(t, 3, compoundList.Len()) + compoundList.Set(collisionKey{a: 1, b: 2}, 4) + require.Equal(t, 4, compoundList.Get(collisionKey{a: 1, b: 2}).Value) + compoundList.Set(collisionKey{a: 2, b: 2}, 5) + require.Equal(t, 4, compoundList.Len()) +} diff --git a/types/module/configurator.go b/types/module/configurator.go index f118bcb19043..77311b6ab6ce 100644 --- a/types/module/configurator.go +++ b/types/module/configurator.go @@ -3,7 +3,7 @@ package module import ( "fmt" - "github.com/gogo/protobuf/grpc" + "github.com/cosmos/gogoproto/grpc" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/types/proto.go b/types/proto.go index 5f2df428d27d..a7bc8451b846 100644 --- a/types/proto.go +++ b/types/proto.go @@ -3,7 +3,7 @@ package types // CustomProtobufType defines the interface custom gogo proto types must implement // in order to be used as a "customtype" extension. // -// ref: https://github.com/gogo/protobuf/blob/master/custom_types.md +// ref: https://github.com/cosmos/gogoproto/blob/master/custom_types.md type CustomProtobufType interface { Marshal() ([]byte, error) MarshalTo(data []byte) (n int, err error) diff --git a/types/query/pagination.pb.go b/types/query/pagination.pb.go index c631ecfb1eaf..665a672a7f4d 100644 --- a/types/query/pagination.pb.go +++ b/types/query/pagination.pb.go @@ -5,7 +5,7 @@ package query import ( fmt "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -25,10 +25,10 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // PageRequest is to be embedded in gRPC request messages for efficient // pagination. Ex: // -// message SomeRequest { -// Foo some_parameter = 1; -// PageRequest pagination = 2; -// } +// message SomeRequest { +// Foo some_parameter = 1; +// PageRequest pagination = 2; +// } type PageRequest struct { // key is a value returned in PageResponse.next_key to begin // querying the next page most efficiently. Only one of offset or key @@ -123,10 +123,10 @@ func (m *PageRequest) GetReverse() bool { // 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 SomeResponse { +// repeated Bar results = 1; +// PageResponse page = 2; +// } type PageResponse struct { // next_key is the key to be passed to PageRequest.key to // query the next page most efficiently diff --git a/types/result.go b/types/result.go index 88aa24e34cbd..b10152668fda 100644 --- a/types/result.go +++ b/types/result.go @@ -6,7 +6,7 @@ import ( "math" "strings" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" abci "github.com/tendermint/tendermint/abci/types" ctypes "github.com/tendermint/tendermint/rpc/core/types" diff --git a/types/result_test.go b/types/result_test.go index ab47b544a279..7bf66e32a559 100644 --- a/types/result_test.go +++ b/types/result_test.go @@ -159,8 +159,8 @@ func (s *resultTestSuite) TestResponseFormatBroadcastTxCommit() { Type: "message", Attributes: []abci.EventAttribute{ { - Key: []byte("action"), - Value: []byte("foo"), + Key: "action", + Value: "foo", Index: true, }, }, @@ -184,8 +184,8 @@ func (s *resultTestSuite) TestResponseFormatBroadcastTxCommit() { Type: "message", Attributes: []abci.EventAttribute{ { - Key: []byte("action"), - Value: []byte("foo"), + Key: "action", + Value: "foo", Index: true, }, }, @@ -209,8 +209,8 @@ func (s *resultTestSuite) TestResponseFormatBroadcastTxCommit() { Type: "message", Attributes: []abci.EventAttribute{ { - Key: []byte("action"), - Value: []byte("foo"), + Key: "action", + Value: "foo", Index: true, }, }, diff --git a/types/tx/service.pb.go b/types/tx/service.pb.go index 13c068cae088..ff1f220916fe 100644 --- a/types/tx/service.pb.go +++ b/types/tx/service.pb.go @@ -8,9 +8,9 @@ import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" golang_proto "github.com/golang/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" @@ -624,17 +624,17 @@ var fileDescriptor_e0b00a618705eca7 = []byte{ 0x56, 0x0d, 0xf6, 0xd6, 0xf6, 0xed, 0xaf, 0x3a, 0xcd, 0x2f, 0x8b, 0x0a, 0x7a, 0x1b, 0x76, 0xd7, 0x76, 0xba, 0xcf, 0x9e, 0x34, 0x8b, 0x6a, 0x4a, 0x4a, 0x43, 0xec, 0x64, 0xea, 0xff, 0x64, 0x20, 0xdb, 0x8d, 0x1f, 0x57, 0xf4, 0x02, 0x72, 0xf3, 0x11, 0x40, 0x46, 0x8a, 0x83, 0x6b, 0x93, 0x57, - 0xba, 0xff, 0x5a, 0x8c, 0x9c, 0xd8, 0x83, 0x1f, 0xff, 0xf8, 0xfb, 0x17, 0xb5, 0x6c, 0xdc, 0xb5, - 0x52, 0x5e, 0x75, 0x09, 0xfe, 0x4c, 0xa9, 0xa1, 0x33, 0x78, 0x43, 0x9c, 0x27, 0xda, 0x4f, 0x61, - 0x4d, 0x4e, 0x43, 0xa9, 0xbc, 0x19, 0x20, 0x6b, 0x56, 0x44, 0xcd, 0x7d, 0xf4, 0x9e, 0x95, 0xf6, - 0xa4, 0x33, 0xeb, 0x45, 0x34, 0x41, 0xaf, 0xd0, 0x0f, 0x90, 0x4f, 0x5c, 0x55, 0x54, 0x79, 0xdd, - 0x0d, 0x5f, 0x96, 0x3f, 0xb8, 0x0e, 0x26, 0x45, 0xdc, 0x13, 0x22, 0xee, 0x1a, 0x77, 0xd2, 0x45, - 0x44, 0x3d, 0xbf, 0x84, 0x7c, 0xe2, 0x91, 0x4d, 0x15, 0x70, 0xf5, 0x93, 0x91, 0x2a, 0x20, 0xe5, - 0xad, 0x36, 0x74, 0x21, 0x40, 0x43, 0x1b, 0x04, 0xd8, 0xcd, 0xdf, 0x2f, 0x75, 0xe5, 0xe2, 0x52, - 0x57, 0xfe, 0xba, 0xd4, 0x95, 0x9f, 0x67, 0xfa, 0xd6, 0x6f, 0x33, 0x5d, 0xb9, 0x98, 0xe9, 0x5b, - 0x7f, 0xce, 0xf4, 0xad, 0x6f, 0x2b, 0xae, 0xc7, 0x4f, 0x26, 0x7d, 0x73, 0x40, 0x47, 0xf3, 0xfc, - 0xf8, 0xe7, 0x43, 0x36, 0xfc, 0xde, 0xe2, 0xd3, 0x31, 0x89, 0x08, 0xfb, 0xdb, 0xe2, 0xeb, 0xf6, - 0xd1, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe4, 0x86, 0xcd, 0x5c, 0xb4, 0x07, 0x00, 0x00, + 0xba, 0xff, 0x5a, 0x8c, 0x9c, 0xd8, 0x83, 0x1f, 0xff, 0xf8, 0xfb, 0x17, 0xb5, 0xfc, 0x99, 0x52, + 0x33, 0xee, 0x5a, 0x29, 0x0f, 0xfb, 0xbc, 0xe0, 0x19, 0xbc, 0x21, 0xce, 0x13, 0xed, 0xa7, 0xb0, + 0x26, 0xa7, 0xa1, 0x54, 0xde, 0x0c, 0x90, 0x35, 0x2b, 0xa2, 0xe6, 0x3e, 0x7a, 0xcf, 0x4a, 0x7b, + 0xd2, 0x99, 0xf5, 0x22, 0x9a, 0xa0, 0x57, 0xe8, 0x07, 0xc8, 0x27, 0xae, 0x2a, 0xaa, 0xbc, 0xee, + 0x86, 0x2f, 0xcb, 0x1f, 0x5c, 0x07, 0x93, 0x22, 0xee, 0x09, 0x11, 0x77, 0xa3, 0xc6, 0xef, 0xa4, + 0xeb, 0x40, 0x2f, 0x21, 0x9f, 0x78, 0x64, 0x53, 0x05, 0x5c, 0xfd, 0x64, 0xa4, 0x0a, 0x48, 0x79, + 0xab, 0x0d, 0x5d, 0x08, 0xd0, 0xd0, 0x86, 0xea, 0x76, 0xf3, 0xf7, 0x4b, 0x5d, 0xb9, 0xb8, 0xd4, + 0x95, 0xbf, 0x2e, 0x75, 0xe5, 0xe7, 0x99, 0xbe, 0xf5, 0xdb, 0x4c, 0x57, 0x2e, 0x66, 0xfa, 0xd6, + 0x9f, 0x33, 0x7d, 0xeb, 0xdb, 0x8a, 0xeb, 0xf1, 0x93, 0x49, 0xdf, 0x1c, 0xd0, 0xd1, 0x3c, 0x3f, + 0xfe, 0xf9, 0x90, 0x0d, 0xbf, 0xb7, 0xf8, 0x74, 0x4c, 0x22, 0xc2, 0xfe, 0xb6, 0xf8, 0xba, 0x7d, + 0xf4, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc4, 0x07, 0x93, 0x48, 0xb4, 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/types/tx/service.pb.gw.go b/types/tx/service.pb.gw.go index 25560e1cdfb2..2c942429ecd3 100644 --- a/types/tx/service.pb.gw.go +++ b/types/tx/service.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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join func request_Service_Simulate_0(ctx context.Context, marshaler runtime.Marshaler, client ServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq SimulateRequest @@ -192,12 +194,14 @@ func local_request_Service_GetTxsEvent_0(ctx context.Context, marshaler runtime. // RegisterServiceHandlerServer registers the http handlers for service Service to "mux". // UnaryRPC :call ServiceServer 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 RegisterServiceHandlerFromEndpoint instead. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterServiceHandlerFromEndpoint instead. func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ServiceServer) error { mux.Handle("POST", pattern_Service_Simulate_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 { @@ -205,6 +209,7 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se return } resp, md, err := local_request_Service_Simulate_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) @@ -218,6 +223,8 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se mux.Handle("GET", pattern_Service_GetTx_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 { @@ -225,6 +232,7 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se return } resp, md, err := local_request_Service_GetTx_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) @@ -238,6 +246,8 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se mux.Handle("POST", pattern_Service_BroadcastTx_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 { @@ -245,6 +255,7 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se return } resp, md, err := local_request_Service_BroadcastTx_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) @@ -258,6 +269,8 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se mux.Handle("GET", pattern_Service_GetTxsEvent_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 { @@ -265,6 +278,7 @@ func RegisterServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, se return } resp, md, err := local_request_Service_GetTxsEvent_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) diff --git a/types/tx/signing/signing.pb.go b/types/tx/signing/signing.pb.go index 346198195edc..89b262c82ef9 100644 --- a/types/tx/signing/signing.pb.go +++ b/types/tx/signing/signing.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" types1 "github.com/cosmos/cosmos-sdk/crypto/types" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -197,6 +197,7 @@ type SignatureDescriptor_Data struct { // sum is the oneof that specifies whether this represents single or multi-signature data // // Types that are valid to be assigned to Sum: + // // *SignatureDescriptor_Data_Single_ // *SignatureDescriptor_Data_Multi_ Sum isSignatureDescriptor_Data_Sum `protobuf_oneof:"sum"` diff --git a/types/tx/tx.pb.go b/types/tx/tx.pb.go index 174248a9812f..1d82d469cc68 100644 --- a/types/tx/tx.pb.go +++ b/types/tx/tx.pb.go @@ -10,8 +10,8 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types2 "github.com/cosmos/cosmos-sdk/types" signing "github.com/cosmos/cosmos-sdk/types/tx/signing" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -477,6 +477,7 @@ type ModeInfo struct { // multisig signer // // Types that are valid to be assigned to Sum: + // // *ModeInfo_Single_ // *ModeInfo_Multi_ Sum isModeInfo_Sum `protobuf_oneof:"sum"` diff --git a/types/tx_msg.go b/types/tx_msg.go index 42d01fdc55ee..f702e03736ea 100644 --- a/types/tx_msg.go +++ b/types/tx_msg.go @@ -1,7 +1,7 @@ package types import ( - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) @@ -37,7 +37,7 @@ type ( // Tx defines the interface a transaction must fulfill. Tx interface { - // Gets the all the transaction's messages. + // GetMsgs returns the all the transaction's messages. GetMsgs() []Msg // ValidateBasic does a simple and lightweight validation check that doesn't @@ -54,7 +54,7 @@ type ( FeeGranter() AccAddress } - // Tx must have GetMemo() method to use ValidateMemoDecorator + // TxWithMemo must have GetMemo() method to use ValidateMemoDecorator TxWithMemo interface { Tx GetMemo() string diff --git a/x/auth/client/tx.go b/x/auth/client/tx.go index 80debcc1dedf..4dd140d5eab8 100644 --- a/x/auth/client/tx.go +++ b/x/auth/client/tx.go @@ -9,7 +9,7 @@ import ( "os" "strings" - "github.com/gogo/protobuf/jsonpb" + "github.com/cosmos/gogoproto/jsonpb" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" diff --git a/x/auth/keeper/keeper.go b/x/auth/keeper/keeper.go index a73f97dc3446..2ca10e4ebf4a 100644 --- a/x/auth/keeper/keeper.go +++ b/x/auth/keeper/keeper.go @@ -3,7 +3,7 @@ package keeper import ( "fmt" - gogotypes "github.com/gogo/protobuf/types" + gogotypes "github.com/cosmos/gogoproto/types" "github.com/tendermint/tendermint/libs/log" "github.com/cosmos/cosmos-sdk/codec" diff --git a/x/auth/keeper/migrations.go b/x/auth/keeper/migrations.go index d3ad7a2f8c5a..edbc468e0c32 100644 --- a/x/auth/keeper/migrations.go +++ b/x/auth/keeper/migrations.go @@ -1,7 +1,7 @@ package keeper import ( - "github.com/gogo/protobuf/grpc" + "github.com/cosmos/gogoproto/grpc" v043 "github.com/cosmos/cosmos-sdk/x/auth/legacy/v043" "github.com/cosmos/cosmos-sdk/x/auth/types" diff --git a/x/auth/legacy/v043/store.go b/x/auth/legacy/v043/store.go index f95f1b3a1bb7..896f35ff6b08 100644 --- a/x/auth/legacy/v043/store.go +++ b/x/auth/legacy/v043/store.go @@ -21,8 +21,8 @@ import ( "errors" "fmt" - "github.com/gogo/protobuf/grpc" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/grpc" + "github.com/cosmos/gogoproto/proto" abci "github.com/tendermint/tendermint/abci/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/x/auth/simulation/decoder.go b/x/auth/simulation/decoder.go index 61a551ba5208..eb90285046b0 100644 --- a/x/auth/simulation/decoder.go +++ b/x/auth/simulation/decoder.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" - gogotypes "github.com/gogo/protobuf/types" + gogotypes "github.com/cosmos/gogoproto/types" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/types/kv" diff --git a/x/auth/simulation/decoder_test.go b/x/auth/simulation/decoder_test.go index 9e21df6e5791..f149c2bb8176 100644 --- a/x/auth/simulation/decoder_test.go +++ b/x/auth/simulation/decoder_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - gogotypes "github.com/gogo/protobuf/types" + gogotypes "github.com/cosmos/gogoproto/types" "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" diff --git a/x/auth/tx/builder.go b/x/auth/tx/builder.go index 28bc39c8b9ab..3fa9d6009ab9 100644 --- a/x/auth/tx/builder.go +++ b/x/auth/tx/builder.go @@ -1,7 +1,7 @@ package tx import ( - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/client" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -64,6 +64,14 @@ func (w *wrapper) ValidateBasic() error { return w.tx.ValidateBasic() } +func (w *wrapper) Size() int { + panic("not implemented") +} + +func (w *wrapper) Hash() [32]byte { + panic("not implemented") +} + func (w *wrapper) getBodyBytes() []byte { if len(w.bodyBz) == 0 { // if bodyBz is empty, then marshal the body. bodyBz will generally @@ -160,10 +168,12 @@ func (w *wrapper) GetTimeoutHeight() uint64 { func (w *wrapper) GetSignaturesV2() ([]signing.SignatureV2, error) { signerInfos := w.tx.AuthInfo.SignerInfos sigs := w.tx.Signatures + pubKeys, err := w.GetPubKeys() if err != nil { return nil, err } + n := len(signerInfos) res := make([]signing.SignatureV2, n) @@ -175,16 +185,17 @@ func (w *wrapper) GetSignaturesV2() ([]signing.SignatureV2, error) { } } else { var err error + sigData, err := ModeInfoAndSigToSignatureData(si.ModeInfo, sigs[i]) if err != nil { return nil, err } + res[i] = signing.SignatureV2{ PubKey: pubKeys[i], Data: sigData, Sequence: si.GetSequence(), } - } } diff --git a/x/auth/tx/encoder.go b/x/auth/tx/encoder.go index 35cecac556eb..f1c9e988d977 100644 --- a/x/auth/tx/encoder.go +++ b/x/auth/tx/encoder.go @@ -3,7 +3,7 @@ package tx import ( "fmt" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/auth/tx/service.go b/x/auth/tx/service.go index a0deedae6aa2..45a460e3b8e0 100644 --- a/x/auth/tx/service.go +++ b/x/auth/tx/service.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - gogogrpc "github.com/gogo/protobuf/grpc" + gogogrpc "github.com/cosmos/gogoproto/grpc" "github.com/golang/protobuf/proto" // nolint: staticcheck "github.com/grpc-ecosystem/grpc-gateway/runtime" "google.golang.org/grpc/codes" diff --git a/x/auth/tx/service_test.go b/x/auth/tx/service_test.go index e827a4b8bf7d..bd7938669430 100644 --- a/x/auth/tx/service_test.go +++ b/x/auth/tx/service_test.go @@ -90,10 +90,10 @@ func (s *IntegrationTestSuite) TearDownSuite() { func (s IntegrationTestSuite) TestSimulateTx_GRPC() { val := s.network.Validators[0] txBuilder := s.mkTxBuilder() - // Convert the txBuilder to a tx.Tx. + protoTx, err := txBuilderToProtoTx(txBuilder) s.Require().NoError(err) - // Encode the txBuilder to txBytes. + txBytes, err := val.ClientCtx.TxConfig.TxEncoder()(txBuilder.GetTx()) s.Require().NoError(err) @@ -122,9 +122,16 @@ func (s IntegrationTestSuite) TestSimulateTx_GRPC() { s.Require().Contains(err.Error(), tc.expErrMsg) } else { s.Require().NoError(err) + // Check the result and gas used are correct. - s.Require().Equal(len(res.GetResult().GetEvents()), 6) // 1 coin recv 1 coin spent, 1 transfer, 3 messages. - s.Require().True(res.GetGasInfo().GetGasUsed() > 0) // Gas used sometimes change, just check it's not empty. + // + // The 13 events are: + // - Sending Fee to the pool: coin_spent, coin_received, transfer and message.sender= + // - tx.* events: tx.fee, tx.acc_seq, tx.signature + // - Sending Amount to recipient: coin_spent, coin_received, transfer and message.sender= + // - Msg events: message.module=bank and message.action=/cosmos.bank.v1beta1.MsgSend (in one message) + s.Require().Equal(13, len(res.GetResult().GetEvents())) + s.Require().True(res.GetGasInfo().GetGasUsed() > 0) // Gas used sometimes change, just check it's not empty. } } }) @@ -134,10 +141,10 @@ func (s IntegrationTestSuite) TestSimulateTx_GRPC() { func (s IntegrationTestSuite) TestSimulateTx_GRPCGateway() { val := s.network.Validators[0] txBuilder := s.mkTxBuilder() - // Convert the txBuilder to a tx.Tx. + protoTx, err := txBuilderToProtoTx(txBuilder) s.Require().NoError(err) - // Encode the txBuilder to txBytes. + txBytes, err := val.ClientCtx.TxConfig.TxEncoder()(txBuilder.GetTx()) s.Require().NoError(err) @@ -156,17 +163,26 @@ func (s IntegrationTestSuite) TestSimulateTx_GRPCGateway() { s.Run(tc.name, func() { req, err := val.ClientCtx.Codec.MarshalJSON(tc.req) s.Require().NoError(err) + res, err := rest.PostRequest(fmt.Sprintf("%s/cosmos/tx/v1beta1/simulate", val.APIAddress), "application/json", req) s.Require().NoError(err) + if tc.expErr { s.Require().Contains(string(res), tc.expErrMsg) } else { var result tx.SimulateResponse err = val.ClientCtx.Codec.UnmarshalJSON(res, &result) s.Require().NoError(err) + // Check the result and gas used are correct. - s.Require().Equal(len(result.GetResult().GetEvents()), 6) // 1 coin recv, 1 coin spent,1 transfer, 3 messages. - s.Require().True(result.GetGasInfo().GetGasUsed() > 0) // Gas used sometimes change, just check it's not empty. + // + // The 13 events are: + // - Sending Fee to the pool: coin_spent, coin_received, transfer and message.sender= + // - tx.* events: tx.fee, tx.acc_seq, tx.signature + // - Sending Amount to recipient: coin_spent, coin_received, transfer and message.sender= + // - Msg events: message.module=bank and message.action=/cosmos.bank.v1beta1.MsgSend (in one message) + s.Require().Equal(len(result.GetResult().GetEvents()), 13) + s.Require().True(result.GetGasInfo().GetGasUsed() > 0) // Gas used sometimes change, just check it's not empty. } }) } diff --git a/x/auth/types/account.go b/x/auth/types/account.go index c0ef8e5da64b..a9fb7c454a7e 100644 --- a/x/auth/types/account.go +++ b/x/auth/types/account.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/tendermint/tendermint/crypto" "gopkg.in/yaml.v2" @@ -26,6 +26,7 @@ var ( ) // NewBaseAccount creates a new BaseAccount object +// //nolint:interfacer func NewBaseAccount(address sdk.AccAddress, pubKey cryptotypes.PubKey, accountNumber, sequence uint64) *BaseAccount { acc := &BaseAccount{ diff --git a/x/auth/types/auth.pb.go b/x/auth/types/auth.pb.go index fa52ac5a8b90..2d996897a10c 100644 --- a/x/auth/types/auth.pb.go +++ b/x/auth/types/auth.pb.go @@ -5,10 +5,10 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -196,7 +196,7 @@ var fileDescriptor_7e1f7e915d020d2d = []byte{ 0x14, 0x8d, 0x5f, 0xf2, 0xf8, 0x98, 0x00, 0x12, 0x26, 0x80, 0x93, 0xf7, 0x64, 0x5b, 0x5e, 0xe5, 0x49, 0x2f, 0x8e, 0x92, 0x8a, 0x4a, 0x64, 0x51, 0x15, 0xd3, 0x2e, 0x50, 0x0b, 0x42, 0x46, 0xea, 0xa2, 0xaa, 0xe4, 0x8e, 0x9d, 0xc1, 0x58, 0x64, 0x32, 0xc6, 0x33, 0x46, 0x31, 0xbf, 0xa0, 0xcb, - 0x2e, 0xbb, 0xe4, 0x47, 0xf0, 0x0f, 0xba, 0xe9, 0x12, 0xb1, 0xea, 0xca, 0xad, 0xc2, 0xa6, 0xea, + 0x2e, 0xbb, 0xe4, 0x47, 0xf0, 0x0f, 0xba, 0xa9, 0x58, 0xb1, 0xec, 0xca, 0xad, 0xc2, 0xa6, 0xea, 0x32, 0xfb, 0x4a, 0x95, 0x67, 0x9c, 0x90, 0xa0, 0x74, 0x95, 0xb9, 0xe7, 0x9c, 0x7b, 0xee, 0x9d, 0x7b, 0xe3, 0x01, 0xaa, 0x47, 0x28, 0x26, 0xb4, 0x09, 0x63, 0x76, 0xd6, 0xbc, 0x6c, 0xb9, 0x88, 0xc1, 0x16, 0x0f, 0xcc, 0x30, 0x22, 0x8c, 0xc8, 0x1b, 0x82, 0x37, 0x39, 0x94, 0xf3, 0xb5, 0xaa, @@ -211,12 +211,12 @@ var fileDescriptor_7e1f7e915d020d2d = []byte{ 0x45, 0x4a, 0x51, 0x97, 0xea, 0x25, 0xab, 0x3a, 0x4a, 0xb5, 0x4d, 0x91, 0x36, 0xcb, 0x1b, 0xf6, 0x6a, 0x0e, 0x1c, 0xf1, 0x58, 0xae, 0x81, 0x25, 0x8a, 0x2e, 0x62, 0xd4, 0xf7, 0x90, 0x52, 0xca, 0x72, 0xed, 0x49, 0xdc, 0x51, 0x3e, 0x5c, 0x6b, 0x85, 0x4f, 0xd7, 0x5a, 0xe1, 0xc7, 0xb5, 0x56, - 0xb8, 0xbb, 0x69, 0x2c, 0xe5, 0xd7, 0x3d, 0x30, 0x3e, 0x4b, 0x60, 0xf5, 0x90, 0x74, 0xe3, 0xde, + 0xb8, 0xbd, 0x69, 0x2c, 0xe5, 0xd7, 0x3d, 0x30, 0x3e, 0x4b, 0x60, 0xf5, 0x90, 0x74, 0xe3, 0xde, 0x64, 0x02, 0xef, 0xc1, 0x8a, 0x0b, 0x29, 0x72, 0x72, 0x77, 0x3e, 0x86, 0x72, 0x5b, 0x37, 0xe7, - 0x6c, 0xc2, 0x9c, 0x9a, 0x9c, 0xf5, 0xcf, 0x6d, 0xaa, 0x49, 0xa3, 0x54, 0xdb, 0x10, 0xdd, 0x4e, + 0x6c, 0xc2, 0x9c, 0x9a, 0x9c, 0xf5, 0xcf, 0x5d, 0xaa, 0x49, 0xa3, 0x54, 0xdb, 0x10, 0xdd, 0x4e, 0x7b, 0x18, 0x76, 0xd9, 0x9d, 0x9a, 0xb1, 0x0c, 0x4a, 0x7d, 0x88, 0x11, 0x1f, 0xe3, 0xb2, 0xcd, 0xcf, 0xb2, 0x0e, 0xca, 0x21, 0x8a, 0x70, 0x40, 0x69, 0x40, 0xfa, 0x54, 0x29, 0xea, 0xc5, 0xfa, - 0xb2, 0x3d, 0x0d, 0x75, 0x6a, 0xe3, 0x3b, 0xdc, 0xdd, 0x34, 0xd6, 0x66, 0x5a, 0x3e, 0x30, 0xbe, + 0xb2, 0x3d, 0x0d, 0x75, 0x6a, 0xe3, 0x3b, 0xdc, 0xde, 0x34, 0xd6, 0x66, 0x5a, 0x3e, 0x30, 0xbe, 0x15, 0xc1, 0xc2, 0x31, 0x8c, 0x20, 0xa6, 0xf2, 0x11, 0xd8, 0xc0, 0x70, 0xe0, 0x60, 0x84, 0x89, 0xe3, 0x9d, 0xc1, 0x08, 0x7a, 0x0c, 0x45, 0x62, 0x99, 0x25, 0x4b, 0x1d, 0xa5, 0x5a, 0x4d, 0xf4, 0x37, 0x47, 0x64, 0xd8, 0xeb, 0x18, 0x0e, 0x0e, 0x11, 0x26, 0xfb, 0x13, 0x4c, 0xde, 0x05, 0x2b, @@ -230,10 +230,10 @@ var fileDescriptor_7e1f7e915d020d2d = []byte{ 0x99, 0x3c, 0x01, 0xcb, 0x09, 0xa8, 0x3e, 0xce, 0xa0, 0xc8, 0x0b, 0xdb, 0x3b, 0x4f, 0xcf, 0x5b, 0xca, 0xdf, 0xbc, 0xe8, 0xb3, 0x61, 0xaa, 0x6d, 0xcd, 0x14, 0x3d, 0x19, 0x2b, 0x46, 0xa9, 0xa6, 0xcf, 0x2f, 0x3b, 0x31, 0x31, 0xec, 0x2d, 0x3a, 0x37, 0xb7, 0xb3, 0x94, 0xff, 0x67, 0x25, 0x6b, - 0xff, 0xcb, 0x50, 0x95, 0x6e, 0x87, 0xaa, 0xf4, 0x7d, 0xa8, 0x4a, 0x1f, 0xef, 0xd5, 0xc2, 0xed, + 0xff, 0xcb, 0x50, 0x95, 0xee, 0x86, 0xaa, 0xf4, 0x7d, 0xa8, 0x4a, 0x1f, 0xef, 0xd5, 0xc2, 0xdd, 0xbd, 0x5a, 0xf8, 0x7a, 0xaf, 0x16, 0xde, 0xfe, 0xe7, 0x07, 0xec, 0x2c, 0x76, 0x4d, 0x8f, 0xe0, 0xfc, 0x2d, 0xc8, 0x7f, 0x1a, 0xb4, 0x7b, 0xde, 0x1c, 0x88, 0xa7, 0x85, 0x25, 0x21, 0xa2, 0xee, - 0x02, 0xff, 0x52, 0x9f, 0xfc, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x49, 0x90, 0x16, 0xd9, 0x76, 0x04, + 0x02, 0xff, 0x52, 0x9f, 0xfc, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xf9, 0xd3, 0xfd, 0x28, 0x76, 0x04, 0x00, 0x00, } diff --git a/x/auth/types/genesis.go b/x/auth/types/genesis.go index 380d85fc6b81..d9f3274d9ba5 100644 --- a/x/auth/types/genesis.go +++ b/x/auth/types/genesis.go @@ -5,7 +5,7 @@ import ( "fmt" "sort" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/x/auth/types/genesis.pb.go b/x/auth/types/genesis.pb.go index 4e7396ab7cb3..fb2e03fe27cb 100644 --- a/x/auth/types/genesis.pb.go +++ b/x/auth/types/genesis.pb.go @@ -6,8 +6,8 @@ package types import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/auth/types/genesis_test.go b/x/auth/types/genesis_test.go index 1030885e799e..288aa367ae4c 100644 --- a/x/auth/types/genesis_test.go +++ b/x/auth/types/genesis_test.go @@ -4,7 +4,7 @@ import ( "encoding/json" "testing" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/require" codectypes "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/x/auth/types/query.pb.go b/x/auth/types/query.pb.go index 9f2f5a88ec8d..42c768544ab6 100644 --- a/x/auth/types/query.pb.go +++ b/x/auth/types/query.pb.go @@ -6,12 +6,12 @@ package types import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/auth/types/query.pb.gw.go b/x/auth/types/query.pb.gw.go index 73ff335f0bda..ee83c6d39a61 100644 --- a/x/auth/types/query.pb.gw.go +++ b/x/auth/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join var ( filter_Query_Accounts_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} @@ -160,12 +162,14 @@ func local_request_Query_ModuleAccounts_0(ctx context.Context, marshaler runtime // 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_Accounts_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 { @@ -173,6 +177,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Accounts_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) @@ -186,6 +191,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Account_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 { @@ -193,6 +200,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Account_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) @@ -206,6 +214,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 { @@ -213,6 +223,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) @@ -226,6 +237,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_ModuleAccounts_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 { @@ -233,6 +246,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_ModuleAccounts_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) diff --git a/x/auth/vesting/client/cli/cli_test.go b/x/auth/vesting/client/cli/cli_test.go index d38a5f2ce56e..3330b333e499 100644 --- a/x/auth/vesting/client/cli/cli_test.go +++ b/x/auth/vesting/client/cli/cli_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" diff --git a/x/auth/vesting/client/testutil/suite.go b/x/auth/vesting/client/testutil/suite.go index bf54d0a32e31..2f649f5d4568 100644 --- a/x/auth/vesting/client/testutil/suite.go +++ b/x/auth/vesting/client/testutil/suite.go @@ -3,7 +3,7 @@ package testutil import ( "fmt" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/client/flags" diff --git a/x/auth/vesting/types/tx.pb.go b/x/auth/vesting/types/tx.pb.go index fcb456654545..ff6b6d7bebc7 100644 --- a/x/auth/vesting/types/tx.pb.go +++ b/x/auth/vesting/types/tx.pb.go @@ -8,9 +8,9 @@ import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/auth/vesting/types/vesting.pb.go b/x/auth/vesting/types/vesting.pb.go index a16ed08fa351..8db9fa39085d 100644 --- a/x/auth/vesting/types/vesting.pb.go +++ b/x/auth/vesting/types/vesting.pb.go @@ -8,8 +8,8 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types1 "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/x/auth/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" diff --git a/x/authz/authorization_grant.go b/x/authz/authorization_grant.go index 30bc1eec467d..c042cbafafb3 100644 --- a/x/authz/authorization_grant.go +++ b/x/authz/authorization_grant.go @@ -3,7 +3,7 @@ package authz import ( "time" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" diff --git a/x/authz/authorizations.go b/x/authz/authorizations.go index b0412ad4b34a..2df63a7d3404 100644 --- a/x/authz/authorizations.go +++ b/x/authz/authorizations.go @@ -1,7 +1,7 @@ package authz import ( - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/authz/authz.pb.go b/x/authz/authz.pb.go index 34fe197e01db..424e981cbf69 100644 --- a/x/authz/authz.pb.go +++ b/x/authz/authz.pb.go @@ -5,11 +5,11 @@ package authz import ( fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" @@ -117,7 +117,7 @@ func init() { func init() { proto.RegisterFile("cosmos/authz/v1beta1/authz.proto", fileDescriptor_544dc2e84b61c637) } var fileDescriptor_544dc2e84b61c637 = []byte{ - // 303 bytes of a gzipped FileDescriptorProto + // 301 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0xce, 0x2f, 0xce, 0xcd, 0x2f, 0xd6, 0x4f, 0x2c, 0x2d, 0xc9, 0xa8, 0xd2, 0x2f, 0x33, 0x4c, 0x4a, 0x2d, 0x49, 0x34, 0x84, 0xf0, 0xf4, 0x0a, 0x8a, 0xf2, 0x4b, 0xf2, 0x85, 0x44, 0x20, 0x2a, 0xf4, 0x20, 0x62, 0x50, @@ -127,16 +127,16 @@ var fileDescriptor_544dc2e84b61c637 = []byte{ 0xa2, 0x92, 0xe8, 0xda, 0x12, 0xf3, 0x2a, 0x21, 0x52, 0x4a, 0xd6, 0x5c, 0x22, 0xee, 0xa9, 0x79, 0xa9, 0x45, 0x99, 0xc9, 0x8e, 0xa5, 0x25, 0x19, 0xf9, 0x45, 0x99, 0x55, 0x89, 0x25, 0x99, 0xf9, 0x79, 0x42, 0x02, 0x5c, 0xcc, 0xb9, 0xc5, 0xe9, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x41, 0x20, - 0xa6, 0x95, 0xe0, 0xa5, 0x2d, 0xba, 0xbc, 0x28, 0x8a, 0x94, 0xe6, 0x30, 0x72, 0xb1, 0xba, 0x17, + 0xa6, 0x95, 0xe0, 0xa9, 0x2d, 0xba, 0xbc, 0x28, 0x8a, 0x94, 0xe6, 0x30, 0x72, 0xb1, 0xba, 0x17, 0x25, 0xe6, 0x95, 0x08, 0xf9, 0x72, 0xf1, 0x26, 0x22, 0x4b, 0x81, 0x35, 0x72, 0x1b, 0x89, 0xe8, - 0x41, 0x6c, 0xd6, 0x83, 0xd9, 0xac, 0xe7, 0x98, 0x57, 0xe9, 0x24, 0x78, 0x0a, 0xdd, 0xa4, 0x20, - 0x54, 0xdd, 0x42, 0x2e, 0x5c, 0x5c, 0xa9, 0x15, 0x05, 0x99, 0x45, 0x10, 0xb3, 0x98, 0xc0, 0x66, - 0x49, 0x61, 0x98, 0x15, 0x02, 0xf3, 0xbc, 0x13, 0xc7, 0x89, 0x7b, 0xf2, 0x0c, 0x13, 0xee, 0xcb, - 0x33, 0x06, 0x21, 0xe9, 0x73, 0x72, 0x3a, 0xf1, 0x50, 0x8e, 0xe1, 0xc4, 0x23, 0x39, 0xc6, 0x0b, - 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, - 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x54, 0xd2, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, - 0xa1, 0x81, 0x0c, 0xa5, 0x74, 0x8b, 0x53, 0xb2, 0xf5, 0x2b, 0x20, 0x11, 0x95, 0xc4, 0x06, 0xb6, - 0xcd, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x6e, 0xbe, 0xf1, 0x5a, 0xcd, 0x01, 0x00, 0x00, + 0x41, 0x6c, 0xd6, 0x83, 0xd9, 0xac, 0xe7, 0x98, 0x57, 0xe9, 0x84, 0x69, 0x52, 0x10, 0xaa, 0x6e, + 0x21, 0x17, 0x2e, 0xae, 0xd4, 0x8a, 0x82, 0xcc, 0x22, 0x88, 0x59, 0x4c, 0x60, 0xb3, 0xa4, 0x30, + 0xcc, 0x0a, 0x81, 0x79, 0xde, 0x89, 0xe3, 0xc4, 0x3d, 0x79, 0x86, 0x09, 0xf7, 0xe5, 0x19, 0x83, + 0x90, 0xf4, 0x39, 0x39, 0x9d, 0x78, 0x28, 0xc7, 0x70, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, + 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, + 0x72, 0x0c, 0x51, 0x2a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xd0, 0x40, + 0x86, 0x52, 0xba, 0xc5, 0x29, 0xd9, 0xfa, 0x15, 0x90, 0x88, 0x4a, 0x62, 0x03, 0xdb, 0x66, 0x0c, + 0x08, 0x00, 0x00, 0xff, 0xff, 0x46, 0xfb, 0xa1, 0x7a, 0xcd, 0x01, 0x00, 0x00, } func (m *GenericAuthorization) Marshal() (dAtA []byte, err error) { @@ -189,7 +189,7 @@ func (m *Grant) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expiration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expiration):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Expiration, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Expiration):]) if err1 != nil { return 0, err1 } @@ -246,7 +246,7 @@ func (m *Grant) Size() (n int) { l = m.Authorization.Size() n += 1 + l + sovAuthz(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Expiration) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Expiration) n += 1 + l + sovAuthz(uint64(l)) return n } @@ -433,7 +433,7 @@ func (m *Grant) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Expiration, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.Expiration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/authz/client/testutil/tx.go b/x/authz/client/testutil/tx.go index 7659bb8ce78f..5baa5dd76e6a 100644 --- a/x/authz/client/testutil/tx.go +++ b/x/authz/client/testutil/tx.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/client/flags" diff --git a/x/authz/event.pb.go b/x/authz/event.pb.go index 4737782814c8..289eb897564e 100644 --- a/x/authz/event.pb.go +++ b/x/authz/event.pb.go @@ -5,7 +5,7 @@ package authz import ( fmt "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/authz/genesis.pb.go b/x/authz/genesis.pb.go index eb6b63d4c72b..43229b54b945 100644 --- a/x/authz/genesis.pb.go +++ b/x/authz/genesis.pb.go @@ -5,11 +5,11 @@ package authz import ( fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" @@ -235,7 +235,7 @@ func (m *GrantAuthorization) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expiration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expiration):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Expiration, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Expiration):]) if err1 != nil { return 0, err1 } @@ -316,7 +316,7 @@ func (m *GrantAuthorization) Size() (n int) { l = m.Authorization.Size() n += 1 + l + sovGenesis(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Expiration) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Expiration) n += 1 + l + sovGenesis(uint64(l)) return n } @@ -569,7 +569,7 @@ func (m *GrantAuthorization) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Expiration, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.Expiration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/authz/keeper/grpc_query.go b/x/authz/keeper/grpc_query.go index 76091daaf7e9..e404cc9a8ebf 100644 --- a/x/authz/keeper/grpc_query.go +++ b/x/authz/keeper/grpc_query.go @@ -6,7 +6,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/x/authz/keeper/keeper.go b/x/authz/keeper/keeper.go index 1b8ec0bf945b..6db32a3d1fa9 100644 --- a/x/authz/keeper/keeper.go +++ b/x/authz/keeper/keeper.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/tendermint/tendermint/libs/log" diff --git a/x/authz/msgs.go b/x/authz/msgs.go index de47c2bc29f2..c48c83646797 100644 --- a/x/authz/msgs.go +++ b/x/authz/msgs.go @@ -1,10 +1,11 @@ package authz import ( - authzcodec "github.com/cosmos/cosmos-sdk/x/authz/codec" "time" - "github.com/gogo/protobuf/proto" + authzcodec "github.com/cosmos/cosmos-sdk/x/authz/codec" + + "github.com/cosmos/gogoproto/proto" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -27,6 +28,7 @@ var ( ) // NewMsgGrant creates a new MsgGrant +// //nolint:interfacer func NewMsgGrant(granter sdk.AccAddress, grantee sdk.AccAddress, a Authorization, expiration time.Time) (*MsgGrant, error) { m := &MsgGrant{ @@ -120,6 +122,7 @@ func (msg MsgGrant) UnpackInterfaces(unpacker cdctypes.AnyUnpacker) error { } // NewMsgRevoke creates a new MsgRevoke +// //nolint:interfacer func NewMsgRevoke(granter sdk.AccAddress, grantee sdk.AccAddress, msgTypeURL string) MsgRevoke { return MsgRevoke{ @@ -176,6 +179,7 @@ func (msg MsgRevoke) GetSignBytes() []byte { } // NewMsgExec creates a new MsgExecAuthorized +// //nolint:interfacer func NewMsgExec(grantee sdk.AccAddress, msgs []sdk.Msg) MsgExec { msgsAny := make([]*cdctypes.Any, len(msgs)) diff --git a/x/authz/query.pb.go b/x/authz/query.pb.go index 3e332ef64453..90f8da01bff2 100644 --- a/x/authz/query.pb.go +++ b/x/authz/query.pb.go @@ -7,8 +7,8 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/authz/query.pb.gw.go b/x/authz/query.pb.gw.go index 3278cb6baa3c..4796362ef57f 100644 --- a/x/authz/query.pb.gw.go +++ b/x/authz/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join var ( filter_Query_Grants_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} @@ -70,12 +72,14 @@ func local_request_Query_Grants_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_Grants_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 { @@ -83,6 +87,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Grants_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) diff --git a/x/authz/tx.pb.go b/x/authz/tx.pb.go index 9f75a1936185..b62de610feff 100644 --- a/x/authz/tx.pb.go +++ b/x/authz/tx.pb.go @@ -6,12 +6,12 @@ package authz import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" _ "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/bank/client/rest/grpc_query_test.go b/x/bank/client/rest/grpc_query_test.go index 857aa58e4b83..b76967a872d5 100644 --- a/x/bank/client/rest/grpc_query_test.go +++ b/x/bank/client/rest/grpc_query_test.go @@ -1,3 +1,4 @@ +//go:build norace // +build norace package rest_test @@ -5,7 +6,7 @@ package rest_test import ( "fmt" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/bank/client/testutil/suite.go b/x/bank/client/testutil/suite.go index 19be5401c672..3be1b06176f0 100644 --- a/x/bank/client/testutil/suite.go +++ b/x/bank/client/testutil/suite.go @@ -3,7 +3,7 @@ package testutil import ( "fmt" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" tmcli "github.com/tendermint/tendermint/libs/cli" diff --git a/x/bank/keeper/keeper_test.go b/x/bank/keeper/keeper_test.go index fe4fe3ec1688..59b13ea0ede6 100644 --- a/x/bank/keeper/keeper_test.go +++ b/x/bank/keeper/keeper_test.go @@ -614,15 +614,15 @@ func (suite *IntegrationTestSuite) TestMsgSendEvents() { } event1.Attributes = append( event1.Attributes, - abci.EventAttribute{Key: []byte(types.AttributeKeyRecipient), Value: []byte(addr2.String())}, + abci.EventAttribute{Key: types.AttributeKeyRecipient, Value: addr2.String()}, ) event1.Attributes = append( event1.Attributes, - abci.EventAttribute{Key: []byte(types.AttributeKeySender), Value: []byte(addr.String())}, + abci.EventAttribute{Key: types.AttributeKeySender, Value: addr.String()}, ) event1.Attributes = append( event1.Attributes, - abci.EventAttribute{Key: []byte(sdk.AttributeKeyAmount), Value: []byte(newCoins.String())}, + abci.EventAttribute{Key: sdk.AttributeKeyAmount, Value: newCoins.String()}, ) event2 := sdk.Event{ @@ -631,7 +631,7 @@ func (suite *IntegrationTestSuite) TestMsgSendEvents() { } event2.Attributes = append( event2.Attributes, - abci.EventAttribute{Key: []byte(types.AttributeKeySender), Value: []byte(addr.String())}, + abci.EventAttribute{Key: types.AttributeKeySender, Value: addr.String()}, ) // events are shifted due to the funding account events @@ -684,7 +684,7 @@ func (suite *IntegrationTestSuite) TestMsgMultiSendEvents() { } event1.Attributes = append( event1.Attributes, - abci.EventAttribute{Key: []byte(types.AttributeKeySender), Value: []byte(addr.String())}, + abci.EventAttribute{Key: types.AttributeKeySender, Value: addr.String()}, ) // Set addr's coins and addr2's coins @@ -705,7 +705,7 @@ func (suite *IntegrationTestSuite) TestMsgMultiSendEvents() { } event2.Attributes = append( event2.Attributes, - abci.EventAttribute{Key: []byte(types.AttributeKeySender), Value: []byte(addr.String())}, + abci.EventAttribute{Key: types.AttributeKeySender, Value: addr.String()}, ) event3 := sdk.Event{ Type: types.EventTypeTransfer, @@ -713,22 +713,22 @@ func (suite *IntegrationTestSuite) TestMsgMultiSendEvents() { } event3.Attributes = append( event3.Attributes, - abci.EventAttribute{Key: []byte(types.AttributeKeyRecipient), Value: []byte(addr3.String())}, + abci.EventAttribute{Key: types.AttributeKeyRecipient, Value: addr3.String()}, ) event3.Attributes = append( event3.Attributes, - abci.EventAttribute{Key: []byte(sdk.AttributeKeyAmount), Value: []byte(newCoins.String())}) + abci.EventAttribute{Key: sdk.AttributeKeyAmount, Value: newCoins.String()}) event4 := sdk.Event{ Type: types.EventTypeTransfer, Attributes: []abci.EventAttribute{}, } event4.Attributes = append( event4.Attributes, - abci.EventAttribute{Key: []byte(types.AttributeKeyRecipient), Value: []byte(addr4.String())}, + abci.EventAttribute{Key: types.AttributeKeyRecipient, Value: addr4.String()}, ) event4.Attributes = append( event4.Attributes, - abci.EventAttribute{Key: []byte(sdk.AttributeKeyAmount), Value: []byte(newCoins2.String())}, + abci.EventAttribute{Key: sdk.AttributeKeyAmount, Value: newCoins2.String()}, ) for _, eventA := range []sdk.Event{event1, event2, event3, event4} { diff --git a/x/bank/types/authz.pb.go b/x/bank/types/authz.pb.go index 9d3660351df7..42a2912911bf 100644 --- a/x/bank/types/authz.pb.go +++ b/x/bank/types/authz.pb.go @@ -5,11 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -94,10 +94,10 @@ var fileDescriptor_a4d2a37888ea779f = []byte{ 0x9c, 0x9f, 0x99, 0xe7, 0x64, 0x70, 0xe2, 0x9e, 0x3c, 0xc3, 0xaa, 0xfb, 0xf2, 0x1a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0x50, 0x67, 0x40, 0x29, 0xdd, 0xe2, 0x94, 0x6c, 0xfd, 0x92, 0xca, 0x82, 0xd4, 0x62, 0xb0, 0x86, 0xe2, 0x20, 0x2e, 0xb0, 0xf9, 0x3e, 0x20, 0xe3, - 0xad, 0x04, 0x2f, 0x6d, 0xd1, 0xe5, 0x45, 0x71, 0x80, 0x93, 0xf3, 0x89, 0x47, 0x72, 0x8c, 0x17, + 0xad, 0x04, 0x4f, 0x6d, 0xd1, 0xe5, 0x45, 0x71, 0x80, 0x93, 0xf3, 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, 0x69, 0xe2, 0xb5, 0xa2, 0x02, 0x12, 0x9e, 0x60, 0x9b, 0x92, 0xd8, - 0xc0, 0x5e, 0x34, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x3b, 0xce, 0xe1, 0x4c, 0x6b, 0x01, 0x00, + 0xc0, 0x5e, 0x34, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x86, 0xc3, 0x2e, 0x6b, 0x01, 0x00, 0x00, } diff --git a/x/bank/types/bank.pb.go b/x/bank/types/bank.pb.go index 8557be66e56b..55c3f6479eed 100644 --- a/x/bank/types/bank.pb.go +++ b/x/bank/types/bank.pb.go @@ -5,11 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -430,44 +430,45 @@ func init() { func init() { proto.RegisterFile("cosmos/bank/v1beta1/bank.proto", fileDescriptor_dd052eee12edf988) } var fileDescriptor_dd052eee12edf988 = []byte{ - // 592 bytes of a gzipped FileDescriptorProto + // 593 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xbf, 0x6f, 0xd3, 0x40, 0x14, 0xf6, 0x35, 0x8d, 0x49, 0x2f, 0xb0, 0x1c, 0x15, 0x72, 0x23, 0x61, 0x1b, 0x4b, 0x48, 0x29, 0xa2, 0x4e, 0x0a, 0x0c, 0x28, 0x0b, 0x52, 0xca, 0x0f, 0x75, 0x40, 0x20, 0x57, 0x08, 0x09, 0x86, 0xe8, 0x9c, 0xbb, 0x06, 0xab, 0xf6, 0x9d, 0x95, 0x3b, 0x57, 0xf5, 0x7f, 0xc0, 0x04, 0x8c, 0x8c, - 0x9d, 0x59, 0xe1, 0x7f, 0xa0, 0x63, 0x05, 0x0b, 0x53, 0x40, 0xc9, 0xc2, 0xdc, 0xbf, 0x00, 0xf9, - 0xce, 0xf9, 0x51, 0x29, 0x20, 0x06, 0x06, 0xa6, 0xbc, 0xef, 0xbd, 0xef, 0x7d, 0xef, 0xe9, 0xbb, - 0xe7, 0x40, 0xbb, 0xcf, 0x45, 0xc2, 0x45, 0x2b, 0xc4, 0xec, 0xa0, 0x75, 0xb8, 0x1d, 0x52, 0x89, - 0xb7, 0x15, 0xf0, 0xd3, 0x21, 0x97, 0x1c, 0x5d, 0xd6, 0x75, 0x5f, 0xa5, 0xca, 0x7a, 0x63, 0x7d, - 0xc0, 0x07, 0x5c, 0xd5, 0x5b, 0x45, 0xa4, 0xa9, 0x8d, 0x0d, 0x4d, 0xed, 0xe9, 0x42, 0xd9, 0xa7, - 0x4b, 0xf3, 0x29, 0x82, 0xce, 0xa6, 0xf4, 0x79, 0xc4, 0x74, 0xdd, 0xfb, 0x0a, 0xa0, 0xf9, 0x14, - 0x0f, 0x71, 0x22, 0xd0, 0x3e, 0xbc, 0x28, 0x28, 0x23, 0x3d, 0xca, 0x70, 0x18, 0x53, 0x62, 0x01, - 0xb7, 0xd2, 0xac, 0xdf, 0x72, 0xfd, 0x25, 0x7b, 0xf8, 0x7b, 0x94, 0x91, 0x07, 0x9a, 0xd7, 0xbd, - 0x76, 0x36, 0x72, 0xae, 0xe6, 0x38, 0x89, 0x3b, 0xde, 0x62, 0xff, 0x4d, 0x9e, 0x44, 0x92, 0x26, - 0xa9, 0xcc, 0xbd, 0xa0, 0x2e, 0xe6, 0x7c, 0xf4, 0x12, 0xae, 0x13, 0xba, 0x8f, 0xb3, 0x58, 0xf6, - 0xce, 0xcd, 0x5b, 0x71, 0x41, 0xb3, 0xd6, 0xdd, 0x3c, 0x1b, 0x39, 0xd7, 0xb5, 0xda, 0x32, 0xd6, - 0xa2, 0x2a, 0x2a, 0x09, 0x0b, 0xcb, 0x74, 0x56, 0xdf, 0x1f, 0x3b, 0x86, 0xf7, 0x08, 0xd6, 0x17, - 0x92, 0x68, 0x1d, 0x56, 0x09, 0x65, 0x3c, 0xb1, 0x80, 0x0b, 0x9a, 0x6b, 0x81, 0x06, 0xc8, 0x82, - 0x17, 0xce, 0x8d, 0x0e, 0xa6, 0xb0, 0x53, 0x2b, 0x44, 0x7e, 0x1e, 0x3b, 0xc0, 0x7b, 0x03, 0x60, - 0x75, 0x97, 0xa5, 0x99, 0x2c, 0xd8, 0x98, 0x90, 0x21, 0x15, 0xa2, 0x54, 0x99, 0x42, 0x84, 0x61, - 0xb5, 0x30, 0x54, 0x58, 0x2b, 0xca, 0xb0, 0x8d, 0xb9, 0x61, 0x82, 0xce, 0x0c, 0xdb, 0xe1, 0x11, - 0xeb, 0xb6, 0x4f, 0x46, 0x8e, 0xf1, 0xe1, 0xbb, 0xd3, 0x1c, 0x44, 0xf2, 0x55, 0x16, 0xfa, 0x7d, - 0x9e, 0x94, 0xaf, 0x55, 0xfe, 0x6c, 0x09, 0x72, 0xd0, 0x92, 0x79, 0x4a, 0x85, 0x6a, 0x10, 0x81, - 0x56, 0xee, 0xd4, 0x5e, 0xeb, 0x85, 0x0c, 0xef, 0x2d, 0x80, 0xe6, 0x93, 0x4c, 0xfe, 0x47, 0x1b, - 0x7d, 0x04, 0xd0, 0xdc, 0xcb, 0xd2, 0x34, 0xce, 0x8b, 0xb9, 0x92, 0x4b, 0x1c, 0x97, 0xa7, 0xf3, - 0x6f, 0xe7, 0x2a, 0xe5, 0xce, 0xc3, 0x72, 0x2e, 0xf8, 0xf2, 0x69, 0xeb, 0xee, 0x8d, 0x3f, 0x76, - 0x1f, 0xe9, 0x4f, 0x2b, 0xa6, 0x03, 0xdc, 0xcf, 0x5b, 0x87, 0xed, 0x3b, 0x6d, 0x5f, 0xef, 0xb9, - 0x6b, 0x01, 0xef, 0x39, 0x5c, 0xbb, 0x5f, 0x5c, 0xc1, 0x33, 0x16, 0xc9, 0xdf, 0xdc, 0x47, 0x03, - 0xd6, 0xe8, 0x51, 0xca, 0x19, 0x65, 0x52, 0x1d, 0xc8, 0xa5, 0x60, 0x86, 0x95, 0xf7, 0x71, 0x84, - 0x05, 0x15, 0x56, 0xc5, 0xad, 0x28, 0xef, 0x35, 0xf4, 0x3e, 0x03, 0x58, 0x7b, 0x4c, 0x25, 0x26, - 0x58, 0x62, 0xe4, 0xc2, 0x3a, 0xa1, 0xa2, 0x3f, 0x8c, 0x52, 0x19, 0x71, 0x56, 0xca, 0x2f, 0xa6, - 0xd0, 0xbd, 0x82, 0xc1, 0x78, 0xd2, 0xcb, 0x58, 0x24, 0xa7, 0x0f, 0x66, 0x2f, 0xfd, 0xe6, 0x66, - 0xfb, 0x06, 0x90, 0x4c, 0x43, 0x81, 0x10, 0x5c, 0x2d, 0xec, 0xb5, 0x2a, 0x4a, 0x5b, 0xc5, 0xc5, - 0x76, 0x24, 0x12, 0x69, 0x8c, 0x73, 0x6b, 0x55, 0x5f, 0x46, 0x09, 0x0b, 0x36, 0xc3, 0x09, 0xb5, - 0xaa, 0x9a, 0x5d, 0xc4, 0xe8, 0x0a, 0x34, 0x45, 0x9e, 0x84, 0x3c, 0xb6, 0x4c, 0x95, 0x2d, 0x51, - 0x77, 0xe7, 0x64, 0x6c, 0x83, 0xd3, 0xb1, 0x0d, 0x7e, 0x8c, 0x6d, 0xf0, 0x6e, 0x62, 0x1b, 0xa7, - 0x13, 0xdb, 0xf8, 0x36, 0xb1, 0x8d, 0x17, 0x9b, 0x7f, 0xe3, 0xbb, 0x7a, 0xbc, 0xd0, 0x54, 0x7f, - 0x33, 0xb7, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xcc, 0x03, 0xbf, 0xe9, 0xee, 0x04, 0x00, 0x00, + 0x9d, 0x59, 0xe1, 0x7f, 0xa0, 0x62, 0xaa, 0xc4, 0xc2, 0x14, 0x50, 0xb2, 0x30, 0xf7, 0x2f, 0x40, + 0xbe, 0x73, 0x7e, 0x54, 0x0a, 0x88, 0x81, 0x81, 0x29, 0xef, 0x7b, 0xef, 0x7b, 0xdf, 0x7b, 0xfa, + 0xee, 0x39, 0xd0, 0xee, 0x73, 0x91, 0x70, 0xd1, 0x0a, 0x31, 0x3b, 0x68, 0x1d, 0x6e, 0x87, 0x54, + 0xe2, 0x6d, 0x05, 0xfc, 0x74, 0xc8, 0x25, 0x47, 0x97, 0x75, 0xdd, 0x57, 0xa9, 0xb2, 0xde, 0x58, + 0x1f, 0xf0, 0x01, 0x57, 0xf5, 0x56, 0x11, 0x69, 0x6a, 0x63, 0x43, 0x53, 0x7b, 0xba, 0x50, 0xf6, + 0xe9, 0xd2, 0x7c, 0x8a, 0xa0, 0xb3, 0x29, 0x7d, 0x1e, 0x31, 0x5d, 0xf7, 0xbe, 0x02, 0x68, 0x3e, + 0xc5, 0x43, 0x9c, 0x08, 0xb4, 0x0f, 0x2f, 0x0a, 0xca, 0x48, 0x8f, 0x32, 0x1c, 0xc6, 0x94, 0x58, + 0xc0, 0xad, 0x34, 0xeb, 0xb7, 0x5c, 0x7f, 0xc9, 0x1e, 0xfe, 0x1e, 0x65, 0xe4, 0x81, 0xe6, 0x75, + 0xaf, 0x9d, 0x8d, 0x9c, 0xab, 0x39, 0x4e, 0xe2, 0x8e, 0xb7, 0xd8, 0x7f, 0x93, 0x27, 0x91, 0xa4, + 0x49, 0x2a, 0x73, 0x2f, 0xa8, 0x8b, 0x39, 0x1f, 0xbd, 0x84, 0xeb, 0x84, 0xee, 0xe3, 0x2c, 0x96, + 0xbd, 0x73, 0xf3, 0x56, 0x5c, 0xd0, 0xac, 0x75, 0x37, 0xcf, 0x46, 0xce, 0x75, 0xad, 0xb6, 0x8c, + 0xb5, 0xa8, 0x8a, 0x4a, 0xc2, 0xc2, 0x32, 0x9d, 0xd5, 0xf7, 0xc7, 0x8e, 0xe1, 0x3d, 0x82, 0xf5, + 0x85, 0x24, 0x5a, 0x87, 0x55, 0x42, 0x19, 0x4f, 0x2c, 0xe0, 0x82, 0xe6, 0x5a, 0xa0, 0x01, 0xb2, + 0xe0, 0x85, 0x73, 0xa3, 0x83, 0x29, 0xec, 0xd4, 0x0a, 0x91, 0x9f, 0xc7, 0x0e, 0xf0, 0xde, 0x00, + 0x58, 0xdd, 0x65, 0x69, 0x26, 0x0b, 0x36, 0x26, 0x64, 0x48, 0x85, 0x28, 0x55, 0xa6, 0x10, 0x61, + 0x58, 0x2d, 0x0c, 0x15, 0xd6, 0x8a, 0x32, 0x6c, 0x63, 0x6e, 0x98, 0xa0, 0x33, 0xc3, 0x76, 0x78, + 0xc4, 0xba, 0xed, 0x93, 0x91, 0x63, 0x7c, 0xf8, 0xee, 0x34, 0x07, 0x91, 0x7c, 0x95, 0x85, 0x7e, + 0x9f, 0x27, 0xe5, 0x6b, 0x95, 0x3f, 0x5b, 0x82, 0x1c, 0xb4, 0x64, 0x9e, 0x52, 0xa1, 0x1a, 0x44, + 0xa0, 0x95, 0x3b, 0xb5, 0xd7, 0x7a, 0x21, 0xc3, 0x7b, 0x0b, 0xa0, 0xf9, 0x24, 0x93, 0xff, 0xd1, + 0x46, 0x1f, 0x01, 0x34, 0xf7, 0xb2, 0x34, 0x8d, 0xf3, 0x62, 0xae, 0xe4, 0x12, 0xc7, 0xe5, 0xe9, + 0xfc, 0xdb, 0xb9, 0x4a, 0xb9, 0xf3, 0xb0, 0x9c, 0x0b, 0xbe, 0x7c, 0xda, 0xba, 0x7b, 0xe3, 0x8f, + 0xdd, 0x47, 0xfa, 0xd3, 0x8a, 0xe9, 0x00, 0xf7, 0xf3, 0xd6, 0x61, 0xfb, 0x4e, 0xdb, 0xd7, 0x7b, + 0xee, 0x5a, 0xc0, 0x7b, 0x0e, 0xd7, 0xee, 0x17, 0x57, 0xf0, 0x8c, 0x45, 0xf2, 0x37, 0xf7, 0xd1, + 0x80, 0x35, 0x7a, 0x94, 0x72, 0x46, 0x99, 0x54, 0x07, 0x72, 0x29, 0x98, 0x61, 0xe5, 0x7d, 0x1c, + 0x61, 0x41, 0x85, 0x55, 0x71, 0x2b, 0xca, 0x7b, 0x0d, 0xbd, 0xcf, 0x00, 0xd6, 0x1e, 0x53, 0x89, + 0x09, 0x96, 0x18, 0xb9, 0xb0, 0x4e, 0xa8, 0xe8, 0x0f, 0xa3, 0x54, 0x46, 0x9c, 0x95, 0xf2, 0x8b, + 0x29, 0x74, 0xaf, 0x60, 0x30, 0x9e, 0xf4, 0x32, 0x16, 0xc9, 0xe9, 0x83, 0xd9, 0x4b, 0xbf, 0xb9, + 0xd9, 0xbe, 0x01, 0x24, 0xd3, 0x50, 0x20, 0x04, 0x57, 0x0b, 0x7b, 0xad, 0x8a, 0xd2, 0x56, 0x71, + 0xb1, 0x1d, 0x89, 0x44, 0x1a, 0xe3, 0xdc, 0x5a, 0xd5, 0x97, 0x51, 0xc2, 0x82, 0xcd, 0x70, 0x42, + 0xad, 0xaa, 0x66, 0x17, 0x31, 0xba, 0x02, 0x4d, 0x91, 0x27, 0x21, 0x8f, 0x2d, 0x53, 0x65, 0x4b, + 0xd4, 0xdd, 0x39, 0x19, 0xdb, 0xe0, 0x74, 0x6c, 0x83, 0x1f, 0x63, 0x1b, 0xbc, 0x9b, 0xd8, 0xc6, + 0xe9, 0xc4, 0x36, 0xbe, 0x4d, 0x6c, 0xe3, 0xc5, 0xe6, 0xdf, 0xf8, 0xae, 0x1e, 0x2f, 0x34, 0xd5, + 0xdf, 0xcc, 0xed, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xb9, 0x6d, 0x56, 0xee, 0x04, 0x00, + 0x00, } func (this *SendEnabled) Equal(that interface{}) bool { diff --git a/x/bank/types/genesis.pb.go b/x/bank/types/genesis.pb.go index c94d7cc9613e..a92f4655169d 100644 --- a/x/bank/types/genesis.pb.go +++ b/x/bank/types/genesis.pb.go @@ -7,8 +7,8 @@ import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/bank/types/query.pb.go b/x/bank/types/query.pb.go index 3af52b138df5..b0254acad145 100644 --- a/x/bank/types/query.pb.go +++ b/x/bank/types/query.pb.go @@ -9,9 +9,9 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/bank/types/query.pb.gw.go b/x/bank/types/query.pb.gw.go index 3e04ab0c3387..c6abc3a8b3ec 100644 --- a/x/bank/types/query.pb.gw.go +++ b/x/bank/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join var ( filter_Query_Balance_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} @@ -502,12 +504,14 @@ func local_request_Query_BaseDenom_0(ctx context.Context, marshaler runtime.Mars // 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_Balance_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 { @@ -515,6 +519,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Balance_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) @@ -528,6 +533,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_AllBalances_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 { @@ -535,6 +542,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_AllBalances_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) @@ -548,6 +556,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_TotalSupply_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 { @@ -555,6 +565,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_TotalSupply_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) @@ -568,6 +579,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_SupplyOf_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 { @@ -575,6 +588,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_SupplyOf_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) @@ -588,6 +602,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_TotalSupplyWithoutOffset_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 { @@ -595,6 +611,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_TotalSupplyWithoutOffset_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) @@ -608,6 +625,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_SupplyOfWithoutOffset_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 { @@ -615,6 +634,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_SupplyOfWithoutOffset_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) @@ -628,6 +648,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 { @@ -635,6 +657,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) @@ -648,6 +671,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_DenomMetadata_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 { @@ -655,6 +680,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_DenomMetadata_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) @@ -668,6 +694,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_DenomsMetadata_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 { @@ -675,6 +703,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_DenomsMetadata_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) @@ -688,6 +717,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_BaseDenom_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 { @@ -695,6 +726,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_BaseDenom_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) diff --git a/x/bank/types/tx.pb.go b/x/bank/types/tx.pb.go index 394c968ae24e..2a85d4371061 100644 --- a/x/bank/types/tx.pb.go +++ b/x/bank/types/tx.pb.go @@ -8,9 +8,9 @@ import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/capability/types/capability.pb.go b/x/capability/types/capability.pb.go index 785742bd338a..1a6639360541 100644 --- a/x/capability/types/capability.pb.go +++ b/x/capability/types/capability.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/capability/types/genesis.pb.go b/x/capability/types/genesis.pb.go index e72c18eda53b..5c7955d678a7 100644 --- a/x/capability/types/genesis.pb.go +++ b/x/capability/types/genesis.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/crisis/client/testsuite/suite.go b/x/crisis/client/testsuite/suite.go index d0d82f62120b..dd611b45e289 100644 --- a/x/crisis/client/testsuite/suite.go +++ b/x/crisis/client/testsuite/suite.go @@ -3,7 +3,7 @@ package testutil import ( "fmt" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/client/flags" diff --git a/x/crisis/types/genesis.pb.go b/x/crisis/types/genesis.pb.go index 06a870ff7193..c65d684d58f7 100644 --- a/x/crisis/types/genesis.pb.go +++ b/x/crisis/types/genesis.pb.go @@ -6,8 +6,8 @@ package types import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/crisis/types/tx.pb.go b/x/crisis/types/tx.pb.go index f84c4adbf106..8b106e37abd7 100644 --- a/x/crisis/types/tx.pb.go +++ b/x/crisis/types/tx.pb.go @@ -6,9 +6,9 @@ package types import ( context "context" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/distribution/client/rest/grpc_query_test.go b/x/distribution/client/rest/grpc_query_test.go index ec8e2a7666dd..8eaab7eca622 100644 --- a/x/distribution/client/rest/grpc_query_test.go +++ b/x/distribution/client/rest/grpc_query_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/testutil" diff --git a/x/distribution/client/testutil/suite.go b/x/distribution/client/testutil/suite.go index 3dcfca70aa68..997a006ed4c5 100644 --- a/x/distribution/client/testutil/suite.go +++ b/x/distribution/client/testutil/suite.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" tmcli "github.com/tendermint/tendermint/libs/cli" diff --git a/x/distribution/keeper/store.go b/x/distribution/keeper/store.go index 0203ee13f672..c5a692cb105d 100644 --- a/x/distribution/keeper/store.go +++ b/x/distribution/keeper/store.go @@ -1,7 +1,7 @@ package keeper import ( - gogotypes "github.com/gogo/protobuf/types" + gogotypes "github.com/cosmos/gogoproto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" diff --git a/x/distribution/types/distribution.pb.go b/x/distribution/types/distribution.pb.go index 2657160a6ea0..a54ec6e634c4 100644 --- a/x/distribution/types/distribution.pb.go +++ b/x/distribution/types/distribution.pb.go @@ -7,8 +7,8 @@ import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -79,11 +79,12 @@ func (m *Params) GetWithdrawAddrEnabled() bool { // 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 +// +// 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 type ValidatorHistoricalRewards struct { CumulativeRewardRatio github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,1,rep,name=cumulative_reward_ratio,json=cumulativeRewardRatio,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"cumulative_reward_ratio" yaml:"cumulative_reward_ratio"` ReferenceCount uint32 `protobuf:"varint,2,opt,name=reference_count,json=referenceCount,proto3" json:"reference_count,omitempty" yaml:"reference_count"` diff --git a/x/distribution/types/genesis.pb.go b/x/distribution/types/genesis.pb.go index 5c94d4359ffa..bb2e053c64a6 100644 --- a/x/distribution/types/genesis.pb.go +++ b/x/distribution/types/genesis.pb.go @@ -7,8 +7,8 @@ import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/distribution/types/query.pb.go b/x/distribution/types/query.pb.go index 47acd5e73c52..32115500c90a 100644 --- a/x/distribution/types/query.pb.go +++ b/x/distribution/types/query.pb.go @@ -9,9 +9,9 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/distribution/types/query.pb.gw.go b/x/distribution/types/query.pb.gw.go index 2e8f1cde3ff1..2b4ce81b8b81 100644 --- a/x/distribution/types/query.pb.gw.go +++ b/x/distribution/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join 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 @@ -488,12 +490,14 @@ func local_request_Query_CommunityPool_0(ctx context.Context, marshaler runtime. // 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_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 { @@ -501,6 +505,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) @@ -514,6 +519,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_ValidatorOutstandingRewards_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 { @@ -521,6 +528,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_ValidatorOutstandingRewards_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) @@ -534,6 +542,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_ValidatorCommission_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 { @@ -541,6 +551,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_ValidatorCommission_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) @@ -554,6 +565,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_ValidatorSlashes_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 { @@ -561,6 +574,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_ValidatorSlashes_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) @@ -574,6 +588,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_DelegationRewards_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 { @@ -581,6 +597,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_DelegationRewards_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) @@ -594,6 +611,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_DelegationTotalRewards_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 { @@ -601,6 +620,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_DelegationTotalRewards_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) @@ -614,6 +634,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_DelegatorValidators_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 { @@ -621,6 +643,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_DelegatorValidators_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) @@ -634,6 +657,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_DelegatorWithdrawAddress_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 { @@ -641,6 +666,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_DelegatorWithdrawAddress_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 +680,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_CommunityPool_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 +689,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_CommunityPool_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) diff --git a/x/distribution/types/tx.pb.go b/x/distribution/types/tx.pb.go index 55cfce4e78f4..8a06f2ff0ef0 100644 --- a/x/distribution/types/tx.pb.go +++ b/x/distribution/types/tx.pb.go @@ -8,9 +8,9 @@ import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/evidence/abci.go b/x/evidence/abci.go index 63866fd2bc68..6812de29c187 100644 --- a/x/evidence/abci.go +++ b/x/evidence/abci.go @@ -21,7 +21,7 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) switch tmEvidence.Type { // It's still ongoing discussion how should we treat and slash attacks with // premeditation. So for now we agree to treat them in the same way. - case abci.EvidenceType_DUPLICATE_VOTE, abci.EvidenceType_LIGHT_CLIENT_ATTACK: + case abci.MisbehaviorType_DUPLICATE_VOTE, abci.MisbehaviorType_LIGHT_CLIENT_ATTACK: evidence := types.FromABCIEvidence(tmEvidence) k.HandleEquivocationEvidence(ctx, evidence.(*types.Equivocation)) diff --git a/x/evidence/exported/evidence.go b/x/evidence/exported/evidence.go index 8cf00fa6a93c..6cad9a9d7093 100644 --- a/x/evidence/exported/evidence.go +++ b/x/evidence/exported/evidence.go @@ -1,7 +1,7 @@ package exported import ( - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" tmbytes "github.com/tendermint/tendermint/libs/bytes" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/evidence/genesis.go b/x/evidence/genesis.go index 2be3fee88276..abff812fc7c8 100644 --- a/x/evidence/genesis.go +++ b/x/evidence/genesis.go @@ -3,7 +3,7 @@ package evidence import ( "fmt" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/evidence/keeper/grpc_query.go b/x/evidence/keeper/grpc_query.go index f084c16717a0..4f511644f696 100644 --- a/x/evidence/keeper/grpc_query.go +++ b/x/evidence/keeper/grpc_query.go @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/store/prefix" "github.com/cosmos/cosmos-sdk/types/query" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/evidence/types/evidence.go b/x/evidence/types/evidence.go index fca6126ec36f..0d957a140770 100644 --- a/x/evidence/types/evidence.go +++ b/x/evidence/types/evidence.go @@ -87,7 +87,7 @@ func (e Equivocation) GetTotalPower() int64 { return 0 } // FromABCIEvidence converts a Tendermint concrete Evidence type to // SDK Evidence using Equivocation as the concrete type. -func FromABCIEvidence(e abci.Evidence) exported.Evidence { +func FromABCIEvidence(e abci.Misbehavior) exported.Evidence { bech32PrefixConsAddr := sdk.GetConfig().GetBech32ConsensusAddrPrefix() consAddr, err := sdk.Bech32ifyAddressBytes(bech32PrefixConsAddr, e.Validator.Address) if err != nil { diff --git a/x/evidence/types/evidence.pb.go b/x/evidence/types/evidence.pb.go index 116d6362d5c7..5d638351ea45 100644 --- a/x/evidence/types/evidence.pb.go +++ b/x/evidence/types/evidence.pb.go @@ -5,9 +5,9 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" @@ -133,7 +133,7 @@ func (m *Equivocation) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) if err1 != nil { return 0, err1 } @@ -169,7 +169,7 @@ func (m *Equivocation) Size() (n int) { if m.Height != 0 { n += 1 + sovEvidence(uint64(m.Height)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time) n += 1 + l + sovEvidence(uint64(l)) if m.Power != 0 { n += 1 + sovEvidence(uint64(m.Power)) @@ -264,7 +264,7 @@ func (m *Equivocation) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/evidence/types/evidence_test.go b/x/evidence/types/evidence_test.go index c78f0b059cc9..1d7ebe99352b 100644 --- a/x/evidence/types/evidence_test.go +++ b/x/evidence/types/evidence_test.go @@ -61,8 +61,8 @@ func TestEquivocationValidateBasic(t *testing.T) { func TestEvidenceAddressConversion(t *testing.T) { sdk.GetConfig().SetBech32PrefixForConsensusNode("testcnclcons", "testcnclconspub") - tmEvidence := abci.Evidence{ - Type: abci.EvidenceType_DUPLICATE_VOTE, + tmEvidence := abci.Misbehavior{ + Type: abci.MisbehaviorType_DUPLICATE_VOTE, Validator: abci.Validator{ Address: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, Power: 100, diff --git a/x/evidence/types/genesis.go b/x/evidence/types/genesis.go index b274ea20714f..102ede073322 100644 --- a/x/evidence/types/genesis.go +++ b/x/evidence/types/genesis.go @@ -3,7 +3,7 @@ package types import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/x/evidence/exported" diff --git a/x/evidence/types/genesis.pb.go b/x/evidence/types/genesis.pb.go index 672a0ce8cf2e..fdf89c8118dd 100644 --- a/x/evidence/types/genesis.pb.go +++ b/x/evidence/types/genesis.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/evidence/types/msgs.go b/x/evidence/types/msgs.go index f1a57ca76f16..8e7c3109115b 100644 --- a/x/evidence/types/msgs.go +++ b/x/evidence/types/msgs.go @@ -2,7 +2,8 @@ package types import ( "fmt" - "github.com/gogo/protobuf/proto" + + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -22,6 +23,7 @@ var ( ) // NewMsgSubmitEvidence returns a new MsgSubmitEvidence with a signer/submitter. +// //nolint:interfacer func NewMsgSubmitEvidence(s sdk.AccAddress, evi exported.Evidence) (*MsgSubmitEvidence, error) { msg, ok := evi.(proto.Message) diff --git a/x/evidence/types/query.pb.go b/x/evidence/types/query.pb.go index e084ea29c899..aababa92cbd8 100644 --- a/x/evidence/types/query.pb.go +++ b/x/evidence/types/query.pb.go @@ -8,9 +8,9 @@ import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" github_com_tendermint_tendermint_libs_bytes "github.com/tendermint/tendermint/libs/bytes" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" diff --git a/x/evidence/types/query.pb.gw.go b/x/evidence/types/query.pb.gw.go index 6f85fd6f1e10..77a7be86d1d7 100644 --- a/x/evidence/types/query.pb.gw.go +++ b/x/evidence/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join func request_Query_Evidence_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryEvidenceRequest @@ -124,12 +126,14 @@ func local_request_Query_AllEvidence_0(ctx context.Context, marshaler runtime.Ma // 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_Evidence_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 { @@ -137,6 +141,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Evidence_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) @@ -150,6 +155,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_AllEvidence_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 { @@ -157,6 +164,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_AllEvidence_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) diff --git a/x/evidence/types/tx.pb.go b/x/evidence/types/tx.pb.go index 0cce8d2cbb4a..d9a912a533f9 100644 --- a/x/evidence/types/tx.pb.go +++ b/x/evidence/types/tx.pb.go @@ -7,11 +7,11 @@ import ( bytes "bytes" context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/feegrant/client/testutil/suite.go b/x/feegrant/client/testutil/suite.go index 47724a38cae5..b4ab46caee0f 100644 --- a/x/feegrant/client/testutil/suite.go +++ b/x/feegrant/client/testutil/suite.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" tmcli "github.com/tendermint/tendermint/libs/cli" diff --git a/x/feegrant/feegrant.pb.go b/x/feegrant/feegrant.pb.go index a76572321924..ac356ab863b7 100644 --- a/x/feegrant/feegrant.pb.go +++ b/x/feegrant/feegrant.pb.go @@ -5,13 +5,13 @@ package feegrant import ( fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types1 "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "google.golang.org/protobuf/types/known/durationpb" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" @@ -294,43 +294,42 @@ func init() { } var fileDescriptor_7279582900c30aea = []byte{ - // 562 bytes of a gzipped FileDescriptorProto + // 560 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x3f, 0x6f, 0xd3, 0x40, - 0x14, 0x8f, 0x9b, 0xa4, 0x90, 0x0b, 0x94, 0xc6, 0x14, 0xe1, 0x64, 0x70, 0xa2, 0x0e, 0x34, 0x0c, - 0xb5, 0x69, 0xd9, 0xca, 0x42, 0x1c, 0xa0, 0x42, 0xa2, 0x12, 0x32, 0x4c, 0x2c, 0xd1, 0xd9, 0x79, - 0x35, 0x27, 0x6c, 0x9f, 0xe5, 0xbb, 0x40, 0xb3, 0x32, 0x31, 0x76, 0x64, 0x42, 0xcc, 0xcc, 0x7c, - 0x88, 0x8a, 0xa9, 0x82, 0x85, 0x89, 0xa2, 0xe4, 0x8b, 0x20, 0xdf, 0x9d, 0x9d, 0x90, 0xf0, 0x47, - 0xaa, 0x3a, 0xc5, 0x77, 0xef, 0xfd, 0xfe, 0xbd, 0x77, 0x0a, 0xba, 0xe5, 0x53, 0x16, 0x51, 0x66, - 0x1f, 0x02, 0x04, 0x29, 0x8e, 0xb9, 0xfd, 0x7a, 0xc7, 0x03, 0x8e, 0x77, 0x8a, 0x0b, 0x2b, 0x49, - 0x29, 0xa7, 0xfa, 0x4d, 0xd9, 0x67, 0x15, 0xd7, 0xaa, 0xaf, 0xb5, 0x11, 0xd0, 0x80, 0x8a, 0x1e, - 0x3b, 0xfb, 0x92, 0xed, 0xad, 0x66, 0x40, 0x69, 0x10, 0x82, 0x2d, 0x4e, 0xde, 0xe8, 0xd0, 0xc6, - 0xf1, 0x38, 0x2f, 0x49, 0xa6, 0x81, 0xc4, 0x28, 0x5a, 0x59, 0x32, 0x95, 0x19, 0x0f, 0x33, 0x28, - 0x8c, 0xf8, 0x94, 0xc4, 0xaa, 0xde, 0x5e, 0x64, 0xe5, 0x24, 0x02, 0xc6, 0x71, 0x94, 0xe4, 0x04, - 0x8b, 0x0d, 0xc3, 0x51, 0x8a, 0x39, 0xa1, 0x8a, 0x60, 0xf3, 0x9b, 0x86, 0xd6, 0x1c, 0xcc, 0x88, - 0xdf, 0x0b, 0x43, 0xfa, 0x06, 0xc7, 0x3e, 0xe8, 0x21, 0xaa, 0xb3, 0x04, 0xe2, 0xe1, 0x20, 0x24, - 0x11, 0xe1, 0x86, 0xd6, 0x29, 0x77, 0xeb, 0xbb, 0x4d, 0x4b, 0xf9, 0xca, 0x9c, 0xe4, 0x51, 0xad, - 0x3e, 0x25, 0xb1, 0x73, 0xe7, 0xe4, 0x47, 0xbb, 0xf4, 0xe9, 0xac, 0xdd, 0x0d, 0x08, 0x7f, 0x39, - 0xf2, 0x2c, 0x9f, 0x46, 0x2a, 0x84, 0xfa, 0xd9, 0x66, 0xc3, 0x57, 0x36, 0x1f, 0x27, 0xc0, 0x04, - 0x80, 0xb9, 0x48, 0xf0, 0x3f, 0xc9, 0xe8, 0xf5, 0xfb, 0x08, 0xc1, 0x51, 0x42, 0xa4, 0x29, 0x63, - 0xa5, 0xa3, 0x75, 0xeb, 0xbb, 0x2d, 0x4b, 0xba, 0xb6, 0x72, 0xd7, 0xd6, 0xf3, 0x3c, 0x96, 0x53, - 0x39, 0x3e, 0x6b, 0x6b, 0xee, 0x1c, 0x66, 0xaf, 0xf1, 0xf5, 0xf3, 0xf6, 0xd5, 0x47, 0x00, 0x45, - 0x82, 0xc7, 0x9b, 0xd3, 0x32, 0x6a, 0x3c, 0x85, 0x94, 0xd0, 0xe1, 0x7c, 0xb0, 0x3e, 0xaa, 0x7a, - 0x59, 0x54, 0x43, 0x13, 0x2a, 0x5b, 0xd6, 0x5f, 0x36, 0x68, 0xfd, 0x3e, 0x10, 0xa7, 0x92, 0x05, - 0x74, 0x25, 0x56, 0xbf, 0x87, 0x56, 0x13, 0xc1, 0xac, 0xbc, 0x36, 0x97, 0xbc, 0x3e, 0x50, 0x13, - 0x76, 0x2e, 0x67, 0xb8, 0xf7, 0x99, 0x5d, 0x05, 0xd1, 0xc7, 0x48, 0x97, 0x5f, 0x83, 0xf9, 0x09, - 0x97, 0x2f, 0x7e, 0xc2, 0xeb, 0x52, 0xe6, 0xd9, 0x6c, 0xce, 0x23, 0xa4, 0xee, 0x06, 0x3e, 0x8e, - 0xa5, 0xbc, 0x51, 0xb9, 0x78, 0xe1, 0x35, 0x29, 0xd2, 0xc7, 0xb1, 0xd0, 0xd6, 0xf7, 0xd1, 0x15, - 0x25, 0x9b, 0x02, 0x03, 0x6e, 0x54, 0xff, 0xbb, 0x60, 0x31, 0x35, 0xb1, 0xe4, 0xba, 0x44, 0xba, - 0x19, 0xf0, 0x4f, 0x5b, 0xfe, 0xa0, 0xa1, 0xeb, 0xe2, 0x08, 0xc3, 0x03, 0x16, 0xcc, 0xf6, 0xfc, - 0x10, 0xd5, 0x70, 0x7e, 0x50, 0xbb, 0xde, 0x58, 0x12, 0xec, 0xc5, 0x63, 0xa7, 0xf1, 0x65, 0x91, - 0xd3, 0x9d, 0x21, 0xf5, 0xdb, 0x68, 0x1d, 0x4b, 0xf6, 0x41, 0x04, 0x8c, 0xe1, 0x00, 0x98, 0xb1, - 0xd2, 0x29, 0x77, 0x6b, 0xee, 0x35, 0x75, 0x7f, 0xa0, 0xae, 0xf7, 0x6e, 0xbc, 0xfb, 0xd8, 0x2e, - 0x2d, 0x1b, 0x7c, 0xab, 0xa1, 0xea, 0x7e, 0xf6, 0xb2, 0x74, 0x03, 0x5d, 0x12, 0x4f, 0x0c, 0x52, - 0x61, 0xa8, 0xe6, 0xe6, 0xc7, 0x59, 0x05, 0xc4, 0x83, 0x2a, 0x2a, 0x0b, 0x31, 0xca, 0xe7, 0x8d, - 0xe1, 0xf4, 0x4e, 0x26, 0xa6, 0x76, 0x3a, 0x31, 0xb5, 0x9f, 0x13, 0x53, 0x3b, 0x9e, 0x9a, 0xa5, - 0xd3, 0xa9, 0x59, 0xfa, 0x3e, 0x35, 0x4b, 0x2f, 0xb6, 0xfe, 0xb9, 0xd5, 0xa3, 0xe2, 0x0f, 0xcf, - 0x5b, 0x15, 0x72, 0x77, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xd0, 0x08, 0x9a, 0x3d, 0x1b, 0x05, - 0x00, 0x00, + 0x14, 0x8f, 0x9b, 0xa4, 0x90, 0x0b, 0x94, 0xd6, 0x14, 0xe1, 0x64, 0x70, 0xa2, 0x0e, 0x34, 0x0c, + 0x3d, 0xd3, 0xb2, 0x95, 0x85, 0x38, 0x40, 0x85, 0x44, 0x25, 0x64, 0x98, 0x58, 0xa2, 0xb3, 0xf3, + 0x6a, 0x4e, 0xc4, 0x3e, 0xcb, 0x77, 0x81, 0x66, 0x65, 0x62, 0xec, 0xc8, 0x84, 0x98, 0x99, 0xf9, + 0x10, 0x15, 0x53, 0x25, 0x16, 0x26, 0x8a, 0x92, 0x2f, 0x82, 0x7c, 0x77, 0x76, 0x42, 0xc2, 0x1f, + 0x09, 0x75, 0x8a, 0xef, 0xde, 0xfb, 0xfd, 0x7b, 0xef, 0x14, 0x74, 0x2b, 0x60, 0x3c, 0x62, 0xdc, + 0x39, 0x02, 0x08, 0x53, 0x12, 0x0b, 0xe7, 0xf5, 0xae, 0x0f, 0x82, 0xec, 0x16, 0x17, 0x38, 0x49, + 0x99, 0x60, 0xe6, 0x4d, 0xd5, 0x87, 0x8b, 0x6b, 0xdd, 0xd7, 0xdc, 0x0c, 0x59, 0xc8, 0x64, 0x8f, + 0x93, 0x7d, 0xa9, 0xf6, 0x66, 0x23, 0x64, 0x2c, 0x1c, 0x82, 0x23, 0x4f, 0xfe, 0xe8, 0xc8, 0x21, + 0xf1, 0x38, 0x2f, 0x29, 0xa6, 0xbe, 0xc2, 0x68, 0x5a, 0x55, 0xb2, 0xb5, 0x19, 0x9f, 0x70, 0x28, + 0x8c, 0x04, 0x8c, 0xc6, 0xba, 0xde, 0x5a, 0x64, 0x15, 0x34, 0x02, 0x2e, 0x48, 0x94, 0xe4, 0x04, + 0x8b, 0x0d, 0x83, 0x51, 0x4a, 0x04, 0x65, 0x9a, 0x60, 0xeb, 0xab, 0x81, 0xd6, 0x5c, 0xc2, 0x69, + 0xd0, 0x1d, 0x0e, 0xd9, 0x1b, 0x12, 0x07, 0x60, 0x0e, 0x51, 0x9d, 0x27, 0x10, 0x0f, 0xfa, 0x43, + 0x1a, 0x51, 0x61, 0x19, 0xed, 0x72, 0xa7, 0xbe, 0xd7, 0xc0, 0xda, 0x57, 0xe6, 0x24, 0x8f, 0x8a, + 0x7b, 0x8c, 0xc6, 0xee, 0x9d, 0xd3, 0xef, 0xad, 0xd2, 0xa7, 0xf3, 0x56, 0x27, 0xa4, 0xe2, 0xe5, + 0xc8, 0xc7, 0x01, 0x8b, 0x74, 0x08, 0xfd, 0xb3, 0xc3, 0x07, 0xaf, 0x1c, 0x31, 0x4e, 0x80, 0x4b, + 0x00, 0xf7, 0x90, 0xe4, 0x7f, 0x92, 0xd1, 0x9b, 0xf7, 0x11, 0x82, 0xe3, 0x84, 0x2a, 0x53, 0xd6, + 0x4a, 0xdb, 0xe8, 0xd4, 0xf7, 0x9a, 0x58, 0xb9, 0xc6, 0xb9, 0x6b, 0xfc, 0x3c, 0x8f, 0xe5, 0x56, + 0x4e, 0xce, 0x5b, 0x86, 0x37, 0x87, 0xd9, 0xdf, 0xf8, 0xf2, 0x79, 0xe7, 0xea, 0x23, 0x80, 0x22, + 0xc1, 0xe3, 0xad, 0x69, 0x19, 0x6d, 0x3c, 0x85, 0x94, 0xb2, 0xc1, 0x7c, 0xb0, 0x1e, 0xaa, 0xfa, + 0x59, 0x54, 0xcb, 0x90, 0x2a, 0xdb, 0xf8, 0x0f, 0x1b, 0xc4, 0xbf, 0x0e, 0xc4, 0xad, 0x64, 0x01, + 0x3d, 0x85, 0x35, 0xef, 0xa1, 0xd5, 0x44, 0x32, 0x6b, 0xaf, 0x8d, 0x25, 0xaf, 0x0f, 0xf4, 0x84, + 0xdd, 0xcb, 0x19, 0xee, 0x7d, 0x66, 0x57, 0x43, 0xcc, 0x31, 0x32, 0xd5, 0x57, 0x7f, 0x7e, 0xc2, + 0xe5, 0x8b, 0x9f, 0xf0, 0xba, 0x92, 0x79, 0x36, 0x9b, 0xf3, 0x08, 0xe9, 0xbb, 0x7e, 0x40, 0x62, + 0x25, 0x6f, 0x55, 0x2e, 0x5e, 0x78, 0x4d, 0x89, 0xf4, 0x48, 0x2c, 0xb5, 0xcd, 0x03, 0x74, 0x45, + 0xcb, 0xa6, 0xc0, 0x41, 0x58, 0xd5, 0x7f, 0x2e, 0x58, 0x4e, 0x4d, 0x2e, 0xb9, 0xae, 0x90, 0x5e, + 0x06, 0xfc, 0xdd, 0x96, 0x3f, 0x18, 0xe8, 0xba, 0x3c, 0xc2, 0xe0, 0x90, 0x87, 0xb3, 0x3d, 0x3f, + 0x44, 0x35, 0x92, 0x1f, 0xf4, 0xae, 0x37, 0x97, 0x04, 0xbb, 0xf1, 0xd8, 0x5d, 0xe6, 0xf4, 0x66, + 0x48, 0xf3, 0x36, 0x5a, 0x27, 0x8a, 0xbd, 0x1f, 0x01, 0xe7, 0x24, 0x04, 0x6e, 0xad, 0xb4, 0xcb, + 0x9d, 0x9a, 0x77, 0x4d, 0xdf, 0x1f, 0xea, 0xeb, 0xfd, 0x1b, 0xef, 0x3e, 0xb6, 0x4a, 0xcb, 0x06, + 0xdf, 0x1a, 0xa8, 0x7a, 0x90, 0xbd, 0x2c, 0xd3, 0x42, 0x97, 0xe4, 0x13, 0x83, 0x54, 0x1a, 0xaa, + 0x79, 0xf9, 0x71, 0x56, 0x01, 0xf9, 0xa0, 0x8a, 0xca, 0x42, 0x8c, 0xf2, 0xff, 0xc6, 0x70, 0xbb, + 0xa7, 0x13, 0xdb, 0x38, 0x9b, 0xd8, 0xc6, 0x8f, 0x89, 0x6d, 0x9c, 0x4c, 0xed, 0xd2, 0xd9, 0xd4, + 0x2e, 0x7d, 0x9b, 0xda, 0xa5, 0x17, 0xdb, 0x7f, 0xdd, 0xea, 0x71, 0xf1, 0x87, 0xe7, 0xaf, 0x4a, + 0xb9, 0xbb, 0x3f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x59, 0xc6, 0xee, 0x8d, 0x1b, 0x05, 0x00, 0x00, } func (m *BasicAllowance) Marshal() (dAtA []byte, err error) { @@ -354,7 +353,7 @@ func (m *BasicAllowance) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if m.Expiration != nil { - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expiration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expiration):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(*m.Expiration, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.Expiration):]) if err1 != nil { return 0, err1 } @@ -400,7 +399,7 @@ func (m *PeriodicAllowance) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PeriodReset, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PeriodReset):]) + n2, err2 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.PeriodReset, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.PeriodReset):]) if err2 != nil { return 0, err2 } @@ -436,7 +435,7 @@ func (m *PeriodicAllowance) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } } - n3, err3 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Period, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.Period):]) + n3, err3 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.Period, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Period):]) if err3 != nil { return 0, err3 } @@ -574,7 +573,7 @@ func (m *BasicAllowance) Size() (n int) { } } if m.Expiration != nil { - l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expiration) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.Expiration) n += 1 + l + sovFeegrant(uint64(l)) } return n @@ -588,7 +587,7 @@ func (m *PeriodicAllowance) Size() (n int) { _ = l l = m.Basic.Size() n += 1 + l + sovFeegrant(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.Period) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Period) n += 1 + l + sovFeegrant(uint64(l)) if len(m.PeriodSpendLimit) > 0 { for _, e := range m.PeriodSpendLimit { @@ -602,7 +601,7 @@ func (m *PeriodicAllowance) Size() (n int) { n += 1 + l + sovFeegrant(uint64(l)) } } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.PeriodReset) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.PeriodReset) n += 1 + l + sovFeegrant(uint64(l)) return n } @@ -748,7 +747,7 @@ func (m *BasicAllowance) Unmarshal(dAtA []byte) error { if m.Expiration == nil { m.Expiration = new(time.Time) } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.Expiration, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(m.Expiration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -864,7 +863,7 @@ func (m *PeriodicAllowance) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.Period, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.Period, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -965,7 +964,7 @@ func (m *PeriodicAllowance) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.PeriodReset, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.PeriodReset, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/feegrant/filtered_fee.go b/x/feegrant/filtered_fee.go index d842e40852af..92a11c8effcc 100644 --- a/x/feegrant/filtered_fee.go +++ b/x/feegrant/filtered_fee.go @@ -1,7 +1,7 @@ package feegrant import ( - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/feegrant/genesis.pb.go b/x/feegrant/genesis.pb.go index 36593a2c8ec4..6c9bfea8b010 100644 --- a/x/feegrant/genesis.pb.go +++ b/x/feegrant/genesis.pb.go @@ -5,8 +5,8 @@ package feegrant import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/feegrant/grant.go b/x/feegrant/grant.go index a51e65ab5e1d..09644dbac796 100644 --- a/x/feegrant/grant.go +++ b/x/feegrant/grant.go @@ -1,7 +1,7 @@ package feegrant import ( - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -13,6 +13,7 @@ var ( ) // NewGrant creates a new FeeAllowanceGrant. +// //nolint:interfacer func NewGrant(granter, grantee sdk.AccAddress, feeAllowance FeeAllowanceI) (Grant, error) { msg, ok := feeAllowance.(proto.Message) diff --git a/x/feegrant/keeper/grpc_query.go b/x/feegrant/keeper/grpc_query.go index d8c23d0313cf..0f96a68e8692 100644 --- a/x/feegrant/keeper/grpc_query.go +++ b/x/feegrant/keeper/grpc_query.go @@ -3,7 +3,7 @@ package keeper import ( "context" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/x/feegrant/msgs.go b/x/feegrant/msgs.go index 3be830664bc3..85161b9e551a 100644 --- a/x/feegrant/msgs.go +++ b/x/feegrant/msgs.go @@ -1,7 +1,7 @@ package feegrant import ( - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -17,6 +17,7 @@ var ( ) // NewMsgGrantAllowance creates a new MsgGrantAllowance. +// //nolint:interfacer func NewMsgGrantAllowance(feeAllowance FeeAllowanceI, granter, grantee sdk.AccAddress) (*MsgGrantAllowance, error) { msg, ok := feeAllowance.(proto.Message) @@ -97,6 +98,7 @@ func (msg MsgGrantAllowance) UnpackInterfaces(unpacker types.AnyUnpacker) error // NewMsgRevokeAllowance returns a message to revoke a fee allowance for a given // granter and grantee +// //nolint:interfacer func NewMsgRevokeAllowance(granter sdk.AccAddress, grantee sdk.AccAddress) MsgRevokeAllowance { return MsgRevokeAllowance{Granter: granter.String(), Grantee: grantee.String()} diff --git a/x/feegrant/query.pb.go b/x/feegrant/query.pb.go index 94368d66649b..c018a29f0ed2 100644 --- a/x/feegrant/query.pb.go +++ b/x/feegrant/query.pb.go @@ -7,8 +7,8 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/feegrant/query.pb.gw.go b/x/feegrant/query.pb.gw.go index 06689435e071..27e109984c44 100644 --- a/x/feegrant/query.pb.gw.go +++ b/x/feegrant/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join func request_Query_Allowance_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryAllowanceRequest @@ -182,12 +184,14 @@ func local_request_Query_Allowances_0(ctx context.Context, marshaler runtime.Mar // 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_Allowance_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 { @@ -195,6 +199,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Allowance_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) @@ -208,6 +213,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Allowances_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 { @@ -215,6 +222,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Allowances_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) diff --git a/x/feegrant/tx.pb.go b/x/feegrant/tx.pb.go index 2a40a7ad49b4..24ddb26c9a24 100644 --- a/x/feegrant/tx.pb.go +++ b/x/feegrant/tx.pb.go @@ -6,11 +6,11 @@ package feegrant import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/genutil/client/cli/migrate.go b/x/genutil/client/cli/migrate.go index 37e42ac4f704..13c1b8cf059d 100644 --- a/x/genutil/client/cli/migrate.go +++ b/x/genutil/client/cli/migrate.go @@ -14,7 +14,6 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" - v040 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v040" v043 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v043" "github.com/cosmos/cosmos-sdk/x/genutil/types" ) @@ -25,7 +24,6 @@ const flagGenesisTime = "genesis-time" // // Ref: https://github.com/cosmos/cosmos-sdk/issues/5041 var migrationMap = types.MigrationMap{ - "v0.42": v040.Migrate, // NOTE: v0.40, v0.41 and v0.42 are genesis compatible. "v0.43": v043.Migrate, } diff --git a/x/genutil/collect_test.go b/x/genutil/collect_test.go index 46e20f88f1b3..cc8a89cda002 100644 --- a/x/genutil/collect_test.go +++ b/x/genutil/collect_test.go @@ -7,7 +7,7 @@ import ( "path/filepath" "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" tmtypes "github.com/tendermint/tendermint/types" diff --git a/x/genutil/legacy/v040/migrate.go b/x/genutil/legacy/v040/migrate.go deleted file mode 100644 index a022d9fcf985..000000000000 --- a/x/genutil/legacy/v040/migrate.go +++ /dev/null @@ -1,200 +0,0 @@ -package v040 - -import ( - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v040" - v036supply "github.com/cosmos/cosmos-sdk/x/bank/legacy/v036" - v038bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v038" - v040bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v040" - v039crisis "github.com/cosmos/cosmos-sdk/x/crisis/legacy/v039" - v040crisis "github.com/cosmos/cosmos-sdk/x/crisis/legacy/v040" - v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036" - v038distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v038" - v040distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v040" - v038evidence "github.com/cosmos/cosmos-sdk/x/evidence/legacy/v038" - v040evidence "github.com/cosmos/cosmos-sdk/x/evidence/legacy/v040" - v039genutil "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v039" - "github.com/cosmos/cosmos-sdk/x/genutil/types" - v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v036" - v040gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v040" - v039mint "github.com/cosmos/cosmos-sdk/x/mint/legacy/v039" - v040mint "github.com/cosmos/cosmos-sdk/x/mint/legacy/v040" - v036params "github.com/cosmos/cosmos-sdk/x/params/legacy/v036" - v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/legacy/v039" - v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/legacy/v040" - v038staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v038" - v040staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v040" - v038upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/legacy/v038" -) - -func migrateGenutil(oldGenState v039genutil.GenesisState) *types.GenesisState { - return &types.GenesisState{ - GenTxs: oldGenState.GenTxs, - } -} - -// Migrate migrates exported state from v0.39 to a v0.40 genesis state. -func Migrate(appState types.AppMap, clientCtx client.Context) types.AppMap { - v039Codec := codec.NewLegacyAmino() - v039auth.RegisterLegacyAminoCodec(v039Codec) - v036gov.RegisterLegacyAminoCodec(v039Codec) - v036distr.RegisterLegacyAminoCodec(v039Codec) - v036params.RegisterLegacyAminoCodec(v039Codec) - v038upgrade.RegisterLegacyAminoCodec(v039Codec) - - v040Codec := clientCtx.Codec - - if appState[v038bank.ModuleName] != nil { - // unmarshal relative source genesis application state - var bankGenState v038bank.GenesisState - v039Codec.MustUnmarshalJSON(appState[v038bank.ModuleName], &bankGenState) - - // unmarshal x/auth genesis state to retrieve all account balances - var authGenState v039auth.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039auth.ModuleName], &authGenState) - - // unmarshal x/supply genesis state to retrieve total supply - var supplyGenState v036supply.GenesisState - v039Codec.MustUnmarshalJSON(appState[v036supply.ModuleName], &supplyGenState) - - // delete deprecated x/bank genesis state - delete(appState, v038bank.ModuleName) - - // delete deprecated x/supply genesis state - delete(appState, v036supply.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040bank.ModuleName] = v040Codec.MustMarshalJSON(v040bank.Migrate(bankGenState, authGenState, supplyGenState)) - } - - // remove balances from existing accounts - if appState[v039auth.ModuleName] != nil { - // unmarshal relative source genesis application state - var authGenState v039auth.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039auth.ModuleName], &authGenState) - - // delete deprecated x/auth genesis state - delete(appState, v039auth.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040auth.ModuleName] = v040Codec.MustMarshalJSON(v040auth.Migrate(authGenState)) - } - - // Migrate x/crisis. - if appState[v039crisis.ModuleName] != nil { - // unmarshal relative source genesis application state - var crisisGenState v039crisis.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039crisis.ModuleName], &crisisGenState) - - // delete deprecated x/crisis genesis state - delete(appState, v039crisis.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040crisis.ModuleName] = v040Codec.MustMarshalJSON(v040crisis.Migrate(crisisGenState)) - } - - // Migrate x/distribution. - if appState[v038distr.ModuleName] != nil { - // unmarshal relative source genesis application state - var distributionGenState v038distr.GenesisState - v039Codec.MustUnmarshalJSON(appState[v038distr.ModuleName], &distributionGenState) - - // delete deprecated x/distribution genesis state - delete(appState, v038distr.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040distr.ModuleName] = v040Codec.MustMarshalJSON(v040distr.Migrate(distributionGenState)) - } - - // Migrate x/evidence. - if appState[v038evidence.ModuleName] != nil { - // unmarshal relative source genesis application state - var evidenceGenState v038evidence.GenesisState - v039Codec.MustUnmarshalJSON(appState[v038bank.ModuleName], &evidenceGenState) - - // delete deprecated x/evidence genesis state - delete(appState, v038evidence.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040evidence.ModuleName] = v040Codec.MustMarshalJSON(v040evidence.Migrate(evidenceGenState)) - } - - // Migrate x/gov. - if appState[v036gov.ModuleName] != nil { - // unmarshal relative source genesis application state - var govGenState v036gov.GenesisState - v039Codec.MustUnmarshalJSON(appState[v036gov.ModuleName], &govGenState) - - // delete deprecated x/gov genesis state - delete(appState, v036gov.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040gov.ModuleName] = v040Codec.MustMarshalJSON(v040gov.Migrate(govGenState)) - } - - // Migrate x/mint. - if appState[v039mint.ModuleName] != nil { - // unmarshal relative source genesis application state - var mintGenState v039mint.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039mint.ModuleName], &mintGenState) - - // delete deprecated x/mint genesis state - delete(appState, v039mint.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040mint.ModuleName] = v040Codec.MustMarshalJSON(v040mint.Migrate(mintGenState)) - } - - // Migrate x/slashing. - if appState[v039slashing.ModuleName] != nil { - // unmarshal relative source genesis application state - var slashingGenState v039slashing.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039slashing.ModuleName], &slashingGenState) - - // delete deprecated x/slashing genesis state - delete(appState, v039slashing.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040slashing.ModuleName] = v040Codec.MustMarshalJSON(v040slashing.Migrate(slashingGenState)) - } - - // Migrate x/staking. - if appState[v038staking.ModuleName] != nil { - // unmarshal relative source genesis application state - var stakingGenState v038staking.GenesisState - v039Codec.MustUnmarshalJSON(appState[v038staking.ModuleName], &stakingGenState) - - // delete deprecated x/staking genesis state - delete(appState, v038staking.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040staking.ModuleName] = v040Codec.MustMarshalJSON(v040staking.Migrate(stakingGenState)) - } - - // Migrate x/genutil - if appState[v039genutil.ModuleName] != nil { - // unmarshal relative source genesis application state - var genutilGenState v039genutil.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039genutil.ModuleName], &genutilGenState) - - // delete deprecated x/staking genesis state - delete(appState, v039genutil.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[ModuleName] = v040Codec.MustMarshalJSON(migrateGenutil(genutilGenState)) - } - - return appState -} diff --git a/x/genutil/legacy/v040/types.go b/x/genutil/legacy/v040/types.go deleted file mode 100644 index f641dbff51e1..000000000000 --- a/x/genutil/legacy/v040/types.go +++ /dev/null @@ -1,5 +0,0 @@ -package v040 - -const ( - ModuleName = "genutil" -) diff --git a/x/genutil/types/genesis.pb.go b/x/genutil/types/genesis.pb.go index 369cd0edfaf6..521e4cc76e86 100644 --- a/x/genutil/types/genesis.pb.go +++ b/x/genutil/types/genesis.pb.go @@ -6,8 +6,8 @@ package types import ( encoding_json "encoding/json" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/gov/client/testutil/suite.go b/x/gov/client/testutil/suite.go index e891818d690d..7fe7b9d56cb2 100644 --- a/x/gov/client/testutil/suite.go +++ b/x/gov/client/testutil/suite.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/testutil" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" tmcli "github.com/tendermint/tendermint/libs/cli" diff --git a/x/gov/keeper/proposal.go b/x/gov/keeper/proposal.go index 9be690f8353c..e5a12895dd5f 100644 --- a/x/gov/keeper/proposal.go +++ b/x/gov/keeper/proposal.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/gov/keeper/proposal_test.go b/x/gov/keeper/proposal_test.go index d70ae1e3aa18..09f48350cd06 100644 --- a/x/gov/keeper/proposal_test.go +++ b/x/gov/keeper/proposal_test.go @@ -7,12 +7,13 @@ import ( "testing" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" + + "github.com/stretchr/testify/require" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/gov/types" paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - "github.com/stretchr/testify/require" ) func (suite *KeeperTestSuite) TestGetSetProposal() { diff --git a/x/gov/legacy/v040/migrate.go b/x/gov/legacy/v040/migrate.go index 3adedde50932..701bfcef10c1 100644 --- a/x/gov/legacy/v040/migrate.go +++ b/x/gov/legacy/v040/migrate.go @@ -3,7 +3,7 @@ package v040 import ( "fmt" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" codectypes "github.com/cosmos/cosmos-sdk/codec/types" v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036" diff --git a/x/gov/types/genesis.pb.go b/x/gov/types/genesis.pb.go index 4df93da3d07b..83fca11c146c 100644 --- a/x/gov/types/genesis.pb.go +++ b/x/gov/types/genesis.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/gov/types/gov.pb.go b/x/gov/types/gov.pb.go index ea6d67e1648e..2e5823cc11fe 100644 --- a/x/gov/types/gov.pb.go +++ b/x/gov/types/gov.pb.go @@ -5,13 +5,13 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types1 "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "google.golang.org/protobuf/types/known/durationpb" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" @@ -561,112 +561,112 @@ func init() { func init() { proto.RegisterFile("cosmos/gov/v1beta1/gov.proto", fileDescriptor_6e82113c1a9a4b7c) } var fileDescriptor_6e82113c1a9a4b7c = []byte{ - // 1673 bytes of a gzipped FileDescriptorProto + // 1671 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcf, 0x8f, 0x1a, 0xc9, 0x15, 0xa6, 0x81, 0xf9, 0x55, 0xc0, 0x98, 0xad, 0xc1, 0x33, 0x0c, 0xf1, 0x76, 0xe3, 0x76, 0xb4, 0x1a, 0x59, 0x5e, 0x66, 0xd7, 0x89, 0x12, 0x65, 0x2c, 0x25, 0x01, 0xd3, 0x8e, 0x89, 0x56, 0x80, 0x1a, 0xcc, 0x68, 0x37, 0x87, 0x56, 0x0f, 0x94, 0x99, 0x4a, 0xe8, 0x2e, 0x42, 0x17, 0xb3, 0x83, 0x72, 0xd9, 0xa3, 0xc5, 0x21, 0xf2, 0x29, 0x72, 0x14, 0x21, 0x59, 0x89, 0x72, 0xc9, 0x39, 0x87, - 0x9c, 0x73, 0xb2, 0xa2, 0x48, 0x59, 0xe5, 0xb4, 0xca, 0x81, 0xcd, 0xda, 0x52, 0xb4, 0xf2, 0x71, - 0xfe, 0x82, 0xa8, 0xab, 0xaa, 0x9b, 0x6e, 0xc0, 0x8b, 0xc9, 0x21, 0xa7, 0xe9, 0x7e, 0xf5, 0xbe, - 0xef, 0xbd, 0xf7, 0xd5, 0x7b, 0x55, 0xcd, 0x80, 0x1b, 0x6d, 0xe2, 0x58, 0xc4, 0x39, 0xee, 0x92, - 0x8b, 0xe3, 0x8b, 0x0f, 0xcf, 0x10, 0x35, 0x3f, 0x74, 0x9f, 0x0b, 0xfd, 0x01, 0xa1, 0x04, 0x42, - 0xbe, 0x5a, 0x70, 0x2d, 0x62, 0x35, 0x27, 0x0b, 0xc4, 0x99, 0xe9, 0x20, 0x1f, 0xd2, 0x26, 0xd8, - 0xe6, 0x98, 0x5c, 0xa6, 0x4b, 0xba, 0x84, 0x3d, 0x1e, 0xbb, 0x4f, 0xc2, 0x7a, 0xc8, 0x51, 0x06, - 0x5f, 0x10, 0xb4, 0x7c, 0x49, 0xe9, 0x12, 0xd2, 0xed, 0xa1, 0x63, 0xf6, 0x76, 0x36, 0x7c, 0x7c, - 0x4c, 0xb1, 0x85, 0x1c, 0x6a, 0x5a, 0x7d, 0x0f, 0x3b, 0xef, 0x60, 0xda, 0x23, 0xb1, 0x24, 0xcf, - 0x2f, 0x75, 0x86, 0x03, 0x93, 0x62, 0x22, 0x92, 0x51, 0xff, 0x28, 0x01, 0x78, 0x8a, 0x70, 0xf7, - 0x9c, 0xa2, 0x4e, 0x8b, 0x50, 0x54, 0xeb, 0xbb, 0x8b, 0xf0, 0x7b, 0x60, 0x93, 0xb0, 0xa7, 0xac, - 0x94, 0x97, 0x8e, 0x76, 0xef, 0xca, 0x85, 0xc5, 0x42, 0x0b, 0x33, 0x7f, 0x5d, 0x78, 0xc3, 0x53, - 0xb0, 0xf9, 0x29, 0x63, 0xcb, 0x46, 0xf3, 0xd2, 0xd1, 0x4e, 0xe9, 0x47, 0x2f, 0xa6, 0x4a, 0xe4, - 0x5f, 0x53, 0xe5, 0xbd, 0x2e, 0xa6, 0xe7, 0xc3, 0xb3, 0x42, 0x9b, 0x58, 0xa2, 0x36, 0xf1, 0xe7, - 0x7d, 0xa7, 0xf3, 0x8b, 0x63, 0x3a, 0xea, 0x23, 0xa7, 0x50, 0x46, 0xed, 0xab, 0xa9, 0x92, 0x1a, - 0x99, 0x56, 0xef, 0x44, 0xe5, 0x2c, 0xaa, 0x2e, 0xe8, 0xd4, 0x53, 0x90, 0x6c, 0xa2, 0x4b, 0x5a, - 0x1f, 0x90, 0x3e, 0x71, 0xcc, 0x1e, 0xcc, 0x80, 0x0d, 0x8a, 0x69, 0x0f, 0xb1, 0xfc, 0x76, 0x74, - 0xfe, 0x02, 0xf3, 0x20, 0xd1, 0x41, 0x4e, 0x7b, 0x80, 0x79, 0xee, 0x2c, 0x07, 0x3d, 0x68, 0x3a, - 0xb9, 0xf6, 0xf5, 0x73, 0x45, 0xfa, 0xe7, 0x9f, 0xdf, 0xdf, 0xba, 0x4f, 0x6c, 0x8a, 0x6c, 0xaa, - 0xfe, 0x43, 0x02, 0x5b, 0x65, 0xd4, 0x27, 0x0e, 0xa6, 0xf0, 0xfb, 0x20, 0xd1, 0x17, 0x01, 0x0c, - 0xdc, 0x61, 0xd4, 0xf1, 0xd2, 0xfe, 0xd5, 0x54, 0x81, 0x3c, 0xa9, 0xc0, 0xa2, 0xaa, 0x03, 0xef, - 0xad, 0xd2, 0x81, 0x37, 0xc0, 0x4e, 0x87, 0x73, 0x90, 0x81, 0x88, 0x3a, 0x33, 0xc0, 0x36, 0xd8, - 0x34, 0x2d, 0x32, 0xb4, 0x69, 0x36, 0x96, 0x8f, 0x1d, 0x25, 0xee, 0x1e, 0x7a, 0x62, 0xba, 0x1d, - 0xe2, 0xab, 0x79, 0x9f, 0x60, 0xbb, 0xf4, 0x81, 0xab, 0xd7, 0x9f, 0xbe, 0x54, 0x8e, 0xde, 0x42, - 0x2f, 0x17, 0xe0, 0xe8, 0x82, 0xfa, 0x64, 0xfb, 0xc9, 0x73, 0x25, 0xf2, 0xf5, 0x73, 0x25, 0xa2, - 0xfe, 0x76, 0x0b, 0x6c, 0xfb, 0x3a, 0x7d, 0x77, 0x59, 0x49, 0x7b, 0xaf, 0xa7, 0x4a, 0x14, 0x77, - 0xae, 0xa6, 0xca, 0x0e, 0x2f, 0x6c, 0xbe, 0x9e, 0x7b, 0x60, 0xab, 0xcd, 0xf5, 0x61, 0xd5, 0x24, - 0xee, 0x66, 0x0a, 0xbc, 0x8f, 0x0a, 0x5e, 0x1f, 0x15, 0x8a, 0xf6, 0xa8, 0x94, 0xf8, 0xdb, 0x4c, - 0x48, 0xdd, 0x43, 0xc0, 0x16, 0xd8, 0x74, 0xa8, 0x49, 0x87, 0x4e, 0x36, 0xc6, 0x7a, 0x47, 0x5d, - 0xd6, 0x3b, 0x5e, 0x82, 0x0d, 0xe6, 0x59, 0xca, 0x5d, 0x4d, 0x95, 0xfd, 0x39, 0x91, 0x39, 0x89, - 0xaa, 0x0b, 0x36, 0xd8, 0x07, 0xf0, 0x31, 0xb6, 0xcd, 0x9e, 0x41, 0xcd, 0x5e, 0x6f, 0x64, 0x0c, - 0x90, 0x33, 0xec, 0xd1, 0x6c, 0x9c, 0xe5, 0xa7, 0x2c, 0x8b, 0xd1, 0x74, 0xfd, 0x74, 0xe6, 0x56, - 0xba, 0xe9, 0x0a, 0x7b, 0x35, 0x55, 0x0e, 0x79, 0x90, 0x45, 0x22, 0x55, 0x4f, 0x33, 0x63, 0x00, - 0x04, 0x7f, 0x06, 0x12, 0xce, 0xf0, 0xcc, 0xc2, 0xd4, 0x70, 0x27, 0x2e, 0xbb, 0xc1, 0x42, 0xe5, - 0x16, 0xa4, 0x68, 0x7a, 0xe3, 0x58, 0x92, 0x45, 0x14, 0xd1, 0x2f, 0x01, 0xb0, 0xfa, 0xf4, 0x4b, - 0x45, 0xd2, 0x01, 0xb7, 0xb8, 0x00, 0x88, 0x41, 0x5a, 0xb4, 0x88, 0x81, 0xec, 0x0e, 0x8f, 0xb0, - 0xb9, 0x32, 0xc2, 0x2d, 0x11, 0xe1, 0x80, 0x47, 0x98, 0x67, 0xe0, 0x61, 0x76, 0x85, 0x59, 0xb3, - 0x3b, 0x2c, 0xd4, 0x13, 0x09, 0xa4, 0x28, 0xa1, 0x66, 0xcf, 0x10, 0x0b, 0xd9, 0xad, 0x55, 0x8d, - 0xf8, 0x50, 0xc4, 0xc9, 0xf0, 0x38, 0x21, 0xb4, 0xba, 0x56, 0x83, 0x26, 0x19, 0xd6, 0x1b, 0xb1, - 0x1e, 0x78, 0xe7, 0x82, 0x50, 0x6c, 0x77, 0xdd, 0xed, 0x1d, 0x08, 0x61, 0xb7, 0x57, 0x96, 0xfd, - 0x6d, 0x91, 0x4e, 0x96, 0xa7, 0xb3, 0x40, 0xc1, 0xeb, 0xbe, 0xc6, 0xed, 0x0d, 0xd7, 0xcc, 0x0a, - 0x7f, 0x0c, 0x84, 0x69, 0x26, 0xf1, 0xce, 0xca, 0x58, 0xaa, 0x88, 0xb5, 0x1f, 0x8a, 0x15, 0x56, - 0x38, 0xc5, 0xad, 0x9e, 0xc0, 0x37, 0x41, 0x12, 0x3b, 0x06, 0xba, 0xec, 0xa3, 0x0e, 0xa6, 0xa8, - 0x93, 0x05, 0x79, 0xe9, 0x68, 0x5b, 0x4f, 0x60, 0x47, 0xf3, 0x4c, 0x27, 0x71, 0xf7, 0xe0, 0x51, - 0x5f, 0x44, 0x41, 0x22, 0xd8, 0x61, 0x3f, 0x06, 0xb1, 0x11, 0x72, 0xf8, 0x21, 0x56, 0x2a, 0xac, - 0x71, 0x58, 0x56, 0x6c, 0xaa, 0xbb, 0x50, 0xf8, 0x10, 0x6c, 0x99, 0x67, 0x0e, 0x35, 0xb1, 0x38, - 0xee, 0xd6, 0x66, 0xf1, 0xe0, 0xf0, 0x87, 0x20, 0x6a, 0x13, 0x36, 0xb3, 0xeb, 0x93, 0x44, 0x6d, - 0x02, 0xbb, 0x20, 0x69, 0x13, 0xe3, 0x53, 0x4c, 0xcf, 0x8d, 0x0b, 0x44, 0x09, 0x9b, 0xcc, 0x9d, - 0x92, 0xb6, 0x1e, 0xd3, 0xd5, 0x54, 0xd9, 0xe3, 0xba, 0x07, 0xb9, 0x54, 0x1d, 0xd8, 0xe4, 0x14, - 0xd3, 0xf3, 0x16, 0xa2, 0x44, 0x48, 0xf9, 0x4a, 0x02, 0x71, 0xf7, 0x06, 0xfa, 0xdf, 0x4f, 0xed, - 0x0c, 0xd8, 0xb8, 0x20, 0x14, 0x79, 0x27, 0x36, 0x7f, 0x81, 0x27, 0xfe, 0xd5, 0x17, 0x7b, 0x9b, - 0xab, 0xaf, 0x14, 0xcd, 0x4a, 0xfe, 0xf5, 0xf7, 0x00, 0x6c, 0xf1, 0x27, 0x27, 0x1b, 0x67, 0x13, - 0xf6, 0xde, 0x32, 0xf0, 0xe2, 0x7d, 0x5b, 0x8a, 0xbb, 0x2a, 0xe9, 0x1e, 0xf8, 0x64, 0xfb, 0x99, - 0x77, 0x98, 0xff, 0x66, 0x03, 0xa4, 0xc4, 0xec, 0xd4, 0xcd, 0x81, 0x69, 0x39, 0xf0, 0x77, 0x12, - 0x48, 0x58, 0xd8, 0xf6, 0x47, 0x59, 0x5a, 0x35, 0xca, 0x86, 0xcb, 0xfd, 0x7a, 0xaa, 0x5c, 0x0f, - 0xa0, 0xee, 0x10, 0x0b, 0x53, 0x64, 0xf5, 0xe9, 0x68, 0xa6, 0x53, 0x60, 0x79, 0xbd, 0x09, 0x07, - 0x16, 0xb6, 0xbd, 0xf9, 0xfe, 0xb5, 0x04, 0xa0, 0x65, 0x5e, 0x7a, 0x44, 0x46, 0x1f, 0x0d, 0x30, - 0xe9, 0x88, 0x5b, 0xe4, 0x70, 0x61, 0xea, 0xca, 0xe2, 0x6b, 0x84, 0xb7, 0xc9, 0xeb, 0xa9, 0x72, - 0x63, 0x11, 0x1c, 0xca, 0x55, 0x9c, 0xdf, 0x8b, 0x5e, 0xea, 0x33, 0x77, 0x2e, 0xd3, 0x96, 0x79, - 0xe9, 0xc9, 0xc5, 0xcc, 0xf0, 0xaf, 0x12, 0x60, 0x85, 0xfb, 0xc3, 0xe9, 0x0b, 0xb7, 0xf2, 0x32, - 0x76, 0x44, 0x4e, 0xca, 0x52, 0x7c, 0x28, 0xad, 0x1b, 0x33, 0x09, 0x17, 0x1c, 0xd7, 0x13, 0x73, - 0xcf, 0xc2, 0xb6, 0x7f, 0x6a, 0x78, 0xaa, 0x3e, 0x95, 0xc0, 0xa1, 0xcb, 0x8d, 0x6d, 0x4c, 0xf1, - 0xec, 0x20, 0x36, 0x98, 0x78, 0x62, 0xd0, 0x1e, 0xad, 0xf7, 0xa9, 0xf5, 0x7a, 0xaa, 0xdc, 0x7a, - 0x23, 0xe5, 0xac, 0x36, 0x7d, 0xdf, 0xc2, 0x76, 0x85, 0xfb, 0x88, 0x6c, 0x74, 0xd7, 0x43, 0x7d, - 0x16, 0x03, 0xc9, 0x16, 0x3b, 0x04, 0x45, 0x5f, 0xfe, 0x0a, 0x88, 0x43, 0xd1, 0xdb, 0x73, 0x69, - 0xd5, 0x9e, 0xdf, 0x13, 0xfa, 0x1e, 0x84, 0x70, 0x21, 0x5d, 0x33, 0xa1, 0x33, 0x38, 0xb8, 0xd3, - 0x49, 0x6e, 0x13, 0xbb, 0xfc, 0x18, 0x1c, 0xf8, 0x63, 0x1e, 0x72, 0x76, 0xb2, 0x51, 0xb6, 0xcd, - 0x47, 0xdf, 0xf4, 0x11, 0xd2, 0x0a, 0x50, 0x89, 0x51, 0xbc, 0xde, 0x5f, 0xb2, 0xe6, 0xc0, 0xdf, - 0x4b, 0xe0, 0x60, 0xb6, 0xc1, 0xe1, 0x7a, 0x63, 0xab, 0xea, 0xad, 0x89, 0x7a, 0x6f, 0xbe, 0x81, - 0x21, 0x54, 0xb9, 0xcc, 0x2b, 0x7f, 0x83, 0x2b, 0xd7, 0xe0, 0xba, 0xbf, 0x1a, 0xcc, 0x52, 0x9d, - 0xc6, 0xc4, 0x25, 0x23, 0x76, 0xe6, 0x13, 0xb0, 0xf9, 0xcb, 0x21, 0x19, 0x0c, 0x2d, 0xb6, 0x25, - 0xc9, 0x52, 0x69, 0xed, 0x4e, 0x49, 0x73, 0x7c, 0xa0, 0x2d, 0x04, 0x23, 0x6c, 0x83, 0x1d, 0x7a, - 0x3e, 0x40, 0xce, 0x39, 0xe9, 0xf1, 0x29, 0x4f, 0xae, 0x75, 0xe2, 0x73, 0xfa, 0x3d, 0x9f, 0x22, - 0x10, 0x61, 0xc6, 0x0b, 0xc7, 0x12, 0xd8, 0x75, 0xaf, 0x01, 0x63, 0x16, 0x2a, 0xc6, 0x42, 0xb5, - 0xd7, 0x0e, 0x95, 0x0d, 0xf3, 0x84, 0x24, 0xbf, 0x2e, 0x9a, 0x2d, 0xe4, 0xa1, 0xea, 0x29, 0xd7, - 0xd0, 0xf4, 0x93, 0xf9, 0x4c, 0x02, 0x7b, 0xb3, 0x5d, 0x99, 0x65, 0x14, 0x67, 0x19, 0xd5, 0xd6, - 0xce, 0xe8, 0xdd, 0x25, 0x64, 0x01, 0x19, 0xa0, 0xbf, 0xec, 0xa7, 0xa0, 0xfe, 0x45, 0x02, 0x99, - 0x65, 0xbd, 0x0b, 0x6f, 0x81, 0x94, 0x3f, 0x06, 0x6e, 0x0c, 0xf1, 0xeb, 0x28, 0xe9, 0x19, 0x9b, - 0xa3, 0x3e, 0x5a, 0x1c, 0xd4, 0xe8, 0xff, 0x6f, 0x50, 0x6f, 0xff, 0x47, 0x02, 0x20, 0xf0, 0x3b, - 0xf3, 0x0e, 0x38, 0x68, 0xd5, 0x9a, 0x9a, 0x51, 0xab, 0x37, 0x2b, 0xb5, 0xaa, 0xf1, 0xa8, 0xda, - 0xa8, 0x6b, 0xf7, 0x2b, 0x0f, 0x2a, 0x5a, 0x39, 0x1d, 0xc9, 0x5d, 0x1b, 0x4f, 0xf2, 0x09, 0xee, - 0xa8, 0xb9, 0x61, 0xa0, 0x0a, 0xae, 0x05, 0xbd, 0x3f, 0xd6, 0x1a, 0x69, 0x29, 0x97, 0x1a, 0x4f, - 0xf2, 0x3b, 0xdc, 0xeb, 0x63, 0xe4, 0xc0, 0xdb, 0x60, 0x2f, 0xe8, 0x53, 0x2c, 0x35, 0x9a, 0xc5, - 0x4a, 0x35, 0x1d, 0xcd, 0xbd, 0x33, 0x9e, 0xe4, 0x53, 0xdc, 0xaf, 0x28, 0xbe, 0x78, 0xf2, 0x60, - 0x37, 0xe8, 0x5b, 0xad, 0xa5, 0x63, 0xb9, 0xe4, 0x78, 0x92, 0xdf, 0xe6, 0x6e, 0x55, 0x02, 0xef, - 0x82, 0x6c, 0xd8, 0xc3, 0x38, 0xad, 0x34, 0x1f, 0x1a, 0x2d, 0xad, 0x59, 0x4b, 0xc7, 0x73, 0x99, - 0xf1, 0x24, 0x9f, 0xf6, 0x7c, 0xbd, 0xcf, 0x93, 0x5c, 0xfc, 0xc9, 0x1f, 0xe4, 0xc8, 0xed, 0xbf, - 0x47, 0xc1, 0x6e, 0xf8, 0x47, 0x0e, 0x2c, 0x80, 0x6f, 0xd5, 0xf5, 0x5a, 0xbd, 0xd6, 0x28, 0x7e, - 0x64, 0x34, 0x9a, 0xc5, 0xe6, 0xa3, 0xc6, 0x5c, 0xc1, 0xac, 0x14, 0xee, 0x5c, 0xc5, 0x3d, 0x78, - 0x0f, 0xc8, 0xf3, 0xfe, 0x65, 0xad, 0x5e, 0x6b, 0x54, 0x9a, 0x46, 0x5d, 0xd3, 0x2b, 0xb5, 0x72, - 0x5a, 0xca, 0x1d, 0x8c, 0x27, 0xf9, 0x3d, 0x0e, 0x09, 0xdf, 0x7b, 0x3f, 0x00, 0xef, 0xce, 0x83, - 0x5b, 0xb5, 0x66, 0xa5, 0xfa, 0x13, 0x0f, 0x1b, 0xcd, 0xed, 0x8f, 0x27, 0x79, 0xc8, 0xb1, 0xa1, - 0x2e, 0xba, 0x03, 0xf6, 0xe7, 0xa1, 0xf5, 0x62, 0xa3, 0xa1, 0x95, 0xd3, 0xb1, 0x5c, 0x7a, 0x3c, - 0xc9, 0x27, 0x39, 0xa6, 0x6e, 0x3a, 0x0e, 0xea, 0xc0, 0x0f, 0x40, 0x76, 0xde, 0x5b, 0xd7, 0x7e, - 0xaa, 0xdd, 0x6f, 0x6a, 0xe5, 0x74, 0x3c, 0x07, 0xc7, 0x93, 0xfc, 0x2e, 0xf7, 0xd7, 0xd1, 0xcf, - 0x51, 0x9b, 0xa2, 0xa5, 0xfc, 0x0f, 0x8a, 0x95, 0x8f, 0xb4, 0x72, 0x7a, 0x23, 0xc8, 0xff, 0xc0, - 0xc4, 0x3d, 0xd4, 0xe1, 0x72, 0x96, 0xaa, 0x2f, 0xbe, 0x92, 0x23, 0x5f, 0x7c, 0x25, 0x47, 0x3e, - 0x7b, 0x29, 0x47, 0x5e, 0xbc, 0x94, 0xa5, 0xcf, 0x5f, 0xca, 0xd2, 0xbf, 0x5f, 0xca, 0xd2, 0xd3, - 0x57, 0x72, 0xe4, 0xf3, 0x57, 0x72, 0xe4, 0x8b, 0x57, 0x72, 0xe4, 0x93, 0x6f, 0xbe, 0x66, 0x2f, - 0xd9, 0x3f, 0x71, 0xd8, 0xec, 0x9d, 0x6d, 0xb2, 0x2e, 0xff, 0xce, 0x7f, 0x03, 0x00, 0x00, 0xff, - 0xff, 0x97, 0x49, 0x34, 0x08, 0xdf, 0x11, 0x00, 0x00, + 0x9c, 0x73, 0xb2, 0xa2, 0x48, 0xd9, 0xe3, 0x2a, 0x07, 0x36, 0x6b, 0x4b, 0xd1, 0xca, 0xc7, 0xf9, + 0x0b, 0xa2, 0xae, 0xaa, 0x6e, 0xba, 0x01, 0x2f, 0x26, 0x87, 0x3d, 0x4d, 0xf7, 0xab, 0xf7, 0x7d, + 0xef, 0xbd, 0xaf, 0xde, 0xab, 0x6a, 0x06, 0xdc, 0x68, 0x13, 0xc7, 0x22, 0xce, 0x71, 0x97, 0x5c, + 0x1c, 0x5f, 0x7c, 0x78, 0x86, 0xa8, 0xf9, 0xa1, 0xfb, 0x5c, 0xe8, 0x0f, 0x08, 0x25, 0x10, 0xf2, + 0xd5, 0x82, 0x6b, 0x11, 0xab, 0x39, 0x59, 0x20, 0xce, 0x4c, 0x07, 0xf9, 0x90, 0x36, 0xc1, 0x36, + 0xc7, 0xe4, 0x32, 0x5d, 0xd2, 0x25, 0xec, 0xf1, 0xd8, 0x7d, 0x12, 0xd6, 0x43, 0x8e, 0x32, 0xf8, + 0x82, 0xa0, 0xe5, 0x4b, 0x4a, 0x97, 0x90, 0x6e, 0x0f, 0x1d, 0xb3, 0xb7, 0xb3, 0xe1, 0xe3, 0x63, + 0x8a, 0x2d, 0xe4, 0x50, 0xd3, 0xea, 0x7b, 0xd8, 0x79, 0x07, 0xd3, 0x1e, 0x89, 0x25, 0x79, 0x7e, + 0xa9, 0x33, 0x1c, 0x98, 0x14, 0x13, 0x91, 0x8c, 0xfa, 0x67, 0x09, 0xc0, 0x53, 0x84, 0xbb, 0xe7, + 0x14, 0x75, 0x5a, 0x84, 0xa2, 0x5a, 0xdf, 0x5d, 0x84, 0x3f, 0x00, 0x9b, 0x84, 0x3d, 0x65, 0xa5, + 0xbc, 0x74, 0xb4, 0x7b, 0x57, 0x2e, 0x2c, 0x16, 0x5a, 0x98, 0xf9, 0xeb, 0xc2, 0x1b, 0x9e, 0x82, + 0xcd, 0x4f, 0x19, 0x5b, 0x36, 0x9a, 0x97, 0x8e, 0x76, 0x4a, 0x3f, 0x79, 0x31, 0x55, 0x22, 0xff, + 0x9e, 0x2a, 0xef, 0x75, 0x31, 0x3d, 0x1f, 0x9e, 0x15, 0xda, 0xc4, 0x12, 0xb5, 0x89, 0x3f, 0xef, + 0x3b, 0x9d, 0x5f, 0x1d, 0xd3, 0x51, 0x1f, 0x39, 0x85, 0x32, 0x6a, 0x5f, 0x4d, 0x95, 0xd4, 0xc8, + 0xb4, 0x7a, 0x27, 0x2a, 0x67, 0x51, 0x75, 0x41, 0xa7, 0x9e, 0x82, 0x64, 0x13, 0x5d, 0xd2, 0xfa, + 0x80, 0xf4, 0x89, 0x63, 0xf6, 0x60, 0x06, 0x6c, 0x50, 0x4c, 0x7b, 0x88, 0xe5, 0xb7, 0xa3, 0xf3, + 0x17, 0x98, 0x07, 0x89, 0x0e, 0x72, 0xda, 0x03, 0xcc, 0x73, 0x67, 0x39, 0xe8, 0x41, 0xd3, 0xc9, + 0xb5, 0xaf, 0x9f, 0x2b, 0xd2, 0x3f, 0xfe, 0xfa, 0xfe, 0xd6, 0x7d, 0x62, 0x53, 0x64, 0x53, 0xf5, + 0x5f, 0x12, 0xd8, 0x2a, 0xa3, 0x3e, 0x71, 0x30, 0x85, 0x3f, 0x04, 0x89, 0xbe, 0x08, 0x60, 0xe0, + 0x0e, 0xa3, 0x8e, 0x97, 0xf6, 0xaf, 0xa6, 0x0a, 0xe4, 0x49, 0x05, 0x16, 0x55, 0x1d, 0x78, 0x6f, + 0x95, 0x0e, 0xbc, 0x01, 0x76, 0x3a, 0x9c, 0x83, 0x0c, 0x44, 0xd4, 0x99, 0x01, 0xb6, 0xc1, 0xa6, + 0x69, 0x91, 0xa1, 0x4d, 0xb3, 0xb1, 0x7c, 0xec, 0x28, 0x71, 0xf7, 0xd0, 0x13, 0xd3, 0xed, 0x10, + 0x5f, 0xcd, 0xfb, 0x04, 0xdb, 0xa5, 0x0f, 0x5c, 0xbd, 0xfe, 0xf2, 0xa5, 0x72, 0xf4, 0x16, 0x7a, + 0xb9, 0x00, 0x47, 0x17, 0xd4, 0x27, 0xdb, 0x4f, 0x9e, 0x2b, 0x91, 0xaf, 0x9f, 0x2b, 0x11, 0xf5, + 0xf7, 0x5b, 0x60, 0xdb, 0xd7, 0xe9, 0xfb, 0xcb, 0x4a, 0xda, 0x7b, 0x3d, 0x55, 0xa2, 0xb8, 0x73, + 0x35, 0x55, 0x76, 0x78, 0x61, 0xf3, 0xf5, 0xdc, 0x03, 0x5b, 0x6d, 0xae, 0x0f, 0xab, 0x26, 0x71, + 0x37, 0x53, 0xe0, 0x7d, 0x54, 0xf0, 0xfa, 0xa8, 0x50, 0xb4, 0x47, 0xa5, 0x44, 0x40, 0x48, 0xdd, + 0x43, 0xc0, 0x16, 0xd8, 0x74, 0xa8, 0x49, 0x87, 0x4e, 0x36, 0xc6, 0x7a, 0x47, 0x5d, 0xd6, 0x3b, + 0x5e, 0x82, 0x0d, 0xe6, 0x59, 0xca, 0x5d, 0x4d, 0x95, 0xfd, 0x39, 0x91, 0x39, 0x89, 0xaa, 0x0b, + 0x36, 0xd8, 0x07, 0xf0, 0x31, 0xb6, 0xcd, 0x9e, 0x41, 0xcd, 0x5e, 0x6f, 0x64, 0x0c, 0x90, 0x33, + 0xec, 0xd1, 0x6c, 0x9c, 0xe5, 0xa7, 0x2c, 0x8b, 0xd1, 0x74, 0xfd, 0x74, 0xe6, 0x56, 0xba, 0xe9, + 0x0a, 0x7b, 0x35, 0x55, 0x0e, 0x79, 0x90, 0x45, 0x22, 0x55, 0x4f, 0x33, 0x63, 0x00, 0x04, 0x7f, + 0x01, 0x12, 0xce, 0xf0, 0xcc, 0xc2, 0xd4, 0x70, 0x27, 0x2e, 0xbb, 0xc1, 0x42, 0xe5, 0x16, 0xa4, + 0x68, 0x7a, 0xe3, 0x58, 0x92, 0x45, 0x14, 0xd1, 0x2f, 0x01, 0xb0, 0xfa, 0xf4, 0x4b, 0x45, 0xd2, + 0x01, 0xb7, 0xb8, 0x00, 0x88, 0x41, 0x5a, 0xb4, 0x88, 0x81, 0xec, 0x0e, 0x8f, 0xb0, 0xb9, 0x32, + 0xc2, 0x2d, 0x11, 0xe1, 0x80, 0x47, 0x98, 0x67, 0xe0, 0x61, 0x76, 0x85, 0x59, 0xb3, 0x3b, 0x2c, + 0xd4, 0x13, 0x09, 0xa4, 0x28, 0xa1, 0x66, 0xcf, 0x10, 0x0b, 0xd9, 0xad, 0x55, 0x8d, 0xf8, 0x50, + 0xc4, 0xc9, 0xf0, 0x38, 0x21, 0xb4, 0xba, 0x56, 0x83, 0x26, 0x19, 0xd6, 0x1b, 0xb1, 0x1e, 0x78, + 0xe7, 0x82, 0x50, 0x6c, 0x77, 0xdd, 0xed, 0x1d, 0x08, 0x61, 0xb7, 0x57, 0x96, 0xfd, 0x5d, 0x91, + 0x4e, 0x96, 0xa7, 0xb3, 0x40, 0xc1, 0xeb, 0xbe, 0xc6, 0xed, 0x0d, 0xd7, 0xcc, 0x0a, 0x7f, 0x0c, + 0x84, 0x69, 0x26, 0xf1, 0xce, 0xca, 0x58, 0xaa, 0x88, 0xb5, 0x1f, 0x8a, 0x15, 0x56, 0x38, 0xc5, + 0xad, 0x9e, 0xc0, 0x37, 0x41, 0x12, 0x3b, 0x06, 0xba, 0xec, 0xa3, 0x0e, 0xa6, 0xa8, 0x93, 0x05, + 0x79, 0xe9, 0x68, 0x5b, 0x4f, 0x60, 0x47, 0xf3, 0x4c, 0x27, 0x71, 0xf7, 0xe0, 0x51, 0x5f, 0x44, + 0x41, 0x22, 0xd8, 0x61, 0x3f, 0x05, 0xb1, 0x11, 0x72, 0xf8, 0x21, 0x56, 0x2a, 0xac, 0x71, 0x58, + 0x56, 0x6c, 0xaa, 0xbb, 0x50, 0xf8, 0x10, 0x6c, 0x99, 0x67, 0x0e, 0x35, 0xb1, 0x38, 0xee, 0xd6, + 0x66, 0xf1, 0xe0, 0xf0, 0xc7, 0x20, 0x6a, 0x13, 0x36, 0xb3, 0xeb, 0x93, 0x44, 0x6d, 0x02, 0xbb, + 0x20, 0x69, 0x13, 0xe3, 0x53, 0x4c, 0xcf, 0x8d, 0x0b, 0x44, 0x09, 0x9b, 0xcc, 0x9d, 0x92, 0xb6, + 0x1e, 0xd3, 0xd5, 0x54, 0xd9, 0xe3, 0xba, 0x07, 0xb9, 0x54, 0x1d, 0xd8, 0xe4, 0x14, 0xd3, 0xf3, + 0x16, 0xa2, 0x44, 0x48, 0xf9, 0x4a, 0x02, 0x71, 0xf7, 0x06, 0xfa, 0xff, 0x4f, 0xed, 0x0c, 0xd8, + 0xb8, 0x20, 0x14, 0x79, 0x27, 0x36, 0x7f, 0x81, 0x27, 0xfe, 0xd5, 0x17, 0x7b, 0x9b, 0xab, 0xaf, + 0x14, 0xcd, 0x4a, 0xfe, 0xf5, 0xf7, 0x00, 0x6c, 0xf1, 0x27, 0x27, 0x1b, 0x67, 0x13, 0xf6, 0xde, + 0x32, 0xf0, 0xe2, 0x7d, 0x5b, 0x8a, 0xbb, 0x2a, 0xe9, 0x1e, 0xf8, 0x64, 0xfb, 0x99, 0x77, 0x98, + 0xff, 0x6e, 0x03, 0xa4, 0xc4, 0xec, 0xd4, 0xcd, 0x81, 0x69, 0x39, 0xf0, 0x0f, 0x12, 0x48, 0x58, + 0xd8, 0xf6, 0x47, 0x59, 0x5a, 0x35, 0xca, 0x86, 0xcb, 0xfd, 0x7a, 0xaa, 0x5c, 0x0f, 0xa0, 0xee, + 0x10, 0x0b, 0x53, 0x64, 0xf5, 0xe9, 0x68, 0xa6, 0x53, 0x60, 0x79, 0xbd, 0x09, 0x07, 0x16, 0xb6, + 0xbd, 0xf9, 0xfe, 0xad, 0x04, 0xa0, 0x65, 0x5e, 0x7a, 0x44, 0x46, 0x1f, 0x0d, 0x30, 0xe9, 0x88, + 0x5b, 0xe4, 0x70, 0x61, 0xea, 0xca, 0xe2, 0x6b, 0x84, 0xb7, 0xc9, 0xeb, 0xa9, 0x72, 0x63, 0x11, + 0x1c, 0xca, 0x55, 0x9c, 0xdf, 0x8b, 0x5e, 0xea, 0x33, 0x77, 0x2e, 0xd3, 0x96, 0x79, 0xe9, 0xc9, + 0xc5, 0xcc, 0xf0, 0xef, 0x12, 0x60, 0x85, 0xfb, 0xc3, 0xe9, 0x0b, 0xb7, 0xf2, 0x32, 0x76, 0x44, + 0x4e, 0xca, 0x52, 0x7c, 0x28, 0xad, 0x1b, 0x33, 0x09, 0x17, 0x1c, 0xd7, 0x13, 0x73, 0xcf, 0xc2, + 0xb6, 0x7f, 0x6a, 0x78, 0xaa, 0x3e, 0x95, 0xc0, 0xa1, 0xcb, 0x8d, 0x6d, 0x4c, 0xf1, 0xec, 0x20, + 0x36, 0x98, 0x78, 0x62, 0xd0, 0x1e, 0xad, 0xf7, 0xa9, 0xf5, 0x7a, 0xaa, 0xdc, 0x7a, 0x23, 0xe5, + 0xac, 0x36, 0x7d, 0xdf, 0xc2, 0x76, 0x85, 0xfb, 0x88, 0x6c, 0x74, 0xd7, 0x43, 0x7d, 0x16, 0x03, + 0xc9, 0x16, 0x3b, 0x04, 0x45, 0x5f, 0xfe, 0x06, 0x88, 0x43, 0xd1, 0xdb, 0x73, 0x69, 0xd5, 0x9e, + 0xdf, 0x13, 0xfa, 0x1e, 0x84, 0x70, 0x21, 0x5d, 0x33, 0xa1, 0x33, 0x38, 0xb8, 0xd3, 0x49, 0x6e, + 0x13, 0xbb, 0xfc, 0x18, 0x1c, 0xf8, 0x63, 0x1e, 0x72, 0x76, 0xb2, 0x51, 0xb6, 0xcd, 0x47, 0xdf, + 0xf4, 0x11, 0xd2, 0x0a, 0x50, 0x89, 0x51, 0xbc, 0xde, 0x5f, 0xb2, 0xe6, 0xc0, 0x3f, 0x4a, 0xe0, + 0x60, 0xb6, 0xc1, 0xe1, 0x7a, 0x63, 0xab, 0xea, 0xad, 0x89, 0x7a, 0x6f, 0xbe, 0x81, 0x21, 0x54, + 0xb9, 0xcc, 0x2b, 0x7f, 0x83, 0x2b, 0xd7, 0xe0, 0xba, 0xbf, 0x1a, 0xcc, 0x52, 0x9d, 0xc6, 0xc4, + 0x25, 0x23, 0x76, 0xe6, 0x13, 0xb0, 0xf9, 0xeb, 0x21, 0x19, 0x0c, 0x2d, 0xb6, 0x25, 0xc9, 0x52, + 0x69, 0xed, 0x4e, 0x49, 0x73, 0x7c, 0xa0, 0x2d, 0x04, 0x23, 0x6c, 0x83, 0x1d, 0x7a, 0x3e, 0x40, + 0xce, 0x39, 0xe9, 0xf1, 0x29, 0x4f, 0xae, 0x75, 0xe2, 0x73, 0xfa, 0x3d, 0x9f, 0x22, 0x10, 0x61, + 0xc6, 0x0b, 0xc7, 0x12, 0xd8, 0x75, 0xaf, 0x01, 0x63, 0x16, 0x2a, 0xc6, 0x42, 0xb5, 0xd7, 0x0e, + 0x95, 0x0d, 0xf3, 0x84, 0x24, 0xbf, 0x2e, 0x9a, 0x2d, 0xe4, 0xa1, 0xea, 0x29, 0xd7, 0xd0, 0xf4, + 0x93, 0xf9, 0x4c, 0x02, 0x7b, 0xb3, 0x5d, 0x99, 0x65, 0x14, 0x67, 0x19, 0xd5, 0xd6, 0xce, 0xe8, + 0xdd, 0x25, 0x64, 0x01, 0x19, 0xa0, 0xbf, 0xec, 0xa7, 0xa0, 0xfe, 0x4d, 0x02, 0x99, 0x65, 0xbd, + 0x0b, 0x6f, 0x81, 0x94, 0x3f, 0x06, 0x6e, 0x0c, 0xf1, 0xeb, 0x28, 0xe9, 0x19, 0x9b, 0xa3, 0x3e, + 0x5a, 0x1c, 0xd4, 0xe8, 0xb7, 0x37, 0xa8, 0xb7, 0xff, 0x2b, 0x01, 0x10, 0xf8, 0x9d, 0x79, 0x07, + 0x1c, 0xb4, 0x6a, 0x4d, 0xcd, 0xa8, 0xd5, 0x9b, 0x95, 0x5a, 0xd5, 0x78, 0x54, 0x6d, 0xd4, 0xb5, + 0xfb, 0x95, 0x07, 0x15, 0xad, 0x9c, 0x8e, 0xe4, 0xae, 0x8d, 0x27, 0xf9, 0x04, 0x77, 0xd4, 0xdc, + 0x30, 0x50, 0x05, 0xd7, 0x82, 0xde, 0x1f, 0x6b, 0x8d, 0xb4, 0x94, 0x4b, 0x8d, 0x27, 0xf9, 0x1d, + 0xee, 0xf5, 0x31, 0x72, 0xe0, 0x6d, 0xb0, 0x17, 0xf4, 0x29, 0x96, 0x1a, 0xcd, 0x62, 0xa5, 0x9a, + 0x8e, 0xe6, 0xde, 0x19, 0x4f, 0xf2, 0x29, 0xee, 0x57, 0x14, 0x5f, 0x3c, 0x79, 0xb0, 0x1b, 0xf4, + 0xad, 0xd6, 0xd2, 0xb1, 0x5c, 0x72, 0x3c, 0xc9, 0x6f, 0x73, 0xb7, 0x2a, 0x81, 0x77, 0x41, 0x36, + 0xec, 0x61, 0x9c, 0x56, 0x9a, 0x0f, 0x8d, 0x96, 0xd6, 0xac, 0xa5, 0xe3, 0xb9, 0xcc, 0x78, 0x92, + 0x4f, 0x7b, 0xbe, 0xde, 0xe7, 0x49, 0x2e, 0xfe, 0xe4, 0x4f, 0x72, 0xe4, 0xf6, 0x3f, 0xa3, 0x60, + 0x37, 0xfc, 0x23, 0x07, 0x16, 0xc0, 0x77, 0xea, 0x7a, 0xad, 0x5e, 0x6b, 0x14, 0x3f, 0x32, 0x1a, + 0xcd, 0x62, 0xf3, 0x51, 0x63, 0xae, 0x60, 0x56, 0x0a, 0x77, 0xae, 0xe2, 0x1e, 0xbc, 0x07, 0xe4, + 0x79, 0xff, 0xb2, 0x56, 0xaf, 0x35, 0x2a, 0x4d, 0xa3, 0xae, 0xe9, 0x95, 0x5a, 0x39, 0x2d, 0xe5, + 0x0e, 0xc6, 0x93, 0xfc, 0x1e, 0x87, 0x84, 0xef, 0xbd, 0x1f, 0x81, 0x77, 0xe7, 0xc1, 0xad, 0x5a, + 0xb3, 0x52, 0xfd, 0x99, 0x87, 0x8d, 0xe6, 0xf6, 0xc7, 0x93, 0x3c, 0xe4, 0xd8, 0x50, 0x17, 0xdd, + 0x01, 0xfb, 0xf3, 0xd0, 0x7a, 0xb1, 0xd1, 0xd0, 0xca, 0xe9, 0x58, 0x2e, 0x3d, 0x9e, 0xe4, 0x93, + 0x1c, 0x53, 0x37, 0x1d, 0x07, 0x75, 0xe0, 0x07, 0x20, 0x3b, 0xef, 0xad, 0x6b, 0x3f, 0xd7, 0xee, + 0x37, 0xb5, 0x72, 0x3a, 0x9e, 0x83, 0xe3, 0x49, 0x7e, 0x97, 0xfb, 0xeb, 0xe8, 0x97, 0xa8, 0x4d, + 0xd1, 0x52, 0xfe, 0x07, 0xc5, 0xca, 0x47, 0x5a, 0x39, 0xbd, 0x11, 0xe4, 0x7f, 0x60, 0xe2, 0x1e, + 0xea, 0x70, 0x39, 0x4b, 0xd5, 0x17, 0x5f, 0xc9, 0x91, 0x2f, 0xbe, 0x92, 0x23, 0x9f, 0xbd, 0x94, + 0x23, 0x2f, 0x5e, 0xca, 0xd2, 0xe7, 0x2f, 0x65, 0xe9, 0x3f, 0x2f, 0x65, 0xe9, 0xe9, 0x2b, 0x39, + 0xf2, 0xf9, 0x2b, 0x39, 0xf2, 0xc5, 0x2b, 0x39, 0xf2, 0xc9, 0x37, 0x5f, 0xb3, 0x97, 0xec, 0x9f, + 0x38, 0x6c, 0xf6, 0xce, 0x36, 0x59, 0x97, 0x7f, 0xef, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x8a, + 0xf8, 0xe9, 0x34, 0xdf, 0x11, 0x00, 0x00, } func (this *TextProposal) Equal(that interface{}) bool { @@ -939,7 +939,7 @@ func (m *Proposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x50 } - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.VotingEndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.VotingEndTime):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.VotingEndTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.VotingEndTime):]) if err1 != nil { return 0, err1 } @@ -947,7 +947,7 @@ func (m *Proposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGov(dAtA, i, uint64(n1)) i-- dAtA[i] = 0x4a - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.VotingStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.VotingStartTime):]) + n2, err2 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.VotingStartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.VotingStartTime):]) if err2 != nil { return 0, err2 } @@ -969,7 +969,7 @@ func (m *Proposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x3a } } - n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.DepositEndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.DepositEndTime):]) + n3, err3 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.DepositEndTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.DepositEndTime):]) if err3 != nil { return 0, err3 } @@ -977,7 +977,7 @@ func (m *Proposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGov(dAtA, i, uint64(n3)) i-- dAtA[i] = 0x32 - n4, err4 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.SubmitTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.SubmitTime):]) + n4, err4 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.SubmitTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.SubmitTime):]) if err4 != nil { return 0, err4 } @@ -1181,7 +1181,7 @@ func (m *DepositParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } } - n7, err7 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxDepositPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxDepositPeriod):]) + n7, err7 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.MaxDepositPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.MaxDepositPeriod):]) if err7 != nil { return 0, err7 } @@ -1226,7 +1226,7 @@ func (m *VotingParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n8, err8 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.ExpeditedVotingPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.ExpeditedVotingPeriod):]) + n8, err8 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.ExpeditedVotingPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.ExpeditedVotingPeriod):]) if err8 != nil { return 0, err8 } @@ -1248,7 +1248,7 @@ func (m *VotingParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x12 } } - n9, err9 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.VotingPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.VotingPeriod):]) + n9, err9 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.VotingPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.VotingPeriod):]) if err9 != nil { return 0, err9 } @@ -1342,7 +1342,7 @@ func (m *ProposalVotingPeriod) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.VotingPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.VotingPeriod):]) + n10, err10 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.VotingPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.VotingPeriod):]) if err10 != nil { return 0, err10 } @@ -1442,9 +1442,9 @@ func (m *Proposal) Size() (n int) { } l = m.FinalTallyResult.Size() n += 1 + l + sovGov(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.SubmitTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.SubmitTime) n += 1 + l + sovGov(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.DepositEndTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.DepositEndTime) n += 1 + l + sovGov(uint64(l)) if len(m.TotalDeposit) > 0 { for _, e := range m.TotalDeposit { @@ -1452,9 +1452,9 @@ func (m *Proposal) Size() (n int) { n += 1 + l + sovGov(uint64(l)) } } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.VotingStartTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.VotingStartTime) n += 1 + l + sovGov(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.VotingEndTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.VotingEndTime) n += 1 + l + sovGov(uint64(l)) if m.IsExpedited { n += 2 @@ -1516,7 +1516,7 @@ func (m *DepositParams) Size() (n int) { n += 1 + l + sovGov(uint64(l)) } } - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxDepositPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.MaxDepositPeriod) n += 1 + l + sovGov(uint64(l)) if len(m.MinExpeditedDeposit) > 0 { for _, e := range m.MinExpeditedDeposit { @@ -1535,7 +1535,7 @@ func (m *VotingParams) Size() (n int) { } var l int _ = l - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.VotingPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.VotingPeriod) n += 1 + l + sovGov(uint64(l)) if len(m.ProposalVotingPeriods) > 0 { for _, e := range m.ProposalVotingPeriods { @@ -1543,7 +1543,7 @@ func (m *VotingParams) Size() (n int) { n += 1 + l + sovGov(uint64(l)) } } - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.ExpeditedVotingPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.ExpeditedVotingPeriod) n += 1 + l + sovGov(uint64(l)) return n } @@ -1575,7 +1575,7 @@ func (m *ProposalVotingPeriod) Size() (n int) { if l > 0 { n += 1 + l + sovGov(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.VotingPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.VotingPeriod) n += 1 + l + sovGov(uint64(l)) return n } @@ -2103,7 +2103,7 @@ func (m *Proposal) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.SubmitTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.SubmitTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2136,7 +2136,7 @@ func (m *Proposal) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.DepositEndTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.DepositEndTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2203,7 +2203,7 @@ func (m *Proposal) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.VotingStartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.VotingStartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2236,7 +2236,7 @@ func (m *Proposal) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.VotingEndTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.VotingEndTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2713,7 +2713,7 @@ func (m *DepositParams) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MaxDepositPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.MaxDepositPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2864,7 +2864,7 @@ func (m *VotingParams) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.VotingPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.VotingPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2931,7 +2931,7 @@ func (m *VotingParams) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.ExpeditedVotingPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.ExpeditedVotingPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -3228,7 +3228,7 @@ func (m *ProposalVotingPeriod) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.VotingPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.VotingPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/gov/types/msgs.go b/x/gov/types/msgs.go index 0f670d9fc7bb..bfd7abbd3356 100644 --- a/x/gov/types/msgs.go +++ b/x/gov/types/msgs.go @@ -5,7 +5,7 @@ import ( yaml "gopkg.in/yaml.v2" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -26,6 +26,7 @@ var ( ) // NewMsgSubmitProposal creates a new MsgSubmitProposal that is not expedited +// //nolint:interfacer func NewMsgSubmitProposal(content Content, initialDeposit sdk.Coins, proposer sdk.AccAddress) (*MsgSubmitProposal, error) { m := &MsgSubmitProposal{ @@ -41,6 +42,7 @@ func NewMsgSubmitProposal(content Content, initialDeposit sdk.Coins, proposer sd } // NewMsgSubmitProposalWithExpedited creates a new MsgSubmitProposal. It can optionally be used to create an expedited proposal +// //nolint:interfacer func NewMsgSubmitProposalWithExpedited(content Content, initialDeposit sdk.Coins, proposer sdk.AccAddress, IsExpedited bool) (*MsgSubmitProposal, error) { m := &MsgSubmitProposal{ @@ -148,6 +150,7 @@ func (m MsgSubmitProposal) UnpackInterfaces(unpacker types.AnyUnpacker) error { } // NewMsgDeposit creates a new MsgDeposit instance +// //nolint:interfacer func NewMsgDeposit(depositor sdk.AccAddress, proposalID uint64, amount sdk.Coins) *MsgDeposit { return &MsgDeposit{proposalID, depositor.String(), amount} @@ -193,6 +196,7 @@ func (msg MsgDeposit) GetSigners() []sdk.AccAddress { } // NewMsgVote creates a message to cast a vote on an active proposal +// //nolint:interfacer func NewMsgVote(voter sdk.AccAddress, proposalID uint64, option VoteOption) *MsgVote { return &MsgVote{proposalID, voter.String(), option} @@ -236,6 +240,7 @@ func (msg MsgVote) GetSigners() []sdk.AccAddress { } // NewMsgVoteWeighted creates a message to cast a vote on an active proposal +// //nolint:interfacer func NewMsgVoteWeighted(voter sdk.AccAddress, proposalID uint64, options WeightedVoteOptions) *MsgVoteWeighted { return &MsgVoteWeighted{proposalID, voter.String(), options} diff --git a/x/gov/types/proposal.go b/x/gov/types/proposal.go index ab2b7e1c6025..291faf0ae1da 100644 --- a/x/gov/types/proposal.go +++ b/x/gov/types/proposal.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" yaml "gopkg.in/yaml.v2" "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/x/gov/types/query.pb.go b/x/gov/types/query.pb.go index 4ca1f33ae5f4..a7c2b4a1b70c 100644 --- a/x/gov/types/query.pb.go +++ b/x/gov/types/query.pb.go @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/gov/types/query.pb.gw.go b/x/gov/types/query.pb.gw.go index 4b6832d41e7b..1638dc7971b9 100644 --- a/x/gov/types/query.pb.gw.go +++ b/x/gov/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join func request_Query_Proposal_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryProposalRequest @@ -528,12 +530,14 @@ func local_request_Query_TallyResult_0(ctx context.Context, marshaler runtime.Ma // 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_Proposal_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 { @@ -541,6 +545,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Proposal_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) @@ -554,6 +559,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Proposals_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 { @@ -561,6 +568,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Proposals_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) @@ -574,6 +582,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Vote_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 { @@ -581,6 +591,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Vote_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) @@ -594,6 +605,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Votes_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 { @@ -601,6 +614,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Votes_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) @@ -614,6 +628,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 { @@ -621,6 +637,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) @@ -634,6 +651,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Deposit_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 { @@ -641,6 +660,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Deposit_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 +674,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Deposits_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 +683,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Deposits_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) @@ -674,6 +697,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_TallyResult_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 { @@ -681,6 +706,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_TallyResult_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) diff --git a/x/gov/types/tx.pb.go b/x/gov/types/tx.pb.go index 5ca7e1af8c63..6f647e1b1550 100644 --- a/x/gov/types/tx.pb.go +++ b/x/gov/types/tx.pb.go @@ -6,13 +6,13 @@ package types import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types1 "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/mint/client/rest/grpc_query_test.go b/x/mint/client/rest/grpc_query_test.go index fdbb4ff75998..e10465561d95 100644 --- a/x/mint/client/rest/grpc_query_test.go +++ b/x/mint/client/rest/grpc_query_test.go @@ -1,3 +1,4 @@ +//go:build norace // +build norace package rest_test @@ -10,7 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/testutil/network" diff --git a/x/mint/types/genesis.pb.go b/x/mint/types/genesis.pb.go index 1486c35f2232..cee6d1f15c87 100644 --- a/x/mint/types/genesis.pb.go +++ b/x/mint/types/genesis.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/mint/types/mint.pb.go b/x/mint/types/mint.pb.go index 4ed1cccd6978..1aba23cc0302 100644 --- a/x/mint/types/mint.pb.go +++ b/x/mint/types/mint.pb.go @@ -6,8 +6,8 @@ package types import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/mint/types/query.pb.go b/x/mint/types/query.pb.go index f707eb810d2d..c6982b3870b8 100644 --- a/x/mint/types/query.pb.go +++ b/x/mint/types/query.pb.go @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/mint/types/query.pb.gw.go b/x/mint/types/query.pb.gw.go index 576b206d4a4e..7ed551a69f5e 100644 --- a/x/mint/types/query.pb.gw.go +++ b/x/mint/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join 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 @@ -88,12 +90,14 @@ func local_request_Query_AnnualProvisions_0(ctx context.Context, marshaler runti // 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_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 { @@ -101,6 +105,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) @@ -114,6 +119,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Inflation_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 { @@ -121,6 +128,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Inflation_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) @@ -134,6 +142,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_AnnualProvisions_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 { @@ -141,6 +151,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_AnnualProvisions_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) diff --git a/x/params/client/rest/grpc_query_test.go b/x/params/client/rest/grpc_query_test.go index f2c4440e29d5..7a0a83f19347 100644 --- a/x/params/client/rest/grpc_query_test.go +++ b/x/params/client/rest/grpc_query_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/testutil" diff --git a/x/params/keeper/consensus_params.go b/x/params/keeper/consensus_params.go index 5ce8d340d0d9..9481d5d91271 100644 --- a/x/params/keeper/consensus_params.go +++ b/x/params/keeper/consensus_params.go @@ -1,7 +1,6 @@ package keeper import ( - abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/baseapp" @@ -16,7 +15,7 @@ import ( func ConsensusParamsKeyTable() types.KeyTable { return types.NewKeyTable( types.NewParamSetPair( - baseapp.ParamStoreKeyBlockParams, abci.BlockParams{}, baseapp.ValidateBlockParams, + baseapp.ParamStoreKeyBlockParams, tmproto.BlockParams{}, baseapp.ValidateBlockParams, ), types.NewParamSetPair( baseapp.ParamStoreKeyEvidenceParams, tmproto.EvidenceParams{}, baseapp.ValidateEvidenceParams, diff --git a/x/params/types/proposal/params.pb.go b/x/params/types/proposal/params.pb.go index 1681b3960e63..7168bfb92e31 100644 --- a/x/params/types/proposal/params.pb.go +++ b/x/params/types/proposal/params.pb.go @@ -5,8 +5,8 @@ package proposal import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/params/types/proposal/query.pb.go b/x/params/types/proposal/query.pb.go index e0c770d70e24..7a2d9ec38d8a 100644 --- a/x/params/types/proposal/query.pb.go +++ b/x/params/types/proposal/query.pb.go @@ -6,9 +6,9 @@ package proposal import ( context "context" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/params/types/proposal/query.pb.gw.go b/x/params/types/proposal/query.pb.gw.go index f5b9f9d5b686..195df70a6055 100644 --- a/x/params/types/proposal/query.pb.gw.go +++ b/x/params/types/proposal/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join var ( filter_Query_Params_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} @@ -70,12 +72,14 @@ 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_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 { @@ -83,6 +87,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) diff --git a/x/simulation/mock_tendermint.go b/x/simulation/mock_tendermint.go index 55c2ca544465..8c8410b2572e 100644 --- a/x/simulation/mock_tendermint.go +++ b/x/simulation/mock_tendermint.go @@ -167,14 +167,14 @@ func RandomRequestBeginBlock(r *rand.Rand, params Params, if len(pastTimes) == 0 { return abci.RequestBeginBlock{ Header: header, - LastCommitInfo: abci.LastCommitInfo{ + LastCommitInfo: abci.CommitInfo{ Votes: voteInfos, }, } } // TODO: Determine capacity before allocation - evidence := make([]abci.Evidence, 0) + evidence := make([]abci.Misbehavior, 0) for r.Float64() < params.EvidenceFraction() { height := header.Height @@ -196,8 +196,8 @@ func RandomRequestBeginBlock(r *rand.Rand, params Params, } evidence = append(evidence, - abci.Evidence{ - Type: abci.EvidenceType_DUPLICATE_VOTE, + abci.Misbehavior{ + Type: abci.MisbehaviorType_DUPLICATE_VOTE, Validator: validator, Height: height, Time: time, @@ -210,7 +210,7 @@ func RandomRequestBeginBlock(r *rand.Rand, params Params, return abci.RequestBeginBlock{ Header: header, - LastCommitInfo: abci.LastCommitInfo{ + LastCommitInfo: abci.CommitInfo{ Votes: voteInfos, }, ByzantineValidators: evidence, diff --git a/x/simulation/params.go b/x/simulation/params.go index 06d48b04f00c..3da5df2a983a 100644 --- a/x/simulation/params.go +++ b/x/simulation/params.go @@ -5,7 +5,6 @@ import ( "fmt" "math/rand" - abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/tendermint/tendermint/types" @@ -151,7 +150,7 @@ func (w WeightedProposalContent) ContentSimulatorFn() simulation.ContentSimulato // Param change proposals // randomConsensusParams returns random simulation consensus parameters, it extracts the Evidence from the Staking genesis state. -func randomConsensusParams(r *rand.Rand, appState json.RawMessage, cdc codec.JSONCodec) *abci.ConsensusParams { +func randomConsensusParams(r *rand.Rand, appState json.RawMessage, cdc codec.JSONCodec) *tmproto.ConsensusParams { var genesisState map[string]json.RawMessage err := json.Unmarshal(appState, &genesisState) if err != nil { @@ -159,8 +158,8 @@ func randomConsensusParams(r *rand.Rand, appState json.RawMessage, cdc codec.JSO } stakingGenesisState := stakingtypes.GetGenesisStateFromAppState(cdc, genesisState) - consensusParams := &abci.ConsensusParams{ - Block: &abci.BlockParams{ + consensusParams := &tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ MaxBytes: int64(simulation.RandIntBetween(r, 20000000, 30000000)), MaxGas: -1, }, @@ -172,7 +171,7 @@ func randomConsensusParams(r *rand.Rand, appState json.RawMessage, cdc codec.JSO MaxAgeDuration: stakingGenesisState.Params.UnbondingTime, }, Version: &tmproto.VersionParams{ - AppVersion: uint64(simulation.RandIntBetween(r, 0, 10000)), + App: uint64(simulation.RandIntBetween(r, 0, 10000)), }, } diff --git a/x/simulation/simulate.go b/x/simulation/simulate.go index 28662508eb2b..e5c221a9f731 100644 --- a/x/simulation/simulate.go +++ b/x/simulation/simulate.go @@ -41,7 +41,7 @@ func initChain( Time: genesisTimestamp, } // Valid app version can only be zero on app initialization. - req.ConsensusParams.Version.AppVersion = 0 + req.ConsensusParams.Version.App = 0 res := app.InitChain(req) validators := newMockValidators(r, res.Validators, params) diff --git a/x/slashing/abci_test.go b/x/slashing/abci_test.go index 6121e3572b88..64d2f594d30a 100644 --- a/x/slashing/abci_test.go +++ b/x/slashing/abci_test.go @@ -42,7 +42,7 @@ func TestBeginBlocker(t *testing.T) { // mark the validator as having signed req := abci.RequestBeginBlock{ - LastCommitInfo: abci.LastCommitInfo{ + LastCommitInfo: abci.CommitInfo{ Votes: []abci.VoteInfo{{ Validator: val, SignedLastBlock: true, @@ -65,7 +65,7 @@ func TestBeginBlocker(t *testing.T) { for ; height < app.SlashingKeeper.SignedBlocksWindow(ctx); height++ { ctx = ctx.WithBlockHeight(height) req = abci.RequestBeginBlock{ - LastCommitInfo: abci.LastCommitInfo{ + LastCommitInfo: abci.CommitInfo{ Votes: []abci.VoteInfo{{ Validator: val, SignedLastBlock: true, @@ -80,7 +80,7 @@ func TestBeginBlocker(t *testing.T) { for ; height < ((app.SlashingKeeper.SignedBlocksWindow(ctx) * 2) - app.SlashingKeeper.MinSignedPerWindow(ctx) + 1); height++ { ctx = ctx.WithBlockHeight(height) req = abci.RequestBeginBlock{ - LastCommitInfo: abci.LastCommitInfo{ + LastCommitInfo: abci.CommitInfo{ Votes: []abci.VoteInfo{{ Validator: val, SignedLastBlock: false, diff --git a/x/slashing/client/rest/grpc_query_test.go b/x/slashing/client/rest/grpc_query_test.go index 39daf06f69c5..c08bbc892846 100644 --- a/x/slashing/client/rest/grpc_query_test.go +++ b/x/slashing/client/rest/grpc_query_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/testutil" diff --git a/x/slashing/client/testutil/suite.go b/x/slashing/client/testutil/suite.go index cf5cf997b6c3..fbc2e43e6daa 100644 --- a/x/slashing/client/testutil/suite.go +++ b/x/slashing/client/testutil/suite.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" tmcli "github.com/tendermint/tendermint/libs/cli" diff --git a/x/slashing/keeper/signing_info.go b/x/slashing/keeper/signing_info.go index ed15ae3e4ff3..a32306a5b2e9 100644 --- a/x/slashing/keeper/signing_info.go +++ b/x/slashing/keeper/signing_info.go @@ -3,7 +3,7 @@ package keeper import ( "time" - gogotypes "github.com/gogo/protobuf/types" + gogotypes "github.com/cosmos/gogoproto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" diff --git a/x/slashing/simulation/decoder.go b/x/slashing/simulation/decoder.go index 6c845ace7174..d295a284ac18 100644 --- a/x/slashing/simulation/decoder.go +++ b/x/slashing/simulation/decoder.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" - gogotypes "github.com/gogo/protobuf/types" + gogotypes "github.com/cosmos/gogoproto/types" "github.com/cosmos/cosmos-sdk/codec" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" diff --git a/x/slashing/simulation/decoder_test.go b/x/slashing/simulation/decoder_test.go index 94b9f5a1c88c..6efc693b75b3 100644 --- a/x/slashing/simulation/decoder_test.go +++ b/x/slashing/simulation/decoder_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - gogotypes "github.com/gogo/protobuf/types" + gogotypes "github.com/cosmos/gogoproto/types" "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" diff --git a/x/slashing/types/genesis.pb.go b/x/slashing/types/genesis.pb.go index 7235626bd762..b817c4db0983 100644 --- a/x/slashing/types/genesis.pb.go +++ b/x/slashing/types/genesis.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/slashing/types/query.pb.go b/x/slashing/types/query.pb.go index 3a0c997a3056..4b591e5f75e7 100644 --- a/x/slashing/types/query.pb.go +++ b/x/slashing/types/query.pb.go @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/slashing/types/query.pb.gw.go b/x/slashing/types/query.pb.gw.go index 95446797bfab..31fe8bb6f02c 100644 --- a/x/slashing/types/query.pb.gw.go +++ b/x/slashing/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join 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 @@ -142,12 +144,14 @@ func local_request_Query_SigningInfos_0(ctx context.Context, marshaler runtime.M // 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_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 { @@ -155,6 +159,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) @@ -168,6 +173,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_SigningInfo_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 { @@ -175,6 +182,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_SigningInfo_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) @@ -188,6 +196,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_SigningInfos_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 { @@ -195,6 +205,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_SigningInfos_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) diff --git a/x/slashing/types/slashing.pb.go b/x/slashing/types/slashing.pb.go index 633b4c5bb944..f377066cfe80 100644 --- a/x/slashing/types/slashing.pb.go +++ b/x/slashing/types/slashing.pb.go @@ -6,9 +6,9 @@ package types import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "google.golang.org/protobuf/types/known/durationpb" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" @@ -342,7 +342,7 @@ func (m *ValidatorSigningInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.JailedUntil, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.JailedUntil):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.JailedUntil, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.JailedUntil):]) if err1 != nil { return 0, err1 } @@ -410,7 +410,7 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x22 - n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.DowntimeJailDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.DowntimeJailDuration):]) + n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.DowntimeJailDuration, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.DowntimeJailDuration):]) if err2 != nil { return 0, err2 } @@ -463,7 +463,7 @@ func (m *ValidatorSigningInfo) Size() (n int) { if m.IndexOffset != 0 { n += 1 + sovSlashing(uint64(m.IndexOffset)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.JailedUntil) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.JailedUntil) n += 1 + l + sovSlashing(uint64(l)) if m.Tombstoned { n += 2 @@ -485,7 +485,7 @@ func (m *Params) Size() (n int) { } l = m.MinSignedPerWindow.Size() n += 1 + l + sovSlashing(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.DowntimeJailDuration) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.DowntimeJailDuration) n += 1 + l + sovSlashing(uint64(l)) l = m.SlashFractionDoubleSign.Size() n += 1 + l + sovSlashing(uint64(l)) @@ -628,7 +628,7 @@ func (m *ValidatorSigningInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.JailedUntil, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.JailedUntil, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -802,7 +802,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.DowntimeJailDuration, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.DowntimeJailDuration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/slashing/types/tx.pb.go b/x/slashing/types/tx.pb.go index ed6dbcd170ab..177211f68702 100644 --- a/x/slashing/types/tx.pb.go +++ b/x/slashing/types/tx.pb.go @@ -6,9 +6,9 @@ package types import ( context "context" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/x/staking/client/rest/grpc_query_test.go b/x/staking/client/rest/grpc_query_test.go index 55a10194f603..218c1f77b687 100644 --- a/x/staking/client/rest/grpc_query_test.go +++ b/x/staking/client/rest/grpc_query_test.go @@ -1,3 +1,4 @@ +//go:build norace // +build norace package rest_test @@ -6,7 +7,7 @@ import ( "fmt" "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/client/flags" diff --git a/x/staking/client/testutil/suite.go b/x/staking/client/testutil/suite.go index 991433f2a25c..1a6fb5dd478a 100644 --- a/x/staking/client/testutil/suite.go +++ b/x/staking/client/testutil/suite.go @@ -6,7 +6,7 @@ import ( "strings" "testing" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" tmcli "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/proto/tendermint/crypto" diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index 12dea7d7267a..9b7a748dc44a 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -5,14 +5,12 @@ import ( "testing" "time" + "github.com/golang/protobuf/proto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" - "github.com/golang/protobuf/proto" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" @@ -170,7 +168,7 @@ func TestDuplicatesMsgCreateValidator(t *testing.T) { func TestInvalidPubKeyTypeMsgCreateValidator(t *testing.T) { initPower := int64(1000) app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 1, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - ctx = ctx.WithConsensusParams(&abci.ConsensusParams{ + ctx = ctx.WithConsensusParams(&tmproto.ConsensusParams{ Validator: &tmproto.ValidatorParams{PubKeyTypes: []string{tmtypes.ABCIPubKeyTypeEd25519}}, }) @@ -184,7 +182,7 @@ func TestInvalidPubKeyTypeMsgCreateValidator(t *testing.T) { func TestBothPubKeyTypesMsgCreateValidator(t *testing.T) { app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, 1000, 2, sdk.NewInt(1000)) - ctx = ctx.WithConsensusParams(&abci.ConsensusParams{ + ctx = ctx.WithConsensusParams(&tmproto.ConsensusParams{ Validator: &tmproto.ValidatorParams{PubKeyTypes: []string{tmtypes.ABCIPubKeyTypeEd25519, tmtypes.ABCIPubKeyTypeSecp256k1}}, }) diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index 22f699366119..8781a5e08cc9 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -5,7 +5,7 @@ import ( "fmt" "sort" - gogotypes "github.com/gogo/protobuf/types" + gogotypes "github.com/cosmos/gogoproto/types" abci "github.com/tendermint/tendermint/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index b3d9bb917a23..5bbb07613dce 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - gogotypes "github.com/gogo/protobuf/types" + gogotypes "github.com/cosmos/gogoproto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/types" diff --git a/x/staking/legacy/v040/genesis.pb.go b/x/staking/legacy/v040/genesis.pb.go deleted file mode 100644 index af9e607d28ac..000000000000 --- a/x/staking/legacy/v040/genesis.pb.go +++ /dev/null @@ -1,944 +0,0 @@ -// Package v040 is taken from: -// https://github.com/cosmos/cosmos-sdk/blob/v0.40.1/x/staking/types/genesis.pb.go -// by copy-pasted only the relevants parts for Genesis. -// nolint -package v040 - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "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 -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// GenesisState defines the staking module's genesis state. -type GenesisState struct { - // params defines all the paramaters of related to deposit. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` - // last_total_power tracks the total amounts of bonded tokens recorded during - // the previous end block. - LastTotalPower github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=last_total_power,json=lastTotalPower,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"last_total_power" yaml:"last_total_power"` - // last_validator_powers is a special index that provides a historical list - // of the last-block's bonded validators. - LastValidatorPowers []LastValidatorPower `protobuf:"bytes,3,rep,name=last_validator_powers,json=lastValidatorPowers,proto3" json:"last_validator_powers" yaml:"last_validator_powers"` - // delegations defines the validator set at genesis. - Validators []Validator `protobuf:"bytes,4,rep,name=validators,proto3" json:"validators"` - // delegations defines the delegations active at genesis. - Delegations []Delegation `protobuf:"bytes,5,rep,name=delegations,proto3" json:"delegations"` - // unbonding_delegations defines the unbonding delegations active at genesis. - UnbondingDelegations []UnbondingDelegation `protobuf:"bytes,6,rep,name=unbonding_delegations,json=unbondingDelegations,proto3" json:"unbonding_delegations" yaml:"unbonding_delegations"` - // redelegations defines the redelegations active at genesis. - Redelegations []Redelegation `protobuf:"bytes,7,rep,name=redelegations,proto3" json:"redelegations"` - Exported bool `protobuf:"varint,8,opt,name=exported,proto3" json:"exported,omitempty"` -} - -func (m *GenesisState) Reset() { *m = GenesisState{} } -func (m *GenesisState) String() string { return proto.CompactTextString(m) } -func (*GenesisState) ProtoMessage() {} -func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_9b3dec8894f2831b, []int{0} -} -func (m *GenesisState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState.Merge(m, src) -} -func (m *GenesisState) XXX_Size() int { - return m.Size() -} -func (m *GenesisState) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState proto.InternalMessageInfo - -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -func (m *GenesisState) GetLastValidatorPowers() []LastValidatorPower { - if m != nil { - return m.LastValidatorPowers - } - return nil -} - -func (m *GenesisState) GetValidators() []Validator { - if m != nil { - return m.Validators - } - return nil -} - -func (m *GenesisState) GetDelegations() []Delegation { - if m != nil { - return m.Delegations - } - return nil -} - -func (m *GenesisState) GetUnbondingDelegations() []UnbondingDelegation { - if m != nil { - return m.UnbondingDelegations - } - return nil -} - -func (m *GenesisState) GetRedelegations() []Redelegation { - if m != nil { - return m.Redelegations - } - return nil -} - -func (m *GenesisState) GetExported() bool { - if m != nil { - return m.Exported - } - return false -} - -// LastValidatorPower required for validator set update logic. -type LastValidatorPower struct { - // address is the address of the validator. - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - // power defines the power of the validator. - Power int64 `protobuf:"varint,2,opt,name=power,proto3" json:"power,omitempty"` -} - -func (m *LastValidatorPower) Reset() { *m = LastValidatorPower{} } -func (m *LastValidatorPower) String() string { return proto.CompactTextString(m) } -func (*LastValidatorPower) ProtoMessage() {} -func (*LastValidatorPower) Descriptor() ([]byte, []int) { - return fileDescriptor_9b3dec8894f2831b, []int{1} -} -func (m *LastValidatorPower) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *LastValidatorPower) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_LastValidatorPower.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 *LastValidatorPower) XXX_Merge(src proto.Message) { - xxx_messageInfo_LastValidatorPower.Merge(m, src) -} -func (m *LastValidatorPower) XXX_Size() int { - return m.Size() -} -func (m *LastValidatorPower) XXX_DiscardUnknown() { - xxx_messageInfo_LastValidatorPower.DiscardUnknown(m) -} - -var xxx_messageInfo_LastValidatorPower proto.InternalMessageInfo - -func init() { - // proto.RegisterType((*GenesisState)(nil), "cosmos.staking.v1beta1.GenesisState") - // proto.RegisterType((*LastValidatorPower)(nil), "cosmos.staking.v1beta1.LastValidatorPower") -} - -func init() { - // proto.RegisterFile("cosmos/staking/v1beta1/genesis.proto", fileDescriptor_9b3dec8894f2831b) -} - -var fileDescriptor_9b3dec8894f2831b = []byte{ - // 493 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0x3d, 0x6f, 0xd3, 0x40, - 0x18, 0xc7, 0x7d, 0xa4, 0x49, 0xc3, 0xa5, 0x20, 0x74, 0xa4, 0x60, 0x45, 0xc8, 0x0e, 0x56, 0x84, - 0x22, 0x5e, 0x6c, 0xb5, 0x6c, 0x15, 0x53, 0x84, 0xa8, 0x8a, 0x10, 0x8a, 0x8e, 0x97, 0x81, 0x25, - 0xba, 0xd4, 0x27, 0x63, 0xd5, 0xf1, 0x59, 0x7e, 0x2e, 0xa5, 0xdd, 0x11, 0x62, 0xe4, 0x23, 0xf4, - 0xe3, 0x74, 0xec, 0xc0, 0x80, 0x18, 0x2c, 0x94, 0x2c, 0xcc, 0xfd, 0x04, 0xc8, 0xe7, 0x17, 0x4c, - 0x52, 0x33, 0x25, 0x77, 0xfa, 0xfd, 0x7f, 0x7f, 0xfb, 0xfc, 0x1c, 0x1e, 0x1c, 0x0a, 0x98, 0x09, - 0x70, 0x40, 0xb2, 0x23, 0x3f, 0xf4, 0x9c, 0xe3, 0x9d, 0x29, 0x97, 0x6c, 0xc7, 0xf1, 0x78, 0xc8, - 0xc1, 0x07, 0x3b, 0x8a, 0x85, 0x14, 0xe4, 0x4e, 0x46, 0xd9, 0x39, 0x65, 0xe7, 0x54, 0xaf, 0xeb, - 0x09, 0x4f, 0x28, 0xc4, 0x49, 0xff, 0x65, 0x74, 0xaf, 0xce, 0x59, 0xa4, 0x15, 0x65, 0x7d, 0x6f, - 0xe2, 0xad, 0xfd, 0xac, 0xe5, 0x8d, 0x64, 0x92, 0x93, 0x67, 0xb8, 0x15, 0xb1, 0x98, 0xcd, 0x40, - 0x47, 0x7d, 0x34, 0xec, 0xec, 0x1a, 0xf6, 0xd5, 0xad, 0xf6, 0x58, 0x51, 0xa3, 0x8d, 0xf3, 0xc4, - 0xd4, 0x68, 0x9e, 0x21, 0x80, 0x6f, 0x05, 0x0c, 0xe4, 0x44, 0x0a, 0xc9, 0x82, 0x49, 0x24, 0x3e, - 0xf1, 0x58, 0xbf, 0xd6, 0x47, 0xc3, 0xad, 0xd1, 0x41, 0xca, 0xfd, 0x4c, 0xcc, 0x07, 0x9e, 0x2f, - 0x3f, 0xce, 0xa7, 0xf6, 0xa1, 0x98, 0x39, 0xf9, 0x13, 0x66, 0x3f, 0x4f, 0xc0, 0x3d, 0x72, 0xe4, - 0x69, 0xc4, 0xc1, 0x3e, 0x08, 0xe5, 0x65, 0x62, 0xde, 0x3d, 0x65, 0xb3, 0x60, 0xcf, 0x5a, 0xf5, - 0x59, 0xf4, 0x66, 0xba, 0xf5, 0x36, 0xdd, 0x19, 0xa7, 0x1b, 0xe4, 0x33, 0xc2, 0xdb, 0x8a, 0x3a, - 0x66, 0x81, 0xef, 0x32, 0x29, 0xe2, 0x8c, 0x04, 0xbd, 0xd1, 0x6f, 0x0c, 0x3b, 0xbb, 0x0f, 0xeb, - 0x5e, 0xe1, 0x15, 0x03, 0xf9, 0xbe, 0xc8, 0x28, 0xd7, 0x68, 0x90, 0x3e, 0xe6, 0x65, 0x62, 0xde, - 0xab, 0x94, 0xaf, 0x6a, 0x2d, 0x7a, 0x3b, 0x58, 0x4b, 0x02, 0xd9, 0xc7, 0xb8, 0x24, 0x41, 0xdf, - 0x50, 0xd5, 0xf7, 0xeb, 0xaa, 0xcb, 0x70, 0x7e, 0x80, 0x95, 0x28, 0x79, 0x89, 0x3b, 0x2e, 0x0f, - 0xb8, 0xc7, 0xa4, 0x2f, 0x42, 0xd0, 0x9b, 0xca, 0x64, 0xd5, 0x99, 0x9e, 0x97, 0x68, 0xae, 0xaa, - 0x86, 0xc9, 0x17, 0x84, 0xb7, 0xe7, 0xe1, 0x54, 0x84, 0xae, 0x1f, 0x7a, 0x93, 0xaa, 0xb6, 0xa5, - 0xb4, 0x8f, 0xea, 0xb4, 0xef, 0x8a, 0x50, 0xc5, 0xbf, 0x72, 0x38, 0x57, 0x7a, 0x2d, 0xda, 0x9d, - 0xaf, 0x47, 0x81, 0x8c, 0xf1, 0x8d, 0x98, 0x57, 0xfb, 0x37, 0x55, 0xff, 0xa0, 0xae, 0x9f, 0x56, - 0xe0, 0xfc, 0xc5, 0xfe, 0x15, 0x90, 0x1e, 0x6e, 0xf3, 0x93, 0x48, 0xc4, 0x92, 0xbb, 0x7a, 0xbb, - 0x8f, 0x86, 0x6d, 0x5a, 0xae, 0xad, 0xd7, 0x98, 0xac, 0x7f, 0x5c, 0xa2, 0xe3, 0x4d, 0xe6, 0xba, - 0x31, 0x87, 0x6c, 0xb8, 0xaf, 0xd3, 0x62, 0x49, 0xba, 0xb8, 0xf9, 0x77, 0x58, 0x1b, 0x34, 0x5b, - 0xec, 0xb5, 0xbf, 0x9e, 0x99, 0xda, 0xef, 0x33, 0x53, 0x1b, 0xbd, 0x38, 0x5f, 0x18, 0xe8, 0x62, - 0x61, 0xa0, 0x5f, 0x0b, 0x03, 0x7d, 0x5b, 0x1a, 0xda, 0xc5, 0xd2, 0xd0, 0x7e, 0x2c, 0x0d, 0xed, - 0xc3, 0xe3, 0xff, 0xce, 0xf3, 0x49, 0x79, 0xfd, 0xd4, 0x64, 0x4f, 0x5b, 0xea, 0xd6, 0x3d, 0xfd, - 0x13, 0x00, 0x00, 0xff, 0xff, 0xff, 0x85, 0xad, 0xc8, 0xf1, 0x03, 0x00, 0x00, -} - -func (m *GenesisState) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Exported { - i-- - if m.Exported { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x40 - } - if len(m.Redelegations) > 0 { - for iNdEx := len(m.Redelegations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Redelegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - } - if len(m.UnbondingDelegations) > 0 { - for iNdEx := len(m.UnbondingDelegations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.UnbondingDelegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.Delegations) > 0 { - for iNdEx := len(m.Delegations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Delegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - } - 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 = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.LastValidatorPowers) > 0 { - for iNdEx := len(m.LastValidatorPowers) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.LastValidatorPowers[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - { - size := m.LastTotalPower.Size() - i -= size - if _, err := m.LastTotalPower.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *LastValidatorPower) 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 *LastValidatorPower) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *LastValidatorPower) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Power != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.Power)) - i-- - dAtA[i] = 0x10 - } - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintGenesis(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { - offset -= sovGenesis(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *GenesisState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) - l = m.LastTotalPower.Size() - n += 1 + l + sovGenesis(uint64(l)) - if len(m.LastValidatorPowers) > 0 { - for _, e := range m.LastValidatorPowers { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.Validators) > 0 { - for _, e := range m.Validators { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.Delegations) > 0 { - for _, e := range m.Delegations { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.UnbondingDelegations) > 0 { - for _, e := range m.UnbondingDelegations { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.Redelegations) > 0 { - for _, e := range m.Redelegations { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if m.Exported { - n += 2 - } - return n -} - -func (m *LastValidatorPower) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovGenesis(uint64(l)) - } - if m.Power != 0 { - n += 1 + sovGenesis(uint64(m.Power)) - } - return n -} - -func sovGenesis(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenesis(x uint64) (n int) { - return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *GenesisState) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - 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 ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastTotalPower", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.LastTotalPower.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastValidatorPowers", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.LastValidatorPowers = append(m.LastValidatorPowers, LastValidatorPower{}) - if err := m.LastValidatorPowers[len(m.LastValidatorPowers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - 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 ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validators = append(m.Validators, Validator{}) - if err := m.Validators[len(m.Validators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Delegations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Delegations = append(m.Delegations, Delegation{}) - if err := m.Delegations[len(m.Delegations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UnbondingDelegations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.UnbondingDelegations = append(m.UnbondingDelegations, UnbondingDelegation{}) - if err := m.UnbondingDelegations[len(m.UnbondingDelegations)-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 Redelegations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Redelegations = append(m.Redelegations, Redelegation{}) - if err := m.Redelegations[len(m.Redelegations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Exported", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Exported = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *LastValidatorPower) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: LastValidatorPower: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LastValidatorPower: 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 ErrIntOverflowGenesis - } - 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 ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Power", wireType) - } - m.Power = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Power |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenesis(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenesis - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenesis - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenesis - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/staking/legacy/v040/keys.go b/x/staking/legacy/v040/keys.go deleted file mode 100644 index c01c41a417e3..000000000000 --- a/x/staking/legacy/v040/keys.go +++ /dev/null @@ -1,330 +0,0 @@ -// Package v040 is copy-pasted from: -// https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/staking/types/keys.go -package v040 - -import ( - "bytes" - "encoding/binary" - "fmt" - "strconv" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v040" - "github.com/cosmos/cosmos-sdk/x/staking/types" -) - -const ( - // ModuleName is the name of the staking module - ModuleName = "staking" - - // StoreKey is the string store representation - StoreKey = ModuleName - - // QuerierRoute is the querier route for the staking module - QuerierRoute = ModuleName - - // RouterKey is the msg router key for the staking module - RouterKey = ModuleName -) - -var ( - // Keys for store prefixes - // Last* values are constant during a block. - LastValidatorPowerKey = []byte{0x11} // prefix for each key to a validator index, for bonded validators - LastTotalPowerKey = []byte{0x12} // prefix for the total power - - ValidatorsKey = []byte{0x21} // prefix for each key to a validator - ValidatorsByConsAddrKey = []byte{0x22} // prefix for each key to a validator index, by pubkey - ValidatorsByPowerIndexKey = []byte{0x23} // prefix for each key to a validator index, sorted by power - - DelegationKey = []byte{0x31} // key for a delegation - UnbondingDelegationKey = []byte{0x32} // key for an unbonding-delegation - UnbondingDelegationByValIndexKey = []byte{0x33} // prefix for each key for an unbonding-delegation, by validator operator - RedelegationKey = []byte{0x34} // key for a redelegation - RedelegationByValSrcIndexKey = []byte{0x35} // prefix for each key for an redelegation, by source validator operator - RedelegationByValDstIndexKey = []byte{0x36} // prefix for each key for an redelegation, by destination validator operator - - UnbondingQueueKey = []byte{0x41} // prefix for the timestamps in unbonding queue - RedelegationQueueKey = []byte{0x42} // prefix for the timestamps in redelegations queue - ValidatorQueueKey = []byte{0x43} // prefix for the timestamps in validator queue - - HistoricalInfoKey = []byte{0x50} // prefix for the historical info -) - -// gets the key for the validator with address -// VALUE: staking/Validator -func GetValidatorKey(operatorAddr sdk.ValAddress) []byte { - return append(ValidatorsKey, operatorAddr.Bytes()...) -} - -// gets the key for the validator with pubkey -// VALUE: validator operator address ([]byte) -func GetValidatorByConsAddrKey(addr sdk.ConsAddress) []byte { - return append(ValidatorsByConsAddrKey, addr.Bytes()...) -} - -// Get the validator operator address from LastValidatorPowerKey -func AddressFromLastValidatorPowerKey(key []byte) []byte { - return key[1:] // remove prefix bytes -} - -// get the validator by power index. -// Power index is the key used in the power-store, and represents the relative -// power ranking of the validator. -// VALUE: validator operator address ([]byte) -func GetValidatorsByPowerIndexKey(validator types.Validator) []byte { - // NOTE the address doesn't need to be stored because counter bytes must always be different - // NOTE the larger values are of higher value - - consensusPower := sdk.TokensToConsensusPower(validator.Tokens, sdk.DefaultPowerReduction) - consensusPowerBytes := make([]byte, 8) - binary.BigEndian.PutUint64(consensusPowerBytes, uint64(consensusPower)) - - powerBytes := consensusPowerBytes - powerBytesLen := len(powerBytes) // 8 - - // key is of format prefix || powerbytes || addrBytes - key := make([]byte, 1+powerBytesLen+v040auth.AddrLen) - - key[0] = ValidatorsByPowerIndexKey[0] - copy(key[1:powerBytesLen+1], powerBytes) - addr, err := sdk.ValAddressFromBech32(validator.OperatorAddress) - if err != nil { - panic(err) - } - operAddrInvr := sdk.CopyBytes(addr) - - for i, b := range operAddrInvr { - operAddrInvr[i] = ^b - } - - copy(key[powerBytesLen+1:], operAddrInvr) - - return key -} - -// get the bonded validator index key for an operator address -func GetLastValidatorPowerKey(operator sdk.ValAddress) []byte { - return append(LastValidatorPowerKey, operator...) -} - -// parse the validators operator address from power rank key -func ParseValidatorPowerRankKey(key []byte) (operAddr []byte) { - powerBytesLen := 8 - if len(key) != 1+powerBytesLen+v040auth.AddrLen { - panic("Invalid validator power rank key length") - } - - operAddr = sdk.CopyBytes(key[powerBytesLen+1:]) - - for i, b := range operAddr { - operAddr[i] = ^b - } - - return operAddr -} - -// GetValidatorQueueKey returns the prefix key used for getting a set of unbonding -// validators whose unbonding completion occurs at the given time and height. -func GetValidatorQueueKey(timestamp time.Time, height int64) []byte { - heightBz := sdk.Uint64ToBigEndian(uint64(height)) - timeBz := sdk.FormatTimeBytes(timestamp) - timeBzL := len(timeBz) - prefixL := len(ValidatorQueueKey) - - bz := make([]byte, prefixL+8+timeBzL+8) - - // copy the prefix - copy(bz[:prefixL], ValidatorQueueKey) - - // copy the encoded time bytes length - copy(bz[prefixL:prefixL+8], sdk.Uint64ToBigEndian(uint64(timeBzL))) - - // copy the encoded time bytes - copy(bz[prefixL+8:prefixL+8+timeBzL], timeBz) - - // copy the encoded height - copy(bz[prefixL+8+timeBzL:], heightBz) - - return bz -} - -// ParseValidatorQueueKey returns the encoded time and height from a key created -// from GetValidatorQueueKey. -func ParseValidatorQueueKey(bz []byte) (time.Time, int64, error) { - prefixL := len(ValidatorQueueKey) - if prefix := bz[:prefixL]; !bytes.Equal(prefix, ValidatorQueueKey) { - return time.Time{}, 0, fmt.Errorf("invalid prefix; expected: %X, got: %X", ValidatorQueueKey, prefix) - } - - timeBzL := sdk.BigEndianToUint64(bz[prefixL : prefixL+8]) - ts, err := sdk.ParseTimeBytes(bz[prefixL+8 : prefixL+8+int(timeBzL)]) - if err != nil { - return time.Time{}, 0, err - } - - height := sdk.BigEndianToUint64(bz[prefixL+8+int(timeBzL):]) - - return ts, int64(height), nil -} - -// gets the key for delegator bond with validator -// VALUE: staking/Delegation -func GetDelegationKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { - return append(GetDelegationsKey(delAddr), valAddr.Bytes()...) -} - -// gets the prefix for a delegator for all validators -func GetDelegationsKey(delAddr sdk.AccAddress) []byte { - return append(DelegationKey, delAddr.Bytes()...) -} - -// gets the key for an unbonding delegation by delegator and validator addr -// VALUE: staking/UnbondingDelegation -func GetUBDKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { - return append( - GetUBDsKey(delAddr.Bytes()), - valAddr.Bytes()...) -} - -// gets the index-key for an unbonding delegation, stored by validator-index -// VALUE: none (key rearrangement used) -func GetUBDByValIndexKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { - return append(GetUBDsByValIndexKey(valAddr), delAddr.Bytes()...) -} - -// rearranges the ValIndexKey to get the UBDKey -func GetUBDKeyFromValIndexKey(indexKey []byte) []byte { - addrs := indexKey[1:] // remove prefix bytes - if len(addrs) != 2*v040auth.AddrLen { - panic("unexpected key length") - } - - valAddr := addrs[:v040auth.AddrLen] - delAddr := addrs[v040auth.AddrLen:] - - return GetUBDKey(delAddr, valAddr) -} - -// gets the prefix for all unbonding delegations from a delegator -func GetUBDsKey(delAddr sdk.AccAddress) []byte { - return append(UnbondingDelegationKey, delAddr.Bytes()...) -} - -// gets the prefix keyspace for the indexes of unbonding delegations for a validator -func GetUBDsByValIndexKey(valAddr sdk.ValAddress) []byte { - return append(UnbondingDelegationByValIndexKey, valAddr.Bytes()...) -} - -// gets the prefix for all unbonding delegations from a delegator -func GetUnbondingDelegationTimeKey(timestamp time.Time) []byte { - bz := sdk.FormatTimeBytes(timestamp) - return append(UnbondingQueueKey, bz...) -} - -// GetREDKey returns a key prefix for indexing a redelegation from a delegator -// and source validator to a destination validator. -func GetREDKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { - key := make([]byte, 1+v040auth.AddrLen*3) - - copy(key[0:v040auth.AddrLen+1], GetREDsKey(delAddr.Bytes())) - copy(key[v040auth.AddrLen+1:2*v040auth.AddrLen+1], valSrcAddr.Bytes()) - copy(key[2*v040auth.AddrLen+1:3*v040auth.AddrLen+1], valDstAddr.Bytes()) - - return key -} - -// gets the index-key for a redelegation, stored by source-validator-index -// VALUE: none (key rearrangement used) -func GetREDByValSrcIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { - REDSFromValsSrcKey := GetREDsFromValSrcIndexKey(valSrcAddr) - offset := len(REDSFromValsSrcKey) - - // key is of the form REDSFromValsSrcKey || delAddr || valDstAddr - key := make([]byte, len(REDSFromValsSrcKey)+2*v040auth.AddrLen) - copy(key[0:offset], REDSFromValsSrcKey) - copy(key[offset:offset+v040auth.AddrLen], delAddr.Bytes()) - copy(key[offset+v040auth.AddrLen:offset+2*v040auth.AddrLen], valDstAddr.Bytes()) - - return key -} - -// gets the index-key for a redelegation, stored by destination-validator-index -// VALUE: none (key rearrangement used) -func GetREDByValDstIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { - REDSToValsDstKey := GetREDsToValDstIndexKey(valDstAddr) - offset := len(REDSToValsDstKey) - - // key is of the form REDSToValsDstKey || delAddr || valSrcAddr - key := make([]byte, len(REDSToValsDstKey)+2*v040auth.AddrLen) - copy(key[0:offset], REDSToValsDstKey) - copy(key[offset:offset+v040auth.AddrLen], delAddr.Bytes()) - copy(key[offset+v040auth.AddrLen:offset+2*v040auth.AddrLen], valSrcAddr.Bytes()) - - return key -} - -// GetREDKeyFromValSrcIndexKey rearranges the ValSrcIndexKey to get the REDKey -func GetREDKeyFromValSrcIndexKey(indexKey []byte) []byte { - // note that first byte is prefix byte - if len(indexKey) != 3*v040auth.AddrLen+1 { - panic("unexpected key length") - } - - valSrcAddr := indexKey[1 : v040auth.AddrLen+1] - delAddr := indexKey[v040auth.AddrLen+1 : 2*v040auth.AddrLen+1] - valDstAddr := indexKey[2*v040auth.AddrLen+1 : 3*v040auth.AddrLen+1] - - return GetREDKey(delAddr, valSrcAddr, valDstAddr) -} - -// GetREDKeyFromValDstIndexKey rearranges the ValDstIndexKey to get the REDKey -func GetREDKeyFromValDstIndexKey(indexKey []byte) []byte { - // note that first byte is prefix byte - if len(indexKey) != 3*v040auth.AddrLen+1 { - panic("unexpected key length") - } - - valDstAddr := indexKey[1 : v040auth.AddrLen+1] - delAddr := indexKey[v040auth.AddrLen+1 : 2*v040auth.AddrLen+1] - valSrcAddr := indexKey[2*v040auth.AddrLen+1 : 3*v040auth.AddrLen+1] - - return GetREDKey(delAddr, valSrcAddr, valDstAddr) -} - -// GetRedelegationTimeKey returns a key prefix for indexing an unbonding -// redelegation based on a completion time. -func GetRedelegationTimeKey(timestamp time.Time) []byte { - bz := sdk.FormatTimeBytes(timestamp) - return append(RedelegationQueueKey, bz...) -} - -// GetREDsKey returns a key prefix for indexing a redelegation from a delegator -// address. -func GetREDsKey(delAddr sdk.AccAddress) []byte { - return append(RedelegationKey, delAddr.Bytes()...) -} - -// GetREDsFromValSrcIndexKey returns a key prefix for indexing a redelegation to -// a source validator. -func GetREDsFromValSrcIndexKey(valSrcAddr sdk.ValAddress) []byte { - return append(RedelegationByValSrcIndexKey, valSrcAddr.Bytes()...) -} - -// GetREDsToValDstIndexKey returns a key prefix for indexing a redelegation to a -// destination (target) validator. -func GetREDsToValDstIndexKey(valDstAddr sdk.ValAddress) []byte { - return append(RedelegationByValDstIndexKey, valDstAddr.Bytes()...) -} - -// GetREDsByDelToValDstIndexKey returns a key prefix for indexing a redelegation -// from an address to a source validator. -func GetREDsByDelToValDstIndexKey(delAddr sdk.AccAddress, valDstAddr sdk.ValAddress) []byte { - return append(GetREDsToValDstIndexKey(valDstAddr), delAddr.Bytes()...) -} - -// GetHistoricalInfoKey returns a key prefix for indexing HistoricalInfo objects. -func GetHistoricalInfoKey(height int64) []byte { - return append(HistoricalInfoKey, []byte(strconv.FormatInt(height, 10))...) -} diff --git a/x/staking/legacy/v040/migrate.go b/x/staking/legacy/v040/migrate.go deleted file mode 100644 index 88743cd2bc7e..000000000000 --- a/x/staking/legacy/v040/migrate.go +++ /dev/null @@ -1,142 +0,0 @@ -package v040 - -import ( - "fmt" - - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034" - v038staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v038" - v040staking "github.com/cosmos/cosmos-sdk/x/staking/types" -) - -func migrateBondStatus(oldStatus v034staking.BondStatus) BondStatus { - switch oldStatus { - case v034staking.Unbonded: - return Unbonded - - case v034staking.Unbonding: - return Unbonding - - case v034staking.Bonded: - return Bonded - - default: - panic(fmt.Errorf("invalid bond status %d", oldStatus)) - } -} - -// Migrate accepts exported v0.38 x/staking genesis state and migrates it to -// v0.40 x/staking genesis state. The migration includes: -// -// - Convert addresses from bytes to bech32 strings. -// - Update BondStatus staking constants. -// - Re-encode in v0.40 GenesisState. -func Migrate(stakingState v038staking.GenesisState) *GenesisState { - newLastValidatorPowers := make([]LastValidatorPower, len(stakingState.LastValidatorPowers)) - for i, oldLastValidatorPower := range stakingState.LastValidatorPowers { - newLastValidatorPowers[i] = LastValidatorPower{ - Address: oldLastValidatorPower.Address.String(), - Power: oldLastValidatorPower.Power, - } - } - - newValidators := make([]Validator, len(stakingState.Validators)) - for i, oldValidator := range stakingState.Validators { - pkAny, err := codectypes.NewAnyWithValue(oldValidator.ConsPubKey) - if err != nil { - panic(fmt.Sprintf("Can't pack validator consensus PK as Any: %s", err)) - } - newValidators[i] = Validator{ - OperatorAddress: oldValidator.OperatorAddress.String(), - ConsensusPubkey: pkAny, - Jailed: oldValidator.Jailed, - Status: migrateBondStatus(oldValidator.Status), - Tokens: oldValidator.Tokens, - DelegatorShares: oldValidator.DelegatorShares, - Description: Description{ - Moniker: oldValidator.Description.Moniker, - Identity: oldValidator.Description.Identity, - Website: oldValidator.Description.Website, - SecurityContact: oldValidator.Description.SecurityContact, - Details: oldValidator.Description.Details, - }, - UnbondingHeight: oldValidator.UnbondingHeight, - UnbondingTime: oldValidator.UnbondingCompletionTime, - Commission: Commission{ - CommissionRates: CommissionRates{ - Rate: oldValidator.Commission.Rate, - MaxRate: oldValidator.Commission.MaxRate, - MaxChangeRate: oldValidator.Commission.MaxChangeRate, - }, - UpdateTime: oldValidator.Commission.UpdateTime, - }, - MinSelfDelegation: oldValidator.MinSelfDelegation, - } - } - - newDelegations := make([]Delegation, len(stakingState.Delegations)) - for i, oldDelegation := range stakingState.Delegations { - newDelegations[i] = Delegation{ - DelegatorAddress: oldDelegation.DelegatorAddress.String(), - ValidatorAddress: oldDelegation.ValidatorAddress.String(), - Shares: oldDelegation.Shares, - } - } - - newUnbondingDelegations := make([]UnbondingDelegation, len(stakingState.UnbondingDelegations)) - for i, oldUnbondingDelegation := range stakingState.UnbondingDelegations { - newEntries := make([]UnbondingDelegationEntry, len(oldUnbondingDelegation.Entries)) - for j, oldEntry := range oldUnbondingDelegation.Entries { - newEntries[j] = UnbondingDelegationEntry{ - CreationHeight: oldEntry.CreationHeight, - CompletionTime: oldEntry.CompletionTime, - InitialBalance: oldEntry.InitialBalance, - Balance: oldEntry.Balance, - } - } - - newUnbondingDelegations[i] = UnbondingDelegation{ - DelegatorAddress: oldUnbondingDelegation.DelegatorAddress.String(), - ValidatorAddress: oldUnbondingDelegation.ValidatorAddress.String(), - Entries: newEntries, - } - } - - newRedelegations := make([]Redelegation, len(stakingState.Redelegations)) - for i, oldRedelegation := range stakingState.Redelegations { - newEntries := make([]RedelegationEntry, len(oldRedelegation.Entries)) - for j, oldEntry := range oldRedelegation.Entries { - newEntries[j] = RedelegationEntry{ - CreationHeight: oldEntry.CreationHeight, - CompletionTime: oldEntry.CompletionTime, - InitialBalance: oldEntry.InitialBalance, - SharesDst: oldEntry.SharesDst, - } - } - - newRedelegations[i] = Redelegation{ - DelegatorAddress: oldRedelegation.DelegatorAddress.String(), - ValidatorSrcAddress: oldRedelegation.ValidatorSrcAddress.String(), - ValidatorDstAddress: oldRedelegation.ValidatorDstAddress.String(), - Entries: newEntries, - } - } - - return &GenesisState{ - Params: Params{ - UnbondingTime: stakingState.Params.UnbondingTime, - MaxValidators: uint32(stakingState.Params.MaxValidators), - MaxEntries: uint32(stakingState.Params.MaxEntries), - HistoricalEntries: uint32(stakingState.Params.HistoricalEntries), - BondDenom: stakingState.Params.BondDenom, - MinCommissionRate: v040staking.DefaultMinCommissionRate, - }, - LastTotalPower: stakingState.LastTotalPower, - LastValidatorPowers: newLastValidatorPowers, - Validators: newValidators, - Delegations: newDelegations, - UnbondingDelegations: newUnbondingDelegations, - Redelegations: newRedelegations, - Exported: stakingState.Exported, - } -} diff --git a/x/staking/legacy/v040/migrate_test.go b/x/staking/legacy/v040/migrate_test.go deleted file mode 100644 index 71da1a1ad55d..000000000000 --- a/x/staking/legacy/v040/migrate_test.go +++ /dev/null @@ -1,97 +0,0 @@ -package v040_test - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - "github.com/cosmos/cosmos-sdk/simapp" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034" - v038staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v038" - v040staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v040" -) - -func TestMigrate(t *testing.T) { - encodingConfig := simapp.MakeTestEncodingConfig() - clientCtx := client.Context{}. - WithInterfaceRegistry(encodingConfig.InterfaceRegistry). - WithTxConfig(encodingConfig.TxConfig). - WithLegacyAmino(encodingConfig.Amino). - WithJSONCodec(encodingConfig.Marshaler) - - consPubKey := ed25519.GenPrivKeyFromSecret([]byte("val0")).PubKey() - stakingGenState := v038staking.GenesisState{ - Validators: v038staking.Validators{v038staking.Validator{ - ConsPubKey: consPubKey, - Status: v034staking.Unbonded, - }}, - } - - migrated := v040staking.Migrate(stakingGenState) - - bz, err := clientCtx.Codec.MarshalJSON(migrated) - require.NoError(t, err) - - // Indent the JSON bz correctly. - var jsonObj map[string]interface{} - err = json.Unmarshal(bz, &jsonObj) - require.NoError(t, err) - indentedBz, err := json.MarshalIndent(jsonObj, "", " ") - require.NoError(t, err) - - // Make sure about: - // - consensus_pubkey: should be an any - // - validator's status should be 1 (new unbonded) - expected := `{ - "delegations": [], - "exported": false, - "last_total_power": "0", - "last_validator_powers": [], - "params": { - "bond_denom": "", - "historical_entries": 0, - "max_entries": 0, - "max_validators": 0, - "min_commission_rate": "0.000000000000000000", - "unbonding_time": "0s" - }, - "redelegations": [], - "unbonding_delegations": [], - "validators": [ - { - "commission": { - "commission_rates": { - "max_change_rate": "0", - "max_rate": "0", - "rate": "0" - }, - "update_time": "0001-01-01T00:00:00Z" - }, - "consensus_pubkey": { - "@type": "/cosmos.crypto.ed25519.PubKey", - "key": "KTeVrjP7NJIufvgMJsQRxZjfFyD+Exda6O7x+oxIvmA=" - }, - "delegator_shares": "0", - "description": { - "details": "", - "identity": "", - "moniker": "", - "security_contact": "", - "website": "" - }, - "jailed": false, - "min_self_delegation": "0", - "operator_address": "", - "status": "BOND_STATUS_UNBONDED", - "tokens": "0", - "unbonding_height": "0", - "unbonding_time": "0001-01-01T00:00:00Z" - } - ] -}` - - require.Equal(t, expected, string(indentedBz)) -} diff --git a/x/staking/legacy/v040/staking.pb.go b/x/staking/legacy/v040/staking.pb.go deleted file mode 100644 index 8b1ea9039ff6..000000000000 --- a/x/staking/legacy/v040/staking.pb.go +++ /dev/null @@ -1,6621 +0,0 @@ -// Package v040 is taken from: -// https://raw.githubusercontent.com/osmosis-labs/cosmos-sdk/v0.42.9-osmo-v2-upgrade/x/staking/types/staking.pb.go -// nolint -package v040 - -import ( - bytes "bytes" - compress_gzip "compress/gzip" - fmt "fmt" - io "io" - io_ioutil "io/ioutil" - math "math" - math_bits "math/bits" - reflect "reflect" - strings "strings" - time "time" - - types1 "github.com/cosmos/cosmos-sdk/codec/types" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types2 "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_protoc_gen_gogo_descriptor "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/regen-network/cosmos-proto" - types "github.com/tendermint/tendermint/proto/tendermint/types" - _ "google.golang.org/protobuf/types/known/durationpb" - _ "google.golang.org/protobuf/types/known/timestamppb" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf -var _ = 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 - -// BondStatus is the status of a validator. -type BondStatus int32 - -const ( - // UNSPECIFIED defines an invalid validator status. - Unspecified BondStatus = 0 - // UNBONDED defines a validator that is not bonded. - Unbonded BondStatus = 1 - // UNBONDING defines a validator that is unbonding. - Unbonding BondStatus = 2 - // BONDED defines a validator that is bonded. - Bonded BondStatus = 3 -) - -var BondStatus_name = map[int32]string{ - 0: "BOND_STATUS_UNSPECIFIED", - 1: "BOND_STATUS_UNBONDED", - 2: "BOND_STATUS_UNBONDING", - 3: "BOND_STATUS_BONDED", -} - -var BondStatus_value = map[string]int32{ - "BOND_STATUS_UNSPECIFIED": 0, - "BOND_STATUS_UNBONDED": 1, - "BOND_STATUS_UNBONDING": 2, - "BOND_STATUS_BONDED": 3, -} - -func (x BondStatus) String() string { - return proto.EnumName(BondStatus_name, int32(x)) -} - -func (BondStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{0} -} - -// 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). -type HistoricalInfo struct { - Header types.Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header"` - Valset []Validator `protobuf:"bytes,2,rep,name=valset,proto3" json:"valset"` -} - -func (m *HistoricalInfo) Reset() { *m = HistoricalInfo{} } -func (m *HistoricalInfo) String() string { return proto.CompactTextString(m) } -func (*HistoricalInfo) ProtoMessage() {} -func (*HistoricalInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{0} -} -func (m *HistoricalInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *HistoricalInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_HistoricalInfo.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 *HistoricalInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_HistoricalInfo.Merge(m, src) -} -func (m *HistoricalInfo) XXX_Size() int { - return m.Size() -} -func (m *HistoricalInfo) XXX_DiscardUnknown() { - xxx_messageInfo_HistoricalInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_HistoricalInfo proto.InternalMessageInfo - -func (m *HistoricalInfo) GetHeader() types.Header { - if m != nil { - return m.Header - } - return types.Header{} -} - -func (m *HistoricalInfo) GetValset() []Validator { - if m != nil { - return m.Valset - } - return nil -} - -// CommissionRates defines the initial commission rates to be used for creating -// a validator. -type CommissionRates struct { - // rate is the commission rate charged to delegators, as a fraction. - Rate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=rate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"rate"` - // max_rate defines the maximum commission rate which validator can ever charge, as a fraction. - MaxRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=max_rate,json=maxRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_rate" yaml:"max_rate"` - // max_change_rate defines the maximum daily increase of the validator commission, as a fraction. - MaxChangeRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=max_change_rate,json=maxChangeRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_change_rate" yaml:"max_change_rate"` -} - -func (m *CommissionRates) Reset() { *m = CommissionRates{} } -func (*CommissionRates) ProtoMessage() {} -func (*CommissionRates) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{1} -} -func (m *CommissionRates) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CommissionRates) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CommissionRates.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 *CommissionRates) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommissionRates.Merge(m, src) -} -func (m *CommissionRates) XXX_Size() int { - return m.Size() -} -func (m *CommissionRates) XXX_DiscardUnknown() { - xxx_messageInfo_CommissionRates.DiscardUnknown(m) -} - -var xxx_messageInfo_CommissionRates proto.InternalMessageInfo - -// Commission defines commission parameters for a given validator. -type Commission struct { - // commission_rates defines the initial commission rates to be used for creating a validator. - CommissionRates `protobuf:"bytes,1,opt,name=commission_rates,json=commissionRates,proto3,embedded=commission_rates" json:"commission_rates"` - // update_time is the last time the commission rate was changed. - UpdateTime time.Time `protobuf:"bytes,2,opt,name=update_time,json=updateTime,proto3,stdtime" json:"update_time" yaml:"update_time"` -} - -func (m *Commission) Reset() { *m = Commission{} } -func (*Commission) ProtoMessage() {} -func (*Commission) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{2} -} -func (m *Commission) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Commission) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Commission.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 *Commission) XXX_Merge(src proto.Message) { - xxx_messageInfo_Commission.Merge(m, src) -} -func (m *Commission) XXX_Size() int { - return m.Size() -} -func (m *Commission) XXX_DiscardUnknown() { - xxx_messageInfo_Commission.DiscardUnknown(m) -} - -var xxx_messageInfo_Commission proto.InternalMessageInfo - -func (m *Commission) GetUpdateTime() time.Time { - if m != nil { - return m.UpdateTime - } - return time.Time{} -} - -// Description defines a validator description. -type Description struct { - // moniker defines a human-readable name for the validator. - Moniker string `protobuf:"bytes,1,opt,name=moniker,proto3" json:"moniker,omitempty"` - // identity defines an optional identity signature (ex. UPort or Keybase). - Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` - // website defines an optional website link. - Website string `protobuf:"bytes,3,opt,name=website,proto3" json:"website,omitempty"` - // security_contact defines an optional email for security contact. - SecurityContact string `protobuf:"bytes,4,opt,name=security_contact,json=securityContact,proto3" json:"security_contact,omitempty" yaml:"security_contact"` - // details define other optional details. - Details string `protobuf:"bytes,5,opt,name=details,proto3" json:"details,omitempty"` -} - -func (m *Description) Reset() { *m = Description{} } -func (*Description) ProtoMessage() {} -func (*Description) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{3} -} -func (m *Description) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Description) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Description.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 *Description) XXX_Merge(src proto.Message) { - xxx_messageInfo_Description.Merge(m, src) -} -func (m *Description) XXX_Size() int { - return m.Size() -} -func (m *Description) XXX_DiscardUnknown() { - xxx_messageInfo_Description.DiscardUnknown(m) -} - -var xxx_messageInfo_Description proto.InternalMessageInfo - -func (m *Description) GetMoniker() string { - if m != nil { - return m.Moniker - } - return "" -} - -func (m *Description) GetIdentity() string { - if m != nil { - return m.Identity - } - return "" -} - -func (m *Description) GetWebsite() string { - if m != nil { - return m.Website - } - return "" -} - -func (m *Description) GetSecurityContact() string { - if m != nil { - return m.SecurityContact - } - return "" -} - -func (m *Description) GetDetails() string { - if m != nil { - return m.Details - } - return "" -} - -// 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. -type Validator struct { - // operator_address defines the address of the validator's operator; bech encoded in JSON. - OperatorAddress string `protobuf:"bytes,1,opt,name=operator_address,json=operatorAddress,proto3" json:"operator_address,omitempty" yaml:"operator_address"` - // consensus_pubkey is the consensus public key of the validator, as a Protobuf Any. - ConsensusPubkey *types1.Any `protobuf:"bytes,2,opt,name=consensus_pubkey,json=consensusPubkey,proto3" json:"consensus_pubkey,omitempty" yaml:"consensus_pubkey"` - // jailed defined whether the validator has been jailed from bonded status or not. - Jailed bool `protobuf:"varint,3,opt,name=jailed,proto3" json:"jailed,omitempty"` - // status is the validator status (bonded/unbonding/unbonded). - Status BondStatus `protobuf:"varint,4,opt,name=status,proto3,enum=cosmos.staking.v1beta1.BondStatus" json:"status,omitempty"` - // tokens define the delegated tokens (incl. self-delegation). - Tokens github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,5,opt,name=tokens,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"tokens"` - // delegator_shares defines total shares issued to a validator's delegators. - DelegatorShares github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=delegator_shares,json=delegatorShares,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"delegator_shares" yaml:"delegator_shares"` - // description defines the description terms for the validator. - Description Description `protobuf:"bytes,7,opt,name=description,proto3" json:"description"` - // unbonding_height defines, if unbonding, the height at which this validator has begun unbonding. - UnbondingHeight int64 `protobuf:"varint,8,opt,name=unbonding_height,json=unbondingHeight,proto3" json:"unbonding_height,omitempty" yaml:"unbonding_height"` - // unbonding_time defines, if unbonding, the min time for the validator to complete unbonding. - UnbondingTime time.Time `protobuf:"bytes,9,opt,name=unbonding_time,json=unbondingTime,proto3,stdtime" json:"unbonding_time" yaml:"unbonding_time"` - // commission defines the commission parameters. - Commission Commission `protobuf:"bytes,10,opt,name=commission,proto3" json:"commission"` - // min_self_delegation is the validator's self declared minimum self delegation. - MinSelfDelegation github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,11,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation" yaml:"min_self_delegation"` -} - -func (m *Validator) Reset() { *m = Validator{} } -func (*Validator) ProtoMessage() {} -func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{4} -} -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 - -// ValAddresses defines a repeated set of validator addresses. -type ValAddresses struct { - Addresses []string `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` -} - -func (m *ValAddresses) Reset() { *m = ValAddresses{} } -func (*ValAddresses) ProtoMessage() {} -func (*ValAddresses) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{5} -} -func (m *ValAddresses) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ValAddresses) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ValAddresses.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 *ValAddresses) XXX_Merge(src proto.Message) { - xxx_messageInfo_ValAddresses.Merge(m, src) -} -func (m *ValAddresses) XXX_Size() int { - return m.Size() -} -func (m *ValAddresses) XXX_DiscardUnknown() { - xxx_messageInfo_ValAddresses.DiscardUnknown(m) -} - -var xxx_messageInfo_ValAddresses proto.InternalMessageInfo - -func (m *ValAddresses) GetAddresses() []string { - if m != nil { - return m.Addresses - } - return nil -} - -// 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. -type DVPair struct { - DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` -} - -func (m *DVPair) Reset() { *m = DVPair{} } -func (*DVPair) ProtoMessage() {} -func (*DVPair) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{6} -} -func (m *DVPair) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DVPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DVPair.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 *DVPair) XXX_Merge(src proto.Message) { - xxx_messageInfo_DVPair.Merge(m, src) -} -func (m *DVPair) XXX_Size() int { - return m.Size() -} -func (m *DVPair) XXX_DiscardUnknown() { - xxx_messageInfo_DVPair.DiscardUnknown(m) -} - -var xxx_messageInfo_DVPair proto.InternalMessageInfo - -// DVPairs defines an array of DVPair objects. -type DVPairs struct { - Pairs []DVPair `protobuf:"bytes,1,rep,name=pairs,proto3" json:"pairs"` -} - -func (m *DVPairs) Reset() { *m = DVPairs{} } -func (m *DVPairs) String() string { return proto.CompactTextString(m) } -func (*DVPairs) ProtoMessage() {} -func (*DVPairs) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{7} -} -func (m *DVPairs) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DVPairs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DVPairs.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 *DVPairs) XXX_Merge(src proto.Message) { - xxx_messageInfo_DVPairs.Merge(m, src) -} -func (m *DVPairs) XXX_Size() int { - return m.Size() -} -func (m *DVPairs) XXX_DiscardUnknown() { - xxx_messageInfo_DVPairs.DiscardUnknown(m) -} - -var xxx_messageInfo_DVPairs proto.InternalMessageInfo - -func (m *DVPairs) GetPairs() []DVPair { - if m != nil { - return m.Pairs - } - return nil -} - -// 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. -type DVVTriplet struct { - DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - ValidatorSrcAddress string `protobuf:"bytes,2,opt,name=validator_src_address,json=validatorSrcAddress,proto3" json:"validator_src_address,omitempty" yaml:"validator_src_address"` - ValidatorDstAddress string `protobuf:"bytes,3,opt,name=validator_dst_address,json=validatorDstAddress,proto3" json:"validator_dst_address,omitempty" yaml:"validator_dst_address"` -} - -func (m *DVVTriplet) Reset() { *m = DVVTriplet{} } -func (*DVVTriplet) ProtoMessage() {} -func (*DVVTriplet) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{8} -} -func (m *DVVTriplet) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DVVTriplet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DVVTriplet.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 *DVVTriplet) XXX_Merge(src proto.Message) { - xxx_messageInfo_DVVTriplet.Merge(m, src) -} -func (m *DVVTriplet) XXX_Size() int { - return m.Size() -} -func (m *DVVTriplet) XXX_DiscardUnknown() { - xxx_messageInfo_DVVTriplet.DiscardUnknown(m) -} - -var xxx_messageInfo_DVVTriplet proto.InternalMessageInfo - -// DVVTriplets defines an array of DVVTriplet objects. -type DVVTriplets struct { - Triplets []DVVTriplet `protobuf:"bytes,1,rep,name=triplets,proto3" json:"triplets"` -} - -func (m *DVVTriplets) Reset() { *m = DVVTriplets{} } -func (m *DVVTriplets) String() string { return proto.CompactTextString(m) } -func (*DVVTriplets) ProtoMessage() {} -func (*DVVTriplets) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{9} -} -func (m *DVVTriplets) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DVVTriplets) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DVVTriplets.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 *DVVTriplets) XXX_Merge(src proto.Message) { - xxx_messageInfo_DVVTriplets.Merge(m, src) -} -func (m *DVVTriplets) XXX_Size() int { - return m.Size() -} -func (m *DVVTriplets) XXX_DiscardUnknown() { - xxx_messageInfo_DVVTriplets.DiscardUnknown(m) -} - -var xxx_messageInfo_DVVTriplets proto.InternalMessageInfo - -func (m *DVVTriplets) GetTriplets() []DVVTriplet { - if m != nil { - return m.Triplets - } - return nil -} - -// 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. -type Delegation struct { - // delegator_address is the bech32-encoded address of the delegator. - DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - // validator_address is the bech32-encoded address of the validator. - ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` - // shares define the delegation shares received. - Shares github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=shares,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares"` -} - -func (m *Delegation) Reset() { *m = Delegation{} } -func (*Delegation) ProtoMessage() {} -func (*Delegation) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{10} -} -func (m *Delegation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Delegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Delegation.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 *Delegation) XXX_Merge(src proto.Message) { - xxx_messageInfo_Delegation.Merge(m, src) -} -func (m *Delegation) XXX_Size() int { - return m.Size() -} -func (m *Delegation) XXX_DiscardUnknown() { - xxx_messageInfo_Delegation.DiscardUnknown(m) -} - -var xxx_messageInfo_Delegation proto.InternalMessageInfo - -// UnbondingDelegation stores all of a single delegator's unbonding bonds -// for a single validator in an time-ordered list. -type UnbondingDelegation struct { - // delegator_address is the bech32-encoded address of the delegator. - DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - // validator_address is the bech32-encoded address of the validator. - ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` - // entries are the unbonding delegation entries. - Entries []UnbondingDelegationEntry `protobuf:"bytes,3,rep,name=entries,proto3" json:"entries"` -} - -func (m *UnbondingDelegation) Reset() { *m = UnbondingDelegation{} } -func (*UnbondingDelegation) ProtoMessage() {} -func (*UnbondingDelegation) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{11} -} -func (m *UnbondingDelegation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *UnbondingDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_UnbondingDelegation.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 *UnbondingDelegation) XXX_Merge(src proto.Message) { - xxx_messageInfo_UnbondingDelegation.Merge(m, src) -} -func (m *UnbondingDelegation) XXX_Size() int { - return m.Size() -} -func (m *UnbondingDelegation) XXX_DiscardUnknown() { - xxx_messageInfo_UnbondingDelegation.DiscardUnknown(m) -} - -var xxx_messageInfo_UnbondingDelegation proto.InternalMessageInfo - -// UnbondingDelegationEntry defines an unbonding object with relevant metadata. -type UnbondingDelegationEntry struct { - // creation_height is the height which the unbonding took place. - CreationHeight int64 `protobuf:"varint,1,opt,name=creation_height,json=creationHeight,proto3" json:"creation_height,omitempty" yaml:"creation_height"` - // completion_time is the unix time for unbonding completion. - CompletionTime time.Time `protobuf:"bytes,2,opt,name=completion_time,json=completionTime,proto3,stdtime" json:"completion_time" yaml:"completion_time"` - // initial_balance defines the tokens initially scheduled to receive at completion. - InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance" yaml:"initial_balance"` - // balance defines the tokens to receive at completion. - Balance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"balance"` -} - -func (m *UnbondingDelegationEntry) Reset() { *m = UnbondingDelegationEntry{} } -func (*UnbondingDelegationEntry) ProtoMessage() {} -func (*UnbondingDelegationEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{12} -} -func (m *UnbondingDelegationEntry) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *UnbondingDelegationEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_UnbondingDelegationEntry.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 *UnbondingDelegationEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_UnbondingDelegationEntry.Merge(m, src) -} -func (m *UnbondingDelegationEntry) XXX_Size() int { - return m.Size() -} -func (m *UnbondingDelegationEntry) XXX_DiscardUnknown() { - xxx_messageInfo_UnbondingDelegationEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_UnbondingDelegationEntry proto.InternalMessageInfo - -func (m *UnbondingDelegationEntry) GetCreationHeight() int64 { - if m != nil { - return m.CreationHeight - } - return 0 -} - -func (m *UnbondingDelegationEntry) GetCompletionTime() time.Time { - if m != nil { - return m.CompletionTime - } - return time.Time{} -} - -// RedelegationEntry defines a redelegation object with relevant metadata. -type RedelegationEntry struct { - // creation_height defines the height which the redelegation took place. - CreationHeight int64 `protobuf:"varint,1,opt,name=creation_height,json=creationHeight,proto3" json:"creation_height,omitempty" yaml:"creation_height"` - // completion_time defines the unix time for redelegation completion. - CompletionTime time.Time `protobuf:"bytes,2,opt,name=completion_time,json=completionTime,proto3,stdtime" json:"completion_time" yaml:"completion_time"` - // initial_balance defines the initial balance when redelegation started. - InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance" yaml:"initial_balance"` - // shares_dst is the amount of destination-validator shares created by redelegation. - SharesDst github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=shares_dst,json=sharesDst,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares_dst"` -} - -func (m *RedelegationEntry) Reset() { *m = RedelegationEntry{} } -func (*RedelegationEntry) ProtoMessage() {} -func (*RedelegationEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{13} -} -func (m *RedelegationEntry) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RedelegationEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RedelegationEntry.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 *RedelegationEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_RedelegationEntry.Merge(m, src) -} -func (m *RedelegationEntry) XXX_Size() int { - return m.Size() -} -func (m *RedelegationEntry) XXX_DiscardUnknown() { - xxx_messageInfo_RedelegationEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_RedelegationEntry proto.InternalMessageInfo - -func (m *RedelegationEntry) GetCreationHeight() int64 { - if m != nil { - return m.CreationHeight - } - return 0 -} - -func (m *RedelegationEntry) GetCompletionTime() time.Time { - if m != nil { - return m.CompletionTime - } - return time.Time{} -} - -// Redelegation contains the list of a particular delegator's redelegating bonds -// from a particular source validator to a particular destination validator. -type Redelegation struct { - // delegator_address is the bech32-encoded address of the delegator. - DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - // validator_src_address is the validator redelegation source operator address. - ValidatorSrcAddress string `protobuf:"bytes,2,opt,name=validator_src_address,json=validatorSrcAddress,proto3" json:"validator_src_address,omitempty" yaml:"validator_src_address"` - // validator_dst_address is the validator redelegation destination operator address. - ValidatorDstAddress string `protobuf:"bytes,3,opt,name=validator_dst_address,json=validatorDstAddress,proto3" json:"validator_dst_address,omitempty" yaml:"validator_dst_address"` - // entries are the redelegation entries. - Entries []RedelegationEntry `protobuf:"bytes,4,rep,name=entries,proto3" json:"entries"` -} - -func (m *Redelegation) Reset() { *m = Redelegation{} } -func (*Redelegation) ProtoMessage() {} -func (*Redelegation) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{14} -} -func (m *Redelegation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Redelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Redelegation.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 *Redelegation) XXX_Merge(src proto.Message) { - xxx_messageInfo_Redelegation.Merge(m, src) -} -func (m *Redelegation) XXX_Size() int { - return m.Size() -} -func (m *Redelegation) XXX_DiscardUnknown() { - xxx_messageInfo_Redelegation.DiscardUnknown(m) -} - -var xxx_messageInfo_Redelegation proto.InternalMessageInfo - -// Params defines the parameters for the staking module. -type Params struct { - // unbonding_time is the time duration of unbonding. - UnbondingTime time.Duration `protobuf:"bytes,1,opt,name=unbonding_time,json=unbondingTime,proto3,stdduration" json:"unbonding_time" yaml:"unbonding_time"` - // max_validators is the maximum number of validators. - MaxValidators uint32 `protobuf:"varint,2,opt,name=max_validators,json=maxValidators,proto3" json:"max_validators,omitempty" yaml:"max_validators"` - // max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio). - MaxEntries uint32 `protobuf:"varint,3,opt,name=max_entries,json=maxEntries,proto3" json:"max_entries,omitempty" yaml:"max_entries"` - // historical_entries is the number of historical entries to persist. - HistoricalEntries uint32 `protobuf:"varint,4,opt,name=historical_entries,json=historicalEntries,proto3" json:"historical_entries,omitempty" yaml:"historical_entries"` - // bond_denom defines the bondable coin denomination. - BondDenom string `protobuf:"bytes,5,opt,name=bond_denom,json=bondDenom,proto3" json:"bond_denom,omitempty" yaml:"bond_denom"` - // min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators - MinCommissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=min_commission_rate,json=minCommissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"min_commission_rate" yaml:"min_commission_rate"` -} - -func (m *Params) Reset() { *m = Params{} } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{15} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.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 *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func (m *Params) GetUnbondingTime() time.Duration { - if m != nil { - return m.UnbondingTime - } - return 0 -} - -func (m *Params) GetMaxValidators() uint32 { - if m != nil { - return m.MaxValidators - } - return 0 -} - -func (m *Params) GetMaxEntries() uint32 { - if m != nil { - return m.MaxEntries - } - return 0 -} - -func (m *Params) GetHistoricalEntries() uint32 { - if m != nil { - return m.HistoricalEntries - } - return 0 -} - -func (m *Params) GetBondDenom() string { - if m != nil { - return m.BondDenom - } - return "" -} - -// DelegationResponse is equivalent to Delegation except that it contains a -// balance in addition to shares which is more suitable for client responses. -type DelegationResponse struct { - Delegation Delegation `protobuf:"bytes,1,opt,name=delegation,proto3" json:"delegation"` - Balance types2.Coin `protobuf:"bytes,2,opt,name=balance,proto3" json:"balance"` -} - -func (m *DelegationResponse) Reset() { *m = DelegationResponse{} } -func (*DelegationResponse) ProtoMessage() {} -func (*DelegationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{16} -} -func (m *DelegationResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DelegationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DelegationResponse.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 *DelegationResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DelegationResponse.Merge(m, src) -} -func (m *DelegationResponse) XXX_Size() int { - return m.Size() -} -func (m *DelegationResponse) XXX_DiscardUnknown() { - xxx_messageInfo_DelegationResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_DelegationResponse proto.InternalMessageInfo - -func (m *DelegationResponse) GetDelegation() Delegation { - if m != nil { - return m.Delegation - } - return Delegation{} -} - -func (m *DelegationResponse) GetBalance() types2.Coin { - if m != nil { - return m.Balance - } - return types2.Coin{} -} - -// RedelegationEntryResponse is equivalent to a RedelegationEntry except that it -// contains a balance in addition to shares which is more suitable for client -// responses. -type RedelegationEntryResponse struct { - RedelegationEntry RedelegationEntry `protobuf:"bytes,1,opt,name=redelegation_entry,json=redelegationEntry,proto3" json:"redelegation_entry"` - Balance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"balance"` -} - -func (m *RedelegationEntryResponse) Reset() { *m = RedelegationEntryResponse{} } -func (m *RedelegationEntryResponse) String() string { return proto.CompactTextString(m) } -func (*RedelegationEntryResponse) ProtoMessage() {} -func (*RedelegationEntryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{17} -} -func (m *RedelegationEntryResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RedelegationEntryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RedelegationEntryResponse.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 *RedelegationEntryResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_RedelegationEntryResponse.Merge(m, src) -} -func (m *RedelegationEntryResponse) XXX_Size() int { - return m.Size() -} -func (m *RedelegationEntryResponse) XXX_DiscardUnknown() { - xxx_messageInfo_RedelegationEntryResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_RedelegationEntryResponse proto.InternalMessageInfo - -func (m *RedelegationEntryResponse) GetRedelegationEntry() RedelegationEntry { - if m != nil { - return m.RedelegationEntry - } - return RedelegationEntry{} -} - -// RedelegationResponse is equivalent to a Redelegation except that its entries -// contain a balance in addition to shares which is more suitable for client -// responses. -type RedelegationResponse struct { - Redelegation Redelegation `protobuf:"bytes,1,opt,name=redelegation,proto3" json:"redelegation"` - Entries []RedelegationEntryResponse `protobuf:"bytes,2,rep,name=entries,proto3" json:"entries"` -} - -func (m *RedelegationResponse) Reset() { *m = RedelegationResponse{} } -func (m *RedelegationResponse) String() string { return proto.CompactTextString(m) } -func (*RedelegationResponse) ProtoMessage() {} -func (*RedelegationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{18} -} -func (m *RedelegationResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RedelegationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RedelegationResponse.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 *RedelegationResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_RedelegationResponse.Merge(m, src) -} -func (m *RedelegationResponse) XXX_Size() int { - return m.Size() -} -func (m *RedelegationResponse) XXX_DiscardUnknown() { - xxx_messageInfo_RedelegationResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_RedelegationResponse proto.InternalMessageInfo - -func (m *RedelegationResponse) GetRedelegation() Redelegation { - if m != nil { - return m.Redelegation - } - return Redelegation{} -} - -func (m *RedelegationResponse) GetEntries() []RedelegationEntryResponse { - if m != nil { - return m.Entries - } - return nil -} - -// Pool is used for tracking bonded and not-bonded token supply of the bond -// denomination. -type Pool struct { - NotBondedTokens github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=not_bonded_tokens,json=notBondedTokens,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"not_bonded_tokens"` - BondedTokens github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=bonded_tokens,json=bondedTokens,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"bonded_tokens" yaml:"bonded_tokens"` -} - -func (m *Pool) Reset() { *m = Pool{} } -func (m *Pool) String() string { return proto.CompactTextString(m) } -func (*Pool) ProtoMessage() {} -func (*Pool) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{19} -} -func (m *Pool) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Pool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Pool.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 *Pool) XXX_Merge(src proto.Message) { - xxx_messageInfo_Pool.Merge(m, src) -} -func (m *Pool) XXX_Size() int { - return m.Size() -} -func (m *Pool) XXX_DiscardUnknown() { - xxx_messageInfo_Pool.DiscardUnknown(m) -} - -var xxx_messageInfo_Pool proto.InternalMessageInfo - -func init() { - // proto.RegisterEnum("cosmos.staking.v1beta1.BondStatus", BondStatus_name, BondStatus_value) - // proto.RegisterType((*HistoricalInfo)(nil), "cosmos.staking.v1beta1.HistoricalInfo") - // proto.RegisterType((*CommissionRates)(nil), "cosmos.staking.v1beta1.CommissionRates") - // proto.RegisterType((*Commission)(nil), "cosmos.staking.v1beta1.Commission") - // proto.RegisterType((*Description)(nil), "cosmos.staking.v1beta1.Description") - // proto.RegisterType((*Validator)(nil), "cosmos.staking.v1beta1.Validator") - // proto.RegisterType((*ValAddresses)(nil), "cosmos.staking.v1beta1.ValAddresses") - // proto.RegisterType((*DVPair)(nil), "cosmos.staking.v1beta1.DVPair") - // proto.RegisterType((*DVPairs)(nil), "cosmos.staking.v1beta1.DVPairs") - // proto.RegisterType((*DVVTriplet)(nil), "cosmos.staking.v1beta1.DVVTriplet") - // proto.RegisterType((*DVVTriplets)(nil), "cosmos.staking.v1beta1.DVVTriplets") - // proto.RegisterType((*Delegation)(nil), "cosmos.staking.v1beta1.Delegation") - // proto.RegisterType((*UnbondingDelegation)(nil), "cosmos.staking.v1beta1.UnbondingDelegation") - // proto.RegisterType((*UnbondingDelegationEntry)(nil), "cosmos.staking.v1beta1.UnbondingDelegationEntry") - // proto.RegisterType((*RedelegationEntry)(nil), "cosmos.staking.v1beta1.RedelegationEntry") - // proto.RegisterType((*Redelegation)(nil), "cosmos.staking.v1beta1.Redelegation") - // proto.RegisterType((*Params)(nil), "cosmos.staking.v1beta1.Params") - // proto.RegisterType((*DelegationResponse)(nil), "cosmos.staking.v1beta1.DelegationResponse") - // proto.RegisterType((*RedelegationEntryResponse)(nil), "cosmos.staking.v1beta1.RedelegationEntryResponse") - // proto.RegisterType((*RedelegationResponse)(nil), "cosmos.staking.v1beta1.RedelegationResponse") - // proto.RegisterType((*Pool)(nil), "cosmos.staking.v1beta1.Pool") -} - -func init() { - proto.RegisterFile("cosmos/staking/v1beta1/staking.proto", fileDescriptor_64c30c6cf92913c9) -} - -var fileDescriptor_64c30c6cf92913c9 = []byte{ - // 1820 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x23, 0x49, - 0x15, 0x76, 0xc7, 0x5e, 0xc7, 0x7e, 0x4e, 0xe2, 0xa4, 0x26, 0x33, 0xeb, 0x98, 0xc1, 0xed, 0x6d, - 0x56, 0x4b, 0x40, 0xbb, 0x0e, 0x93, 0x45, 0x8b, 0xc8, 0x05, 0xc6, 0x71, 0x86, 0x58, 0x3b, 0x0c, - 0xa1, 0x93, 0x09, 0x12, 0xac, 0xb0, 0xca, 0xdd, 0x15, 0xa7, 0x89, 0xbb, 0xdb, 0x74, 0x95, 0x87, - 0x58, 0xda, 0x03, 0xc7, 0x65, 0x10, 0x62, 0xb9, 0xed, 0x65, 0xa4, 0x91, 0xf6, 0xba, 0x12, 0x17, - 0xc4, 0x95, 0xeb, 0x02, 0x97, 0xe1, 0x86, 0x10, 0x32, 0x68, 0xe6, 0x82, 0x38, 0x21, 0x8b, 0x03, - 0x37, 0x50, 0xfd, 0xf4, 0x4f, 0xda, 0xf1, 0xcc, 0x78, 0xb4, 0x87, 0x95, 0xd8, 0x4b, 0xe2, 0x7a, - 0xf5, 0xde, 0xf7, 0xea, 0xfd, 0xd6, 0xab, 0x86, 0x57, 0x2d, 0x9f, 0xba, 0x3e, 0xdd, 0xa2, 0x0c, - 0x9f, 0x39, 0x5e, 0x6f, 0xeb, 0xde, 0x8d, 0x2e, 0x61, 0xf8, 0x46, 0xb8, 0x6e, 0x0c, 0x02, 0x9f, - 0xf9, 0xe8, 0x9a, 0xe4, 0x6a, 0x84, 0x54, 0xc5, 0x55, 0x5d, 0xef, 0xf9, 0x3d, 0x5f, 0xb0, 0x6c, - 0xf1, 0x5f, 0x92, 0xbb, 0xba, 0xd1, 0xf3, 0xfd, 0x5e, 0x9f, 0x6c, 0x89, 0x55, 0x77, 0x78, 0xb2, - 0x85, 0xbd, 0x91, 0xda, 0xaa, 0xa5, 0xb7, 0xec, 0x61, 0x80, 0x99, 0xe3, 0x7b, 0x6a, 0x5f, 0x4f, - 0xef, 0x33, 0xc7, 0x25, 0x94, 0x61, 0x77, 0x10, 0x62, 0xcb, 0x93, 0x74, 0xa4, 0x52, 0x75, 0x2c, - 0x85, 0xad, 0x4c, 0xe9, 0x62, 0x4a, 0x22, 0x3b, 0x2c, 0xdf, 0x09, 0xb1, 0xaf, 0x33, 0xe2, 0xd9, - 0x24, 0x70, 0x1d, 0x8f, 0x6d, 0xb1, 0xd1, 0x80, 0x50, 0xf9, 0x57, 0xee, 0x1a, 0x3f, 0xd3, 0x60, - 0x65, 0xdf, 0xa1, 0xcc, 0x0f, 0x1c, 0x0b, 0xf7, 0xdb, 0xde, 0x89, 0x8f, 0xde, 0x82, 0xfc, 0x29, - 0xc1, 0x36, 0x09, 0x2a, 0x5a, 0x5d, 0xdb, 0x2c, 0x6d, 0x57, 0x1a, 0x31, 0x42, 0x43, 0xca, 0xee, - 0x8b, 0xfd, 0x66, 0xee, 0xe3, 0xb1, 0x9e, 0x31, 0x15, 0x37, 0xfa, 0x06, 0xe4, 0xef, 0xe1, 0x3e, - 0x25, 0xac, 0xb2, 0x50, 0xcf, 0x6e, 0x96, 0xb6, 0x5f, 0x69, 0x5c, 0xee, 0xbe, 0xc6, 0x31, 0xee, - 0x3b, 0x36, 0x66, 0x7e, 0x04, 0x20, 0xc5, 0x8c, 0x5f, 0x2f, 0x40, 0x79, 0xd7, 0x77, 0x5d, 0x87, - 0x52, 0xc7, 0xf7, 0x4c, 0xcc, 0x08, 0x45, 0x4d, 0xc8, 0x05, 0x98, 0x11, 0x71, 0x94, 0x62, 0xb3, - 0xc1, 0xf9, 0xff, 0x32, 0xd6, 0x5f, 0xeb, 0x39, 0xec, 0x74, 0xd8, 0x6d, 0x58, 0xbe, 0xab, 0x9c, - 0xa1, 0xfe, 0xbd, 0x41, 0xed, 0x33, 0x65, 0x5f, 0x8b, 0x58, 0xa6, 0x90, 0x45, 0xef, 0x40, 0xc1, - 0xc5, 0xe7, 0x1d, 0x81, 0xb3, 0x20, 0x70, 0x6e, 0xce, 0x87, 0x33, 0x19, 0xeb, 0xe5, 0x11, 0x76, - 0xfb, 0x3b, 0x46, 0x88, 0x63, 0x98, 0x8b, 0x2e, 0x3e, 0xe7, 0x47, 0x44, 0x03, 0x28, 0x73, 0xaa, - 0x75, 0x8a, 0xbd, 0x1e, 0x91, 0x4a, 0xb2, 0x42, 0xc9, 0xfe, 0xdc, 0x4a, 0xae, 0xc5, 0x4a, 0x12, - 0x70, 0x86, 0xb9, 0xec, 0xe2, 0xf3, 0x5d, 0x41, 0xe0, 0x1a, 0x77, 0x0a, 0x1f, 0x3c, 0xd4, 0x33, - 0xff, 0x78, 0xa8, 0x6b, 0xc6, 0x9f, 0x34, 0x80, 0xd8, 0x63, 0xe8, 0x1d, 0x58, 0xb5, 0xa2, 0x95, - 0x90, 0xa5, 0x2a, 0x86, 0x5f, 0x9c, 0x15, 0x8b, 0x94, 0xbf, 0x9b, 0x05, 0x7e, 0xe8, 0x47, 0x63, - 0x5d, 0x33, 0xcb, 0x56, 0x2a, 0x14, 0x3f, 0x80, 0xd2, 0x70, 0x60, 0x63, 0x46, 0x3a, 0x3c, 0x3b, - 0x85, 0x27, 0x4b, 0xdb, 0xd5, 0x86, 0x4c, 0xdd, 0x46, 0x98, 0xba, 0x8d, 0xa3, 0x30, 0x75, 0x9b, - 0x35, 0x8e, 0x35, 0x19, 0xeb, 0x48, 0x9a, 0x95, 0x10, 0x36, 0xde, 0xff, 0x9b, 0xae, 0x99, 0x20, - 0x29, 0x5c, 0x20, 0x61, 0xd3, 0xef, 0x35, 0x28, 0xb5, 0x08, 0xb5, 0x02, 0x67, 0xc0, 0x2b, 0x04, - 0x55, 0x60, 0xd1, 0xf5, 0x3d, 0xe7, 0x4c, 0xe5, 0x63, 0xd1, 0x0c, 0x97, 0xa8, 0x0a, 0x05, 0xc7, - 0x26, 0x1e, 0x73, 0xd8, 0x48, 0xc6, 0xd5, 0x8c, 0xd6, 0x5c, 0xea, 0x27, 0xa4, 0x4b, 0x9d, 0x30, - 0x1a, 0x66, 0xb8, 0x44, 0xb7, 0x60, 0x95, 0x12, 0x6b, 0x18, 0x38, 0x6c, 0xd4, 0xb1, 0x7c, 0x8f, - 0x61, 0x8b, 0x55, 0x72, 0x22, 0x60, 0x9f, 0x9b, 0x8c, 0xf5, 0x97, 0xe5, 0x59, 0xd3, 0x1c, 0x86, - 0x59, 0x0e, 0x49, 0xbb, 0x92, 0xc2, 0x35, 0xd8, 0x84, 0x61, 0xa7, 0x4f, 0x2b, 0x2f, 0x49, 0x0d, - 0x6a, 0x99, 0xb0, 0xe5, 0xa3, 0x45, 0x28, 0x46, 0xd9, 0xce, 0x35, 0xfb, 0x03, 0x12, 0xf0, 0xdf, - 0x1d, 0x6c, 0xdb, 0x01, 0xa1, 0x54, 0xe5, 0x75, 0x42, 0x73, 0x9a, 0xc3, 0x30, 0xcb, 0x21, 0xe9, - 0xa6, 0xa4, 0x20, 0xc6, 0xc3, 0xec, 0x51, 0xe2, 0xd1, 0x21, 0xed, 0x0c, 0x86, 0xdd, 0x33, 0x32, - 0x52, 0xd1, 0x58, 0x9f, 0x8a, 0xc6, 0x4d, 0x6f, 0xd4, 0x7c, 0x33, 0x46, 0x4f, 0xcb, 0x19, 0x7f, - 0xf8, 0xcd, 0x1b, 0xeb, 0x2a, 0x35, 0xac, 0x60, 0x34, 0x60, 0x7e, 0xe3, 0x60, 0xd8, 0x7d, 0x9b, - 0x8c, 0x78, 0xf8, 0x15, 0xeb, 0x81, 0xe0, 0x44, 0xd7, 0x20, 0xff, 0x23, 0xec, 0xf4, 0x89, 0x2d, - 0x1c, 0x5a, 0x30, 0xd5, 0x0a, 0xed, 0x40, 0x9e, 0x32, 0xcc, 0x86, 0x54, 0x78, 0x71, 0x65, 0xdb, - 0x98, 0x95, 0x6a, 0x4d, 0xdf, 0xb3, 0x0f, 0x05, 0xa7, 0xa9, 0x24, 0xd0, 0x2d, 0xc8, 0x33, 0xff, - 0x8c, 0x78, 0xca, 0x85, 0x73, 0xd5, 0x77, 0xdb, 0x63, 0xa6, 0x92, 0xe6, 0x1e, 0xb1, 0x49, 0x9f, - 0xf4, 0x84, 0xe3, 0xe8, 0x29, 0x0e, 0x08, 0xad, 0xe4, 0x05, 0x62, 0x7b, 0xee, 0x22, 0x54, 0x9e, - 0x4a, 0xe3, 0x19, 0x66, 0x39, 0x22, 0x1d, 0x0a, 0x0a, 0x7a, 0x1b, 0x4a, 0x76, 0x9c, 0xa8, 0x95, - 0x45, 0x11, 0x82, 0x2f, 0xcc, 0x32, 0x3f, 0x91, 0xd3, 0xaa, 0xef, 0x25, 0xa5, 0x79, 0x72, 0x0c, - 0xbd, 0xae, 0xef, 0xd9, 0x8e, 0xd7, 0xeb, 0x9c, 0x12, 0xa7, 0x77, 0xca, 0x2a, 0x85, 0xba, 0xb6, - 0x99, 0x4d, 0x26, 0x47, 0x9a, 0xc3, 0x30, 0xcb, 0x11, 0x69, 0x5f, 0x50, 0x90, 0x0d, 0x2b, 0x31, - 0x97, 0x28, 0xd4, 0xe2, 0x33, 0x0b, 0xf5, 0x15, 0x55, 0xa8, 0x57, 0xd3, 0x5a, 0xe2, 0x5a, 0x5d, - 0x8e, 0x88, 0x5c, 0x0c, 0xed, 0x03, 0xc4, 0xed, 0xa1, 0x02, 0x42, 0x83, 0xf1, 0xec, 0x1e, 0xa3, - 0x0c, 0x4f, 0xc8, 0xa2, 0x77, 0xe1, 0x8a, 0xeb, 0x78, 0x1d, 0x4a, 0xfa, 0x27, 0x1d, 0xe5, 0x60, - 0x0e, 0x59, 0x12, 0xd1, 0xbb, 0x3d, 0x5f, 0x3e, 0x4c, 0xc6, 0x7a, 0x55, 0xb5, 0xd0, 0x69, 0x48, - 0xc3, 0x5c, 0x73, 0x1d, 0xef, 0x90, 0xf4, 0x4f, 0x5a, 0x11, 0x6d, 0x67, 0xe9, 0xbd, 0x87, 0x7a, - 0x46, 0x95, 0x6b, 0xc6, 0x78, 0x0b, 0x96, 0x8e, 0x71, 0x5f, 0x95, 0x19, 0xa1, 0xe8, 0x3a, 0x14, - 0x71, 0xb8, 0xa8, 0x68, 0xf5, 0xec, 0x66, 0xd1, 0x8c, 0x09, 0xb2, 0xcc, 0x7f, 0xfa, 0xd7, 0xba, - 0x66, 0x7c, 0xa4, 0x41, 0xbe, 0x75, 0x7c, 0x80, 0x9d, 0x00, 0xb5, 0x61, 0x2d, 0xce, 0x9c, 0x8b, - 0x45, 0x7e, 0x7d, 0x32, 0xd6, 0x2b, 0xe9, 0xe4, 0x8a, 0xaa, 0x3c, 0x4e, 0xe0, 0xb0, 0xcc, 0xdb, - 0xb0, 0x76, 0x2f, 0xec, 0x1d, 0x11, 0xd4, 0x42, 0x1a, 0x6a, 0x8a, 0xc5, 0x30, 0x57, 0x23, 0x9a, - 0x82, 0x4a, 0x99, 0xb9, 0x07, 0x8b, 0xf2, 0xb4, 0x14, 0xed, 0xc0, 0x4b, 0x03, 0xfe, 0x43, 0x58, - 0x57, 0xda, 0xae, 0xcd, 0x4c, 0x5e, 0xc1, 0xaf, 0xc2, 0x27, 0x45, 0x8c, 0x5f, 0x2d, 0x00, 0xb4, - 0x8e, 0x8f, 0x8f, 0x02, 0x67, 0xd0, 0x27, 0xec, 0x93, 0xb4, 0xfc, 0x08, 0xae, 0xc6, 0x66, 0xd1, - 0xc0, 0x4a, 0x59, 0x5f, 0x9f, 0x8c, 0xf5, 0xeb, 0x69, 0xeb, 0x13, 0x6c, 0x86, 0x79, 0x25, 0xa2, - 0x1f, 0x06, 0xd6, 0xa5, 0xa8, 0x36, 0x65, 0x11, 0x6a, 0x76, 0x36, 0x6a, 0x82, 0x2d, 0x89, 0xda, - 0xa2, 0xec, 0x72, 0xd7, 0x1e, 0x42, 0x29, 0x76, 0x09, 0x45, 0x2d, 0x28, 0x30, 0xf5, 0x5b, 0x79, - 0xd8, 0x98, 0xed, 0xe1, 0x50, 0x4c, 0x79, 0x39, 0x92, 0x34, 0xfe, 0xa3, 0x01, 0xc4, 0x39, 0xfb, - 0xe9, 0x4c, 0x31, 0xde, 0xca, 0x55, 0xe3, 0xcd, 0xbe, 0xd0, 0xa8, 0xa6, 0xa4, 0x53, 0xfe, 0xfc, - 0xf9, 0x02, 0x5c, 0xb9, 0x1b, 0x76, 0x9e, 0x4f, 0xbd, 0x0f, 0x0e, 0x60, 0x91, 0x78, 0x2c, 0x70, - 0x84, 0x13, 0x78, 0xb4, 0xbf, 0x32, 0x2b, 0xda, 0x97, 0xd8, 0xb4, 0xe7, 0xb1, 0x60, 0xa4, 0x62, - 0x1f, 0xc2, 0xa4, 0xbc, 0xf1, 0xcb, 0x2c, 0x54, 0x66, 0x49, 0xa2, 0x5d, 0x28, 0x5b, 0x01, 0x11, - 0x84, 0xf0, 0xfe, 0xd0, 0xc4, 0xfd, 0x51, 0x8d, 0x27, 0xcb, 0x14, 0x83, 0x61, 0xae, 0x84, 0x14, - 0x75, 0x7b, 0xf4, 0x80, 0x8f, 0x7d, 0x3c, 0xed, 0x38, 0xd7, 0x73, 0xce, 0x79, 0x86, 0xba, 0x3e, - 0x42, 0x25, 0x17, 0x01, 0xe4, 0xfd, 0xb1, 0x12, 0x53, 0xc5, 0x05, 0xf2, 0x63, 0x28, 0x3b, 0x9e, - 0xc3, 0x1c, 0xdc, 0xef, 0x74, 0x71, 0x1f, 0x7b, 0xd6, 0x8b, 0x4c, 0xcd, 0xb2, 0xe5, 0x2b, 0xb5, - 0x29, 0x38, 0xc3, 0x5c, 0x51, 0x94, 0xa6, 0x24, 0xa0, 0x7d, 0x58, 0x0c, 0x55, 0xe5, 0x5e, 0x68, - 0xda, 0x08, 0xc5, 0x13, 0x03, 0xde, 0x2f, 0xb2, 0xb0, 0x66, 0x12, 0xfb, 0xb3, 0x50, 0xcc, 0x17, - 0x8a, 0x6f, 0x03, 0xc8, 0x72, 0xe7, 0x0d, 0xf6, 0x05, 0xa2, 0xc1, 0x1b, 0x46, 0x51, 0x22, 0xb4, - 0x28, 0x4b, 0xc4, 0x63, 0xbc, 0x00, 0x4b, 0xc9, 0x78, 0xfc, 0x9f, 0xde, 0x4a, 0xa8, 0x1d, 0x77, - 0xa2, 0x9c, 0xe8, 0x44, 0x5f, 0x9a, 0xd5, 0x89, 0xa6, 0xb2, 0xf7, 0xe9, 0x2d, 0xe8, 0xdf, 0x59, - 0xc8, 0x1f, 0xe0, 0x00, 0xbb, 0x14, 0x59, 0x53, 0x93, 0xa6, 0x7c, 0x6b, 0x6e, 0x4c, 0xe5, 0x67, - 0x4b, 0x7d, 0xed, 0x78, 0xc6, 0xa0, 0xf9, 0xc1, 0x25, 0x83, 0xe6, 0x37, 0x61, 0x85, 0x3f, 0x87, - 0x23, 0x1b, 0xa5, 0xb7, 0x97, 0x9b, 0x1b, 0x31, 0xca, 0xc5, 0x7d, 0xf9, 0x5a, 0x8e, 0x1e, 0x5d, - 0x14, 0x7d, 0x0d, 0x4a, 0x9c, 0x23, 0x6e, 0xcc, 0x5c, 0xfc, 0x5a, 0xfc, 0x2c, 0x4d, 0x6c, 0x1a, - 0x26, 0xb8, 0xf8, 0x7c, 0x4f, 0x2e, 0xd0, 0x6d, 0x40, 0xa7, 0xd1, 0x97, 0x91, 0x4e, 0xec, 0x4e, - 0x2e, 0xff, 0xf9, 0xc9, 0x58, 0xdf, 0x90, 0xf2, 0xd3, 0x3c, 0x86, 0xb9, 0x16, 0x13, 0x43, 0xb4, - 0xaf, 0x02, 0x70, 0xbb, 0x3a, 0x36, 0xf1, 0x7c, 0x57, 0x3d, 0x77, 0xae, 0x4e, 0xc6, 0xfa, 0x9a, - 0x44, 0x89, 0xf7, 0x0c, 0xb3, 0xc8, 0x17, 0x2d, 0xfe, 0x3b, 0x9c, 0x8e, 0x53, 0xaf, 0x7a, 0xf5, - 0xb6, 0xb9, 0x3d, 0xf7, 0xdb, 0x26, 0x31, 0x1d, 0xa7, 0x20, 0xe5, 0x74, 0x7c, 0xf1, 0x6b, 0x40, - 0xa2, 0xae, 0x3e, 0xd4, 0x00, 0xc5, 0x17, 0x8e, 0x49, 0xe8, 0x80, 0xbf, 0x0e, 0xf9, 0x33, 0x20, - 0x31, 0xb3, 0x6b, 0x4f, 0x7f, 0x06, 0xc4, 0xf2, 0xe1, 0x33, 0x20, 0x51, 0xa7, 0x5f, 0x8f, 0x9b, - 0xf3, 0x82, 0xca, 0x22, 0x05, 0xd3, 0xc5, 0x94, 0x24, 0x9e, 0x12, 0x4e, 0x28, 0x3d, 0xd5, 0x8d, - 0x33, 0xc6, 0x1f, 0x35, 0xd8, 0x98, 0xca, 0xe7, 0xe8, 0xb0, 0x3f, 0x04, 0x14, 0x24, 0x36, 0x45, - 0xb4, 0x46, 0xea, 0xd0, 0x73, 0x97, 0xc7, 0x5a, 0x30, 0xd5, 0xf5, 0x3f, 0xb9, 0xfb, 0x25, 0x27, - 0x7c, 0xfe, 0x3b, 0x0d, 0xd6, 0x93, 0xea, 0x23, 0x43, 0xee, 0xc0, 0x52, 0x52, 0xbb, 0x32, 0xe1, - 0xd5, 0xe7, 0x31, 0x41, 0x9d, 0xfe, 0x82, 0x3c, 0xfa, 0x6e, 0xdc, 0x2c, 0xe4, 0x97, 0xbb, 0x1b, - 0xcf, 0xed, 0x8d, 0xf0, 0x4c, 0xe9, 0xa6, 0x91, 0x13, 0xf1, 0xf8, 0xaf, 0x06, 0xb9, 0x03, 0xdf, - 0xef, 0x23, 0x1f, 0xd6, 0x3c, 0x9f, 0x75, 0x78, 0x5e, 0x13, 0xbb, 0xa3, 0x9e, 0xfc, 0xb2, 0x0b, - 0xef, 0xce, 0xe7, 0xa4, 0x7f, 0x8e, 0xf5, 0x69, 0x28, 0xb3, 0xec, 0xf9, 0xac, 0x29, 0x28, 0x47, - 0xf2, 0x83, 0xc0, 0xbb, 0xb0, 0x7c, 0x51, 0x99, 0xec, 0xd1, 0xdf, 0x9b, 0x5b, 0xd9, 0x45, 0x98, - 0xc9, 0x58, 0x5f, 0x8f, 0xeb, 0x35, 0x22, 0x1b, 0xe6, 0x52, 0x37, 0xa1, 0x7d, 0xa7, 0xc0, 0xe3, - 0xf7, 0xaf, 0x87, 0xba, 0xf6, 0xe5, 0xdf, 0x6a, 0x00, 0xf1, 0x77, 0x0f, 0xf4, 0x3a, 0xbc, 0xdc, - 0xfc, 0xce, 0x9d, 0x56, 0xe7, 0xf0, 0xe8, 0xe6, 0xd1, 0xdd, 0xc3, 0xce, 0xdd, 0x3b, 0x87, 0x07, - 0x7b, 0xbb, 0xed, 0x5b, 0xed, 0xbd, 0xd6, 0x6a, 0xa6, 0x5a, 0xbe, 0xff, 0xa0, 0x5e, 0xba, 0xeb, - 0xd1, 0x01, 0xb1, 0x9c, 0x13, 0x87, 0xd8, 0xe8, 0x35, 0x58, 0xbf, 0xc8, 0xcd, 0x57, 0x7b, 0xad, - 0x55, 0xad, 0xba, 0x74, 0xff, 0x41, 0xbd, 0x20, 0x27, 0x41, 0x62, 0xa3, 0x4d, 0xb8, 0x3a, 0xcd, - 0xd7, 0xbe, 0xf3, 0xad, 0xd5, 0x85, 0xea, 0xf2, 0xfd, 0x07, 0xf5, 0x62, 0x34, 0x32, 0x22, 0x03, - 0x50, 0x92, 0x53, 0xe1, 0x65, 0xab, 0x70, 0xff, 0x41, 0x3d, 0x2f, 0x1d, 0x58, 0xcd, 0xbd, 0xf7, - 0x61, 0x2d, 0xd3, 0xbc, 0xf5, 0xf1, 0xe3, 0x9a, 0xf6, 0xe8, 0x71, 0x4d, 0xfb, 0xfb, 0xe3, 0x9a, - 0xf6, 0xfe, 0x93, 0x5a, 0xe6, 0xd1, 0x93, 0x5a, 0xe6, 0xcf, 0x4f, 0x6a, 0x99, 0xef, 0xbf, 0xfe, - 0x54, 0xdf, 0x9d, 0x47, 0x9f, 0xd4, 0x85, 0x17, 0xbb, 0x79, 0x71, 0x09, 0xbc, 0xf9, 0xbf, 0x00, - 0x00, 0x00, 0xff, 0xff, 0x45, 0x84, 0x47, 0xa8, 0x71, 0x17, 0x00, 0x00, -} - -func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { - return StakingDescription() -} -func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { - d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} - var gzipped = []byte{ - // 9612 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xd7, - 0x71, 0x18, 0x66, 0x77, 0x01, 0xec, 0x36, 0x16, 0xc0, 0xe2, 0x01, 0x77, 0xb7, 0xb7, 0x3c, 0x02, - 0xe0, 0xf0, 0xeb, 0x78, 0x24, 0x71, 0xe4, 0x91, 0x77, 0x24, 0xf7, 0x24, 0x51, 0x58, 0x60, 0x0f, - 0x07, 0x1e, 0xbe, 0x38, 0x00, 0x8e, 0xd4, 0x87, 0xb3, 0x35, 0x98, 0x7d, 0x58, 0x0c, 0xb1, 0x3b, - 0x33, 0x9c, 0x99, 0xbd, 0x3b, 0x50, 0x52, 0x8a, 0x96, 0x14, 0x45, 0xa2, 0xcb, 0xb1, 0x14, 0xa5, - 0x62, 0x89, 0xd2, 0x29, 0x92, 0xe5, 0x44, 0x8e, 0xac, 0xc4, 0x96, 0xa5, 0x28, 0x71, 0x92, 0xaa, - 0x48, 0xa9, 0x38, 0x96, 0x94, 0x8a, 0x4b, 0xaa, 0xb8, 0x12, 0xc7, 0x95, 0x9c, 0x1d, 0x4a, 0xe5, - 0x30, 0x8a, 0x12, 0xcb, 0x17, 0xba, 0xe2, 0x94, 0x2a, 0x95, 0xd4, 0xfb, 0x9a, 0xaf, 0xfd, 0x98, - 0x5d, 0xe8, 0x4e, 0x92, 0xe3, 0xfc, 0xc2, 0xbe, 0x9e, 0xee, 0x7e, 0xdd, 0xfd, 0xfa, 0x75, 0xf7, - 0x7b, 0xf3, 0xde, 0x00, 0xbe, 0x78, 0x1e, 0x66, 0x6b, 0xa6, 0x59, 0xab, 0xe3, 0xd3, 0x96, 0x6d, - 0xba, 0xe6, 0x4e, 0x73, 0xf7, 0x74, 0x15, 0x3b, 0x9a, 0xad, 0x5b, 0xae, 0x69, 0xcf, 0x51, 0x18, - 0x1a, 0x67, 0x18, 0x73, 0x02, 0x43, 0x5e, 0x85, 0x89, 0x0b, 0x7a, 0x1d, 0x2f, 0x7a, 0x88, 0x9b, - 0xd8, 0x45, 0x4f, 0x42, 0x6a, 0x57, 0xaf, 0xe3, 0xbc, 0x34, 0x9b, 0x3c, 0x39, 0x72, 0xe6, 0x9e, - 0xb9, 0x08, 0xd1, 0x5c, 0x98, 0x62, 0x83, 0x80, 0x15, 0x4a, 0x21, 0x7f, 0x37, 0x05, 0x93, 0x6d, - 0x9e, 0x22, 0x04, 0x29, 0x43, 0x6d, 0x10, 0x8e, 0xd2, 0xc9, 0x8c, 0x42, 0x7f, 0xa3, 0x3c, 0x0c, - 0x5b, 0xaa, 0xb6, 0xaf, 0xd6, 0x70, 0x3e, 0x41, 0xc1, 0xa2, 0x89, 0xa6, 0x01, 0xaa, 0xd8, 0xc2, - 0x46, 0x15, 0x1b, 0xda, 0x41, 0x3e, 0x39, 0x9b, 0x3c, 0x99, 0x51, 0x02, 0x10, 0xf4, 0x20, 0x4c, - 0x58, 0xcd, 0x9d, 0xba, 0xae, 0x55, 0x02, 0x68, 0x30, 0x9b, 0x3c, 0x39, 0xa8, 0xe4, 0xd8, 0x83, - 0x45, 0x1f, 0xf9, 0x7e, 0x18, 0xbf, 0x8a, 0xd5, 0xfd, 0x20, 0xea, 0x08, 0x45, 0x1d, 0x23, 0xe0, - 0x00, 0xe2, 0x02, 0x64, 0x1b, 0xd8, 0x71, 0xd4, 0x1a, 0xae, 0xb8, 0x07, 0x16, 0xce, 0xa7, 0xa8, - 0xf6, 0xb3, 0x2d, 0xda, 0x47, 0x35, 0x1f, 0xe1, 0x54, 0x5b, 0x07, 0x16, 0x46, 0xf3, 0x90, 0xc1, - 0x46, 0xb3, 0xc1, 0x38, 0x0c, 0x76, 0xb0, 0x5f, 0xd9, 0x68, 0x36, 0xa2, 0x5c, 0xd2, 0x84, 0x8c, - 0xb3, 0x18, 0x76, 0xb0, 0x7d, 0x45, 0xd7, 0x70, 0x7e, 0x88, 0x32, 0xb8, 0xbf, 0x85, 0xc1, 0x26, - 0x7b, 0x1e, 0xe5, 0x21, 0xe8, 0xd0, 0x02, 0x64, 0xf0, 0x35, 0x17, 0x1b, 0x8e, 0x6e, 0x1a, 0xf9, - 0x61, 0xca, 0xe4, 0xde, 0x36, 0xa3, 0x88, 0xeb, 0xd5, 0x28, 0x0b, 0x9f, 0x0e, 0x9d, 0x83, 0x61, - 0xd3, 0x72, 0x75, 0xd3, 0x70, 0xf2, 0xe9, 0x59, 0xe9, 0xe4, 0xc8, 0x99, 0x13, 0x6d, 0x1d, 0x61, - 0x9d, 0xe1, 0x28, 0x02, 0x19, 0x2d, 0x43, 0xce, 0x31, 0x9b, 0xb6, 0x86, 0x2b, 0x9a, 0x59, 0xc5, - 0x15, 0xdd, 0xd8, 0x35, 0xf3, 0x19, 0xca, 0x60, 0xa6, 0x55, 0x11, 0x8a, 0xb8, 0x60, 0x56, 0xf1, - 0xb2, 0xb1, 0x6b, 0x2a, 0x63, 0x4e, 0xa8, 0x8d, 0x8e, 0xc2, 0x90, 0x73, 0x60, 0xb8, 0xea, 0xb5, - 0x7c, 0x96, 0x7a, 0x08, 0x6f, 0xc9, 0xbf, 0x39, 0x04, 0xe3, 0xbd, 0xb8, 0xd8, 0x79, 0x18, 0xdc, - 0x25, 0x5a, 0xe6, 0x13, 0xfd, 0xd8, 0x80, 0xd1, 0x84, 0x8d, 0x38, 0x74, 0x48, 0x23, 0xce, 0xc3, - 0x88, 0x81, 0x1d, 0x17, 0x57, 0x99, 0x47, 0x24, 0x7b, 0xf4, 0x29, 0x60, 0x44, 0xad, 0x2e, 0x95, - 0x3a, 0x94, 0x4b, 0x3d, 0x0f, 0xe3, 0x9e, 0x48, 0x15, 0x5b, 0x35, 0x6a, 0xc2, 0x37, 0x4f, 0xc7, - 0x49, 0x32, 0x57, 0x16, 0x74, 0x0a, 0x21, 0x53, 0xc6, 0x70, 0xa8, 0x8d, 0x16, 0x01, 0x4c, 0x03, - 0x9b, 0xbb, 0x95, 0x2a, 0xd6, 0xea, 0xf9, 0x74, 0x07, 0x2b, 0xad, 0x13, 0x94, 0x16, 0x2b, 0x99, - 0x0c, 0xaa, 0xd5, 0xd1, 0x53, 0xbe, 0xab, 0x0d, 0x77, 0xf0, 0x94, 0x55, 0x36, 0xc9, 0x5a, 0xbc, - 0x6d, 0x1b, 0xc6, 0x6c, 0x4c, 0xfc, 0x1e, 0x57, 0xb9, 0x66, 0x19, 0x2a, 0xc4, 0x5c, 0xac, 0x66, - 0x0a, 0x27, 0x63, 0x8a, 0x8d, 0xda, 0xc1, 0x26, 0xba, 0x1b, 0x3c, 0x40, 0x85, 0xba, 0x15, 0xd0, - 0x28, 0x94, 0x15, 0xc0, 0x35, 0xb5, 0x81, 0x0b, 0x2f, 0xc1, 0x58, 0xd8, 0x3c, 0x68, 0x0a, 0x06, - 0x1d, 0x57, 0xb5, 0x5d, 0xea, 0x85, 0x83, 0x0a, 0x6b, 0xa0, 0x1c, 0x24, 0xb1, 0x51, 0xa5, 0x51, - 0x6e, 0x50, 0x21, 0x3f, 0xd1, 0x5b, 0x7d, 0x85, 0x93, 0x54, 0xe1, 0xfb, 0x5a, 0x47, 0x34, 0xc4, - 0x39, 0xaa, 0x77, 0xe1, 0x09, 0x18, 0x0d, 0x29, 0xd0, 0x6b, 0xd7, 0xf2, 0xbb, 0xe1, 0x48, 0x5b, - 0xd6, 0xe8, 0x79, 0x98, 0x6a, 0x1a, 0xba, 0xe1, 0x62, 0xdb, 0xb2, 0x31, 0xf1, 0x58, 0xd6, 0x55, - 0xfe, 0x3f, 0x0f, 0x77, 0xf0, 0xb9, 0xed, 0x20, 0x36, 0xe3, 0xa2, 0x4c, 0x36, 0x5b, 0x81, 0xa7, - 0x32, 0xe9, 0xd7, 0x87, 0x73, 0x2f, 0xbf, 0xfc, 0xf2, 0xcb, 0x09, 0xf9, 0x6b, 0x43, 0x30, 0xd5, - 0x6e, 0xce, 0xb4, 0x9d, 0xbe, 0x47, 0x61, 0xc8, 0x68, 0x36, 0x76, 0xb0, 0x4d, 0x8d, 0x34, 0xa8, - 0xf0, 0x16, 0x9a, 0x87, 0xc1, 0xba, 0xba, 0x83, 0xeb, 0xf9, 0xd4, 0xac, 0x74, 0x72, 0xec, 0xcc, - 0x83, 0x3d, 0xcd, 0xca, 0xb9, 0x15, 0x42, 0xa2, 0x30, 0x4a, 0xf4, 0x16, 0x48, 0xf1, 0x10, 0x4d, - 0x38, 0x9c, 0xea, 0x8d, 0x03, 0x99, 0x4b, 0x0a, 0xa5, 0x43, 0x77, 0x40, 0x86, 0xfc, 0x65, 0xbe, - 0x31, 0x44, 0x65, 0x4e, 0x13, 0x00, 0xf1, 0x0b, 0x54, 0x80, 0x34, 0x9d, 0x26, 0x55, 0x2c, 0x52, - 0x9b, 0xd7, 0x26, 0x8e, 0x55, 0xc5, 0xbb, 0x6a, 0xb3, 0xee, 0x56, 0xae, 0xa8, 0xf5, 0x26, 0xa6, - 0x0e, 0x9f, 0x51, 0xb2, 0x1c, 0x78, 0x99, 0xc0, 0xd0, 0x0c, 0x8c, 0xb0, 0x59, 0xa5, 0x1b, 0x55, - 0x7c, 0x8d, 0x46, 0xcf, 0x41, 0x85, 0x4d, 0xb4, 0x65, 0x02, 0x21, 0xdd, 0xbf, 0xe0, 0x98, 0x86, - 0x70, 0x4d, 0xda, 0x05, 0x01, 0xd0, 0xee, 0x9f, 0x88, 0x06, 0xee, 0x3b, 0xdb, 0xab, 0xd7, 0x32, - 0x97, 0xee, 0x87, 0x71, 0x8a, 0xf1, 0x18, 0x1f, 0x7a, 0xb5, 0x9e, 0x9f, 0x98, 0x95, 0x4e, 0xa6, - 0x95, 0x31, 0x06, 0x5e, 0xe7, 0x50, 0xf9, 0x2b, 0x09, 0x48, 0xd1, 0xc0, 0x32, 0x0e, 0x23, 0x5b, - 0x6f, 0xdb, 0x28, 0x57, 0x16, 0xd7, 0xb7, 0x4b, 0x2b, 0xe5, 0x9c, 0x84, 0xc6, 0x00, 0x28, 0xe0, - 0xc2, 0xca, 0xfa, 0xfc, 0x56, 0x2e, 0xe1, 0xb5, 0x97, 0xd7, 0xb6, 0xce, 0x3d, 0x9e, 0x4b, 0x7a, - 0x04, 0xdb, 0x0c, 0x90, 0x0a, 0x22, 0x3c, 0x76, 0x26, 0x37, 0x88, 0x72, 0x90, 0x65, 0x0c, 0x96, - 0x9f, 0x2f, 0x2f, 0x9e, 0x7b, 0x3c, 0x37, 0x14, 0x86, 0x3c, 0x76, 0x26, 0x37, 0x8c, 0x46, 0x21, - 0x43, 0x21, 0xa5, 0xf5, 0xf5, 0x95, 0x5c, 0xda, 0xe3, 0xb9, 0xb9, 0xa5, 0x2c, 0xaf, 0x2d, 0xe5, - 0x32, 0x1e, 0xcf, 0x25, 0x65, 0x7d, 0x7b, 0x23, 0x07, 0x1e, 0x87, 0xd5, 0xf2, 0xe6, 0xe6, 0xfc, - 0x52, 0x39, 0x37, 0xe2, 0x61, 0x94, 0xde, 0xb6, 0x55, 0xde, 0xcc, 0x65, 0x43, 0x62, 0x3d, 0x76, - 0x26, 0x37, 0xea, 0x75, 0x51, 0x5e, 0xdb, 0x5e, 0xcd, 0x8d, 0xa1, 0x09, 0x18, 0x65, 0x5d, 0x08, - 0x21, 0xc6, 0x23, 0xa0, 0x73, 0x8f, 0xe7, 0x72, 0xbe, 0x20, 0x8c, 0xcb, 0x44, 0x08, 0x70, 0xee, - 0xf1, 0x1c, 0x92, 0x17, 0x60, 0x90, 0xba, 0x21, 0x42, 0x30, 0xb6, 0x32, 0x5f, 0x2a, 0xaf, 0x54, - 0xd6, 0x37, 0xb6, 0x96, 0xd7, 0xd7, 0xe6, 0x57, 0x72, 0x92, 0x0f, 0x53, 0xca, 0xcf, 0x6e, 0x2f, - 0x2b, 0xe5, 0xc5, 0x5c, 0x22, 0x08, 0xdb, 0x28, 0xcf, 0x6f, 0x95, 0x17, 0x73, 0x49, 0x59, 0x83, - 0xa9, 0x76, 0x01, 0xb5, 0xed, 0x14, 0x0a, 0xf8, 0x42, 0xa2, 0x83, 0x2f, 0x50, 0x5e, 0x51, 0x5f, - 0x90, 0xbf, 0x93, 0x80, 0xc9, 0x36, 0x49, 0xa5, 0x6d, 0x27, 0x4f, 0xc3, 0x20, 0xf3, 0x65, 0x96, - 0x66, 0x1f, 0x68, 0x9b, 0x9d, 0xa8, 0x67, 0xb7, 0xa4, 0x5a, 0x4a, 0x17, 0x2c, 0x35, 0x92, 0x1d, - 0x4a, 0x0d, 0xc2, 0xa2, 0xc5, 0x61, 0x7f, 0xa6, 0x25, 0xf8, 0xb3, 0xfc, 0x78, 0xae, 0x97, 0xfc, - 0x48, 0x61, 0xfd, 0x25, 0x81, 0xc1, 0x36, 0x49, 0xe0, 0x3c, 0x4c, 0xb4, 0x30, 0xea, 0x39, 0x18, - 0xbf, 0x4f, 0x82, 0x7c, 0x27, 0xe3, 0xc4, 0x84, 0xc4, 0x44, 0x28, 0x24, 0x9e, 0x8f, 0x5a, 0xf0, - 0xae, 0xce, 0x83, 0xd0, 0x32, 0xd6, 0x9f, 0x93, 0xe0, 0x68, 0xfb, 0x92, 0xb2, 0xad, 0x0c, 0x6f, - 0x81, 0xa1, 0x06, 0x76, 0xf7, 0x4c, 0x51, 0x56, 0xdd, 0xd7, 0x26, 0x59, 0x93, 0xc7, 0xd1, 0xc1, - 0xe6, 0x54, 0xc1, 0x6c, 0x9f, 0xec, 0x54, 0x17, 0x32, 0x69, 0x5a, 0x24, 0xfd, 0x50, 0x02, 0x8e, - 0xb4, 0x65, 0xde, 0x56, 0xd0, 0x3b, 0x01, 0x74, 0xc3, 0x6a, 0xba, 0xac, 0x74, 0x62, 0x91, 0x38, - 0x43, 0x21, 0x34, 0x78, 0x91, 0x28, 0xdb, 0x74, 0xbd, 0xe7, 0x49, 0xfa, 0x1c, 0x18, 0x88, 0x22, - 0x3c, 0xe9, 0x0b, 0x9a, 0xa2, 0x82, 0x4e, 0x77, 0xd0, 0xb4, 0xc5, 0x31, 0x1f, 0x81, 0x9c, 0x56, - 0xd7, 0xb1, 0xe1, 0x56, 0x1c, 0xd7, 0xc6, 0x6a, 0x43, 0x37, 0x6a, 0x34, 0xd5, 0xa4, 0x8b, 0x83, - 0xbb, 0x6a, 0xdd, 0xc1, 0xca, 0x38, 0x7b, 0xbc, 0x29, 0x9e, 0x12, 0x0a, 0xea, 0x40, 0x76, 0x80, - 0x62, 0x28, 0x44, 0xc1, 0x1e, 0x7b, 0x14, 0xf2, 0x47, 0x32, 0x30, 0x12, 0x28, 0xc0, 0xd1, 0x5d, - 0x90, 0x7d, 0x41, 0xbd, 0xa2, 0x56, 0xc4, 0xa2, 0x8a, 0x59, 0x62, 0x84, 0xc0, 0x36, 0xf8, 0xc2, - 0xea, 0x11, 0x98, 0xa2, 0x28, 0x66, 0xd3, 0xc5, 0x76, 0x45, 0xab, 0xab, 0x8e, 0x43, 0x8d, 0x96, - 0xa6, 0xa8, 0x88, 0x3c, 0x5b, 0x27, 0x8f, 0x16, 0xc4, 0x13, 0x74, 0x16, 0x26, 0x29, 0x45, 0xa3, - 0x59, 0x77, 0x75, 0xab, 0x8e, 0x2b, 0x64, 0x99, 0xe7, 0xd0, 0x94, 0xe3, 0x49, 0x36, 0x41, 0x30, - 0x56, 0x39, 0x02, 0x91, 0xc8, 0x41, 0x8b, 0x70, 0x27, 0x25, 0xab, 0x61, 0x03, 0xdb, 0xaa, 0x8b, - 0x2b, 0xf8, 0xc5, 0xa6, 0x5a, 0x77, 0x2a, 0xaa, 0x51, 0xad, 0xec, 0xa9, 0xce, 0x5e, 0x7e, 0x8a, - 0x30, 0x28, 0x25, 0xf2, 0x92, 0x72, 0x9c, 0x20, 0x2e, 0x71, 0xbc, 0x32, 0x45, 0x9b, 0x37, 0xaa, - 0x17, 0x55, 0x67, 0x0f, 0x15, 0xe1, 0x28, 0xe5, 0xe2, 0xb8, 0xb6, 0x6e, 0xd4, 0x2a, 0xda, 0x1e, - 0xd6, 0xf6, 0x2b, 0x4d, 0x77, 0xf7, 0xc9, 0xfc, 0x1d, 0xc1, 0xfe, 0xa9, 0x84, 0x9b, 0x14, 0x67, - 0x81, 0xa0, 0x6c, 0xbb, 0xbb, 0x4f, 0xa2, 0x4d, 0xc8, 0x92, 0xc1, 0x68, 0xe8, 0x2f, 0xe1, 0xca, - 0xae, 0x69, 0xd3, 0x1c, 0x3a, 0xd6, 0x26, 0x34, 0x05, 0x2c, 0x38, 0xb7, 0xce, 0x09, 0x56, 0xcd, - 0x2a, 0x2e, 0x0e, 0x6e, 0x6e, 0x94, 0xcb, 0x8b, 0xca, 0x88, 0xe0, 0x72, 0xc1, 0xb4, 0x89, 0x43, - 0xd5, 0x4c, 0xcf, 0xc0, 0x23, 0xcc, 0xa1, 0x6a, 0xa6, 0x30, 0xef, 0x59, 0x98, 0xd4, 0x34, 0xa6, - 0xb3, 0xae, 0x55, 0xf8, 0x62, 0xcc, 0xc9, 0xe7, 0x42, 0xc6, 0xd2, 0xb4, 0x25, 0x86, 0xc0, 0x7d, - 0xdc, 0x41, 0x4f, 0xc1, 0x11, 0xdf, 0x58, 0x41, 0xc2, 0x89, 0x16, 0x2d, 0xa3, 0xa4, 0x67, 0x61, - 0xd2, 0x3a, 0x68, 0x25, 0x44, 0xa1, 0x1e, 0xad, 0x83, 0x28, 0xd9, 0x13, 0x30, 0x65, 0xed, 0x59, - 0xad, 0x74, 0xa7, 0x82, 0x74, 0xc8, 0xda, 0xb3, 0xa2, 0x84, 0xf7, 0xd2, 0x95, 0xb9, 0x8d, 0x35, - 0xd5, 0xc5, 0xd5, 0xfc, 0xb1, 0x20, 0x7a, 0xe0, 0x01, 0x9a, 0x83, 0x9c, 0xa6, 0x55, 0xb0, 0xa1, - 0xee, 0xd4, 0x71, 0x45, 0xb5, 0xb1, 0xa1, 0x3a, 0xf9, 0x19, 0x8a, 0x9c, 0x72, 0xed, 0x26, 0x56, - 0xc6, 0x34, 0xad, 0x4c, 0x1f, 0xce, 0xd3, 0x67, 0xe8, 0x14, 0x4c, 0x98, 0x3b, 0x2f, 0x68, 0xcc, - 0x23, 0x2b, 0x96, 0x8d, 0x77, 0xf5, 0x6b, 0xf9, 0x7b, 0xa8, 0x79, 0xc7, 0xc9, 0x03, 0xea, 0x8f, - 0x1b, 0x14, 0x8c, 0x1e, 0x80, 0x9c, 0xe6, 0xec, 0xa9, 0xb6, 0x45, 0x43, 0xb2, 0x63, 0xa9, 0x1a, - 0xce, 0xdf, 0xcb, 0x50, 0x19, 0x7c, 0x4d, 0x80, 0xc9, 0x8c, 0x70, 0xae, 0xea, 0xbb, 0xae, 0xe0, - 0x78, 0x3f, 0x9b, 0x11, 0x14, 0xc6, 0xb9, 0x9d, 0x84, 0x1c, 0xb1, 0x44, 0xa8, 0xe3, 0x93, 0x14, - 0x6d, 0xcc, 0xda, 0xb3, 0x82, 0xfd, 0xde, 0x0d, 0xa3, 0x04, 0xd3, 0xef, 0xf4, 0x01, 0x56, 0xb8, - 0x59, 0x7b, 0x81, 0x1e, 0x1f, 0x87, 0xa3, 0x04, 0xa9, 0x81, 0x5d, 0xb5, 0xaa, 0xba, 0x6a, 0x00, - 0xfb, 0x21, 0x8a, 0x4d, 0xcc, 0xbe, 0xca, 0x1f, 0x86, 0xe4, 0xb4, 0x9b, 0x3b, 0x07, 0x9e, 0x63, - 0x3d, 0xcc, 0xe4, 0x24, 0x30, 0xe1, 0x5a, 0xb7, 0xad, 0x38, 0x97, 0x8b, 0x90, 0x0d, 0xfa, 0x3d, - 0xca, 0x00, 0xf3, 0xfc, 0x9c, 0x44, 0x8a, 0xa0, 0x85, 0xf5, 0x45, 0x52, 0xbe, 0xbc, 0xbd, 0x9c, - 0x4b, 0x90, 0x32, 0x6a, 0x65, 0x79, 0xab, 0x5c, 0x51, 0xb6, 0xd7, 0xb6, 0x96, 0x57, 0xcb, 0xb9, - 0x64, 0xa0, 0xb0, 0x7f, 0x26, 0x95, 0xbe, 0x2f, 0x77, 0xbf, 0xfc, 0xed, 0x04, 0x8c, 0x85, 0x57, - 0x6a, 0xe8, 0x4d, 0x70, 0x4c, 0x6c, 0xab, 0x38, 0xd8, 0xad, 0x5c, 0xd5, 0x6d, 0x3a, 0x21, 0x1b, - 0x2a, 0x4b, 0x8e, 0x9e, 0xff, 0x4c, 0x71, 0xac, 0x4d, 0xec, 0x3e, 0xa7, 0xdb, 0x64, 0xba, 0x35, - 0x54, 0x17, 0xad, 0xc0, 0x8c, 0x61, 0x56, 0x1c, 0x57, 0x35, 0xaa, 0xaa, 0x5d, 0xad, 0xf8, 0x1b, - 0x5a, 0x15, 0x55, 0xd3, 0xb0, 0xe3, 0x98, 0x2c, 0x11, 0x7a, 0x5c, 0x4e, 0x18, 0xe6, 0x26, 0x47, - 0xf6, 0x33, 0xc4, 0x3c, 0x47, 0x8d, 0xb8, 0x6f, 0xb2, 0x93, 0xfb, 0xde, 0x01, 0x99, 0x86, 0x6a, - 0x55, 0xb0, 0xe1, 0xda, 0x07, 0xb4, 0x3e, 0x4f, 0x2b, 0xe9, 0x86, 0x6a, 0x95, 0x49, 0xfb, 0xc7, - 0xb2, 0x4c, 0x7a, 0x26, 0x95, 0x4e, 0xe7, 0x32, 0xcf, 0xa4, 0xd2, 0x99, 0x1c, 0xc8, 0xaf, 0x25, - 0x21, 0x1b, 0xac, 0xd7, 0xc9, 0xf2, 0x47, 0xa3, 0x19, 0x4b, 0xa2, 0x31, 0xed, 0xee, 0xae, 0xd5, - 0xfd, 0xdc, 0x02, 0x49, 0x65, 0xc5, 0x21, 0x56, 0x1c, 0x2b, 0x8c, 0x92, 0x94, 0x11, 0xc4, 0xd9, - 0x30, 0x2b, 0x46, 0xd2, 0x0a, 0x6f, 0xa1, 0x25, 0x18, 0x7a, 0xc1, 0xa1, 0xbc, 0x87, 0x28, 0xef, - 0x7b, 0xba, 0xf3, 0x7e, 0x66, 0x93, 0x32, 0xcf, 0x3c, 0xb3, 0x59, 0x59, 0x5b, 0x57, 0x56, 0xe7, - 0x57, 0x14, 0x4e, 0x8e, 0x8e, 0x43, 0xaa, 0xae, 0xbe, 0x74, 0x10, 0x4e, 0x7a, 0x14, 0xd4, 0xeb, - 0x20, 0x1c, 0x87, 0xd4, 0x55, 0xac, 0xee, 0x87, 0x53, 0x0d, 0x05, 0xdd, 0xc6, 0xc9, 0x70, 0x1a, - 0x06, 0xa9, 0xbd, 0x10, 0x00, 0xb7, 0x58, 0x6e, 0x00, 0xa5, 0x21, 0xb5, 0xb0, 0xae, 0x90, 0x09, - 0x91, 0x83, 0x2c, 0x83, 0x56, 0x36, 0x96, 0xcb, 0x0b, 0xe5, 0x5c, 0x42, 0x3e, 0x0b, 0x43, 0xcc, - 0x08, 0x64, 0xb2, 0x78, 0x66, 0xc8, 0x0d, 0xf0, 0x26, 0xe7, 0x21, 0x89, 0xa7, 0xdb, 0xab, 0xa5, - 0xb2, 0x92, 0x4b, 0x84, 0x87, 0x3a, 0x95, 0x1b, 0x94, 0x1d, 0xc8, 0x06, 0xeb, 0xf0, 0x1f, 0xcf, - 0x62, 0xfc, 0xab, 0x12, 0x8c, 0x04, 0xea, 0x6a, 0x52, 0x10, 0xa9, 0xf5, 0xba, 0x79, 0xb5, 0xa2, - 0xd6, 0x75, 0xd5, 0xe1, 0xae, 0x01, 0x14, 0x34, 0x4f, 0x20, 0xbd, 0x0e, 0xdd, 0x8f, 0x69, 0x8a, - 0x0c, 0xe6, 0x86, 0xe4, 0x4f, 0x49, 0x90, 0x8b, 0x16, 0xb6, 0x11, 0x31, 0xa5, 0x9f, 0xa4, 0x98, - 0xf2, 0x27, 0x25, 0x18, 0x0b, 0x57, 0xb3, 0x11, 0xf1, 0xee, 0xfa, 0x89, 0x8a, 0xf7, 0x87, 0x09, - 0x18, 0x0d, 0xd5, 0xb0, 0xbd, 0x4a, 0xf7, 0x22, 0x4c, 0xe8, 0x55, 0xdc, 0xb0, 0x4c, 0x17, 0x1b, - 0xda, 0x41, 0xa5, 0x8e, 0xaf, 0xe0, 0x7a, 0x5e, 0xa6, 0x41, 0xe3, 0x74, 0xf7, 0x2a, 0x79, 0x6e, - 0xd9, 0xa7, 0x5b, 0x21, 0x64, 0xc5, 0xc9, 0xe5, 0xc5, 0xf2, 0xea, 0xc6, 0xfa, 0x56, 0x79, 0x6d, - 0xe1, 0x6d, 0x95, 0xed, 0xb5, 0x4b, 0x6b, 0xeb, 0xcf, 0xad, 0x29, 0x39, 0x3d, 0x82, 0x76, 0x1b, - 0xa7, 0xfd, 0x06, 0xe4, 0xa2, 0x42, 0xa1, 0x63, 0xd0, 0x4e, 0xac, 0xdc, 0x00, 0x9a, 0x84, 0xf1, - 0xb5, 0xf5, 0xca, 0xe6, 0xf2, 0x62, 0xb9, 0x52, 0xbe, 0x70, 0xa1, 0xbc, 0xb0, 0xb5, 0xc9, 0xf6, - 0x3d, 0x3c, 0xec, 0xad, 0xd0, 0x04, 0x97, 0x5f, 0x4d, 0xc2, 0x64, 0x1b, 0x49, 0xd0, 0x3c, 0x5f, - 0xb1, 0xb0, 0x45, 0xd4, 0xc3, 0xbd, 0x48, 0x3f, 0x47, 0x6a, 0x86, 0x0d, 0xd5, 0x76, 0xf9, 0x02, - 0xe7, 0x01, 0x20, 0x56, 0x32, 0x5c, 0x7d, 0x57, 0xc7, 0x36, 0xdf, 0x4f, 0x62, 0xcb, 0x98, 0x71, - 0x1f, 0xce, 0xb6, 0x94, 0x1e, 0x02, 0x64, 0x99, 0x8e, 0xee, 0xea, 0x57, 0x70, 0x45, 0x37, 0xc4, - 0xe6, 0x13, 0x59, 0xd6, 0xa4, 0x94, 0x9c, 0x78, 0xb2, 0x6c, 0xb8, 0x1e, 0xb6, 0x81, 0x6b, 0x6a, - 0x04, 0x9b, 0x04, 0xf3, 0xa4, 0x92, 0x13, 0x4f, 0x3c, 0xec, 0xbb, 0x20, 0x5b, 0x35, 0x9b, 0xa4, - 0xd6, 0x63, 0x78, 0x24, 0x77, 0x48, 0xca, 0x08, 0x83, 0x79, 0x28, 0xbc, 0x8a, 0xf7, 0x77, 0xbd, - 0xb2, 0xca, 0x08, 0x83, 0x31, 0x94, 0xfb, 0x61, 0x5c, 0xad, 0xd5, 0x6c, 0xc2, 0x5c, 0x30, 0x62, - 0xeb, 0x92, 0x31, 0x0f, 0x4c, 0x11, 0x0b, 0xcf, 0x40, 0x5a, 0xd8, 0x81, 0xa4, 0x6a, 0x62, 0x89, - 0x8a, 0xc5, 0x16, 0xdb, 0x89, 0x93, 0x19, 0x25, 0x6d, 0x88, 0x87, 0x77, 0x41, 0x56, 0x77, 0x2a, - 0xfe, 0x26, 0x7e, 0x62, 0x36, 0x71, 0x32, 0xad, 0x8c, 0xe8, 0x8e, 0xb7, 0x01, 0x2a, 0x7f, 0x2e, - 0x01, 0x63, 0xe1, 0x97, 0x10, 0x68, 0x11, 0xd2, 0x75, 0x53, 0x53, 0xa9, 0x6b, 0xb1, 0x37, 0x60, - 0x27, 0x63, 0xde, 0x5b, 0xcc, 0xad, 0x70, 0x7c, 0xc5, 0xa3, 0x2c, 0xfc, 0x8e, 0x04, 0x69, 0x01, - 0x46, 0x47, 0x21, 0x65, 0xa9, 0xee, 0x1e, 0x65, 0x37, 0x58, 0x4a, 0xe4, 0x24, 0x85, 0xb6, 0x09, - 0xdc, 0xb1, 0x54, 0x83, 0xba, 0x00, 0x87, 0x93, 0x36, 0x19, 0xd7, 0x3a, 0x56, 0xab, 0x74, 0xd1, - 0x63, 0x36, 0x1a, 0xd8, 0x70, 0x1d, 0x31, 0xae, 0x1c, 0xbe, 0xc0, 0xc1, 0xe8, 0x41, 0x98, 0x70, - 0x6d, 0x55, 0xaf, 0x87, 0x70, 0x53, 0x14, 0x37, 0x27, 0x1e, 0x78, 0xc8, 0x45, 0x38, 0x2e, 0xf8, - 0x56, 0xb1, 0xab, 0x6a, 0x7b, 0xb8, 0xea, 0x13, 0x0d, 0xd1, 0xcd, 0x8d, 0x63, 0x1c, 0x61, 0x91, - 0x3f, 0x17, 0xb4, 0xf2, 0xb7, 0x25, 0x98, 0x10, 0xcb, 0xb4, 0xaa, 0x67, 0xac, 0x55, 0x00, 0xd5, - 0x30, 0x4c, 0x37, 0x68, 0xae, 0x56, 0x57, 0x6e, 0xa1, 0x9b, 0x9b, 0xf7, 0x88, 0x94, 0x00, 0x83, - 0x42, 0x03, 0xc0, 0x7f, 0xd2, 0xd1, 0x6c, 0x33, 0x30, 0xc2, 0xdf, 0x30, 0xd1, 0xd7, 0x94, 0x6c, - 0x61, 0x0f, 0x0c, 0x44, 0xd6, 0x73, 0x68, 0x0a, 0x06, 0x77, 0x70, 0x4d, 0x37, 0xf8, 0xbe, 0x31, - 0x6b, 0x88, 0xed, 0x97, 0x94, 0xb7, 0xfd, 0x52, 0xfa, 0xcb, 0x30, 0xa9, 0x99, 0x8d, 0xa8, 0xb8, - 0xa5, 0x5c, 0x64, 0x73, 0xc1, 0xb9, 0x28, 0xbd, 0xfd, 0x61, 0x8e, 0x54, 0x33, 0xeb, 0xaa, 0x51, - 0x9b, 0x33, 0xed, 0x9a, 0xff, 0x9a, 0x95, 0x54, 0x3c, 0x4e, 0xe0, 0x65, 0xab, 0xb5, 0xf3, 0x67, - 0x92, 0xf4, 0x4b, 0x89, 0xe4, 0xd2, 0x46, 0xe9, 0xf3, 0x89, 0xc2, 0x12, 0x23, 0xdc, 0x10, 0xc6, - 0x50, 0xf0, 0x6e, 0x1d, 0x6b, 0x44, 0x41, 0xf8, 0xde, 0x83, 0x30, 0x55, 0x33, 0x6b, 0x26, 0xe5, - 0x74, 0x9a, 0xfc, 0xe2, 0xef, 0x69, 0x33, 0x1e, 0xb4, 0x10, 0xfb, 0x52, 0xb7, 0xb8, 0x06, 0x93, - 0x1c, 0xb9, 0x42, 0x5f, 0x14, 0xb1, 0x65, 0x0c, 0xea, 0xba, 0x87, 0x96, 0xff, 0xe2, 0x77, 0x69, - 0xfa, 0x56, 0x26, 0x38, 0x29, 0x79, 0xc6, 0x56, 0x3a, 0x45, 0x05, 0x8e, 0x84, 0xf8, 0xb1, 0x49, - 0x8a, 0xed, 0x18, 0x8e, 0xbf, 0xc5, 0x39, 0x4e, 0x06, 0x38, 0x6e, 0x72, 0xd2, 0xe2, 0x02, 0x8c, - 0xf6, 0xc3, 0xeb, 0x5f, 0x72, 0x5e, 0x59, 0x1c, 0x64, 0xb2, 0x04, 0xe3, 0x94, 0x89, 0xd6, 0x74, - 0x5c, 0xb3, 0x41, 0x23, 0x60, 0x77, 0x36, 0xbf, 0xfd, 0x5d, 0x36, 0x6b, 0xc6, 0x08, 0xd9, 0x82, - 0x47, 0x55, 0x2c, 0x02, 0x7d, 0x37, 0x56, 0xc5, 0x5a, 0x3d, 0x86, 0xc3, 0xd7, 0xb9, 0x20, 0x1e, - 0x7e, 0xf1, 0x32, 0x4c, 0x91, 0xdf, 0x34, 0x40, 0x05, 0x25, 0x89, 0xdf, 0x70, 0xcb, 0x7f, 0xfb, - 0x7d, 0x6c, 0x62, 0x4e, 0x7a, 0x0c, 0x02, 0x32, 0x05, 0x46, 0xb1, 0x86, 0x5d, 0x17, 0xdb, 0x4e, - 0x45, 0xad, 0xb7, 0x13, 0x2f, 0xb0, 0x63, 0x91, 0xff, 0xf8, 0xf7, 0xc3, 0xa3, 0xb8, 0xc4, 0x28, - 0xe7, 0xeb, 0xf5, 0xe2, 0x36, 0x1c, 0x6b, 0xe3, 0x15, 0x3d, 0xf0, 0x7c, 0x95, 0xf3, 0x9c, 0x6a, - 0xf1, 0x0c, 0xc2, 0x76, 0x03, 0x04, 0xdc, 0x1b, 0xcb, 0x1e, 0x78, 0x7e, 0x82, 0xf3, 0x44, 0x9c, - 0x56, 0x0c, 0x29, 0xe1, 0xf8, 0x0c, 0x4c, 0x5c, 0xc1, 0xf6, 0x8e, 0xe9, 0xf0, 0x5d, 0xa2, 0x1e, - 0xd8, 0x7d, 0x92, 0xb3, 0x1b, 0xe7, 0x84, 0x74, 0xdb, 0x88, 0xf0, 0x7a, 0x0a, 0xd2, 0xbb, 0xaa, - 0x86, 0x7b, 0x60, 0x71, 0x9d, 0xb3, 0x18, 0x26, 0xf8, 0x84, 0x74, 0x1e, 0xb2, 0x35, 0x93, 0xe7, - 0xa8, 0x78, 0xf2, 0x4f, 0x71, 0xf2, 0x11, 0x41, 0xc3, 0x59, 0x58, 0xa6, 0xd5, 0xac, 0x93, 0x04, - 0x16, 0xcf, 0xe2, 0x6f, 0x09, 0x16, 0x82, 0x86, 0xb3, 0xe8, 0xc3, 0xac, 0x9f, 0x16, 0x2c, 0x9c, - 0x80, 0x3d, 0x9f, 0x86, 0x11, 0xd3, 0xa8, 0x1f, 0x98, 0x46, 0x2f, 0x42, 0x7c, 0x86, 0x73, 0x00, - 0x4e, 0x42, 0x18, 0x9c, 0x87, 0x4c, 0xaf, 0x03, 0xf1, 0xb7, 0xbf, 0x2f, 0xa6, 0x87, 0x18, 0x81, - 0x25, 0x18, 0x17, 0x01, 0x4a, 0x37, 0x8d, 0x1e, 0x58, 0xfc, 0x1d, 0xce, 0x62, 0x2c, 0x40, 0xc6, - 0xd5, 0x70, 0xb1, 0xe3, 0xd6, 0x70, 0x2f, 0x4c, 0x3e, 0x27, 0xd4, 0xe0, 0x24, 0xdc, 0x94, 0x3b, - 0xd8, 0xd0, 0xf6, 0x7a, 0xe3, 0xf0, 0x2b, 0xc2, 0x94, 0x82, 0x86, 0xb0, 0x58, 0x80, 0xd1, 0x86, - 0x6a, 0x3b, 0x7b, 0x6a, 0xbd, 0xa7, 0xe1, 0xf8, 0xbb, 0x9c, 0x47, 0xd6, 0x23, 0xe2, 0x16, 0x69, - 0x1a, 0xfd, 0xb0, 0xf9, 0xbc, 0xb0, 0x48, 0x80, 0x8c, 0x4f, 0x3d, 0xc7, 0xa5, 0x5b, 0x6a, 0xfd, - 0x70, 0xfb, 0x55, 0x31, 0xf5, 0x18, 0xed, 0x6a, 0x90, 0xe3, 0x79, 0xc8, 0x38, 0xfa, 0x4b, 0x3d, - 0xb1, 0xf9, 0x82, 0x18, 0x69, 0x4a, 0x40, 0x88, 0xdf, 0x06, 0xc7, 0xdb, 0xa6, 0x89, 0x1e, 0x98, - 0xfd, 0x3d, 0xce, 0xec, 0x68, 0x9b, 0x54, 0xc1, 0x43, 0x42, 0xbf, 0x2c, 0xff, 0xbe, 0x08, 0x09, - 0x38, 0xc2, 0x6b, 0x83, 0xac, 0x1a, 0x1c, 0x75, 0xb7, 0x3f, 0xab, 0xfd, 0x9a, 0xb0, 0x1a, 0xa3, - 0x0d, 0x59, 0x6d, 0x0b, 0x8e, 0x72, 0x8e, 0xfd, 0x8d, 0xeb, 0xaf, 0x8b, 0xc0, 0xca, 0xa8, 0xb7, - 0xc3, 0xa3, 0xfb, 0x0e, 0x28, 0x78, 0xe6, 0x14, 0xe5, 0xa9, 0x53, 0x69, 0xa8, 0x56, 0x0f, 0x9c, - 0xbf, 0xc8, 0x39, 0x8b, 0x88, 0xef, 0xd5, 0xb7, 0xce, 0xaa, 0x6a, 0x11, 0xe6, 0xcf, 0x43, 0x5e, - 0x30, 0x6f, 0x1a, 0x36, 0xd6, 0xcc, 0x9a, 0xa1, 0xbf, 0x84, 0xab, 0x3d, 0xb0, 0xfe, 0x8d, 0xc8, - 0x50, 0x6d, 0x07, 0xc8, 0x09, 0xe7, 0x65, 0xc8, 0x79, 0xb5, 0x4a, 0x45, 0x6f, 0x58, 0xa6, 0xed, - 0xc6, 0x70, 0xfc, 0x92, 0x18, 0x29, 0x8f, 0x6e, 0x99, 0x92, 0x15, 0xcb, 0xc0, 0xde, 0x33, 0xf7, - 0xea, 0x92, 0x5f, 0xe6, 0x8c, 0x46, 0x7d, 0x2a, 0x1e, 0x38, 0x34, 0xb3, 0x61, 0xa9, 0x76, 0x2f, - 0xf1, 0xef, 0x1f, 0x88, 0xc0, 0xc1, 0x49, 0x78, 0xe0, 0x20, 0x15, 0x1d, 0xc9, 0xf6, 0x3d, 0x70, - 0xf8, 0x8a, 0x08, 0x1c, 0x82, 0x86, 0xb3, 0x10, 0x05, 0x43, 0x0f, 0x2c, 0xfe, 0xa1, 0x60, 0x21, - 0x68, 0x08, 0x8b, 0x67, 0xfd, 0x44, 0x6b, 0xe3, 0x9a, 0xee, 0xb8, 0x36, 0x2b, 0x8a, 0xbb, 0xb3, - 0xfa, 0x47, 0xdf, 0x0f, 0x17, 0x61, 0x4a, 0x80, 0x94, 0x44, 0x22, 0xbe, 0xc9, 0x4a, 0xd7, 0x4c, - 0xf1, 0x82, 0xfd, 0xa6, 0x88, 0x44, 0x01, 0x32, 0x22, 0x5b, 0xa0, 0x42, 0x24, 0x66, 0xd7, 0xc8, - 0x4a, 0xa1, 0x07, 0x76, 0xff, 0x38, 0x22, 0xdc, 0xa6, 0xa0, 0x25, 0x3c, 0x03, 0xf5, 0x4f, 0xd3, - 0xd8, 0xc7, 0x07, 0x3d, 0x79, 0xe7, 0x3f, 0x89, 0xd4, 0x3f, 0xdb, 0x8c, 0x92, 0xc5, 0x90, 0xf1, - 0x48, 0x3d, 0x85, 0xe2, 0x4e, 0x15, 0xe5, 0x7f, 0xf6, 0x0d, 0xae, 0x6f, 0xb8, 0x9c, 0x2a, 0xae, - 0x10, 0x27, 0x0f, 0x17, 0x3d, 0xf1, 0xcc, 0xde, 0xf7, 0x86, 0xe7, 0xe7, 0xa1, 0x9a, 0xa7, 0x78, - 0x01, 0x46, 0x43, 0x05, 0x4f, 0x3c, 0xab, 0xf7, 0x73, 0x56, 0xd9, 0x60, 0xbd, 0x53, 0x3c, 0x0b, - 0x29, 0x52, 0xbc, 0xc4, 0x93, 0xff, 0x15, 0x4e, 0x4e, 0xd1, 0x8b, 0x6f, 0x86, 0xb4, 0x28, 0x5a, - 0xe2, 0x49, 0x3f, 0xc0, 0x49, 0x3d, 0x12, 0x42, 0x2e, 0x0a, 0x96, 0x78, 0xf2, 0xbf, 0x2a, 0xc8, - 0x05, 0x09, 0x21, 0xef, 0xdd, 0x84, 0x5f, 0xfd, 0xb9, 0x14, 0x4f, 0x3a, 0xc2, 0x76, 0xe7, 0x61, - 0x98, 0x57, 0x2a, 0xf1, 0xd4, 0x1f, 0xe2, 0x9d, 0x0b, 0x8a, 0xe2, 0x13, 0x30, 0xd8, 0xa3, 0xc1, - 0x7f, 0x9e, 0x93, 0x32, 0xfc, 0xe2, 0x02, 0x8c, 0x04, 0xaa, 0x93, 0x78, 0xf2, 0xbf, 0xc6, 0xc9, - 0x83, 0x54, 0x44, 0x74, 0x5e, 0x9d, 0xc4, 0x33, 0xf8, 0x05, 0x21, 0x3a, 0xa7, 0x20, 0x66, 0x13, - 0x85, 0x49, 0x3c, 0xf5, 0x87, 0x85, 0xd5, 0x05, 0x49, 0xf1, 0x69, 0xc8, 0x78, 0xc9, 0x26, 0x9e, - 0xfe, 0x23, 0x9c, 0xde, 0xa7, 0x21, 0x16, 0x08, 0x24, 0xbb, 0x78, 0x16, 0x7f, 0x5d, 0x58, 0x20, - 0x40, 0x45, 0xa6, 0x51, 0xb4, 0x80, 0x89, 0xe7, 0xf4, 0x51, 0x31, 0x8d, 0x22, 0xf5, 0x0b, 0x19, - 0x4d, 0x1a, 0xf3, 0xe3, 0x59, 0xfc, 0x0d, 0x31, 0x9a, 0x14, 0x9f, 0x88, 0x11, 0xad, 0x08, 0xe2, - 0x79, 0xfc, 0xa2, 0x10, 0x23, 0x52, 0x10, 0x14, 0x37, 0x00, 0xb5, 0x56, 0x03, 0xf1, 0xfc, 0x3e, - 0xc6, 0xf9, 0x4d, 0xb4, 0x14, 0x03, 0xc5, 0xe7, 0xe0, 0x68, 0xfb, 0x4a, 0x20, 0x9e, 0xeb, 0xc7, - 0xdf, 0x88, 0xac, 0xdd, 0x82, 0x85, 0x40, 0x71, 0xcb, 0x4f, 0x29, 0xc1, 0x2a, 0x20, 0x9e, 0xed, - 0xab, 0x6f, 0x84, 0x03, 0x77, 0xb0, 0x08, 0x28, 0xce, 0x03, 0xf8, 0x09, 0x38, 0x9e, 0xd7, 0x27, - 0x39, 0xaf, 0x00, 0x11, 0x99, 0x1a, 0x3c, 0xff, 0xc6, 0xd3, 0x5f, 0x17, 0x53, 0x83, 0x53, 0x90, - 0xa9, 0x21, 0x52, 0x6f, 0x3c, 0xf5, 0xa7, 0xc4, 0xd4, 0x10, 0x24, 0xc4, 0xb3, 0x03, 0xd9, 0x2d, - 0x9e, 0xc3, 0x67, 0x84, 0x67, 0x07, 0xa8, 0x8a, 0x6b, 0x30, 0xd1, 0x92, 0x10, 0xe3, 0x59, 0xfd, - 0x12, 0x67, 0x95, 0x8b, 0xe6, 0xc3, 0x60, 0xf2, 0xe2, 0xc9, 0x30, 0x9e, 0xdb, 0x67, 0x23, 0xc9, - 0x8b, 0xe7, 0xc2, 0xe2, 0x79, 0x48, 0x1b, 0xcd, 0x7a, 0x9d, 0x4c, 0x1e, 0xd4, 0xfd, 0x24, 0x60, - 0xfe, 0xbf, 0xfc, 0x90, 0x5b, 0x47, 0x10, 0x14, 0xcf, 0xc2, 0x20, 0x6e, 0xec, 0xe0, 0x6a, 0x1c, - 0xe5, 0xf7, 0x7e, 0x28, 0x02, 0x26, 0xc1, 0x2e, 0x3e, 0x0d, 0xc0, 0xb6, 0x46, 0xe8, 0xcb, 0xc0, - 0x18, 0xda, 0xff, 0xfa, 0x43, 0x7e, 0xf4, 0xc6, 0x27, 0xf1, 0x19, 0xb0, 0x83, 0x3c, 0xdd, 0x19, - 0x7c, 0x3f, 0xcc, 0x80, 0x8e, 0xc8, 0x53, 0x30, 0xfc, 0x82, 0x63, 0x1a, 0xae, 0x5a, 0x8b, 0xa3, - 0xfe, 0x6f, 0x9c, 0x5a, 0xe0, 0x13, 0x83, 0x35, 0x4c, 0x1b, 0xbb, 0x6a, 0xcd, 0x89, 0xa3, 0xfd, - 0xef, 0x9c, 0xd6, 0x23, 0x20, 0xc4, 0x9a, 0xea, 0xb8, 0xbd, 0xe8, 0xfd, 0xc7, 0x82, 0x58, 0x10, - 0x10, 0xa1, 0xc9, 0xef, 0x7d, 0x7c, 0x10, 0x47, 0xfb, 0x03, 0x21, 0x34, 0xc7, 0x2f, 0xbe, 0x19, - 0x32, 0xe4, 0x27, 0x3b, 0x4f, 0x17, 0x43, 0xfc, 0x27, 0x9c, 0xd8, 0xa7, 0x20, 0x3d, 0x3b, 0x6e, - 0xd5, 0xd5, 0xe3, 0x8d, 0x7d, 0x93, 0x8f, 0xb4, 0xc0, 0x2f, 0xce, 0xc3, 0x88, 0xe3, 0x56, 0xab, - 0x4d, 0x5e, 0x9f, 0xc6, 0x90, 0xff, 0x8f, 0x1f, 0x7a, 0x5b, 0x16, 0x1e, 0x0d, 0x19, 0xed, 0xab, - 0xfb, 0xae, 0x65, 0xd2, 0x17, 0x1e, 0x71, 0x1c, 0xde, 0xe0, 0x1c, 0x02, 0x24, 0xc5, 0x05, 0xc8, - 0x12, 0x5d, 0x6c, 0x6c, 0x61, 0xfa, 0x76, 0x2a, 0x86, 0xc5, 0x9f, 0x72, 0x03, 0x84, 0x88, 0x4a, - 0x3f, 0xf3, 0xf5, 0xd7, 0xa6, 0xa5, 0x6f, 0xbd, 0x36, 0x2d, 0xfd, 0xe1, 0x6b, 0xd3, 0xd2, 0x87, - 0xbf, 0x33, 0x3d, 0xf0, 0xad, 0xef, 0x4c, 0x0f, 0xfc, 0xde, 0x77, 0xa6, 0x07, 0xda, 0xef, 0x12, - 0xc3, 0x92, 0xb9, 0x64, 0xb2, 0xfd, 0xe1, 0xb7, 0xcb, 0x35, 0xdd, 0xdd, 0x6b, 0xee, 0xcc, 0x69, - 0x66, 0x83, 0x6e, 0xe3, 0xfa, 0xbb, 0xb5, 0xde, 0x22, 0x07, 0xfe, 0x54, 0x22, 0x0b, 0xe6, 0xf0, - 0x5e, 0xae, 0x6a, 0x1c, 0x74, 0xb8, 0x99, 0x53, 0x68, 0xbb, 0x31, 0x2c, 0xbf, 0x09, 0x92, 0xf3, - 0xc6, 0x01, 0x3a, 0xce, 0x62, 0x5e, 0xa5, 0x69, 0xd7, 0xf9, 0x39, 0xaf, 0x61, 0xd2, 0xde, 0xb6, - 0xeb, 0x68, 0xca, 0x3f, 0x8c, 0x29, 0x9d, 0xcc, 0xf2, 0x13, 0x96, 0xc5, 0xd4, 0x0f, 0x3e, 0x33, - 0x33, 0x50, 0xda, 0x8f, 0x6a, 0xf8, 0xd5, 0x58, 0x2d, 0xd3, 0xf3, 0xc6, 0x01, 0x55, 0x72, 0x43, - 0x7a, 0xfb, 0x20, 0xdd, 0xe8, 0x16, 0x1b, 0xdb, 0xd3, 0xd1, 0x8d, 0xed, 0xe7, 0x70, 0xbd, 0x7e, - 0xc9, 0x30, 0xaf, 0x1a, 0x5b, 0x04, 0x6d, 0x67, 0x88, 0x1d, 0x1a, 0x86, 0x8f, 0x26, 0x60, 0xba, - 0x65, 0x0f, 0x9b, 0x8f, 0x7c, 0xa7, 0x6b, 0x49, 0x45, 0x48, 0x2f, 0x0a, 0x87, 0xca, 0xc3, 0xb0, - 0x83, 0x35, 0xd3, 0xa8, 0x3a, 0x54, 0xd5, 0xa4, 0x22, 0x9a, 0x44, 0x55, 0x43, 0x35, 0x4c, 0x87, - 0x9f, 0x85, 0x64, 0x8d, 0xd2, 0x27, 0xa4, 0xfe, 0xc6, 0x71, 0x54, 0xf4, 0x24, 0xd4, 0x7c, 0x34, - 0x76, 0xab, 0x7f, 0x9f, 0x68, 0xe9, 0x29, 0x11, 0xda, 0xee, 0xef, 0xd5, 0x2a, 0xbf, 0x98, 0x80, - 0x99, 0xa8, 0x55, 0xc8, 0x74, 0x72, 0x5c, 0xb5, 0x61, 0x75, 0x32, 0xcb, 0x79, 0xc8, 0x6c, 0x09, - 0x9c, 0xbe, 0xed, 0x72, 0xbd, 0x4f, 0xbb, 0x8c, 0x79, 0x5d, 0x09, 0xc3, 0x9c, 0xe9, 0xd1, 0x30, - 0x9e, 0x1e, 0x87, 0xb2, 0xcc, 0x7b, 0x93, 0x70, 0x5c, 0x33, 0x9d, 0x86, 0xe9, 0x54, 0x98, 0xfb, - 0xb3, 0x06, 0xb7, 0x49, 0x36, 0xf8, 0xa8, 0x87, 0x97, 0x23, 0x17, 0x61, 0x8c, 0x86, 0x08, 0xba, - 0x2d, 0x4c, 0xa3, 0x72, 0x6c, 0x22, 0xfd, 0xc6, 0xbf, 0x1d, 0xa4, 0x53, 0x6a, 0xd4, 0x23, 0xa4, - 0xa7, 0x5c, 0xb6, 0x60, 0x4a, 0x6f, 0x58, 0x75, 0x4c, 0x5f, 0x87, 0x55, 0xbc, 0x67, 0xf1, 0xfc, - 0xbe, 0xc9, 0xf9, 0x4d, 0xfa, 0xe4, 0xcb, 0x82, 0xba, 0xb8, 0x02, 0x13, 0xaa, 0xa6, 0x61, 0x2b, - 0xc4, 0x32, 0x26, 0x7c, 0x09, 0x01, 0x73, 0x9c, 0xd2, 0xe3, 0x56, 0x7a, 0xba, 0xd3, 0x10, 0xbf, - 0xfd, 0xde, 0x40, 0x84, 0xb2, 0x71, 0x0d, 0x1b, 0x0f, 0x1b, 0xd8, 0xbd, 0x6a, 0xda, 0xfb, 0xdc, - 0xbc, 0x0f, 0xb3, 0xae, 0xc4, 0x20, 0xbc, 0x3f, 0x09, 0xd3, 0xec, 0xc1, 0xe9, 0x1d, 0xd5, 0xc1, - 0xa7, 0xaf, 0x3c, 0xba, 0x83, 0x5d, 0xf5, 0xd1, 0xd3, 0x9a, 0xa9, 0x8b, 0x49, 0x3b, 0xc9, 0xc7, - 0x85, 0x3c, 0x9f, 0xe3, 0xcf, 0x3b, 0x44, 0xad, 0x25, 0x48, 0x2d, 0x98, 0xba, 0x41, 0x1c, 0xb3, - 0x8a, 0x0d, 0xb3, 0xc1, 0x63, 0x16, 0x6b, 0xa0, 0xbb, 0x61, 0x48, 0x6d, 0x98, 0x4d, 0xc3, 0x65, - 0x6f, 0xf2, 0x4a, 0x23, 0x5f, 0xbf, 0x31, 0x33, 0xf0, 0xfb, 0x37, 0x66, 0x92, 0xcb, 0x86, 0xab, - 0xf0, 0x47, 0xc5, 0xd4, 0xeb, 0x9f, 0x9e, 0x91, 0xe4, 0x67, 0x60, 0x78, 0x11, 0x6b, 0x87, 0xe1, - 0xb5, 0x88, 0xb5, 0x08, 0xaf, 0x07, 0x20, 0xbd, 0x6c, 0xb8, 0xec, 0xf4, 0xf0, 0x9d, 0x90, 0xd4, - 0x0d, 0x76, 0x20, 0x2d, 0xd2, 0x3f, 0x81, 0x13, 0xd4, 0x45, 0xac, 0x79, 0xa8, 0x55, 0xac, 0x45, - 0x51, 0x09, 0x7b, 0x02, 0x2f, 0x2d, 0xfe, 0xde, 0x7f, 0x9a, 0x1e, 0x78, 0xf9, 0xb5, 0xe9, 0x81, - 0x8e, 0x23, 0x11, 0xcc, 0x15, 0xdc, 0xc4, 0x7c, 0x08, 0x9c, 0xea, 0x3e, 0x9b, 0x47, 0xde, 0x30, - 0x7c, 0x3e, 0x05, 0x77, 0xd2, 0x8b, 0x23, 0x76, 0x43, 0x37, 0xdc, 0xd3, 0x9a, 0x7d, 0x60, 0xb9, - 0x34, 0xb9, 0x98, 0xbb, 0x7c, 0x14, 0x26, 0xfc, 0xc7, 0x73, 0xec, 0x71, 0x87, 0x31, 0xd8, 0x85, - 0xc1, 0x0d, 0x42, 0x47, 0x0c, 0xe7, 0x9a, 0xae, 0x5a, 0xe7, 0x51, 0x83, 0x35, 0x08, 0x94, 0x5d, - 0x36, 0x49, 0x30, 0xa8, 0x2e, 0xee, 0x99, 0xd4, 0xb1, 0xba, 0xcb, 0xce, 0xec, 0x26, 0x69, 0x42, - 0x49, 0x13, 0x00, 0x3d, 0x9e, 0x3b, 0x05, 0x83, 0x6a, 0x93, 0xbd, 0x6e, 0x4e, 0x92, 0x4c, 0x43, - 0x1b, 0xf2, 0x25, 0x18, 0xe6, 0x2f, 0xbd, 0x50, 0x0e, 0x92, 0xfb, 0xf8, 0x80, 0xf6, 0x93, 0x55, - 0xc8, 0x4f, 0x34, 0x07, 0x83, 0x54, 0x78, 0x7e, 0x19, 0x21, 0x3f, 0xd7, 0x22, 0xfd, 0x1c, 0x15, - 0x52, 0x61, 0x68, 0xf2, 0x33, 0x90, 0x5e, 0x34, 0x1b, 0xba, 0x61, 0x86, 0xb9, 0x65, 0x18, 0x37, - 0x2a, 0xb3, 0xd5, 0xe4, 0x63, 0xad, 0xb0, 0x06, 0x3a, 0x0a, 0x43, 0xec, 0x0c, 0x37, 0x7f, 0x65, - 0xce, 0x5b, 0xf2, 0x02, 0x0c, 0x53, 0xde, 0xeb, 0x16, 0x42, 0xfc, 0xf6, 0x0f, 0x3f, 0x2c, 0x4e, - 0xc3, 0x02, 0x67, 0x9f, 0xf0, 0x85, 0x45, 0x90, 0xaa, 0xaa, 0xae, 0xca, 0xf5, 0xa6, 0xbf, 0xe5, - 0xb7, 0x40, 0x9a, 0x33, 0x71, 0xd0, 0x19, 0x48, 0x9a, 0x96, 0xc3, 0x5f, 0x7a, 0x17, 0x3a, 0xa9, - 0xb2, 0x6e, 0x95, 0x52, 0xc4, 0x4b, 0x14, 0x82, 0x5c, 0x52, 0x3a, 0xba, 0xc5, 0x93, 0x01, 0xb7, - 0x08, 0x0c, 0x79, 0xe0, 0x27, 0x1b, 0xd2, 0x16, 0x77, 0xf0, 0x9c, 0xe5, 0x33, 0x09, 0x98, 0x0e, - 0x3c, 0xbd, 0x82, 0x6d, 0xb2, 0xf2, 0x63, 0x1e, 0xc5, 0xbd, 0x05, 0x05, 0x84, 0xe4, 0xcf, 0x3b, - 0xb8, 0xcb, 0x9b, 0x21, 0x39, 0x6f, 0x59, 0xa8, 0x00, 0x69, 0xda, 0xd6, 0x4c, 0xe6, 0x2f, 0x29, - 0xc5, 0x6b, 0x93, 0x67, 0x8e, 0xb9, 0xeb, 0x5e, 0x55, 0x6d, 0xef, 0x9a, 0x93, 0x68, 0xcb, 0x4f, - 0x41, 0x66, 0xc1, 0x34, 0x1c, 0x6c, 0x38, 0x4d, 0x9a, 0x8f, 0x76, 0xea, 0xa6, 0xb6, 0xcf, 0x39, - 0xb0, 0x06, 0x31, 0xb8, 0x6a, 0x59, 0x94, 0x32, 0xa5, 0x90, 0x9f, 0x6c, 0x5e, 0x96, 0x36, 0x3b, - 0x9a, 0xe8, 0xa9, 0xfe, 0x4d, 0xc4, 0x95, 0xf4, 0x6c, 0xf4, 0xbf, 0x25, 0x38, 0xd1, 0x3a, 0xa1, - 0xf6, 0xf1, 0x81, 0xd3, 0xef, 0x7c, 0x7a, 0x1e, 0x32, 0x1b, 0xf4, 0xae, 0xf1, 0x25, 0x7c, 0x80, - 0x0a, 0x30, 0x8c, 0xab, 0x67, 0xce, 0x9e, 0x7d, 0xf4, 0x29, 0xe6, 0xed, 0x17, 0x07, 0x14, 0x01, - 0x40, 0xd3, 0x90, 0x71, 0xb0, 0x66, 0x9d, 0x39, 0x7b, 0x6e, 0xff, 0x51, 0xe6, 0x5e, 0x17, 0x07, - 0x14, 0x1f, 0x54, 0x4c, 0x13, 0xad, 0x5f, 0xff, 0xcc, 0x8c, 0x54, 0x1a, 0x84, 0xa4, 0xd3, 0x6c, - 0xdc, 0x56, 0x1f, 0x79, 0x75, 0x10, 0x66, 0x83, 0x94, 0x34, 0x6b, 0x5f, 0x51, 0xeb, 0x7a, 0x55, - 0xf5, 0x6f, 0x89, 0xe7, 0x02, 0x36, 0xa0, 0x18, 0xed, 0x4d, 0x50, 0xe8, 0x6a, 0x49, 0xf9, 0x37, - 0x24, 0xc8, 0x5e, 0x16, 0x9c, 0x37, 0xb1, 0x8b, 0xce, 0x03, 0x78, 0x3d, 0x89, 0x69, 0x73, 0xc7, - 0x5c, 0xb4, 0xaf, 0x39, 0x8f, 0x46, 0x09, 0xa0, 0xa3, 0x27, 0xa8, 0x23, 0x5a, 0xa6, 0xc3, 0xaf, - 0xbe, 0xc4, 0x90, 0x7a, 0xc8, 0xe8, 0x21, 0x40, 0x34, 0xc2, 0x55, 0xae, 0x98, 0xae, 0x6e, 0xd4, - 0x2a, 0x96, 0x79, 0x95, 0x5f, 0x28, 0x4c, 0x2a, 0x39, 0xfa, 0xe4, 0x32, 0x7d, 0xb0, 0x41, 0xe0, - 0x44, 0xe8, 0x8c, 0xc7, 0x85, 0x94, 0x58, 0x6a, 0xb5, 0x6a, 0x63, 0xc7, 0xe1, 0x41, 0x4c, 0x34, - 0xd1, 0x79, 0x18, 0xb6, 0x9a, 0x3b, 0x15, 0x11, 0x31, 0x46, 0xce, 0x9c, 0x68, 0x37, 0xff, 0x85, - 0x7f, 0xf0, 0x08, 0x30, 0x64, 0x35, 0x77, 0x88, 0xb7, 0xdc, 0x05, 0xd9, 0x36, 0xc2, 0x8c, 0x5c, - 0xf1, 0xe5, 0xa0, 0x57, 0xdc, 0xb9, 0x06, 0x15, 0xcb, 0xd6, 0x4d, 0x5b, 0x77, 0x0f, 0xe8, 0xc9, - 0x95, 0xa4, 0x92, 0x13, 0x0f, 0x36, 0x38, 0x5c, 0xde, 0x87, 0xf1, 0x4d, 0x5a, 0x5b, 0xf8, 0x92, - 0x9f, 0xf5, 0xe5, 0x93, 0xe2, 0xe5, 0xeb, 0x28, 0x59, 0xa2, 0x45, 0xb2, 0xd2, 0xb3, 0x1d, 0xbd, - 0xf3, 0x89, 0xfe, 0xbd, 0x33, 0x9c, 0xed, 0xfe, 0xf8, 0x78, 0x68, 0x72, 0x32, 0xe7, 0x0c, 0x86, - 0xaf, 0x5e, 0x1d, 0x33, 0xae, 0xb2, 0x2e, 0x74, 0x4f, 0xaa, 0x85, 0x98, 0x30, 0x5a, 0x88, 0x9d, - 0x42, 0xf2, 0x53, 0x30, 0xba, 0xa1, 0xda, 0xee, 0x26, 0x76, 0x2f, 0x62, 0xb5, 0x8a, 0xed, 0x70, - 0xd6, 0x1d, 0x15, 0x59, 0x17, 0x41, 0x8a, 0xa6, 0x56, 0x96, 0x75, 0xe8, 0x6f, 0x79, 0x0f, 0x52, - 0xf4, 0xf4, 0x9a, 0x97, 0x91, 0x39, 0x05, 0xcb, 0xc8, 0x24, 0x96, 0x1e, 0xb8, 0xd8, 0x11, 0xcb, - 0x3b, 0xda, 0x40, 0x8f, 0x8b, 0xbc, 0x9a, 0xec, 0x9e, 0x57, 0xb9, 0x23, 0xf2, 0xec, 0x5a, 0x87, - 0xe1, 0x12, 0x09, 0xc5, 0xcb, 0x8b, 0x9e, 0x20, 0x92, 0x2f, 0x08, 0x5a, 0x85, 0x71, 0x4b, 0xb5, - 0x5d, 0x7a, 0x6c, 0x7f, 0x8f, 0x6a, 0xc1, 0x7d, 0x7d, 0xa6, 0x75, 0xe6, 0x85, 0x94, 0xe5, 0xbd, - 0x8c, 0x5a, 0x41, 0xa0, 0xfc, 0x47, 0x29, 0x18, 0xe2, 0xc6, 0x78, 0x33, 0x0c, 0x73, 0xb3, 0x72, - 0xef, 0xbc, 0x73, 0xae, 0x35, 0x31, 0xcd, 0x79, 0x09, 0x84, 0xf3, 0x13, 0x34, 0xe8, 0x3e, 0x48, - 0x6b, 0x7b, 0xaa, 0x6e, 0x54, 0xf4, 0xaa, 0x28, 0xf3, 0x5e, 0xbb, 0x31, 0x33, 0xbc, 0x40, 0x60, - 0xcb, 0x8b, 0xca, 0x30, 0x7d, 0xb8, 0x5c, 0x25, 0x95, 0xc0, 0x1e, 0xd6, 0x6b, 0x7b, 0x2e, 0x9f, - 0x61, 0xbc, 0x85, 0x9e, 0x84, 0x14, 0x71, 0x08, 0x7e, 0xa9, 0xab, 0xd0, 0x52, 0x6c, 0x7b, 0x0b, - 0x9f, 0x52, 0x9a, 0x74, 0xfc, 0xe1, 0x3f, 0x98, 0x91, 0x14, 0x4a, 0x81, 0x16, 0x60, 0xb4, 0xae, - 0x3a, 0x6e, 0x85, 0x66, 0x30, 0xd2, 0xfd, 0x20, 0x65, 0x71, 0xbc, 0xd5, 0x20, 0xdc, 0xb0, 0x5c, - 0xf4, 0x11, 0x42, 0xc5, 0x40, 0x55, 0x74, 0x12, 0x72, 0x94, 0x89, 0x66, 0x36, 0x1a, 0xba, 0xcb, - 0x6a, 0xab, 0x21, 0x6a, 0xf7, 0x31, 0x02, 0x5f, 0xa0, 0x60, 0x5a, 0x61, 0xdd, 0x01, 0x19, 0x7a, - 0x8d, 0x84, 0xa2, 0xb0, 0x23, 0x93, 0x69, 0x02, 0xa0, 0x0f, 0xef, 0x87, 0x71, 0x3f, 0x3e, 0x32, - 0x94, 0x34, 0xe3, 0xe2, 0x83, 0x29, 0xe2, 0x23, 0x30, 0x65, 0xe0, 0x6b, 0xf4, 0x10, 0x67, 0x08, - 0x3b, 0x43, 0xb1, 0x11, 0x79, 0x76, 0x39, 0x4c, 0x71, 0x2f, 0x8c, 0x69, 0xc2, 0xf8, 0x0c, 0x17, - 0x28, 0xee, 0xa8, 0x07, 0xa5, 0x68, 0xc7, 0x21, 0xad, 0x5a, 0x16, 0x43, 0x18, 0xe1, 0xf1, 0xd1, - 0xb2, 0xe8, 0xa3, 0x53, 0x30, 0x41, 0x75, 0xb4, 0xb1, 0xd3, 0xac, 0xbb, 0x9c, 0x49, 0x96, 0xe2, - 0x8c, 0x93, 0x07, 0x0a, 0x83, 0x53, 0xdc, 0xbb, 0x61, 0x14, 0x5f, 0xd1, 0xab, 0xd8, 0xd0, 0x30, - 0xc3, 0x1b, 0xa5, 0x78, 0x59, 0x01, 0xa4, 0x48, 0x0f, 0x80, 0x17, 0xf7, 0x2a, 0x22, 0x26, 0x8f, - 0x31, 0x7e, 0x02, 0x3e, 0xcf, 0xc0, 0x72, 0x1e, 0x52, 0x8b, 0xaa, 0xab, 0x92, 0x02, 0xc3, 0xbd, - 0xc6, 0x12, 0x4d, 0x56, 0x21, 0x3f, 0xe5, 0xd7, 0x13, 0x90, 0xba, 0x6c, 0xba, 0x18, 0x3d, 0x16, - 0x28, 0x00, 0xc7, 0xda, 0xf9, 0xf3, 0xa6, 0x5e, 0x33, 0x70, 0x75, 0xd5, 0xa9, 0x05, 0xee, 0x7c, - 0xfb, 0xee, 0x94, 0x08, 0xb9, 0xd3, 0x14, 0x0c, 0xda, 0x66, 0xd3, 0xa8, 0x8a, 0xd3, 0x86, 0xb4, - 0x81, 0xca, 0x90, 0xf6, 0xbc, 0x24, 0x15, 0xe7, 0x25, 0xe3, 0xc4, 0x4b, 0x88, 0x0f, 0x73, 0x80, - 0x32, 0xbc, 0xc3, 0x9d, 0xa5, 0x04, 0x19, 0x2f, 0x78, 0x71, 0x6f, 0xeb, 0xcd, 0x61, 0x7d, 0x32, - 0x92, 0x4c, 0xbc, 0xb1, 0xf7, 0x8c, 0xc7, 0x3c, 0x2e, 0xe7, 0x3d, 0xe0, 0xd6, 0x0b, 0xb9, 0x15, - 0xbf, 0x7f, 0x3e, 0x4c, 0xf5, 0xf2, 0xdd, 0x8a, 0xdd, 0x41, 0x3f, 0x01, 0x19, 0x47, 0xaf, 0x19, - 0xaa, 0xdb, 0xb4, 0x31, 0xf7, 0x3c, 0x1f, 0x20, 0x7f, 0x55, 0x82, 0x21, 0xe6, 0xc9, 0x01, 0xbb, - 0x49, 0xed, 0xed, 0x96, 0xe8, 0x64, 0xb7, 0xe4, 0xe1, 0xed, 0x36, 0x0f, 0xe0, 0x09, 0xe3, 0xf0, - 0x6b, 0xc1, 0x6d, 0x2a, 0x06, 0x26, 0xe2, 0xa6, 0x5e, 0xe3, 0x13, 0x35, 0x40, 0x24, 0xff, 0x47, - 0x89, 0x14, 0xb1, 0xfc, 0x39, 0x9a, 0x87, 0x51, 0x21, 0x57, 0x65, 0xb7, 0xae, 0xd6, 0xb8, 0xef, - 0xdc, 0xd9, 0x51, 0xb8, 0x0b, 0x75, 0xb5, 0xa6, 0x8c, 0x70, 0x79, 0x48, 0xa3, 0xfd, 0x38, 0x24, - 0x3a, 0x8c, 0x43, 0x68, 0xe0, 0x93, 0x87, 0x1b, 0xf8, 0xd0, 0x10, 0xa5, 0xa2, 0x43, 0xf4, 0xa5, - 0x04, 0x5d, 0xcc, 0x58, 0xa6, 0xa3, 0xd6, 0x7f, 0x1c, 0x33, 0xe2, 0x0e, 0xc8, 0x58, 0x66, 0xbd, - 0xc2, 0x9e, 0xb0, 0x53, 0xb8, 0x69, 0xcb, 0xac, 0x2b, 0x2d, 0xc3, 0x3e, 0x78, 0x8b, 0xa6, 0xcb, - 0xd0, 0x2d, 0xb0, 0xda, 0x70, 0xd4, 0x6a, 0x36, 0x64, 0x99, 0x29, 0x78, 0x2e, 0x7b, 0x84, 0xd8, - 0x80, 0x26, 0x47, 0xa9, 0x35, 0xf7, 0x32, 0xb1, 0x19, 0xa6, 0xc2, 0xf1, 0x08, 0x05, 0x0b, 0xfd, - 0xed, 0x56, 0xc1, 0x41, 0xb7, 0x54, 0x38, 0x9e, 0xfc, 0x37, 0x25, 0x80, 0x15, 0x62, 0x59, 0xaa, - 0x2f, 0xc9, 0x42, 0x0e, 0x15, 0xa1, 0x12, 0xea, 0x79, 0xba, 0xd3, 0xa0, 0xf1, 0xfe, 0xb3, 0x4e, - 0x50, 0xee, 0x05, 0x18, 0xf5, 0x9d, 0xd1, 0xc1, 0x42, 0x98, 0xe9, 0x2e, 0x55, 0xf5, 0x26, 0x76, - 0x95, 0xec, 0x95, 0x40, 0x4b, 0xfe, 0xe7, 0x12, 0x64, 0xa8, 0x4c, 0xab, 0xd8, 0x55, 0x43, 0x63, - 0x28, 0x1d, 0x7e, 0x0c, 0xef, 0x04, 0x60, 0x6c, 0x1c, 0xfd, 0x25, 0xcc, 0x3d, 0x2b, 0x43, 0x21, - 0x9b, 0xfa, 0x4b, 0x18, 0x9d, 0xf3, 0x0c, 0x9e, 0xec, 0x6e, 0x70, 0x51, 0x75, 0x73, 0xb3, 0x1f, - 0x83, 0x61, 0xfa, 0x19, 0x9d, 0x6b, 0x0e, 0x2f, 0xa4, 0x87, 0x8c, 0x66, 0x63, 0xeb, 0x9a, 0x23, - 0xbf, 0x00, 0xc3, 0x5b, 0xd7, 0xd8, 0xde, 0xc8, 0x1d, 0x90, 0xb1, 0x4d, 0x93, 0xe7, 0x64, 0x56, - 0x0b, 0xa5, 0x09, 0x80, 0xa6, 0x20, 0xb1, 0x1f, 0x90, 0xf0, 0xf7, 0x03, 0xfc, 0x0d, 0x8d, 0x64, - 0x4f, 0x1b, 0x1a, 0xa7, 0xfe, 0x9d, 0x04, 0x23, 0x81, 0xf8, 0x80, 0x1e, 0x85, 0x23, 0xa5, 0x95, - 0xf5, 0x85, 0x4b, 0x95, 0xe5, 0xc5, 0xca, 0x85, 0x95, 0xf9, 0x25, 0xff, 0x9e, 0x49, 0xe1, 0xe8, - 0x2b, 0xd7, 0x67, 0x51, 0x00, 0x77, 0xdb, 0xa0, 0xbb, 0xab, 0xe8, 0x34, 0x4c, 0x85, 0x49, 0xe6, - 0x4b, 0x9b, 0xe5, 0xb5, 0xad, 0x9c, 0x54, 0x38, 0xf2, 0xca, 0xf5, 0xd9, 0x89, 0x00, 0xc5, 0xfc, - 0x8e, 0x83, 0x0d, 0xb7, 0x95, 0x60, 0x61, 0x7d, 0x75, 0x75, 0x79, 0x2b, 0x97, 0x68, 0x21, 0xe0, - 0x01, 0xfb, 0x01, 0x98, 0x08, 0x13, 0xac, 0x2d, 0xaf, 0xe4, 0x92, 0x05, 0xf4, 0xca, 0xf5, 0xd9, - 0xb1, 0x00, 0xf6, 0x9a, 0x5e, 0x2f, 0xa4, 0x3f, 0xf8, 0xd9, 0xe9, 0x81, 0x5f, 0xf9, 0xe5, 0x69, - 0x89, 0x68, 0x36, 0x1a, 0x8a, 0x11, 0xe8, 0x21, 0x38, 0xb6, 0xb9, 0xbc, 0xb4, 0x56, 0x5e, 0xac, - 0xac, 0x6e, 0x2e, 0x55, 0xd8, 0xf7, 0x35, 0x3c, 0xed, 0xc6, 0x5f, 0xb9, 0x3e, 0x3b, 0xc2, 0x55, - 0xea, 0x84, 0xbd, 0xa1, 0x94, 0x2f, 0xaf, 0x6f, 0x95, 0x73, 0x12, 0xc3, 0xde, 0xb0, 0xf1, 0x15, - 0xd3, 0x65, 0xdf, 0xd9, 0x7a, 0x04, 0x8e, 0xb7, 0xc1, 0xf6, 0x14, 0x9b, 0x78, 0xe5, 0xfa, 0xec, - 0xe8, 0x86, 0x8d, 0xd9, 0xfc, 0xa1, 0x14, 0x73, 0x90, 0x6f, 0xa5, 0x58, 0xdf, 0x58, 0xdf, 0x9c, - 0x5f, 0xc9, 0xcd, 0x16, 0x72, 0xaf, 0x5c, 0x9f, 0xcd, 0x8a, 0x60, 0x48, 0xf0, 0x7d, 0xcd, 0x6e, - 0xe7, 0x8a, 0xe7, 0x4f, 0xe6, 0xe0, 0x1e, 0xbe, 0x07, 0xe8, 0xb8, 0xea, 0xbe, 0x6e, 0xd4, 0xbc, - 0x9d, 0x56, 0xde, 0xe6, 0x2b, 0x9f, 0xa3, 0x7c, 0xb3, 0x55, 0x40, 0xbb, 0xee, 0xb7, 0x16, 0x3a, - 0xbf, 0x67, 0x2a, 0xc4, 0xbc, 0x8a, 0x89, 0x5f, 0x3a, 0x75, 0xde, 0x9b, 0x2f, 0xc4, 0xec, 0x18, - 0x17, 0xba, 0x2e, 0xee, 0xe4, 0x0f, 0x49, 0x30, 0x76, 0x51, 0x77, 0x5c, 0xd3, 0xd6, 0x35, 0xb5, - 0x4e, 0x6f, 0x97, 0x9c, 0xeb, 0x35, 0xb6, 0x46, 0xa6, 0xfa, 0xd3, 0x30, 0x74, 0x45, 0xad, 0xb3, - 0xa0, 0x96, 0xa4, 0x1f, 0xc3, 0x68, 0x6f, 0x3e, 0x3f, 0xb4, 0x09, 0x06, 0x8c, 0x4c, 0xfe, 0xb5, - 0x04, 0x8c, 0xd3, 0xc9, 0xe0, 0xb0, 0xcf, 0x24, 0x91, 0x35, 0x56, 0x09, 0x52, 0xb6, 0xea, 0xf2, - 0x4d, 0xc3, 0xd2, 0x1c, 0xdf, 0xf9, 0xbd, 0x2f, 0x7e, 0x37, 0x77, 0x6e, 0x11, 0x6b, 0x0a, 0xa5, - 0x45, 0xef, 0x84, 0x74, 0x43, 0xbd, 0x56, 0xa1, 0x7c, 0xd8, 0xca, 0x65, 0xbe, 0x3f, 0x3e, 0x37, - 0x6f, 0xcc, 0x8c, 0x1f, 0xa8, 0x8d, 0x7a, 0x51, 0x16, 0x7c, 0x64, 0x65, 0xb8, 0xa1, 0x5e, 0x23, - 0x22, 0x22, 0x0b, 0xc6, 0x09, 0x54, 0xdb, 0x53, 0x8d, 0x1a, 0x66, 0x9d, 0xd0, 0x2d, 0xd0, 0xd2, - 0xc5, 0xbe, 0x3b, 0x39, 0xea, 0x77, 0x12, 0x60, 0x27, 0x2b, 0xa3, 0x0d, 0xf5, 0xda, 0x02, 0x05, - 0x90, 0x1e, 0x8b, 0xe9, 0x8f, 0x7d, 0x7a, 0x66, 0x80, 0xee, 0xa6, 0x7f, 0x5b, 0x02, 0xf0, 0x2d, - 0x86, 0xde, 0x09, 0x39, 0xcd, 0x6b, 0x51, 0x5a, 0x87, 0x8f, 0xe1, 0xfd, 0x9d, 0xc6, 0x22, 0x62, - 0x6f, 0x96, 0x9b, 0xbf, 0x75, 0x63, 0x46, 0x52, 0xc6, 0xb5, 0xc8, 0x50, 0xbc, 0x03, 0x46, 0x9a, - 0x56, 0x55, 0x75, 0x71, 0x85, 0xae, 0xe3, 0x12, 0xb1, 0x79, 0x7e, 0x9a, 0xf0, 0xba, 0x79, 0x63, - 0x06, 0x31, 0xb5, 0x02, 0xc4, 0x32, 0xcd, 0xfe, 0xc0, 0x20, 0x84, 0x20, 0xa0, 0xd3, 0x37, 0x24, - 0x18, 0x59, 0x0c, 0x9c, 0xfb, 0xca, 0xc3, 0x70, 0xc3, 0x34, 0xf4, 0x7d, 0xee, 0x8f, 0x19, 0x45, - 0x34, 0x51, 0x01, 0xd2, 0xec, 0xc2, 0x9d, 0x7b, 0x20, 0xb6, 0x42, 0x45, 0x9b, 0x50, 0x5d, 0xc5, - 0x3b, 0x8e, 0x2e, 0x46, 0x43, 0x11, 0x4d, 0x74, 0x01, 0x72, 0x0e, 0xd6, 0x9a, 0xb6, 0xee, 0x1e, - 0x54, 0x34, 0xd3, 0x70, 0x55, 0xcd, 0x65, 0x57, 0xb7, 0x4a, 0x77, 0xdc, 0xbc, 0x31, 0x73, 0x8c, - 0xc9, 0x1a, 0xc5, 0x90, 0x95, 0x71, 0x01, 0x5a, 0x60, 0x10, 0xd2, 0x43, 0x15, 0xbb, 0xaa, 0x5e, - 0x77, 0xf2, 0xec, 0xc5, 0x90, 0x68, 0x06, 0x74, 0xf9, 0xc2, 0x70, 0x70, 0x63, 0xeb, 0x02, 0xe4, - 0x4c, 0x0b, 0xdb, 0xa1, 0x42, 0x54, 0x8a, 0xf6, 0x1c, 0xc5, 0x90, 0x95, 0x71, 0x01, 0x12, 0x45, - 0xaa, 0x4b, 0x86, 0x59, 0x2c, 0x14, 0xad, 0xe6, 0x8e, 0xbf, 0x1f, 0x36, 0xd5, 0x32, 0x1a, 0xf3, - 0xc6, 0x41, 0xe9, 0x31, 0x9f, 0x7b, 0x94, 0x4e, 0xfe, 0xe6, 0x97, 0x1f, 0x9e, 0xe2, 0xae, 0xe1, - 0xef, 0x4f, 0x5d, 0xc2, 0x07, 0x64, 0xf8, 0x39, 0xea, 0x06, 0xc5, 0x24, 0x65, 0xe7, 0x0b, 0xaa, - 0x5e, 0x17, 0x57, 0x90, 0x15, 0xde, 0x42, 0x45, 0x18, 0x72, 0x5c, 0xd5, 0x6d, 0x3a, 0xfc, 0xc3, - 0x60, 0x72, 0x27, 0x57, 0x2b, 0x99, 0x46, 0x75, 0x93, 0x62, 0x2a, 0x9c, 0x02, 0x5d, 0x80, 0x21, - 0xd7, 0xdc, 0xc7, 0x06, 0x37, 0x61, 0x5f, 0xf3, 0x9b, 0xbe, 0xa7, 0x62, 0xd4, 0xc4, 0x22, 0x55, - 0x5c, 0xc7, 0x35, 0x56, 0x56, 0xed, 0xa9, 0x64, 0xf5, 0x41, 0xbf, 0x0f, 0x56, 0x5a, 0xee, 0x7b, - 0x12, 0x72, 0x4b, 0x45, 0xf9, 0xc9, 0xca, 0xb8, 0x07, 0xda, 0xa4, 0x10, 0x74, 0x29, 0x74, 0x40, - 0x91, 0x7f, 0x44, 0xef, 0xee, 0x4e, 0xea, 0x07, 0x7c, 0x5a, 0xec, 0x4f, 0x04, 0x8f, 0x37, 0x5e, - 0x80, 0x5c, 0xd3, 0xd8, 0x31, 0x0d, 0x7a, 0x4f, 0x90, 0xd7, 0xf7, 0x64, 0x7d, 0x97, 0x0c, 0x3a, - 0x47, 0x14, 0x43, 0x56, 0xc6, 0x3d, 0xd0, 0x45, 0xb6, 0x0a, 0xa8, 0xc2, 0x98, 0x8f, 0x45, 0x27, - 0x6a, 0x26, 0x76, 0xa2, 0xde, 0xc5, 0x27, 0xea, 0x91, 0x68, 0x2f, 0xfe, 0x5c, 0x1d, 0xf5, 0x80, - 0x84, 0x0c, 0x5d, 0x04, 0xf0, 0xc3, 0x03, 0xdd, 0xa7, 0x18, 0xe9, 0x3c, 0xf0, 0x7e, 0x8c, 0x11, - 0xeb, 0x3d, 0x9f, 0x16, 0xbd, 0x1b, 0x26, 0x1b, 0xba, 0x51, 0x71, 0x70, 0x7d, 0xb7, 0xc2, 0x0d, - 0x4c, 0x58, 0xd2, 0xcf, 0xbc, 0x94, 0x56, 0xfa, 0xf3, 0x87, 0x9b, 0x37, 0x66, 0x0a, 0x3c, 0x84, - 0xb6, 0xb2, 0x94, 0x95, 0x89, 0x86, 0x6e, 0x6c, 0xe2, 0xfa, 0xee, 0xa2, 0x07, 0x2b, 0x66, 0x3f, - 0xf8, 0xe9, 0x99, 0x01, 0x3e, 0x5d, 0x07, 0xe4, 0x73, 0x74, 0xef, 0x9c, 0x4f, 0x33, 0xec, 0x90, - 0x35, 0x89, 0x2a, 0x1a, 0x74, 0x47, 0x23, 0xa3, 0xf8, 0x00, 0x36, 0xcd, 0x5f, 0xfe, 0x0f, 0xb3, - 0x92, 0xfc, 0x05, 0x09, 0x86, 0x16, 0x2f, 0x6f, 0xa8, 0xba, 0x8d, 0x96, 0x61, 0xc2, 0xf7, 0x9c, - 0xf0, 0x24, 0x3f, 0x71, 0xf3, 0xc6, 0x4c, 0x3e, 0xea, 0x5c, 0xde, 0x2c, 0xf7, 0x1d, 0x58, 0x4c, - 0xf3, 0xe5, 0x4e, 0x0b, 0xd7, 0x10, 0xab, 0x16, 0x14, 0xb9, 0x75, 0x59, 0x1b, 0x51, 0xb3, 0x0c, - 0xc3, 0x4c, 0x5a, 0x07, 0x15, 0x61, 0xd0, 0x22, 0x3f, 0xf8, 0x8b, 0x81, 0xe9, 0x8e, 0xce, 0x4b, - 0xf1, 0xbd, 0x8d, 0x4c, 0x42, 0x22, 0x7f, 0x24, 0x01, 0xb0, 0x78, 0xf9, 0xf2, 0x96, 0xad, 0x5b, - 0x75, 0xec, 0xde, 0x4a, 0xcd, 0xb7, 0xe0, 0x48, 0x60, 0x95, 0x64, 0x6b, 0x11, 0xed, 0x67, 0x6f, - 0xde, 0x98, 0x39, 0x11, 0xd5, 0x3e, 0x80, 0x26, 0x2b, 0x93, 0xfe, 0x7a, 0xc9, 0xd6, 0xda, 0x72, - 0xad, 0x3a, 0xae, 0xc7, 0x35, 0xd9, 0x99, 0x6b, 0x00, 0x2d, 0xc8, 0x75, 0xd1, 0x71, 0xdb, 0x9b, - 0x76, 0x13, 0x46, 0x7c, 0x93, 0x38, 0x68, 0x11, 0xd2, 0x2e, 0xff, 0xcd, 0x2d, 0x2c, 0x77, 0xb6, - 0xb0, 0x20, 0xe3, 0x56, 0xf6, 0x28, 0xe5, 0x3f, 0x93, 0x00, 0x7c, 0x9f, 0xfd, 0xe9, 0x74, 0x31, - 0x12, 0xca, 0x79, 0xe0, 0x4d, 0x1e, 0xaa, 0x54, 0xe3, 0xd4, 0x11, 0x7b, 0xfe, 0x5c, 0x02, 0x26, - 0xb7, 0x45, 0xe4, 0xf9, 0xa9, 0xb7, 0xc1, 0x06, 0x0c, 0x63, 0xc3, 0xb5, 0x75, 0x6a, 0x04, 0x32, - 0xda, 0x8f, 0x74, 0x1a, 0xed, 0x36, 0x3a, 0xd1, 0x0f, 0xdd, 0x88, 0x4d, 0x77, 0xce, 0x26, 0x62, - 0x8d, 0x5f, 0x48, 0x42, 0xbe, 0x13, 0x25, 0x5a, 0x80, 0x71, 0xcd, 0xc6, 0x14, 0x50, 0x09, 0xee, - 0xfc, 0x95, 0x0a, 0x7e, 0x65, 0x19, 0x41, 0x90, 0x95, 0x31, 0x01, 0xe1, 0xd9, 0xa3, 0x06, 0xa4, - 0xec, 0x23, 0x6e, 0x47, 0xb0, 0x7a, 0xac, 0xf3, 0x64, 0x9e, 0x3e, 0x44, 0x27, 0x61, 0x06, 0x2c, - 0x7f, 0x8c, 0xf9, 0x50, 0x9a, 0x40, 0x5e, 0x84, 0x71, 0xdd, 0xd0, 0x5d, 0x5d, 0xad, 0x57, 0x76, - 0xd4, 0xba, 0x6a, 0x68, 0x87, 0xa9, 0x9a, 0x59, 0xc8, 0xe7, 0xdd, 0x46, 0xd8, 0xc9, 0xca, 0x18, - 0x87, 0x94, 0x18, 0x00, 0x5d, 0x84, 0x61, 0xd1, 0x55, 0xea, 0x50, 0xd5, 0x86, 0x20, 0x0f, 0x14, - 0x78, 0x3f, 0x9f, 0x84, 0x09, 0x05, 0x57, 0xff, 0xff, 0x50, 0xf4, 0x37, 0x14, 0xab, 0x00, 0x6c, - 0xba, 0x93, 0x00, 0x7b, 0x88, 0xd1, 0x20, 0x01, 0x23, 0xc3, 0x38, 0x2c, 0x3a, 0x6e, 0x60, 0x3c, - 0x6e, 0x24, 0x20, 0x1b, 0x1c, 0x8f, 0xbf, 0xa0, 0x59, 0x09, 0x2d, 0xfb, 0x91, 0x28, 0xc5, 0x3f, - 0x0f, 0xda, 0x21, 0x12, 0xb5, 0x78, 0x6f, 0xf7, 0x10, 0xf4, 0x46, 0x12, 0x86, 0x36, 0x54, 0x5b, - 0x6d, 0x38, 0x48, 0x6b, 0xa9, 0x34, 0xc5, 0xf6, 0x63, 0xcb, 0x47, 0xa0, 0xf9, 0x6e, 0x47, 0x4c, - 0xa1, 0xf9, 0xb1, 0x36, 0x85, 0xe6, 0x5b, 0x61, 0x8c, 0x2c, 0x87, 0x03, 0x47, 0x18, 0x88, 0xb5, - 0x47, 0x4b, 0xc7, 0x7d, 0x2e, 0xe1, 0xe7, 0x6c, 0xb5, 0x7c, 0x39, 0x78, 0x86, 0x61, 0x84, 0x60, - 0xf8, 0x81, 0x99, 0x90, 0x1f, 0xf5, 0x97, 0xa5, 0x81, 0x87, 0xb2, 0x02, 0x0d, 0xf5, 0x5a, 0x99, - 0x35, 0xd0, 0x0a, 0xa0, 0x3d, 0x6f, 0x67, 0xa4, 0xe2, 0x9b, 0x93, 0xd0, 0xdf, 0x79, 0xf3, 0xc6, - 0xcc, 0x71, 0x46, 0xdf, 0x8a, 0x23, 0x2b, 0x13, 0x3e, 0x50, 0x70, 0x7b, 0x1c, 0x80, 0xe8, 0x55, - 0x61, 0xc7, 0xe7, 0xd8, 0x72, 0xe7, 0xc8, 0xcd, 0x1b, 0x33, 0x13, 0x8c, 0x8b, 0xff, 0x4c, 0x56, - 0x32, 0xa4, 0xb1, 0x48, 0x4f, 0xd6, 0xf1, 0xea, 0x38, 0xb2, 0xaa, 0xe7, 0x6b, 0x9b, 0x95, 0xbe, - 0xd7, 0x36, 0x81, 0xea, 0x38, 0xc2, 0x92, 0x55, 0xc7, 0xe1, 0xdd, 0x80, 0xc0, 0xbc, 0xfa, 0xac, - 0x04, 0xc8, 0x4f, 0x38, 0x0a, 0x76, 0x2c, 0xb2, 0x3a, 0x24, 0xcb, 0x80, 0x40, 0xcd, 0x2e, 0x75, - 0x5f, 0x06, 0xf8, 0xf4, 0x62, 0x19, 0x10, 0x98, 0xa7, 0x4f, 0xf9, 0xc1, 0x39, 0xc1, 0xbd, 0xa8, - 0xcd, 0x49, 0xc7, 0xb9, 0x05, 0x53, 0x17, 0xd4, 0x2d, 0xd1, 0x78, 0x40, 0xfe, 0x57, 0x12, 0x1c, - 0x6f, 0xf1, 0x67, 0x4f, 0xd8, 0xbf, 0x04, 0xc8, 0x0e, 0x3c, 0xe4, 0x5f, 0x9a, 0x63, 0x42, 0xf7, - 0x3d, 0x3d, 0x26, 0xec, 0x96, 0xa8, 0x7f, 0xeb, 0xf2, 0x0b, 0x3b, 0x2a, 0xf9, 0xcf, 0x24, 0x98, - 0x0a, 0x76, 0xef, 0x29, 0xb2, 0x06, 0xd9, 0x60, 0xef, 0x5c, 0x85, 0x7b, 0x7a, 0x51, 0x81, 0x4b, - 0x1f, 0xa2, 0x47, 0xcf, 0xfa, 0xc1, 0x82, 0xed, 0xdc, 0x3d, 0xda, 0xb3, 0x35, 0x84, 0x4c, 0xd1, - 0xa0, 0x91, 0xa2, 0xe3, 0xf1, 0x7f, 0x24, 0x48, 0x6d, 0x98, 0x66, 0x1d, 0x99, 0x30, 0x61, 0x98, - 0x6e, 0x85, 0xf8, 0x35, 0xae, 0x56, 0xf8, 0x92, 0x9f, 0x45, 0xe1, 0x85, 0xfe, 0x8c, 0xf4, 0xbd, - 0x1b, 0x33, 0xad, 0xac, 0x94, 0x71, 0xc3, 0x74, 0x4b, 0x14, 0xb2, 0xc5, 0x36, 0x04, 0xde, 0x0d, - 0xa3, 0xe1, 0xce, 0x58, 0x8c, 0x7e, 0xae, 0xef, 0xce, 0xc2, 0x6c, 0x6e, 0xde, 0x98, 0x99, 0xf2, - 0xe7, 0xab, 0x07, 0x96, 0x95, 0xec, 0x4e, 0xa0, 0x77, 0x76, 0xb8, 0xec, 0x07, 0x9f, 0x9e, 0x91, - 0x4e, 0x7d, 0x45, 0x02, 0xf0, 0xf7, 0x3d, 0xd0, 0x43, 0x70, 0xac, 0xb4, 0xbe, 0xb6, 0x58, 0xd9, - 0xdc, 0x9a, 0xdf, 0xda, 0xde, 0xac, 0x6c, 0xaf, 0x6d, 0x6e, 0x94, 0x17, 0x96, 0x2f, 0x2c, 0x97, - 0x17, 0xfd, 0xcd, 0x79, 0xc7, 0xc2, 0x9a, 0xbe, 0xab, 0xe3, 0x2a, 0xba, 0x0f, 0xa6, 0xc2, 0xd8, - 0xa4, 0x55, 0x5e, 0xcc, 0x49, 0x85, 0xec, 0x2b, 0xd7, 0x67, 0xd3, 0xac, 0x12, 0xc4, 0x55, 0x74, - 0x12, 0x8e, 0xb4, 0xe2, 0x2d, 0xaf, 0x2d, 0xe5, 0x12, 0x85, 0xd1, 0x57, 0xae, 0xcf, 0x66, 0xbc, - 0x92, 0x11, 0xc9, 0x80, 0x82, 0x98, 0x9c, 0x5f, 0xb2, 0x00, 0xaf, 0x5c, 0x9f, 0x1d, 0x62, 0x06, - 0x2c, 0xa4, 0x3e, 0xf8, 0xd9, 0xe9, 0x81, 0xd2, 0x85, 0x8e, 0xdb, 0xef, 0x0f, 0x75, 0xb5, 0xdd, - 0x35, 0x6f, 0x4b, 0x3d, 0xb2, 0xe7, 0x3e, 0xdc, 0x71, 0xcf, 0xbd, 0x86, 0x0d, 0xec, 0xe8, 0xce, - 0xa1, 0xf6, 0xdc, 0x7b, 0xda, 0xc7, 0x97, 0x7f, 0x77, 0x10, 0xb2, 0x4b, 0xac, 0x17, 0x32, 0x10, - 0x18, 0xbd, 0x09, 0x86, 0x2c, 0x9a, 0xc4, 0xbc, 0x97, 0x78, 0x1d, 0x1c, 0x9e, 0xa5, 0x3a, 0xef, - 0x24, 0x19, 0x4b, 0x7c, 0x0e, 0x3f, 0x4a, 0xc2, 0x4e, 0xb8, 0xf9, 0x67, 0xb6, 0xb2, 0x7d, 0xed, - 0x36, 0xb1, 0x8a, 0x89, 0x6f, 0xec, 0x44, 0xf9, 0xc9, 0xec, 0x54, 0xca, 0x16, 0x81, 0xb0, 0xb3, - 0x69, 0xef, 0x97, 0xe0, 0x08, 0xc5, 0xf2, 0xcb, 0x00, 0x8a, 0x29, 0x96, 0x1a, 0xa7, 0x3a, 0xa9, - 0xb0, 0xa2, 0x3a, 0xfe, 0x49, 0x13, 0x76, 0x9a, 0xec, 0x1e, 0x9e, 0x86, 0x4f, 0x04, 0x3a, 0x8f, - 0xb2, 0x95, 0x95, 0xc9, 0x7a, 0x0b, 0xa5, 0x83, 0x96, 0x42, 0xc7, 0x09, 0x53, 0xfd, 0x6d, 0xf4, - 0x07, 0x8f, 0x16, 0x3e, 0x03, 0x23, 0x7e, 0x2c, 0x71, 0xf8, 0x7f, 0xc6, 0xe8, 0x3d, 0x77, 0x04, - 0x89, 0xd1, 0x07, 0x24, 0x38, 0xe2, 0xd7, 0x12, 0x41, 0xb6, 0xec, 0x3f, 0x88, 0x3c, 0xd8, 0xc7, - 0x32, 0x2c, 0x6a, 0x9c, 0xb6, 0x7c, 0x65, 0x65, 0xaa, 0xd9, 0x4a, 0x4a, 0x16, 0x80, 0xa3, 0xc1, - 0xc8, 0xea, 0xe4, 0xc5, 0x47, 0xf2, 0x7a, 0x0f, 0xcd, 0x61, 0x06, 0xec, 0xbf, 0x1a, 0x58, 0xa6, - 0xed, 0xe2, 0x2a, 0xdd, 0x0e, 0x4c, 0x2b, 0x5e, 0x5b, 0x5e, 0x03, 0xd4, 0x3a, 0xb8, 0xd1, 0xe3, - 0x93, 0x19, 0xff, 0xf8, 0xe4, 0x14, 0x0c, 0x06, 0x0f, 0x18, 0xb2, 0x46, 0x31, 0xfd, 0x41, 0x9e, - 0x3e, 0x6f, 0xf9, 0x9c, 0xff, 0x17, 0x09, 0x38, 0x15, 0x7c, 0x39, 0xf5, 0x62, 0x13, 0xdb, 0x07, - 0xde, 0x14, 0xb5, 0xd4, 0x9a, 0x6e, 0x04, 0xef, 0x23, 0x1d, 0x0f, 0x26, 0x7c, 0x8a, 0x2b, 0xec, - 0x24, 0x1b, 0x30, 0xb2, 0xa1, 0xd6, 0xb0, 0x82, 0x5f, 0x6c, 0x62, 0xc7, 0x6d, 0x73, 0xc4, 0xfd, - 0x28, 0x0c, 0x99, 0xbb, 0xbb, 0xe2, 0x85, 0x7a, 0x4a, 0xe1, 0x2d, 0xa2, 0x72, 0x5d, 0x6f, 0xe8, - 0xec, 0x2c, 0x5a, 0x4a, 0x61, 0x0d, 0x34, 0x03, 0x23, 0x9a, 0xd9, 0x34, 0xf8, 0x8c, 0xcb, 0xa7, - 0xc4, 0xc7, 0x28, 0x9a, 0x06, 0x9b, 0x71, 0xf2, 0xd3, 0x90, 0x65, 0xfd, 0xf1, 0x8c, 0x7b, 0x1c, - 0xd2, 0xf4, 0x30, 0x97, 0xdf, 0xeb, 0x30, 0x69, 0x5f, 0x62, 0xc7, 0xe1, 0x19, 0x17, 0xd6, 0x31, - 0x6b, 0x94, 0x4a, 0x1d, 0x4d, 0x79, 0x32, 0x3e, 0x34, 0x30, 0x43, 0x79, 0x66, 0xfc, 0xad, 0x41, - 0x38, 0xc2, 0xdf, 0x0f, 0xaa, 0x96, 0x7e, 0x7a, 0xcf, 0x75, 0xc5, 0x55, 0x25, 0xe0, 0x85, 0xb6, - 0x6a, 0xe9, 0xf2, 0x01, 0xa4, 0x2e, 0xba, 0xae, 0x85, 0x4e, 0xc1, 0xa0, 0xdd, 0xac, 0x63, 0xb1, - 0xdf, 0xe4, 0xbd, 0x11, 0x50, 0x2d, 0x7d, 0x8e, 0x20, 0x28, 0xcd, 0x3a, 0x56, 0x18, 0x0a, 0x2a, - 0xc3, 0xcc, 0x6e, 0xb3, 0x5e, 0x3f, 0xa8, 0x54, 0x31, 0xfd, 0xaf, 0x41, 0xde, 0x77, 0xf7, 0xf1, - 0x35, 0x4b, 0x15, 0x5f, 0xef, 0x23, 0xb6, 0x39, 0x41, 0xd1, 0x16, 0x29, 0x96, 0xf8, 0xe6, 0x7e, - 0x59, 0xe0, 0xc8, 0xbf, 0x9f, 0x80, 0xb4, 0x60, 0x4d, 0xcf, 0xa7, 0xe3, 0x3a, 0xd6, 0x5c, 0x53, - 0xbc, 0xaf, 0xf1, 0xda, 0x08, 0x41, 0xb2, 0xc6, 0x87, 0x28, 0x73, 0x71, 0x40, 0x21, 0x0d, 0x02, - 0xf3, 0x6e, 0x0d, 0x10, 0x98, 0xd5, 0x24, 0xa3, 0x96, 0xb2, 0x4c, 0xb1, 0x30, 0xbc, 0x38, 0xa0, - 0xd0, 0x16, 0xca, 0xc3, 0x10, 0x99, 0x19, 0x2e, 0xfb, 0x24, 0x22, 0x81, 0xf3, 0x36, 0x3a, 0x0a, - 0x83, 0x96, 0xea, 0x6a, 0xec, 0x40, 0x1f, 0x79, 0xc0, 0x9a, 0xe8, 0x09, 0x18, 0x62, 0x97, 0x53, - 0xa3, 0xff, 0x92, 0x83, 0x18, 0x83, 0x7d, 0x05, 0x8c, 0xc8, 0xbd, 0xa1, 0xba, 0x2e, 0xb6, 0x0d, - 0xc2, 0x90, 0xa1, 0x23, 0x04, 0xa9, 0x1d, 0xb3, 0x7a, 0xc0, 0xff, 0x4d, 0x08, 0xfd, 0xcd, 0xff, - 0x2f, 0x01, 0xf5, 0x87, 0x0a, 0x7d, 0xc8, 0xfe, 0x3b, 0x52, 0x56, 0x00, 0x4b, 0x04, 0xa9, 0x0c, - 0x93, 0x6a, 0xb5, 0xaa, 0xb3, 0xff, 0xd8, 0x51, 0xd9, 0xd1, 0x69, 0x84, 0x70, 0xe8, 0xff, 0xbe, - 0xea, 0x34, 0x16, 0xc8, 0x27, 0x28, 0x71, 0xfc, 0x52, 0x06, 0x86, 0x2d, 0x26, 0x94, 0x7c, 0x1e, - 0x26, 0x5a, 0x24, 0x25, 0xf2, 0xed, 0xeb, 0x46, 0x55, 0x5c, 0xa5, 0x20, 0xbf, 0x09, 0x8c, 0x7e, - 0xb7, 0x8f, 0xbd, 0x09, 0xa3, 0xbf, 0x4b, 0xef, 0xed, 0x7c, 0xfb, 0x6c, 0x2c, 0x70, 0xfb, 0x4c, - 0xb5, 0xf4, 0x52, 0x86, 0xf2, 0xe7, 0x77, 0xce, 0xe6, 0x5b, 0xef, 0x9c, 0xd5, 0xb0, 0x21, 0xb2, - 0x2f, 0x79, 0xa4, 0x5a, 0xba, 0x43, 0xdd, 0xd1, 0xff, 0x8e, 0xa0, 0x73, 0x3e, 0xf0, 0x9b, 0x5e, - 0x41, 0x4b, 0x2d, 0xcd, 0x6f, 0x2c, 0x7b, 0x7e, 0xfc, 0xb5, 0x04, 0x9c, 0x08, 0xf8, 0x71, 0x00, - 0xb9, 0xd5, 0x9d, 0x0b, 0xed, 0x3d, 0xbe, 0x87, 0xab, 0x67, 0x97, 0x20, 0x45, 0xf0, 0x51, 0xcc, - 0x7f, 0x0d, 0xc8, 0xff, 0xfa, 0x37, 0xff, 0xa9, 0x1c, 0x7e, 0x67, 0x16, 0x1a, 0x15, 0xca, 0xa4, - 0xf4, 0x81, 0xde, 0xed, 0x97, 0xf3, 0x3f, 0xa1, 0xe8, 0xdc, 0x3a, 0x33, 0x46, 0x6d, 0xf8, 0xdd, - 0xb3, 0x20, 0x77, 0x28, 0x79, 0x58, 0xc4, 0xec, 0x5e, 0x44, 0xf5, 0x11, 0x8e, 0x3b, 0xdd, 0x3e, - 0xe8, 0x36, 0x82, 0x3d, 0x96, 0x63, 0xd7, 0xe0, 0xe8, 0xb3, 0xa4, 0x6f, 0x7f, 0x91, 0x2e, 0x02, - 0xfb, 0x51, 0xef, 0x5d, 0xa2, 0xc4, 0xff, 0xf5, 0x98, 0x78, 0x4f, 0x08, 0xbe, 0x7c, 0x7c, 0x81, - 0x78, 0xdf, 0x5c, 0xc7, 0x7c, 0x31, 0x17, 0x48, 0x16, 0x4a, 0x80, 0x52, 0xfe, 0x55, 0x09, 0x8e, - 0xb5, 0x74, 0xcd, 0x63, 0xfc, 0x52, 0x9b, 0x8b, 0x12, 0x87, 0xaa, 0x6c, 0x96, 0xda, 0x08, 0x7b, - 0x7f, 0xac, 0xb0, 0x4c, 0x8a, 0x90, 0xb4, 0x6f, 0x81, 0x23, 0x61, 0x61, 0x85, 0x99, 0xee, 0x85, - 0xb1, 0xf0, 0x7e, 0x34, 0x37, 0xd7, 0x68, 0x68, 0x47, 0x5a, 0xae, 0x44, 0xed, 0xec, 0xe9, 0x5a, - 0x86, 0x8c, 0x87, 0xca, 0x4b, 0xe0, 0x9e, 0x55, 0xf5, 0x29, 0xe5, 0x8f, 0x48, 0x30, 0x1b, 0xee, - 0x21, 0x50, 0x0c, 0xf5, 0x27, 0xec, 0x2d, 0x1b, 0xe2, 0xd7, 0x25, 0xb8, 0xab, 0x8b, 0x4c, 0xdc, - 0x00, 0x2f, 0xc1, 0x54, 0x60, 0x27, 0x40, 0x84, 0x70, 0x31, 0xec, 0xa7, 0xe2, 0xcb, 0x50, 0x6f, - 0xe1, 0x7b, 0x07, 0x31, 0xca, 0xe7, 0xff, 0x60, 0x66, 0xb2, 0xf5, 0x99, 0xa3, 0x4c, 0xb6, 0xae, - 0xde, 0x6f, 0xa1, 0x7f, 0xbc, 0x2a, 0xc1, 0x03, 0x61, 0x55, 0xdb, 0xd4, 0xb3, 0x3f, 0xa9, 0x71, - 0xf8, 0xf7, 0x12, 0x9c, 0xea, 0x45, 0x38, 0x3e, 0x20, 0x3b, 0x30, 0xe9, 0x57, 0xda, 0xd1, 0xf1, - 0xe8, 0xab, 0x7e, 0x67, 0x5e, 0x8a, 0x3c, 0x6e, 0xb7, 0xc1, 0xf0, 0x16, 0x9f, 0x58, 0xc1, 0x21, - 0xf7, 0x8c, 0x1c, 0xde, 0x4b, 0x16, 0x46, 0x0e, 0xed, 0x26, 0xb7, 0x19, 0x8b, 0x44, 0x9b, 0xb1, - 0xf0, 0x4b, 0x73, 0xf9, 0x0a, 0x8f, 0x5b, 0x6d, 0xf6, 0xe0, 0xde, 0x01, 0x93, 0x6d, 0x5c, 0x99, - 0xcf, 0xea, 0x3e, 0x3c, 0x59, 0x41, 0xad, 0xce, 0x2a, 0x1f, 0xc0, 0x0c, 0xed, 0xb7, 0x8d, 0xa1, - 0x6f, 0xb7, 0xca, 0x0d, 0x1e, 0x5b, 0xda, 0x76, 0xcd, 0x75, 0x5f, 0x86, 0x21, 0x36, 0xce, 0x5c, - 0xdd, 0x43, 0x38, 0x0a, 0x67, 0x20, 0x7f, 0x42, 0xc4, 0xb2, 0x45, 0x21, 0x76, 0xfb, 0x39, 0xd4, - 0x8b, 0xae, 0xb7, 0x68, 0x0e, 0x05, 0x8c, 0xf1, 0x6d, 0x11, 0xd5, 0xda, 0x4b, 0xc7, 0xcd, 0xa1, - 0xdd, 0xb2, 0xa8, 0xc6, 0x6c, 0x73, 0x7b, 0xc3, 0xd7, 0x2f, 0x8b, 0xf0, 0xe5, 0xe9, 0x14, 0x13, - 0xbe, 0x7e, 0x32, 0xa6, 0xf7, 0x02, 0x59, 0x8c, 0x98, 0x7f, 0x1e, 0x03, 0xd9, 0x0f, 0x24, 0x38, - 0x4e, 0x75, 0x0b, 0x6e, 0x44, 0xf4, 0x6b, 0xf2, 0x87, 0x00, 0x39, 0xb6, 0x56, 0x69, 0x3b, 0xbb, - 0x73, 0x8e, 0xad, 0x5d, 0x0e, 0xe5, 0x97, 0x87, 0x00, 0x55, 0x43, 0xdb, 0x4d, 0x14, 0x9b, 0x9d, - 0xd1, 0xcb, 0x55, 0x03, 0xbb, 0x19, 0x6d, 0x86, 0x33, 0x75, 0x0b, 0x86, 0xf3, 0x5b, 0x12, 0x14, - 0xda, 0xa9, 0xcc, 0x87, 0x4f, 0x87, 0xa3, 0xa1, 0x97, 0x04, 0xd1, 0x11, 0x7c, 0xa8, 0x97, 0xad, - 0x9c, 0xc8, 0x34, 0x3a, 0x62, 0xe3, 0xdb, 0x5d, 0x07, 0xcc, 0x84, 0x3d, 0xb4, 0xb5, 0xb2, 0xfe, - 0x89, 0x4d, 0x9f, 0x2f, 0xb7, 0xc4, 0xd5, 0x3f, 0x17, 0xb5, 0xf7, 0x35, 0x98, 0xee, 0x20, 0xf5, - 0xed, 0xce, 0x7b, 0x7b, 0x1d, 0x07, 0xf3, 0x56, 0x97, 0xef, 0x8f, 0xf3, 0x99, 0x10, 0x3e, 0xff, - 0x1d, 0x58, 0x8b, 0xb5, 0xbb, 0x40, 0x26, 0xbf, 0x0d, 0xee, 0x68, 0x4b, 0xc5, 0x65, 0x2b, 0x42, - 0x6a, 0x4f, 0x77, 0x5c, 0x2e, 0xd6, 0x7d, 0x9d, 0xc4, 0x8a, 0x50, 0x53, 0x1a, 0x19, 0x41, 0x8e, - 0xb2, 0xde, 0x30, 0xcd, 0x3a, 0x17, 0x43, 0xbe, 0x04, 0x13, 0x01, 0x18, 0xef, 0xe4, 0x1c, 0xa4, - 0x2c, 0x93, 0x7f, 0x1c, 0x61, 0xe4, 0xcc, 0x89, 0x8e, 0xbb, 0xf7, 0xa6, 0x59, 0xe7, 0x6a, 0x53, - 0x7c, 0x79, 0x0a, 0x10, 0x63, 0x46, 0x37, 0xf2, 0x45, 0x17, 0x9b, 0x30, 0x19, 0x82, 0xf2, 0x4e, - 0x7e, 0xa4, 0x97, 0x04, 0x67, 0xbe, 0x77, 0x04, 0x06, 0x29, 0x57, 0xf4, 0x71, 0x09, 0x20, 0xf0, - 0x3e, 0x7a, 0xae, 0x13, 0x9b, 0xf6, 0x6b, 0xe2, 0xc2, 0xe9, 0x9e, 0xf1, 0x79, 0xcd, 0x76, 0xea, - 0xbd, 0xff, 0xe6, 0xbb, 0x1f, 0x4d, 0xdc, 0x83, 0xe4, 0xd3, 0x1d, 0x56, 0xe3, 0x81, 0xf9, 0xf2, - 0xb9, 0xd0, 0xcd, 0xfb, 0x87, 0x7b, 0xeb, 0x4a, 0x48, 0x36, 0xd7, 0x2b, 0x3a, 0x17, 0xec, 0x3c, - 0x15, 0xec, 0x2c, 0x7a, 0x2c, 0x5e, 0xb0, 0xd3, 0xef, 0x0a, 0x4f, 0x9a, 0xf7, 0xa0, 0xdf, 0x95, - 0x60, 0xaa, 0xdd, 0x92, 0x0e, 0x3d, 0xd9, 0x9b, 0x14, 0xad, 0x25, 0x45, 0xe1, 0xa9, 0x43, 0x50, - 0x72, 0x55, 0x96, 0xa8, 0x2a, 0xf3, 0xe8, 0xe9, 0x43, 0xa8, 0x72, 0x3a, 0xb8, 0xbf, 0xff, 0xbf, - 0x24, 0xb8, 0xb3, 0xeb, 0x0a, 0x09, 0xcd, 0xf7, 0x26, 0x65, 0x97, 0xda, 0xa9, 0x50, 0xfa, 0x51, - 0x58, 0x70, 0x8d, 0x9f, 0xa5, 0x1a, 0x5f, 0x42, 0xcb, 0x87, 0xd1, 0xb8, 0xed, 0x4b, 0x14, 0xf4, - 0xdb, 0xe1, 0x73, 0x8d, 0xdd, 0xdd, 0xa9, 0x65, 0xe1, 0x11, 0x33, 0x31, 0x5a, 0x8b, 0x5a, 0xf9, - 0x79, 0xaa, 0x82, 0x82, 0x36, 0x7e, 0xc4, 0x41, 0x3b, 0xfd, 0xae, 0x70, 0xe0, 0x7f, 0x0f, 0xfa, - 0x9f, 0x52, 0xfb, 0x63, 0x8a, 0x4f, 0x74, 0x15, 0xb1, 0xf3, 0xa2, 0xaa, 0xf0, 0x64, 0xff, 0x84, - 0x5c, 0xc9, 0x06, 0x55, 0xb2, 0x86, 0xf0, 0xad, 0x56, 0xb2, 0xed, 0x20, 0xa2, 0x6f, 0x48, 0x30, - 0xd5, 0x6e, 0x4d, 0x12, 0x33, 0x2d, 0xbb, 0x2c, 0xb2, 0x62, 0xa6, 0x65, 0xb7, 0x05, 0x90, 0xfc, - 0x26, 0xaa, 0xfc, 0x39, 0xf4, 0x78, 0x27, 0xe5, 0xbb, 0x8e, 0x22, 0x99, 0x8b, 0x5d, 0x8b, 0xfc, - 0x98, 0xb9, 0xd8, 0xcb, 0x3a, 0x26, 0x66, 0x2e, 0xf6, 0xb4, 0xc6, 0x88, 0x9f, 0x8b, 0x9e, 0x66, - 0x3d, 0x0e, 0xa3, 0x83, 0xbe, 0x26, 0xc1, 0x68, 0xa8, 0x22, 0x46, 0x8f, 0x76, 0x15, 0xb4, 0xdd, - 0x82, 0xa1, 0x70, 0xa6, 0x1f, 0x12, 0xae, 0xcb, 0x32, 0xd5, 0x65, 0x01, 0xcd, 0x1f, 0x46, 0x97, - 0xf0, 0xbb, 0xd2, 0x6f, 0x49, 0x30, 0xd9, 0xa6, 0xca, 0x8c, 0x99, 0x85, 0x9d, 0x8b, 0xe6, 0xc2, - 0x93, 0xfd, 0x13, 0x72, 0xad, 0x2e, 0x50, 0xad, 0xde, 0x8a, 0xde, 0x72, 0x18, 0xad, 0x02, 0xf9, - 0xf9, 0x86, 0x7f, 0xee, 0x2a, 0xd0, 0x0f, 0x3a, 0xd7, 0xa7, 0x60, 0x42, 0xa1, 0x27, 0xfa, 0xa6, - 0xe3, 0xfa, 0x3c, 0x47, 0xf5, 0x79, 0x16, 0xad, 0xff, 0x68, 0xfa, 0xb4, 0xa6, 0xf5, 0x2f, 0xb5, - 0xde, 0x3f, 0xec, 0xee, 0x45, 0x6d, 0x8b, 0xd5, 0xc2, 0x63, 0x7d, 0xd1, 0x70, 0xa5, 0x9e, 0xa4, - 0x4a, 0x9d, 0x41, 0x8f, 0x74, 0x52, 0x2a, 0x70, 0xb4, 0x4f, 0x37, 0x76, 0xcd, 0xd3, 0xef, 0x62, - 0x25, 0xf0, 0x7b, 0xd0, 0xcf, 0x8a, 0x83, 0x4d, 0x27, 0xbb, 0xf6, 0x1b, 0xa8, 0x63, 0x0b, 0x0f, - 0xf4, 0x80, 0xc9, 0xe5, 0xba, 0x87, 0xca, 0x35, 0x8d, 0x4e, 0x74, 0x92, 0x8b, 0xd4, 0xb2, 0xe8, - 0x43, 0x92, 0x77, 0x12, 0xf3, 0x54, 0x77, 0xde, 0xc1, 0x62, 0xb7, 0xf0, 0x60, 0x4f, 0xb8, 0x5c, - 0x92, 0xfb, 0xa8, 0x24, 0xb3, 0x68, 0xba, 0xa3, 0x24, 0xac, 0xf4, 0xbd, 0xd5, 0x27, 0x07, 0x5e, - 0x39, 0x06, 0x33, 0x1d, 0x7a, 0x74, 0xaf, 0xc5, 0xbc, 0xe3, 0xea, 0x72, 0x0d, 0x37, 0xf6, 0x9a, - 0x6d, 0x87, 0x8b, 0xbd, 0x87, 0xbf, 0x7c, 0xdb, 0xdb, 0x0b, 0xb1, 0x7f, 0x9d, 0x02, 0xb4, 0xea, - 0xd4, 0x16, 0x6c, 0xcc, 0xfe, 0xdd, 0x1e, 0x9f, 0xe5, 0x91, 0xfb, 0x65, 0xd2, 0x8f, 0x74, 0xbf, - 0x6c, 0x35, 0x74, 0x63, 0x2b, 0xd1, 0xdf, 0xad, 0xd0, 0x9e, 0xaf, 0x6d, 0x25, 0x7f, 0x2c, 0xd7, - 0xb6, 0xda, 0x9f, 0xea, 0x4e, 0xdd, 0xba, 0xeb, 0x1f, 0x83, 0x87, 0xbd, 0x02, 0xc3, 0x6f, 0x63, - 0x0e, 0x75, 0xb9, 0x8d, 0x99, 0xef, 0x78, 0xe5, 0x92, 0x53, 0xa3, 0xb3, 0xe2, 0x63, 0xc2, 0xc3, - 0xbd, 0x9d, 0x84, 0xe5, 0x5f, 0x1b, 0xf6, 0xb7, 0x10, 0x4e, 0x40, 0xa1, 0xd5, 0x9d, 0xbc, 0x49, - 0xfd, 0xd1, 0x24, 0xe4, 0x56, 0x9d, 0x5a, 0xb9, 0xaa, 0xbb, 0xb7, 0xc9, 0xd7, 0x9e, 0xee, 0x7c, - 0xa5, 0x06, 0xdd, 0xbc, 0x31, 0x33, 0xc6, 0x6c, 0xda, 0xc5, 0x92, 0x0d, 0x18, 0x8f, 0x1e, 0x79, - 0x66, 0x9e, 0xb5, 0x78, 0x98, 0xfb, 0xd4, 0x2d, 0x47, 0x9d, 0xc7, 0xc2, 0x57, 0x9b, 0xd1, 0xb5, - 0xf6, 0xce, 0xcc, 0x1c, 0xea, 0xe2, 0xed, 0xbc, 0x7f, 0xe8, 0x8f, 0x59, 0x01, 0xf2, 0xd1, 0x41, - 0xf1, 0x46, 0xec, 0x8f, 0x24, 0x18, 0x59, 0x75, 0x44, 0x29, 0x88, 0x7f, 0x4a, 0x6f, 0x3f, 0x3d, - 0xe1, 0x7d, 0x05, 0x36, 0xd9, 0x9b, 0xdf, 0x8a, 0x2f, 0xc3, 0xfa, 0x46, 0x38, 0x02, 0x93, 0x01, - 0x3d, 0x3d, 0xfd, 0x7f, 0x27, 0x41, 0xe3, 0x63, 0x09, 0xd7, 0x74, 0xc3, 0xab, 0x22, 0xf1, 0x5f, - 0xd4, 0xbb, 0x1d, 0xbe, 0x9d, 0x53, 0x87, 0xb5, 0xf3, 0x3e, 0x0d, 0x10, 0x11, 0x7b, 0x7a, 0x1b, - 0x5f, 0xab, 0xad, 0x37, 0x8f, 0xa4, 0x3e, 0x3e, 0xea, 0x13, 0xb9, 0x5f, 0x24, 0xbf, 0x2e, 0xc1, - 0xe8, 0xaa, 0x53, 0xdb, 0x36, 0xaa, 0xff, 0xcf, 0xfb, 0xef, 0x2e, 0x1c, 0x09, 0x69, 0x7a, 0x9b, - 0x4c, 0x7a, 0xe6, 0xd5, 0x14, 0x24, 0x57, 0x9d, 0x1a, 0x7a, 0x11, 0xc6, 0xa3, 0x45, 0x43, 0xc7, - 0x5a, 0xb0, 0x35, 0x23, 0x74, 0x5e, 0xaf, 0x75, 0xce, 0x1e, 0x68, 0x1f, 0x46, 0xc3, 0x99, 0xe3, - 0x64, 0x17, 0x26, 0x21, 0xcc, 0xc2, 0x23, 0xbd, 0x62, 0x7a, 0x9d, 0xbd, 0x13, 0xd2, 0x5e, 0xd0, - 0xbb, 0xbb, 0x0b, 0xb5, 0x40, 0xea, 0x5c, 0xdd, 0xb6, 0x09, 0x2b, 0xc4, 0x7a, 0xd1, 0x90, 0xd2, - 0xcd, 0x7a, 0x11, 0xdc, 0xae, 0xd6, 0xeb, 0x34, 0xb5, 0x76, 0x00, 0x02, 0xf3, 0xe0, 0xde, 0x2e, - 0x1c, 0x7c, 0xb4, 0xc2, 0xc3, 0x3d, 0xa1, 0x79, 0x2f, 0x9d, 0x6e, 0x71, 0x31, 0xfe, 0x7f, 0x03, - 0x00, 0x00, 0xff, 0xff, 0xa4, 0x8b, 0x68, 0x27, 0xe4, 0x94, 0x00, 0x00, - } - r := bytes.NewReader(gzipped) - gzipr, err := compress_gzip.NewReader(r) - if err != nil { - panic(err) - } - ungzipped, err := io_ioutil.ReadAll(gzipr) - if err != nil { - panic(err) - } - if err := github_com_gogo_protobuf_proto.Unmarshal(ungzipped, d); err != nil { - panic(err) - } - return d -} -func (this *CommissionRates) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*CommissionRates) - if !ok { - that2, ok := that.(CommissionRates) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.Rate.Equal(that1.Rate) { - return false - } - if !this.MaxRate.Equal(that1.MaxRate) { - return false - } - if !this.MaxChangeRate.Equal(that1.MaxChangeRate) { - return false - } - return true -} -func (this *Commission) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Commission) - if !ok { - that2, ok := that.(Commission) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.CommissionRates.Equal(&that1.CommissionRates) { - return false - } - if !this.UpdateTime.Equal(that1.UpdateTime) { - return false - } - return true -} -func (this *Description) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Description) - if !ok { - that2, ok := that.(Description) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Moniker != that1.Moniker { - return false - } - if this.Identity != that1.Identity { - return false - } - if this.Website != that1.Website { - return false - } - if this.SecurityContact != that1.SecurityContact { - return false - } - if this.Details != that1.Details { - return false - } - return true -} -func (this *UnbondingDelegationEntry) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*UnbondingDelegationEntry) - if !ok { - that2, ok := that.(UnbondingDelegationEntry) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.CreationHeight != that1.CreationHeight { - return false - } - if !this.CompletionTime.Equal(that1.CompletionTime) { - return false - } - if !this.InitialBalance.Equal(that1.InitialBalance) { - return false - } - if !this.Balance.Equal(that1.Balance) { - return false - } - return true -} -func (this *RedelegationEntry) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*RedelegationEntry) - if !ok { - that2, ok := that.(RedelegationEntry) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.CreationHeight != that1.CreationHeight { - return false - } - if !this.CompletionTime.Equal(that1.CompletionTime) { - return false - } - if !this.InitialBalance.Equal(that1.InitialBalance) { - return false - } - if !this.SharesDst.Equal(that1.SharesDst) { - return false - } - return true -} -func (this *Params) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Params) - if !ok { - that2, ok := that.(Params) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.UnbondingTime != that1.UnbondingTime { - return false - } - if this.MaxValidators != that1.MaxValidators { - return false - } - if this.MaxEntries != that1.MaxEntries { - return false - } - if this.HistoricalEntries != that1.HistoricalEntries { - return false - } - if this.BondDenom != that1.BondDenom { - return false - } - if !this.MinCommissionRate.Equal(that1.MinCommissionRate) { - return false - } - return true -} -func (this *RedelegationEntryResponse) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*RedelegationEntryResponse) - if !ok { - that2, ok := that.(RedelegationEntryResponse) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.RedelegationEntry.Equal(&that1.RedelegationEntry) { - return false - } - if !this.Balance.Equal(that1.Balance) { - return false - } - return true -} -func (this *Pool) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Pool) - if !ok { - that2, ok := that.(Pool) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.NotBondedTokens.Equal(that1.NotBondedTokens) { - return false - } - if !this.BondedTokens.Equal(that1.BondedTokens) { - return false - } - return true -} -func (m *HistoricalInfo) 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 *HistoricalInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *HistoricalInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Valset) > 0 { - for iNdEx := len(m.Valset) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Valset[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *CommissionRates) 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 *CommissionRates) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommissionRates) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.MaxChangeRate.Size() - i -= size - if _, err := m.MaxChangeRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.MaxRate.Size() - i -= size - if _, err := m.MaxRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.Rate.Size() - i -= size - if _, err := m.Rate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Commission) 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 *Commission) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Commission) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.UpdateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.UpdateTime):]) - if err2 != nil { - return 0, err2 - } - i -= n2 - i = encodeVarintStaking(dAtA, i, uint64(n2)) - i-- - dAtA[i] = 0x12 - { - size, err := m.CommissionRates.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Description) 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 *Description) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Description) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Details) > 0 { - i -= len(m.Details) - copy(dAtA[i:], m.Details) - i = encodeVarintStaking(dAtA, i, uint64(len(m.Details))) - i-- - dAtA[i] = 0x2a - } - if len(m.SecurityContact) > 0 { - i -= len(m.SecurityContact) - copy(dAtA[i:], m.SecurityContact) - i = encodeVarintStaking(dAtA, i, uint64(len(m.SecurityContact))) - i-- - dAtA[i] = 0x22 - } - if len(m.Website) > 0 { - i -= len(m.Website) - copy(dAtA[i:], m.Website) - i = encodeVarintStaking(dAtA, i, uint64(len(m.Website))) - i-- - dAtA[i] = 0x1a - } - if len(m.Identity) > 0 { - i -= len(m.Identity) - copy(dAtA[i:], m.Identity) - i = encodeVarintStaking(dAtA, i, uint64(len(m.Identity))) - i-- - dAtA[i] = 0x12 - } - if len(m.Moniker) > 0 { - i -= len(m.Moniker) - copy(dAtA[i:], m.Moniker) - i = encodeVarintStaking(dAtA, i, uint64(len(m.Moniker))) - 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 - { - size := m.MinSelfDelegation.Size() - i -= size - if _, err := m.MinSelfDelegation.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x5a - { - size, err := m.Commission.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - n5, err5 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.UnbondingTime):]) - if err5 != nil { - return 0, err5 - } - i -= n5 - i = encodeVarintStaking(dAtA, i, uint64(n5)) - i-- - dAtA[i] = 0x4a - if m.UnbondingHeight != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingHeight)) - i-- - dAtA[i] = 0x40 - } - { - size, err := m.Description.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - { - size := m.DelegatorShares.Size() - i -= size - if _, err := m.DelegatorShares.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size := m.Tokens.Size() - i -= size - if _, err := m.Tokens.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - if m.Status != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.Status)) - i-- - dAtA[i] = 0x20 - } - if m.Jailed { - i-- - if m.Jailed { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.ConsensusPubkey != nil { - { - size, err := m.ConsensusPubkey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.OperatorAddress) > 0 { - i -= len(m.OperatorAddress) - copy(dAtA[i:], m.OperatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.OperatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ValAddresses) 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 *ValAddresses) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ValAddresses) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = 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 = encodeVarintStaking(dAtA, i, uint64(len(m.Addresses[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *DVPair) 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 *DVPair) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DVPair) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ValidatorAddress) > 0 { - i -= len(m.ValidatorAddress) - copy(dAtA[i:], m.ValidatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DelegatorAddress) > 0 { - i -= len(m.DelegatorAddress) - copy(dAtA[i:], m.DelegatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *DVPairs) 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 *DVPairs) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DVPairs) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Pairs) > 0 { - for iNdEx := len(m.Pairs) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Pairs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *DVVTriplet) 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 *DVVTriplet) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DVVTriplet) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ValidatorDstAddress) > 0 { - i -= len(m.ValidatorDstAddress) - copy(dAtA[i:], m.ValidatorDstAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorDstAddress))) - i-- - dAtA[i] = 0x1a - } - if len(m.ValidatorSrcAddress) > 0 { - i -= len(m.ValidatorSrcAddress) - copy(dAtA[i:], m.ValidatorSrcAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorSrcAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DelegatorAddress) > 0 { - i -= len(m.DelegatorAddress) - copy(dAtA[i:], m.DelegatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *DVVTriplets) 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 *DVVTriplets) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DVVTriplets) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Triplets) > 0 { - for iNdEx := len(m.Triplets) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Triplets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *Delegation) 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 *Delegation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Delegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Shares.Size() - i -= size - if _, err := m.Shares.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if len(m.ValidatorAddress) > 0 { - i -= len(m.ValidatorAddress) - copy(dAtA[i:], m.ValidatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DelegatorAddress) > 0 { - i -= len(m.DelegatorAddress) - copy(dAtA[i:], m.DelegatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *UnbondingDelegation) 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 *UnbondingDelegation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *UnbondingDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Entries) > 0 { - for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.ValidatorAddress) > 0 { - i -= len(m.ValidatorAddress) - copy(dAtA[i:], m.ValidatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DelegatorAddress) > 0 { - i -= len(m.DelegatorAddress) - copy(dAtA[i:], m.DelegatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *UnbondingDelegationEntry) 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 *UnbondingDelegationEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Balance.Size() - i -= size - if _, err := m.Balance.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.InitialBalance.Size() - i -= size - if _, err := m.InitialBalance.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) - if err8 != nil { - return 0, err8 - } - i -= n8 - i = encodeVarintStaking(dAtA, i, uint64(n8)) - i-- - dAtA[i] = 0x12 - if m.CreationHeight != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.CreationHeight)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *RedelegationEntry) 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 *RedelegationEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.SharesDst.Size() - i -= size - if _, err := m.SharesDst.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.InitialBalance.Size() - i -= size - if _, err := m.InitialBalance.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) - if err9 != nil { - return 0, err9 - } - i -= n9 - i = encodeVarintStaking(dAtA, i, uint64(n9)) - i-- - dAtA[i] = 0x12 - if m.CreationHeight != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.CreationHeight)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Redelegation) 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 *Redelegation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Redelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Entries) > 0 { - for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.ValidatorDstAddress) > 0 { - i -= len(m.ValidatorDstAddress) - copy(dAtA[i:], m.ValidatorDstAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorDstAddress))) - i-- - dAtA[i] = 0x1a - } - if len(m.ValidatorSrcAddress) > 0 { - i -= len(m.ValidatorSrcAddress) - copy(dAtA[i:], m.ValidatorSrcAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorSrcAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DelegatorAddress) > 0 { - i -= len(m.DelegatorAddress) - copy(dAtA[i:], m.DelegatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Params) 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 *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.MinCommissionRate.Size() - i -= size - if _, err := m.MinCommissionRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - if len(m.BondDenom) > 0 { - i -= len(m.BondDenom) - copy(dAtA[i:], m.BondDenom) - i = encodeVarintStaking(dAtA, i, uint64(len(m.BondDenom))) - i-- - dAtA[i] = 0x2a - } - if m.HistoricalEntries != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.HistoricalEntries)) - i-- - dAtA[i] = 0x20 - } - if m.MaxEntries != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.MaxEntries)) - i-- - dAtA[i] = 0x18 - } - if m.MaxValidators != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.MaxValidators)) - i-- - dAtA[i] = 0x10 - } - n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime):]) - if err10 != nil { - return 0, err10 - } - i -= n10 - i = encodeVarintStaking(dAtA, i, uint64(n10)) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *DelegationResponse) 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 *DelegationResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DelegationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Balance.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Delegation.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *RedelegationEntryResponse) 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 *RedelegationEntryResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RedelegationEntryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Balance.Size() - i -= size - if _, err := m.Balance.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.RedelegationEntry.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *RedelegationResponse) 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 *RedelegationResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RedelegationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Entries) > 0 { - for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Redelegation.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Pool) 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 *Pool) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.BondedTokens.Size() - i -= size - if _, err := m.BondedTokens.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.NotBondedTokens.Size() - i -= size - if _, err := m.NotBondedTokens.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintStaking(dAtA []byte, offset int, v uint64) int { - offset -= sovStaking(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *HistoricalInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Header.Size() - n += 1 + l + sovStaking(uint64(l)) - if len(m.Valset) > 0 { - for _, e := range m.Valset { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *CommissionRates) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Rate.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.MaxRate.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.MaxChangeRate.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *Commission) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.CommissionRates.Size() - n += 1 + l + sovStaking(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.UpdateTime) - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *Description) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Moniker) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.Identity) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.Website) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.SecurityContact) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.Details) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - return n -} - -func (m *Validator) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.OperatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - if m.ConsensusPubkey != nil { - l = m.ConsensusPubkey.Size() - n += 1 + l + sovStaking(uint64(l)) - } - if m.Jailed { - n += 2 - } - if m.Status != 0 { - n += 1 + sovStaking(uint64(m.Status)) - } - l = m.Tokens.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.DelegatorShares.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.Description.Size() - n += 1 + l + sovStaking(uint64(l)) - if m.UnbondingHeight != 0 { - n += 1 + sovStaking(uint64(m.UnbondingHeight)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.UnbondingTime) - n += 1 + l + sovStaking(uint64(l)) - l = m.Commission.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.MinSelfDelegation.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *ValAddresses) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Addresses) > 0 { - for _, s := range m.Addresses { - l = len(s) - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *DVPair) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - return n -} - -func (m *DVPairs) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Pairs) > 0 { - for _, e := range m.Pairs { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *DVVTriplet) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorSrcAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorDstAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - return n -} - -func (m *DVVTriplets) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Triplets) > 0 { - for _, e := range m.Triplets { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *Delegation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = m.Shares.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *UnbondingDelegation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - if len(m.Entries) > 0 { - for _, e := range m.Entries { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *UnbondingDelegationEntry) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CreationHeight != 0 { - n += 1 + sovStaking(uint64(m.CreationHeight)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime) - n += 1 + l + sovStaking(uint64(l)) - l = m.InitialBalance.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.Balance.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *RedelegationEntry) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CreationHeight != 0 { - n += 1 + sovStaking(uint64(m.CreationHeight)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime) - n += 1 + l + sovStaking(uint64(l)) - l = m.InitialBalance.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.SharesDst.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *Redelegation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorSrcAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorDstAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - if len(m.Entries) > 0 { - for _, e := range m.Entries { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime) - n += 1 + l + sovStaking(uint64(l)) - if m.MaxValidators != 0 { - n += 1 + sovStaking(uint64(m.MaxValidators)) - } - if m.MaxEntries != 0 { - n += 1 + sovStaking(uint64(m.MaxEntries)) - } - if m.HistoricalEntries != 0 { - n += 1 + sovStaking(uint64(m.HistoricalEntries)) - } - l = len(m.BondDenom) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = m.MinCommissionRate.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *DelegationResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Delegation.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.Balance.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *RedelegationEntryResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.RedelegationEntry.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.Balance.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *RedelegationResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Redelegation.Size() - n += 1 + l + sovStaking(uint64(l)) - if len(m.Entries) > 0 { - for _, e := range m.Entries { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *Pool) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.NotBondedTokens.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.BondedTokens.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func sovStaking(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozStaking(x uint64) (n int) { - return sovStaking(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *ValAddresses) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ValAddresses{`, - `Addresses:` + fmt.Sprintf("%v", this.Addresses) + `,`, - `}`, - }, "") - return s -} -func valueToStringStaking(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *HistoricalInfo) 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 ErrIntOverflowStaking - } - 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: HistoricalInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: HistoricalInfo: 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 ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - 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 Valset", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Valset = append(m.Valset, Validator{}) - if err := m.Valset[len(m.Valset)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CommissionRates) 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 ErrIntOverflowStaking - } - 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: CommissionRates: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CommissionRates: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Rate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MaxRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxChangeRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MaxChangeRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Commission) 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 ErrIntOverflowStaking - } - 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: Commission: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Commission: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CommissionRates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.CommissionRates.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdateTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.UpdateTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Description) 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 ErrIntOverflowStaking - } - 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: Description: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Description: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - 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 ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Moniker = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Website", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Website = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecurityContact", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SecurityContact = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Details = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - 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 ErrIntOverflowStaking - } - 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 OperatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OperatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConsensusPubkey", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ConsensusPubkey == nil { - m.ConsensusPubkey = &types1.Any{} - } - if err := m.ConsensusPubkey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Jailed", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Jailed = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - m.Status = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Status |= BondStatus(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tokens", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Tokens.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorShares", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.DelegatorShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Description.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field UnbondingHeight", wireType) - } - m.UnbondingHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.UnbondingHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UnbondingTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.UnbondingTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Commission", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Commission.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinSelfDelegation", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MinSelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ValAddresses) 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 ErrIntOverflowStaking - } - 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: ValAddresses: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ValAddresses: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - 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 ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DVPair) 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 ErrIntOverflowStaking - } - 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: DVPair: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DVPair: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DVPairs) 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 ErrIntOverflowStaking - } - 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: DVPairs: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DVPairs: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pairs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Pairs = append(m.Pairs, DVPair{}) - if err := m.Pairs[len(m.Pairs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DVVTriplet) 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 ErrIntOverflowStaking - } - 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: DVVTriplet: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DVVTriplet: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSrcAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorSrcAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorDstAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorDstAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DVVTriplets) 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 ErrIntOverflowStaking - } - 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: DVVTriplets: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DVVTriplets: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Triplets", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Triplets = append(m.Triplets, DVVTriplet{}) - if err := m.Triplets[len(m.Triplets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Delegation) 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 ErrIntOverflowStaking - } - 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: Delegation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Delegation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shares", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Shares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UnbondingDelegation) 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 ErrIntOverflowStaking - } - 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: UnbondingDelegation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UnbondingDelegation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Entries = append(m.Entries, UnbondingDelegationEntry{}) - if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UnbondingDelegationEntry) 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 ErrIntOverflowStaking - } - 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: UnbondingDelegationEntry: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UnbondingDelegationEntry: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CreationHeight", wireType) - } - m.CreationHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CreationHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CompletionTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InitialBalance", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.InitialBalance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Balance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RedelegationEntry) 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 ErrIntOverflowStaking - } - 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: RedelegationEntry: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RedelegationEntry: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CreationHeight", wireType) - } - m.CreationHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CreationHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CompletionTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InitialBalance", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.InitialBalance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SharesDst", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.SharesDst.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Redelegation) 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 ErrIntOverflowStaking - } - 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: Redelegation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Redelegation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSrcAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorSrcAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorDstAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorDstAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Entries = append(m.Entries, RedelegationEntry{}) - if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Params) 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 ErrIntOverflowStaking - } - 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: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UnbondingTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.UnbondingTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxValidators", wireType) - } - m.MaxValidators = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxValidators |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxEntries", wireType) - } - m.MaxEntries = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxEntries |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HistoricalEntries", wireType) - } - m.HistoricalEntries = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HistoricalEntries |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BondDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.BondDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinCommissionRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MinCommissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DelegationResponse) 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 ErrIntOverflowStaking - } - 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: DelegationResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DelegationResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Delegation", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Delegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Balance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RedelegationEntryResponse) 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 ErrIntOverflowStaking - } - 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: RedelegationEntryResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RedelegationEntryResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RedelegationEntry", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.RedelegationEntry.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Balance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RedelegationResponse) 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 ErrIntOverflowStaking - } - 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: RedelegationResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RedelegationResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Redelegation", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Redelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Entries = append(m.Entries, RedelegationEntryResponse{}) - if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Pool) 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 ErrIntOverflowStaking - } - 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: Pool: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Pool: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NotBondedTokens", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.NotBondedTokens.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BondedTokens", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BondedTokens.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipStaking(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, ErrIntOverflowStaking - } - 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, ErrIntOverflowStaking - } - 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, ErrIntOverflowStaking - } - 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, ErrInvalidLengthStaking - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupStaking - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthStaking - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthStaking = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowStaking = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupStaking = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/staking/legacy/v040/types.go b/x/staking/legacy/v040/types.go index 8964296fa97d..c01c41a417e3 100644 --- a/x/staking/legacy/v040/types.go +++ b/x/staking/legacy/v040/types.go @@ -1,201 +1,330 @@ +// Package v040 is copy-pasted from: +// https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/staking/types/keys.go package v040 import ( + "bytes" + "encoding/binary" "fmt" - "strings" + "strconv" "time" - yaml "gopkg.in/yaml.v2" - sdk "github.com/cosmos/cosmos-sdk/types" + v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v040" + "github.com/cosmos/cosmos-sdk/x/staking/types" ) -// Staking params default values const ( - // DefaultUnbondingTime reflects three weeks in seconds as the default - // unbonding time. - // TODO: Justify our choice of default here. - DefaultUnbondingTime time.Duration = time.Hour * 24 * 7 * 3 + // ModuleName is the name of the staking module + ModuleName = "staking" + + // StoreKey is the string store representation + StoreKey = ModuleName + + // QuerierRoute is the querier route for the staking module + QuerierRoute = ModuleName + + // RouterKey is the msg router key for the staking module + RouterKey = ModuleName +) + +var ( + // Keys for store prefixes + // Last* values are constant during a block. + LastValidatorPowerKey = []byte{0x11} // prefix for each key to a validator index, for bonded validators + LastTotalPowerKey = []byte{0x12} // prefix for the total power + + ValidatorsKey = []byte{0x21} // prefix for each key to a validator + ValidatorsByConsAddrKey = []byte{0x22} // prefix for each key to a validator index, by pubkey + ValidatorsByPowerIndexKey = []byte{0x23} // prefix for each key to a validator index, sorted by power - // Default maximum number of bonded validators - DefaultMaxValidators uint32 = 100 + DelegationKey = []byte{0x31} // key for a delegation + UnbondingDelegationKey = []byte{0x32} // key for an unbonding-delegation + UnbondingDelegationByValIndexKey = []byte{0x33} // prefix for each key for an unbonding-delegation, by validator operator + RedelegationKey = []byte{0x34} // key for a redelegation + RedelegationByValSrcIndexKey = []byte{0x35} // prefix for each key for an redelegation, by source validator operator + RedelegationByValDstIndexKey = []byte{0x36} // prefix for each key for an redelegation, by destination validator operator - // Default maximum entries in a UBD/RED pair - DefaultMaxEntries uint32 = 7 + UnbondingQueueKey = []byte{0x41} // prefix for the timestamps in unbonding queue + RedelegationQueueKey = []byte{0x42} // prefix for the timestamps in redelegations queue + ValidatorQueueKey = []byte{0x43} // prefix for the timestamps in validator queue - // DefaultHistorical entries is 10000. Apps that don't use IBC can ignore this - // value by not adding the staking module to the application module manager's - // SetOrderBeginBlockers. - DefaultHistoricalEntries uint32 = 10000 + HistoricalInfoKey = []byte{0x50} // prefix for the historical info ) -// NewParams creates a new Params instance -func NewParams(unbondingTime time.Duration, maxValidators, maxEntries, historicalEntries uint32, bondDenom string) Params { - return Params{ - UnbondingTime: unbondingTime, - MaxValidators: maxValidators, - MaxEntries: maxEntries, - HistoricalEntries: historicalEntries, - BondDenom: bondDenom, +// gets the key for the validator with address +// VALUE: staking/Validator +func GetValidatorKey(operatorAddr sdk.ValAddress) []byte { + return append(ValidatorsKey, operatorAddr.Bytes()...) +} + +// gets the key for the validator with pubkey +// VALUE: validator operator address ([]byte) +func GetValidatorByConsAddrKey(addr sdk.ConsAddress) []byte { + return append(ValidatorsByConsAddrKey, addr.Bytes()...) +} + +// Get the validator operator address from LastValidatorPowerKey +func AddressFromLastValidatorPowerKey(key []byte) []byte { + return key[1:] // remove prefix bytes +} + +// get the validator by power index. +// Power index is the key used in the power-store, and represents the relative +// power ranking of the validator. +// VALUE: validator operator address ([]byte) +func GetValidatorsByPowerIndexKey(validator types.Validator) []byte { + // NOTE the address doesn't need to be stored because counter bytes must always be different + // NOTE the larger values are of higher value + + consensusPower := sdk.TokensToConsensusPower(validator.Tokens, sdk.DefaultPowerReduction) + consensusPowerBytes := make([]byte, 8) + binary.BigEndian.PutUint64(consensusPowerBytes, uint64(consensusPower)) + + powerBytes := consensusPowerBytes + powerBytesLen := len(powerBytes) // 8 + + // key is of format prefix || powerbytes || addrBytes + key := make([]byte, 1+powerBytesLen+v040auth.AddrLen) + + key[0] = ValidatorsByPowerIndexKey[0] + copy(key[1:powerBytesLen+1], powerBytes) + addr, err := sdk.ValAddressFromBech32(validator.OperatorAddress) + if err != nil { + panic(err) } + operAddrInvr := sdk.CopyBytes(addr) + + for i, b := range operAddrInvr { + operAddrInvr[i] = ^b + } + + copy(key[powerBytesLen+1:], operAddrInvr) + + return key } -// String returns a human readable string representation of the parameters. -func (p Params) String() string { - out, _ := yaml.Marshal(p) - return string(out) +// get the bonded validator index key for an operator address +func GetLastValidatorPowerKey(operator sdk.ValAddress) []byte { + return append(LastValidatorPowerKey, operator...) } -func DefaultParams() Params { - return NewParams( - DefaultUnbondingTime, - DefaultMaxValidators, - DefaultMaxEntries, - DefaultHistoricalEntries, - sdk.DefaultBondDenom, - ) +// parse the validators operator address from power rank key +func ParseValidatorPowerRankKey(key []byte) (operAddr []byte) { + powerBytesLen := 8 + if len(key) != 1+powerBytesLen+v040auth.AddrLen { + panic("Invalid validator power rank key length") + } + + operAddr = sdk.CopyBytes(key[powerBytesLen+1:]) + + for i, b := range operAddr { + operAddr[i] = ^b + } + + return operAddr } -// String implements the Stringer interface for a Commission object. -func (c Commission) String() string { - out, _ := yaml.Marshal(c) - return string(out) +// GetValidatorQueueKey returns the prefix key used for getting a set of unbonding +// validators whose unbonding completion occurs at the given time and height. +func GetValidatorQueueKey(timestamp time.Time, height int64) []byte { + heightBz := sdk.Uint64ToBigEndian(uint64(height)) + timeBz := sdk.FormatTimeBytes(timestamp) + timeBzL := len(timeBz) + prefixL := len(ValidatorQueueKey) + + bz := make([]byte, prefixL+8+timeBzL+8) + + // copy the prefix + copy(bz[:prefixL], ValidatorQueueKey) + + // copy the encoded time bytes length + copy(bz[prefixL:prefixL+8], sdk.Uint64ToBigEndian(uint64(timeBzL))) + + // copy the encoded time bytes + copy(bz[prefixL+8:prefixL+8+timeBzL], timeBz) + + // copy the encoded height + copy(bz[prefixL+8+timeBzL:], heightBz) + + return bz } -// String implements the Stringer interface for a CommissionRates object. -func (cr CommissionRates) String() string { - out, _ := yaml.Marshal(cr) - return string(out) +// ParseValidatorQueueKey returns the encoded time and height from a key created +// from GetValidatorQueueKey. +func ParseValidatorQueueKey(bz []byte) (time.Time, int64, error) { + prefixL := len(ValidatorQueueKey) + if prefix := bz[:prefixL]; !bytes.Equal(prefix, ValidatorQueueKey) { + return time.Time{}, 0, fmt.Errorf("invalid prefix; expected: %X, got: %X", ValidatorQueueKey, prefix) + } + + timeBzL := sdk.BigEndianToUint64(bz[prefixL : prefixL+8]) + ts, err := sdk.ParseTimeBytes(bz[prefixL+8 : prefixL+8+int(timeBzL)]) + if err != nil { + return time.Time{}, 0, err + } + + height := sdk.BigEndianToUint64(bz[prefixL+8+int(timeBzL):]) + + return ts, int64(height), nil } -// String implements the Stringer interface for a DVPair object. -func (dv DVPair) String() string { - out, _ := yaml.Marshal(dv) - return string(out) +// gets the key for delegator bond with validator +// VALUE: staking/Delegation +func GetDelegationKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { + return append(GetDelegationsKey(delAddr), valAddr.Bytes()...) } -// String implements the Stringer interface for a DVVTriplet object. -func (dvv DVVTriplet) String() string { - out, _ := yaml.Marshal(dvv) - return string(out) +// gets the prefix for a delegator for all validators +func GetDelegationsKey(delAddr sdk.AccAddress) []byte { + return append(DelegationKey, delAddr.Bytes()...) } -// String returns a human readable string representation of a Delegation. -func (d Delegation) String() string { - out, _ := yaml.Marshal(d) - return string(out) +// gets the key for an unbonding delegation by delegator and validator addr +// VALUE: staking/UnbondingDelegation +func GetUBDKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { + return append( + GetUBDsKey(delAddr.Bytes()), + valAddr.Bytes()...) } -// Delegations is a collection of delegations -type Delegations []Delegation +// gets the index-key for an unbonding delegation, stored by validator-index +// VALUE: none (key rearrangement used) +func GetUBDByValIndexKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { + return append(GetUBDsByValIndexKey(valAddr), delAddr.Bytes()...) +} -func (d Delegations) String() (out string) { - for _, del := range d { - out += del.String() + "\n" +// rearranges the ValIndexKey to get the UBDKey +func GetUBDKeyFromValIndexKey(indexKey []byte) []byte { + addrs := indexKey[1:] // remove prefix bytes + if len(addrs) != 2*v040auth.AddrLen { + panic("unexpected key length") } - return strings.TrimSpace(out) + valAddr := addrs[:v040auth.AddrLen] + delAddr := addrs[v040auth.AddrLen:] + + return GetUBDKey(delAddr, valAddr) } -// String implements the stringer interface for a UnbondingDelegationEntry. -func (e UnbondingDelegationEntry) String() string { - out, _ := yaml.Marshal(e) - return string(out) +// gets the prefix for all unbonding delegations from a delegator +func GetUBDsKey(delAddr sdk.AccAddress) []byte { + return append(UnbondingDelegationKey, delAddr.Bytes()...) } -// String returns a human readable string representation of an UnbondingDelegation. -func (ubd UnbondingDelegation) String() string { - out := fmt.Sprintf(`Unbonding Delegations between: - Delegator: %s - Validator: %s - Entries:`, ubd.DelegatorAddress, ubd.ValidatorAddress) - for i, entry := range ubd.Entries { - out += fmt.Sprintf(` Unbonding Delegation %d: - Creation Height: %v - Min time to unbond (unix): %v - Expected balance: %s`, i, entry.CreationHeight, - entry.CompletionTime, entry.Balance) - } +// gets the prefix keyspace for the indexes of unbonding delegations for a validator +func GetUBDsByValIndexKey(valAddr sdk.ValAddress) []byte { + return append(UnbondingDelegationByValIndexKey, valAddr.Bytes()...) +} - return out +// gets the prefix for all unbonding delegations from a delegator +func GetUnbondingDelegationTimeKey(timestamp time.Time) []byte { + bz := sdk.FormatTimeBytes(timestamp) + return append(UnbondingQueueKey, bz...) } -// UnbondingDelegations is a collection of UnbondingDelegation -type UnbondingDelegations []UnbondingDelegation +// GetREDKey returns a key prefix for indexing a redelegation from a delegator +// and source validator to a destination validator. +func GetREDKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { + key := make([]byte, 1+v040auth.AddrLen*3) -func (ubds UnbondingDelegations) String() (out string) { - for _, u := range ubds { - out += u.String() + "\n" - } + copy(key[0:v040auth.AddrLen+1], GetREDsKey(delAddr.Bytes())) + copy(key[v040auth.AddrLen+1:2*v040auth.AddrLen+1], valSrcAddr.Bytes()) + copy(key[2*v040auth.AddrLen+1:3*v040auth.AddrLen+1], valDstAddr.Bytes()) - return strings.TrimSpace(out) -} - -// String implements the Stringer interface for a RedelegationEntry object. -func (e RedelegationEntry) String() string { - out, _ := yaml.Marshal(e) - return string(out) -} - -// String returns a human readable string representation of a Redelegation. -func (red Redelegation) String() string { - out := fmt.Sprintf(`Redelegations between: - Delegator: %s - Source Validator: %s - Destination Validator: %s - Entries: -`, - red.DelegatorAddress, red.ValidatorSrcAddress, red.ValidatorDstAddress, - ) - - for i, entry := range red.Entries { - out += fmt.Sprintf(` Redelegation Entry #%d: - Creation height: %v - Min time to unbond (unix): %v - Dest Shares: %s -`, - i, entry.CreationHeight, entry.CompletionTime, entry.SharesDst, - ) - } + return key +} + +// gets the index-key for a redelegation, stored by source-validator-index +// VALUE: none (key rearrangement used) +func GetREDByValSrcIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { + REDSFromValsSrcKey := GetREDsFromValSrcIndexKey(valSrcAddr) + offset := len(REDSFromValsSrcKey) - return strings.TrimRight(out, "\n") + // key is of the form REDSFromValsSrcKey || delAddr || valDstAddr + key := make([]byte, len(REDSFromValsSrcKey)+2*v040auth.AddrLen) + copy(key[0:offset], REDSFromValsSrcKey) + copy(key[offset:offset+v040auth.AddrLen], delAddr.Bytes()) + copy(key[offset+v040auth.AddrLen:offset+2*v040auth.AddrLen], valDstAddr.Bytes()) + + return key } -// Redelegations are a collection of Redelegation -type Redelegations []Redelegation +// gets the index-key for a redelegation, stored by destination-validator-index +// VALUE: none (key rearrangement used) +func GetREDByValDstIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { + REDSToValsDstKey := GetREDsToValDstIndexKey(valDstAddr) + offset := len(REDSToValsDstKey) + + // key is of the form REDSToValsDstKey || delAddr || valSrcAddr + key := make([]byte, len(REDSToValsDstKey)+2*v040auth.AddrLen) + copy(key[0:offset], REDSToValsDstKey) + copy(key[offset:offset+v040auth.AddrLen], delAddr.Bytes()) + copy(key[offset+v040auth.AddrLen:offset+2*v040auth.AddrLen], valSrcAddr.Bytes()) + + return key +} -func (d Redelegations) String() (out string) { - for _, red := range d { - out += red.String() + "\n" +// GetREDKeyFromValSrcIndexKey rearranges the ValSrcIndexKey to get the REDKey +func GetREDKeyFromValSrcIndexKey(indexKey []byte) []byte { + // note that first byte is prefix byte + if len(indexKey) != 3*v040auth.AddrLen+1 { + panic("unexpected key length") } - return strings.TrimSpace(out) + valSrcAddr := indexKey[1 : v040auth.AddrLen+1] + delAddr := indexKey[v040auth.AddrLen+1 : 2*v040auth.AddrLen+1] + valDstAddr := indexKey[2*v040auth.AddrLen+1 : 3*v040auth.AddrLen+1] + + return GetREDKey(delAddr, valSrcAddr, valDstAddr) } -// String implements the Stringer interface for DelegationResponse. -func (d DelegationResponse) String() string { - return fmt.Sprintf("%s\n Balance: %s", d.Delegation.String(), d.Balance) +// GetREDKeyFromValDstIndexKey rearranges the ValDstIndexKey to get the REDKey +func GetREDKeyFromValDstIndexKey(indexKey []byte) []byte { + // note that first byte is prefix byte + if len(indexKey) != 3*v040auth.AddrLen+1 { + panic("unexpected key length") + } + + valDstAddr := indexKey[1 : v040auth.AddrLen+1] + delAddr := indexKey[v040auth.AddrLen+1 : 2*v040auth.AddrLen+1] + valSrcAddr := indexKey[2*v040auth.AddrLen+1 : 3*v040auth.AddrLen+1] + + return GetREDKey(delAddr, valSrcAddr, valDstAddr) } -// String implements the Stringer interface for a Validator object. -func (v Validator) String() string { - out, _ := yaml.Marshal(v) - return string(out) +// GetRedelegationTimeKey returns a key prefix for indexing an unbonding +// redelegation based on a completion time. +func GetRedelegationTimeKey(timestamp time.Time) []byte { + bz := sdk.FormatTimeBytes(timestamp) + return append(RedelegationQueueKey, bz...) } -// Validators is a collection of Validator -type Validators []Validator +// GetREDsKey returns a key prefix for indexing a redelegation from a delegator +// address. +func GetREDsKey(delAddr sdk.AccAddress) []byte { + return append(RedelegationKey, delAddr.Bytes()...) +} -func (v Validators) String() (out string) { - for _, val := range v { - out += val.String() + "\n" - } +// GetREDsFromValSrcIndexKey returns a key prefix for indexing a redelegation to +// a source validator. +func GetREDsFromValSrcIndexKey(valSrcAddr sdk.ValAddress) []byte { + return append(RedelegationByValSrcIndexKey, valSrcAddr.Bytes()...) +} + +// GetREDsToValDstIndexKey returns a key prefix for indexing a redelegation to a +// destination (target) validator. +func GetREDsToValDstIndexKey(valDstAddr sdk.ValAddress) []byte { + return append(RedelegationByValDstIndexKey, valDstAddr.Bytes()...) +} - return strings.TrimSpace(out) +// GetREDsByDelToValDstIndexKey returns a key prefix for indexing a redelegation +// from an address to a source validator. +func GetREDsByDelToValDstIndexKey(delAddr sdk.AccAddress, valDstAddr sdk.ValAddress) []byte { + return append(GetREDsToValDstIndexKey(valDstAddr), delAddr.Bytes()...) } -// String implements the Stringer interface for a Description object. -func (d Description) String() string { - out, _ := yaml.Marshal(d) - return string(out) +// GetHistoricalInfoKey returns a key prefix for indexing HistoricalInfo objects. +func GetHistoricalInfoKey(height int64) []byte { + return append(HistoricalInfoKey, []byte(strconv.FormatInt(height, 10))...) } diff --git a/x/staking/types/authz.pb.go b/x/staking/types/authz.pb.go index d4e5c5c5bdd6..7917bec8c08e 100644 --- a/x/staking/types/authz.pb.go +++ b/x/staking/types/authz.pb.go @@ -5,10 +5,10 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -228,36 +228,36 @@ func init() { } var fileDescriptor_d6d8cdbc6f4432f0 = []byte{ - // 462 bytes of a gzipped FileDescriptorProto + // 461 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x93, 0xcb, 0x6e, 0xd3, 0x40, 0x14, 0x86, 0x3d, 0x0d, 0x02, 0x72, 0xb8, 0xa8, 0x19, 0x21, 0x94, 0x06, 0x31, 0x2d, 0x59, 0x40, 0xb8, 0x74, 0xac, 0x16, 0xb1, 0x61, 0x97, 0xb4, 0x2e, 0x8d, 0x54, 0xb5, 0x95, 0xeb, 0x56, 0xd0, 0x8d, 0x35, 0x89, 0x47, 0xc9, 0x28, 0xb6, 0x27, 0xf2, 0x4c, 0x4a, 0xd2, 0xa7, 0xe0, 0x09, 0x78, - 0x00, 0xd6, 0x3c, 0x04, 0x0b, 0x16, 0x15, 0x2b, 0x76, 0xa0, 0xe4, 0x45, 0x90, 0xc7, 0xae, 0xa1, - 0x34, 0x65, 0xc3, 0xca, 0x97, 0xf3, 0xcd, 0xf7, 0x9f, 0x63, 0x1d, 0x43, 0xbd, 0x2b, 0x55, 0x24, - 0x95, 0xad, 0x34, 0x1b, 0x88, 0xb8, 0x67, 0x9f, 0xac, 0x75, 0xb8, 0x66, 0x6b, 0x36, 0x1b, 0xe9, - 0xfe, 0x29, 0x1d, 0x26, 0x52, 0x4b, 0x7c, 0x3f, 0x63, 0x68, 0xce, 0xd0, 0x9c, 0xa9, 0xdd, 0xeb, - 0xc9, 0x9e, 0x34, 0x88, 0x9d, 0xde, 0x65, 0x74, 0x6d, 0x29, 0xa3, 0xfd, 0xac, 0x90, 0x1f, 0xcd, - 0x4a, 0x24, 0x0f, 0xeb, 0x30, 0xc5, 0x8b, 0xa4, 0xae, 0x14, 0x71, 0x56, 0xaf, 0x7f, 0x2d, 0x01, - 0x3e, 0xd0, 0x6c, 0xc0, 0x9b, 0x23, 0xdd, 0x97, 0x89, 0x38, 0x65, 0x5a, 0xc8, 0x18, 0x73, 0x80, - 0x88, 0x8d, 0x7d, 0x2d, 0x07, 0x3c, 0x56, 0x55, 0xb4, 0x82, 0x1a, 0xb7, 0xd6, 0x97, 0x68, 0x6e, - 0x4e, 0x5d, 0xe7, 0x1d, 0xd1, 0x0d, 0x29, 0xe2, 0xd6, 0xf3, 0x4f, 0x3f, 0x96, 0x9f, 0xf4, 0x84, - 0xee, 0x8f, 0x3a, 0xb4, 0x2b, 0xa3, 0xbc, 0x85, 0xfc, 0xb2, 0xaa, 0x82, 0x81, 0xad, 0x27, 0x43, - 0xae, 0x0c, 0xec, 0x96, 0x23, 0x36, 0xf6, 0x8c, 0x18, 0x1f, 0x01, 0xb0, 0x30, 0x94, 0xef, 0xfd, - 0x50, 0x28, 0x5d, 0x5d, 0x30, 0x31, 0xaf, 0xe8, 0xfc, 0xd9, 0xe9, 0xe5, 0x36, 0xe9, 0x11, 0x0b, - 0x45, 0xc0, 0xb4, 0x4c, 0xd4, 0xb6, 0xe5, 0x96, 0x8d, 0x6a, 0x47, 0x28, 0x8d, 0x3d, 0x28, 0x07, - 0x3c, 0x9e, 0x64, 0xda, 0xd2, 0xff, 0x69, 0x6f, 0xa6, 0x26, 0x63, 0x7d, 0x0b, 0x98, 0xfd, 0xc9, - 0xf9, 0xe9, 0x50, 0xd5, 0x6b, 0x2b, 0xa8, 0x71, 0x77, 0xfd, 0xe9, 0x55, 0xfa, 0x0b, 0x66, 0x6f, - 0x32, 0xe4, 0x6e, 0x85, 0xfd, 0xfd, 0xaa, 0xf6, 0x18, 0xe0, 0x77, 0x26, 0xae, 0xc2, 0x0d, 0x16, - 0x04, 0x09, 0x57, 0xe9, 0x97, 0x2f, 0x35, 0xca, 0xee, 0xf9, 0xe3, 0xeb, 0xca, 0xb7, 0xcf, 0xab, - 0x77, 0x2e, 0x18, 0x5b, 0xb7, 0x01, 0x4e, 0x8a, 0xa3, 0xcf, 0x3e, 0x22, 0xa8, 0x5c, 0x4a, 0xc4, - 0x75, 0x20, 0xcd, 0x43, 0x6f, 0x7b, 0xcf, 0x6d, 0x1f, 0x37, 0xbd, 0xf6, 0xde, 0xae, 0xef, 0xbd, - 0xdb, 0x77, 0xfc, 0xc3, 0xdd, 0x83, 0x7d, 0x67, 0xa3, 0xbd, 0xd5, 0x76, 0x36, 0x17, 0x2d, 0xbc, - 0x0c, 0x0f, 0xe6, 0x30, 0x9b, 0xce, 0x8e, 0xf3, 0xa6, 0xe9, 0x39, 0x8b, 0x08, 0x3f, 0x82, 0x87, - 0x73, 0x25, 0x05, 0xb2, 0x70, 0x05, 0xe2, 0x3a, 0x05, 0x52, 0x6a, 0x6d, 0x7d, 0x99, 0x12, 0x74, - 0x36, 0x25, 0xe8, 0xe7, 0x94, 0xa0, 0x0f, 0x33, 0x62, 0x9d, 0xcd, 0x88, 0xf5, 0x7d, 0x46, 0xac, - 0xe3, 0x17, 0xff, 0xdc, 0x9f, 0x71, 0xf1, 0xbb, 0x98, 0x4d, 0xea, 0x5c, 0x37, 0xeb, 0xfb, 0xf2, - 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x54, 0x04, 0xbf, 0x8c, 0x4d, 0x03, 0x00, 0x00, + 0x00, 0xd6, 0x3c, 0x04, 0x42, 0x2c, 0xba, 0x64, 0x07, 0x4a, 0x5e, 0x04, 0x79, 0xec, 0x1a, 0x4a, + 0x53, 0x36, 0xac, 0x7c, 0x39, 0xdf, 0x7c, 0xff, 0x39, 0xd6, 0x31, 0xd4, 0xbb, 0x52, 0x45, 0x52, + 0xd9, 0x4a, 0xb3, 0x81, 0x88, 0x7b, 0xf6, 0xc9, 0x5a, 0x87, 0x6b, 0xb6, 0x66, 0xb3, 0x91, 0xee, + 0x9f, 0xd2, 0x61, 0x22, 0xb5, 0xc4, 0xf7, 0x33, 0x86, 0xe6, 0x0c, 0xcd, 0x99, 0xda, 0xbd, 0x9e, + 0xec, 0x49, 0x83, 0xd8, 0xe9, 0x5d, 0x46, 0xd7, 0x96, 0x32, 0xda, 0xcf, 0x0a, 0xf9, 0xd1, 0xac, + 0x44, 0xf2, 0xb0, 0x0e, 0x53, 0xbc, 0x48, 0xea, 0x4a, 0x11, 0x67, 0xf5, 0xfa, 0xb7, 0x12, 0xe0, + 0x03, 0xcd, 0x06, 0xbc, 0x39, 0xd2, 0x7d, 0x99, 0x88, 0x53, 0xa6, 0x85, 0x8c, 0x31, 0x07, 0x88, + 0xd8, 0xd8, 0xd7, 0x72, 0xc0, 0x63, 0x55, 0x45, 0x2b, 0xa8, 0x71, 0x6b, 0x7d, 0x89, 0xe6, 0xe6, + 0xd4, 0x75, 0xde, 0x11, 0xdd, 0x90, 0x22, 0x6e, 0x3d, 0xff, 0xf4, 0x63, 0xf9, 0x49, 0x4f, 0xe8, + 0xfe, 0xa8, 0x43, 0xbb, 0x32, 0xca, 0x5b, 0xc8, 0x2f, 0xab, 0x2a, 0x18, 0xd8, 0x7a, 0x32, 0xe4, + 0xca, 0xc0, 0x6e, 0x39, 0x62, 0x63, 0xcf, 0x88, 0xf1, 0x11, 0x00, 0x0b, 0x43, 0xf9, 0xde, 0x0f, + 0x85, 0xd2, 0xd5, 0x05, 0x13, 0xf3, 0x8a, 0xce, 0x9f, 0x9d, 0x5e, 0x6e, 0x93, 0x1e, 0xb1, 0x50, + 0x04, 0x4c, 0xcb, 0x44, 0x6d, 0x5b, 0x6e, 0xd9, 0xa8, 0x76, 0x84, 0xd2, 0xd8, 0x83, 0x72, 0xc0, + 0xe3, 0x49, 0xa6, 0x2d, 0xfd, 0x9f, 0xf6, 0x66, 0x6a, 0x32, 0xd6, 0xb7, 0x80, 0xd9, 0x9f, 0x9c, + 0x9f, 0x0e, 0x55, 0xbd, 0xb6, 0x82, 0x1a, 0x77, 0xd7, 0x9f, 0x5e, 0xa5, 0xbf, 0x60, 0xf6, 0x26, + 0x43, 0xee, 0x56, 0xd8, 0xdf, 0xaf, 0x6a, 0x8f, 0x01, 0x7e, 0x67, 0xe2, 0x2a, 0xdc, 0x60, 0x41, + 0x90, 0x70, 0x95, 0x7e, 0xf9, 0x52, 0xa3, 0xec, 0x9e, 0x3f, 0xbe, 0xae, 0x7c, 0xfd, 0xbc, 0x7a, + 0xe7, 0x82, 0xb1, 0x75, 0x1b, 0xe0, 0xa4, 0x38, 0xfa, 0xec, 0x23, 0x82, 0xca, 0xa5, 0x44, 0x5c, + 0x07, 0xd2, 0x3c, 0xf4, 0xb6, 0xf7, 0xdc, 0xf6, 0x71, 0xd3, 0x6b, 0xef, 0xed, 0xfa, 0xde, 0xbb, + 0x7d, 0xc7, 0x3f, 0xdc, 0x3d, 0xd8, 0x77, 0x36, 0xda, 0x5b, 0x6d, 0x67, 0x73, 0xd1, 0xc2, 0xcb, + 0xf0, 0x60, 0x0e, 0xb3, 0xe9, 0xec, 0x38, 0x6f, 0x9a, 0x9e, 0xb3, 0x88, 0xf0, 0x23, 0x78, 0x38, + 0x57, 0x52, 0x20, 0x0b, 0x57, 0x20, 0xae, 0x53, 0x20, 0xa5, 0xd6, 0xd6, 0x97, 0x29, 0x41, 0x67, + 0x53, 0x82, 0x7e, 0x4e, 0x09, 0xfa, 0x30, 0x23, 0xd6, 0xd9, 0x8c, 0x58, 0xdf, 0x67, 0xc4, 0x3a, + 0x7e, 0xf1, 0xcf, 0xfd, 0x19, 0x17, 0xbf, 0x8b, 0xd9, 0xa4, 0xce, 0x75, 0xb3, 0xbe, 0x2f, 0x7f, + 0x05, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xfd, 0x97, 0xc2, 0x4d, 0x03, 0x00, 0x00, } func (m *StakeAuthorization) Marshal() (dAtA []byte, err error) { diff --git a/x/staking/types/genesis.pb.go b/x/staking/types/genesis.pb.go index 2ea6f8bf9964..89815b5ea0c7 100644 --- a/x/staking/types/genesis.pb.go +++ b/x/staking/types/genesis.pb.go @@ -6,8 +6,8 @@ package types import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" diff --git a/x/staking/types/historical_info.go b/x/staking/types/historical_info.go index 447a559bda7b..ecdecbd41a6c 100644 --- a/x/staking/types/historical_info.go +++ b/x/staking/types/historical_info.go @@ -3,7 +3,7 @@ package types import ( "sort" - "github.com/gogo/protobuf/proto" + "github.com/cosmos/gogoproto/proto" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" diff --git a/x/staking/types/query.pb.go b/x/staking/types/query.pb.go index 29f84adc27ac..8cdf2056b349 100644 --- a/x/staking/types/query.pb.go +++ b/x/staking/types/query.pb.go @@ -7,9 +7,9 @@ import ( context "context" fmt "fmt" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/staking/types/query.pb.gw.go b/x/staking/types/query.pb.gw.go index 0982dfc3d671..7ed30880ddff 100644 --- a/x/staking/types/query.pb.gw.go +++ b/x/staking/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join var ( filter_Query_Validators_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} @@ -874,12 +876,14 @@ 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_Validators_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 { @@ -887,6 +891,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Validators_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) @@ -900,6 +905,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Validator_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 { @@ -907,6 +914,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Validator_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) @@ -920,6 +928,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_ValidatorDelegations_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 { @@ -927,6 +937,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_ValidatorDelegations_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) @@ -940,6 +951,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_ValidatorUnbondingDelegations_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 { @@ -947,6 +960,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_ValidatorUnbondingDelegations_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) @@ -960,6 +974,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Delegation_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 { @@ -967,6 +983,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Delegation_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) @@ -980,6 +997,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_UnbondingDelegation_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 { @@ -987,6 +1006,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_UnbondingDelegation_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) @@ -1000,6 +1020,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_DelegatorDelegations_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 { @@ -1007,6 +1029,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_DelegatorDelegations_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) @@ -1020,6 +1043,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_DelegatorUnbondingDelegations_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 { @@ -1027,6 +1052,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_DelegatorUnbondingDelegations_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) @@ -1040,6 +1066,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Redelegations_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 { @@ -1047,6 +1075,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Redelegations_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) @@ -1060,6 +1089,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_DelegatorValidators_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 { @@ -1067,6 +1098,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_DelegatorValidators_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) @@ -1080,6 +1112,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_DelegatorValidator_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 { @@ -1087,6 +1121,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_DelegatorValidator_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) @@ -1100,6 +1135,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_HistoricalInfo_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 { @@ -1107,6 +1144,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_HistoricalInfo_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) @@ -1120,6 +1158,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_Pool_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 { @@ -1127,6 +1167,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_Pool_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) @@ -1140,6 +1181,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 { @@ -1147,6 +1190,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) diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 753f711f8342..757f2f84bcca 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -7,15 +7,15 @@ import ( bytes "bytes" compress_gzip "compress/gzip" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types1 "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types2 "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_protoc_gen_gogo_descriptor "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + github_com_cosmos_gogoproto_proto "github.com/cosmos/gogoproto/proto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor "github.com/cosmos/gogoproto/protoc-gen-gogo/descriptor" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" types "github.com/tendermint/tendermint/proto/tendermint/types" _ "google.golang.org/protobuf/types/known/durationpb" _ "google.golang.org/protobuf/types/known/timestamppb" @@ -1260,630 +1260,493 @@ var fileDescriptor_64c30c6cf92913c9 = []byte{ 0x00, 0x00, } -func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { +func (this *Pool) Description() (desc *github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet) { return StakingDescription() } -func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { - d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} +func StakingDescription() (desc *github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet) { + d := &github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 9862 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x5c, 0xd7, - 0x75, 0x18, 0xde, 0x7e, 0x00, 0xbb, 0x07, 0x0b, 0x60, 0x71, 0x01, 0x92, 0xcb, 0x25, 0x09, 0x40, - 0x4f, 0x5f, 0x14, 0x25, 0x81, 0x12, 0x25, 0x52, 0xd2, 0xd2, 0xb6, 0x8c, 0xc5, 0x2e, 0x41, 0x88, - 0xf8, 0xd2, 0x03, 0x40, 0xc9, 0xb2, 0xd3, 0x9d, 0x87, 0xdd, 0x8b, 0xc5, 0x13, 0x76, 0xdf, 0x7b, - 0x7a, 0xef, 0x2d, 0x09, 0xc8, 0x76, 0x47, 0xfe, 0xa8, 0x6b, 0x33, 0x93, 0xc6, 0xae, 0x3b, 0x8d, - 0x2d, 0x9b, 0xae, 0x1c, 0xa7, 0x75, 0xea, 0xb8, 0x8d, 0x1d, 0xbb, 0x6e, 0xd3, 0x76, 0xa6, 0x76, - 0x67, 0xd2, 0xd8, 0x6e, 0x93, 0xb1, 0xdb, 0x4c, 0x9b, 0x66, 0x52, 0x3a, 0x95, 0x3d, 0xa9, 0xea, - 0xba, 0x8d, 0xc3, 0xba, 0xd3, 0x74, 0x3c, 0x9d, 0x76, 0xee, 0xd7, 0xfb, 0xda, 0x6f, 0x88, 0x94, - 0x9c, 0xa6, 0xbf, 0xb0, 0xf7, 0xdc, 0x73, 0xce, 0x3d, 0xf7, 0xdc, 0x73, 0xce, 0x3d, 0xf7, 0xeb, - 0x01, 0xbe, 0x7c, 0x1e, 0x66, 0xaa, 0x86, 0x51, 0xad, 0xe1, 0xd3, 0xa6, 0x65, 0x38, 0xc6, 0x56, - 0x63, 0xfb, 0x74, 0x05, 0xdb, 0x65, 0x4b, 0x33, 0x1d, 0xc3, 0x9a, 0xa5, 0x30, 0x34, 0xc6, 0x30, - 0x66, 0x05, 0x86, 0xbc, 0x0c, 0xe3, 0x17, 0xb4, 0x1a, 0x2e, 0xb8, 0x88, 0xeb, 0xd8, 0x41, 0x8f, - 0x43, 0x6c, 0x5b, 0xab, 0xe1, 0x8c, 0x34, 0x13, 0x3d, 0x39, 0x7c, 0xe6, 0xae, 0xd9, 0x10, 0xd1, - 0x6c, 0x90, 0x62, 0x8d, 0x80, 0x15, 0x4a, 0x21, 0xff, 0x20, 0x06, 0x13, 0x2d, 0x6a, 0x11, 0x82, - 0x98, 0xae, 0xd6, 0x09, 0x47, 0xe9, 0x64, 0x52, 0xa1, 0xbf, 0x51, 0x06, 0x86, 0x4c, 0xb5, 0xbc, - 0xab, 0x56, 0x71, 0x26, 0x42, 0xc1, 0xa2, 0x88, 0xa6, 0x00, 0x2a, 0xd8, 0xc4, 0x7a, 0x05, 0xeb, - 0xe5, 0xfd, 0x4c, 0x74, 0x26, 0x7a, 0x32, 0xa9, 0xf8, 0x20, 0xe8, 0x7e, 0x18, 0x37, 0x1b, 0x5b, - 0x35, 0xad, 0x5c, 0xf2, 0xa1, 0xc1, 0x4c, 0xf4, 0x64, 0x5c, 0x49, 0xb3, 0x8a, 0x82, 0x87, 0x7c, - 0x2f, 0x8c, 0x5d, 0xc5, 0xea, 0xae, 0x1f, 0x75, 0x98, 0xa2, 0x8e, 0x12, 0xb0, 0x0f, 0x71, 0x1e, - 0x52, 0x75, 0x6c, 0xdb, 0x6a, 0x15, 0x97, 0x9c, 0x7d, 0x13, 0x67, 0x62, 0xb4, 0xf7, 0x33, 0x4d, - 0xbd, 0x0f, 0xf7, 0x7c, 0x98, 0x53, 0x6d, 0xec, 0x9b, 0x18, 0xcd, 0x41, 0x12, 0xeb, 0x8d, 0x3a, - 0xe3, 0x10, 0x6f, 0xa3, 0xbf, 0xa2, 0xde, 0xa8, 0x87, 0xb9, 0x24, 0x08, 0x19, 0x67, 0x31, 0x64, - 0x63, 0xeb, 0x8a, 0x56, 0xc6, 0x99, 0x41, 0xca, 0xe0, 0xde, 0x26, 0x06, 0xeb, 0xac, 0x3e, 0xcc, - 0x43, 0xd0, 0xa1, 0x79, 0x48, 0xe2, 0x3d, 0x07, 0xeb, 0xb6, 0x66, 0xe8, 0x99, 0x21, 0xca, 0xe4, - 0xee, 0x16, 0xa3, 0x88, 0x6b, 0x95, 0x30, 0x0b, 0x8f, 0x0e, 0x9d, 0x83, 0x21, 0xc3, 0x74, 0x34, - 0x43, 0xb7, 0x33, 0x89, 0x19, 0xe9, 0xe4, 0xf0, 0x99, 0xe3, 0x2d, 0x0d, 0x61, 0x95, 0xe1, 0x28, - 0x02, 0x19, 0x2d, 0x42, 0xda, 0x36, 0x1a, 0x56, 0x19, 0x97, 0xca, 0x46, 0x05, 0x97, 0x34, 0x7d, - 0xdb, 0xc8, 0x24, 0x29, 0x83, 0xe9, 0xe6, 0x8e, 0x50, 0xc4, 0x79, 0xa3, 0x82, 0x17, 0xf5, 0x6d, - 0x43, 0x19, 0xb5, 0x03, 0x65, 0x74, 0x18, 0x06, 0xed, 0x7d, 0xdd, 0x51, 0xf7, 0x32, 0x29, 0x6a, - 0x21, 0xbc, 0x24, 0xff, 0xe6, 0x20, 0x8c, 0xf5, 0x62, 0x62, 0xe7, 0x21, 0xbe, 0x4d, 0x7a, 0x99, - 0x89, 0xf4, 0xa3, 0x03, 0x46, 0x13, 0x54, 0xe2, 0xe0, 0x01, 0x95, 0x38, 0x07, 0xc3, 0x3a, 0xb6, - 0x1d, 0x5c, 0x61, 0x16, 0x11, 0xed, 0xd1, 0xa6, 0x80, 0x11, 0x35, 0x9b, 0x54, 0xec, 0x40, 0x26, - 0xf5, 0x2c, 0x8c, 0xb9, 0x22, 0x95, 0x2c, 0x55, 0xaf, 0x0a, 0xdb, 0x3c, 0xdd, 0x4d, 0x92, 0xd9, - 0xa2, 0xa0, 0x53, 0x08, 0x99, 0x32, 0x8a, 0x03, 0x65, 0x54, 0x00, 0x30, 0x74, 0x6c, 0x6c, 0x97, - 0x2a, 0xb8, 0x5c, 0xcb, 0x24, 0xda, 0x68, 0x69, 0x95, 0xa0, 0x34, 0x69, 0xc9, 0x60, 0xd0, 0x72, - 0x0d, 0x3d, 0xe1, 0x99, 0xda, 0x50, 0x1b, 0x4b, 0x59, 0x66, 0x4e, 0xd6, 0x64, 0x6d, 0x9b, 0x30, - 0x6a, 0x61, 0x62, 0xf7, 0xb8, 0xc2, 0x7b, 0x96, 0xa4, 0x42, 0xcc, 0x76, 0xed, 0x99, 0xc2, 0xc9, - 0x58, 0xc7, 0x46, 0x2c, 0x7f, 0x11, 0xdd, 0x09, 0x2e, 0xa0, 0x44, 0xcd, 0x0a, 0x68, 0x14, 0x4a, - 0x09, 0xe0, 0x8a, 0x5a, 0xc7, 0xd9, 0x17, 0x61, 0x34, 0xa8, 0x1e, 0x34, 0x09, 0x71, 0xdb, 0x51, - 0x2d, 0x87, 0x5a, 0x61, 0x5c, 0x61, 0x05, 0x94, 0x86, 0x28, 0xd6, 0x2b, 0x34, 0xca, 0xc5, 0x15, - 0xf2, 0x13, 0xbd, 0xdd, 0xeb, 0x70, 0x94, 0x76, 0xf8, 0x9e, 0xe6, 0x11, 0x0d, 0x70, 0x0e, 0xf7, - 0x3b, 0xfb, 0x18, 0x8c, 0x04, 0x3a, 0xd0, 0x6b, 0xd3, 0xf2, 0x7b, 0xe0, 0x50, 0x4b, 0xd6, 0xe8, - 0x59, 0x98, 0x6c, 0xe8, 0x9a, 0xee, 0x60, 0xcb, 0xb4, 0x30, 0xb1, 0x58, 0xd6, 0x54, 0xe6, 0x3f, - 0x0d, 0xb5, 0xb1, 0xb9, 0x4d, 0x3f, 0x36, 0xe3, 0xa2, 0x4c, 0x34, 0x9a, 0x81, 0xa7, 0x92, 0x89, - 0xd7, 0x86, 0xd2, 0x2f, 0xbd, 0xf4, 0xd2, 0x4b, 0x11, 0xf9, 0x1b, 0x83, 0x30, 0xd9, 0xca, 0x67, - 0x5a, 0xba, 0xef, 0x61, 0x18, 0xd4, 0x1b, 0xf5, 0x2d, 0x6c, 0x51, 0x25, 0xc5, 0x15, 0x5e, 0x42, - 0x73, 0x10, 0xaf, 0xa9, 0x5b, 0xb8, 0x96, 0x89, 0xcd, 0x48, 0x27, 0x47, 0xcf, 0xdc, 0xdf, 0x93, - 0x57, 0xce, 0x2e, 0x11, 0x12, 0x85, 0x51, 0xa2, 0xb7, 0x41, 0x8c, 0x87, 0x68, 0xc2, 0xe1, 0x54, - 0x6f, 0x1c, 0x88, 0x2f, 0x29, 0x94, 0x0e, 0x1d, 0x83, 0x24, 0xf9, 0xcb, 0x6c, 0x63, 0x90, 0xca, - 0x9c, 0x20, 0x00, 0x62, 0x17, 0x28, 0x0b, 0x09, 0xea, 0x26, 0x15, 0x2c, 0xa6, 0x36, 0xb7, 0x4c, - 0x0c, 0xab, 0x82, 0xb7, 0xd5, 0x46, 0xcd, 0x29, 0x5d, 0x51, 0x6b, 0x0d, 0x4c, 0x0d, 0x3e, 0xa9, - 0xa4, 0x38, 0xf0, 0x32, 0x81, 0xa1, 0x69, 0x18, 0x66, 0x5e, 0xa5, 0xe9, 0x15, 0xbc, 0x47, 0xa3, - 0x67, 0x5c, 0x61, 0x8e, 0xb6, 0x48, 0x20, 0xa4, 0xf9, 0xe7, 0x6d, 0x43, 0x17, 0xa6, 0x49, 0x9b, - 0x20, 0x00, 0xda, 0xfc, 0x63, 0xe1, 0xc0, 0x7d, 0xa2, 0x75, 0xf7, 0x9a, 0x7c, 0xe9, 0x5e, 0x18, - 0xa3, 0x18, 0x8f, 0xf0, 0xa1, 0x57, 0x6b, 0x99, 0xf1, 0x19, 0xe9, 0x64, 0x42, 0x19, 0x65, 0xe0, - 0x55, 0x0e, 0x95, 0xbf, 0x16, 0x81, 0x18, 0x0d, 0x2c, 0x63, 0x30, 0xbc, 0xf1, 0x8e, 0xb5, 0x62, - 0xa9, 0xb0, 0xba, 0x99, 0x5f, 0x2a, 0xa6, 0x25, 0x34, 0x0a, 0x40, 0x01, 0x17, 0x96, 0x56, 0xe7, - 0x36, 0xd2, 0x11, 0xb7, 0xbc, 0xb8, 0xb2, 0x71, 0xee, 0xd1, 0x74, 0xd4, 0x25, 0xd8, 0x64, 0x80, - 0x98, 0x1f, 0xe1, 0x91, 0x33, 0xe9, 0x38, 0x4a, 0x43, 0x8a, 0x31, 0x58, 0x7c, 0xb6, 0x58, 0x38, - 0xf7, 0x68, 0x7a, 0x30, 0x08, 0x79, 0xe4, 0x4c, 0x7a, 0x08, 0x8d, 0x40, 0x92, 0x42, 0xf2, 0xab, - 0xab, 0x4b, 0xe9, 0x84, 0xcb, 0x73, 0x7d, 0x43, 0x59, 0x5c, 0x59, 0x48, 0x27, 0x5d, 0x9e, 0x0b, - 0xca, 0xea, 0xe6, 0x5a, 0x1a, 0x5c, 0x0e, 0xcb, 0xc5, 0xf5, 0xf5, 0xb9, 0x85, 0x62, 0x7a, 0xd8, - 0xc5, 0xc8, 0xbf, 0x63, 0xa3, 0xb8, 0x9e, 0x4e, 0x05, 0xc4, 0x7a, 0xe4, 0x4c, 0x7a, 0xc4, 0x6d, - 0xa2, 0xb8, 0xb2, 0xb9, 0x9c, 0x1e, 0x45, 0xe3, 0x30, 0xc2, 0x9a, 0x10, 0x42, 0x8c, 0x85, 0x40, - 0xe7, 0x1e, 0x4d, 0xa7, 0x3d, 0x41, 0x18, 0x97, 0xf1, 0x00, 0xe0, 0xdc, 0xa3, 0x69, 0x24, 0xcf, - 0x43, 0x9c, 0x9a, 0x21, 0x42, 0x30, 0xba, 0x34, 0x97, 0x2f, 0x2e, 0x95, 0x56, 0xd7, 0x36, 0x16, - 0x57, 0x57, 0xe6, 0x96, 0xd2, 0x92, 0x07, 0x53, 0x8a, 0x4f, 0x6f, 0x2e, 0x2a, 0xc5, 0x42, 0x3a, - 0xe2, 0x87, 0xad, 0x15, 0xe7, 0x36, 0x8a, 0x85, 0x74, 0x54, 0x2e, 0xc3, 0x64, 0xab, 0x80, 0xda, - 0xd2, 0x85, 0x7c, 0xb6, 0x10, 0x69, 0x63, 0x0b, 0x94, 0x57, 0xd8, 0x16, 0xe4, 0xef, 0x47, 0x60, - 0xa2, 0xc5, 0xa4, 0xd2, 0xb2, 0x91, 0x27, 0x21, 0xce, 0x6c, 0x99, 0x4d, 0xb3, 0xf7, 0xb5, 0x9c, - 0x9d, 0xa8, 0x65, 0x37, 0x4d, 0xb5, 0x94, 0xce, 0x9f, 0x6a, 0x44, 0xdb, 0xa4, 0x1a, 0x84, 0x45, - 0x93, 0xc1, 0xfe, 0x5c, 0x53, 0xf0, 0x67, 0xf3, 0xe3, 0xb9, 0x5e, 0xe6, 0x47, 0x0a, 0xeb, 0x6f, - 0x12, 0x88, 0xb7, 0x98, 0x04, 0xce, 0xc3, 0x78, 0x13, 0xa3, 0x9e, 0x83, 0xf1, 0x07, 0x24, 0xc8, - 0xb4, 0x53, 0x4e, 0x97, 0x90, 0x18, 0x09, 0x84, 0xc4, 0xf3, 0x61, 0x0d, 0xde, 0xd1, 0x7e, 0x10, - 0x9a, 0xc6, 0xfa, 0xf3, 0x12, 0x1c, 0x6e, 0x9d, 0x52, 0xb6, 0x94, 0xe1, 0x6d, 0x30, 0x58, 0xc7, - 0xce, 0x8e, 0x21, 0xd2, 0xaa, 0x7b, 0x5a, 0x4c, 0xd6, 0xa4, 0x3a, 0x3c, 0xd8, 0x9c, 0xca, 0x3f, - 0xdb, 0x47, 0xdb, 0xe5, 0x85, 0x4c, 0x9a, 0x26, 0x49, 0x3f, 0x12, 0x81, 0x43, 0x2d, 0x99, 0xb7, - 0x14, 0xf4, 0x04, 0x80, 0xa6, 0x9b, 0x0d, 0x87, 0xa5, 0x4e, 0x2c, 0x12, 0x27, 0x29, 0x84, 0x06, - 0x2f, 0x12, 0x65, 0x1b, 0x8e, 0x5b, 0x1f, 0xa5, 0xf5, 0xc0, 0x40, 0x14, 0xe1, 0x71, 0x4f, 0xd0, - 0x18, 0x15, 0x74, 0xaa, 0x4d, 0x4f, 0x9b, 0x0c, 0xf3, 0x21, 0x48, 0x97, 0x6b, 0x1a, 0xd6, 0x9d, - 0x92, 0xed, 0x58, 0x58, 0xad, 0x6b, 0x7a, 0x95, 0x4e, 0x35, 0x89, 0x5c, 0x7c, 0x5b, 0xad, 0xd9, - 0x58, 0x19, 0x63, 0xd5, 0xeb, 0xa2, 0x96, 0x50, 0x50, 0x03, 0xb2, 0x7c, 0x14, 0x83, 0x01, 0x0a, - 0x56, 0xed, 0x52, 0xc8, 0x1f, 0x4b, 0xc2, 0xb0, 0x2f, 0x01, 0x47, 0x77, 0x40, 0xea, 0x79, 0xf5, - 0x8a, 0x5a, 0x12, 0x8b, 0x2a, 0xa6, 0x89, 0x61, 0x02, 0x5b, 0xe3, 0x0b, 0xab, 0x87, 0x60, 0x92, - 0xa2, 0x18, 0x0d, 0x07, 0x5b, 0xa5, 0x72, 0x4d, 0xb5, 0x6d, 0xaa, 0xb4, 0x04, 0x45, 0x45, 0xa4, - 0x6e, 0x95, 0x54, 0xcd, 0x8b, 0x1a, 0x74, 0x16, 0x26, 0x28, 0x45, 0xbd, 0x51, 0x73, 0x34, 0xb3, - 0x86, 0x4b, 0x64, 0x99, 0x67, 0xd3, 0x29, 0xc7, 0x95, 0x6c, 0x9c, 0x60, 0x2c, 0x73, 0x04, 0x22, - 0x91, 0x8d, 0x0a, 0x70, 0x82, 0x92, 0x55, 0xb1, 0x8e, 0x2d, 0xd5, 0xc1, 0x25, 0xfc, 0x42, 0x43, - 0xad, 0xd9, 0x25, 0x55, 0xaf, 0x94, 0x76, 0x54, 0x7b, 0x27, 0x33, 0x49, 0x18, 0xe4, 0x23, 0x19, - 0x49, 0x39, 0x4a, 0x10, 0x17, 0x38, 0x5e, 0x91, 0xa2, 0xcd, 0xe9, 0x95, 0x8b, 0xaa, 0xbd, 0x83, - 0x72, 0x70, 0x98, 0x72, 0xb1, 0x1d, 0x4b, 0xd3, 0xab, 0xa5, 0xf2, 0x0e, 0x2e, 0xef, 0x96, 0x1a, - 0xce, 0xf6, 0xe3, 0x99, 0x63, 0xfe, 0xf6, 0xa9, 0x84, 0xeb, 0x14, 0x67, 0x9e, 0xa0, 0x6c, 0x3a, - 0xdb, 0x8f, 0xa3, 0x75, 0x48, 0x91, 0xc1, 0xa8, 0x6b, 0x2f, 0xe2, 0xd2, 0xb6, 0x61, 0xd1, 0x39, - 0x74, 0xb4, 0x45, 0x68, 0xf2, 0x69, 0x70, 0x76, 0x95, 0x13, 0x2c, 0x1b, 0x15, 0x9c, 0x8b, 0xaf, - 0xaf, 0x15, 0x8b, 0x05, 0x65, 0x58, 0x70, 0xb9, 0x60, 0x58, 0xc4, 0xa0, 0xaa, 0x86, 0xab, 0xe0, - 0x61, 0x66, 0x50, 0x55, 0x43, 0xa8, 0xf7, 0x2c, 0x4c, 0x94, 0xcb, 0xac, 0xcf, 0x5a, 0xb9, 0xc4, - 0x17, 0x63, 0x76, 0x26, 0x1d, 0x50, 0x56, 0xb9, 0xbc, 0xc0, 0x10, 0xb8, 0x8d, 0xdb, 0xe8, 0x09, - 0x38, 0xe4, 0x29, 0xcb, 0x4f, 0x38, 0xde, 0xd4, 0xcb, 0x30, 0xe9, 0x59, 0x98, 0x30, 0xf7, 0x9b, - 0x09, 0x51, 0xa0, 0x45, 0x73, 0x3f, 0x4c, 0xf6, 0x18, 0x4c, 0x9a, 0x3b, 0x66, 0x33, 0xdd, 0x29, - 0x3f, 0x1d, 0x32, 0x77, 0xcc, 0x30, 0xe1, 0xdd, 0x74, 0x65, 0x6e, 0xe1, 0xb2, 0xea, 0xe0, 0x4a, - 0xe6, 0x88, 0x1f, 0xdd, 0x57, 0x81, 0x66, 0x21, 0x5d, 0x2e, 0x97, 0xb0, 0xae, 0x6e, 0xd5, 0x70, - 0x49, 0xb5, 0xb0, 0xae, 0xda, 0x99, 0x69, 0x8a, 0x1c, 0x73, 0xac, 0x06, 0x56, 0x46, 0xcb, 0xe5, - 0x22, 0xad, 0x9c, 0xa3, 0x75, 0xe8, 0x14, 0x8c, 0x1b, 0x5b, 0xcf, 0x97, 0x99, 0x45, 0x96, 0x4c, - 0x0b, 0x6f, 0x6b, 0x7b, 0x99, 0xbb, 0xa8, 0x7a, 0xc7, 0x48, 0x05, 0xb5, 0xc7, 0x35, 0x0a, 0x46, - 0xf7, 0x41, 0xba, 0x6c, 0xef, 0xa8, 0x96, 0x49, 0x43, 0xb2, 0x6d, 0xaa, 0x65, 0x9c, 0xb9, 0x9b, - 0xa1, 0x32, 0xf8, 0x8a, 0x00, 0x13, 0x8f, 0xb0, 0xaf, 0x6a, 0xdb, 0x8e, 0xe0, 0x78, 0x2f, 0xf3, - 0x08, 0x0a, 0xe3, 0xdc, 0x4e, 0x42, 0x9a, 0x68, 0x22, 0xd0, 0xf0, 0x49, 0x8a, 0x36, 0x6a, 0xee, - 0x98, 0xfe, 0x76, 0xef, 0x84, 0x11, 0x82, 0xe9, 0x35, 0x7a, 0x1f, 0x4b, 0xdc, 0xcc, 0x1d, 0x5f, - 0x8b, 0x8f, 0xc2, 0x61, 0x82, 0x54, 0xc7, 0x8e, 0x5a, 0x51, 0x1d, 0xd5, 0x87, 0xfd, 0x00, 0xc5, - 0x26, 0x6a, 0x5f, 0xe6, 0x95, 0x01, 0x39, 0xad, 0xc6, 0xd6, 0xbe, 0x6b, 0x58, 0x0f, 0x32, 0x39, - 0x09, 0x4c, 0x98, 0xd6, 0x6d, 0x4b, 0xce, 0xe5, 0x1c, 0xa4, 0xfc, 0x76, 0x8f, 0x92, 0xc0, 0x2c, - 0x3f, 0x2d, 0x91, 0x24, 0x68, 0x7e, 0xb5, 0x40, 0xd2, 0x97, 0xe7, 0x8a, 0xe9, 0x08, 0x49, 0xa3, - 0x96, 0x16, 0x37, 0x8a, 0x25, 0x65, 0x73, 0x65, 0x63, 0x71, 0xb9, 0x98, 0x8e, 0xfa, 0x12, 0xfb, - 0xa7, 0x62, 0x89, 0x7b, 0xd2, 0xf7, 0xca, 0xdf, 0x8d, 0xc0, 0x68, 0x70, 0xa5, 0x86, 0xde, 0x02, - 0x47, 0xc4, 0xb6, 0x8a, 0x8d, 0x9d, 0xd2, 0x55, 0xcd, 0xa2, 0x0e, 0x59, 0x57, 0xd9, 0xe4, 0xe8, - 0xda, 0xcf, 0x24, 0xc7, 0x5a, 0xc7, 0xce, 0x33, 0x9a, 0x45, 0xdc, 0xad, 0xae, 0x3a, 0x68, 0x09, - 0xa6, 0x75, 0xa3, 0x64, 0x3b, 0xaa, 0x5e, 0x51, 0xad, 0x4a, 0xc9, 0xdb, 0xd0, 0x2a, 0xa9, 0xe5, - 0x32, 0xb6, 0x6d, 0x83, 0x4d, 0x84, 0x2e, 0x97, 0xe3, 0xba, 0xb1, 0xce, 0x91, 0xbd, 0x19, 0x62, - 0x8e, 0xa3, 0x86, 0xcc, 0x37, 0xda, 0xce, 0x7c, 0x8f, 0x41, 0xb2, 0xae, 0x9a, 0x25, 0xac, 0x3b, - 0xd6, 0x3e, 0xcd, 0xcf, 0x13, 0x4a, 0xa2, 0xae, 0x9a, 0x45, 0x52, 0x7e, 0x43, 0x96, 0x49, 0x4f, - 0xc5, 0x12, 0x89, 0x74, 0xf2, 0xa9, 0x58, 0x22, 0x99, 0x06, 0xf9, 0xd5, 0x28, 0xa4, 0xfc, 0xf9, - 0x3a, 0x59, 0xfe, 0x94, 0xe9, 0x8c, 0x25, 0xd1, 0x98, 0x76, 0x67, 0xc7, 0xec, 0x7e, 0x76, 0x9e, - 0x4c, 0x65, 0xb9, 0x41, 0x96, 0x1c, 0x2b, 0x8c, 0x92, 0xa4, 0x11, 0xc4, 0xd8, 0x30, 0x4b, 0x46, - 0x12, 0x0a, 0x2f, 0xa1, 0x05, 0x18, 0x7c, 0xde, 0xa6, 0xbc, 0x07, 0x29, 0xef, 0xbb, 0x3a, 0xf3, - 0x7e, 0x6a, 0x9d, 0x32, 0x4f, 0x3e, 0xb5, 0x5e, 0x5a, 0x59, 0x55, 0x96, 0xe7, 0x96, 0x14, 0x4e, - 0x8e, 0x8e, 0x42, 0xac, 0xa6, 0xbe, 0xb8, 0x1f, 0x9c, 0xf4, 0x28, 0xa8, 0xd7, 0x41, 0x38, 0x0a, - 0xb1, 0xab, 0x58, 0xdd, 0x0d, 0x4e, 0x35, 0x14, 0x74, 0x1b, 0x9d, 0xe1, 0x34, 0xc4, 0xa9, 0xbe, - 0x10, 0x00, 0xd7, 0x58, 0x7a, 0x00, 0x25, 0x20, 0x36, 0xbf, 0xaa, 0x10, 0x87, 0x48, 0x43, 0x8a, - 0x41, 0x4b, 0x6b, 0x8b, 0xc5, 0xf9, 0x62, 0x3a, 0x22, 0x9f, 0x85, 0x41, 0xa6, 0x04, 0xe2, 0x2c, - 0xae, 0x1a, 0xd2, 0x03, 0xbc, 0xc8, 0x79, 0x48, 0xa2, 0x76, 0x73, 0x39, 0x5f, 0x54, 0xd2, 0x91, - 0xe0, 0x50, 0xc7, 0xd2, 0x71, 0xd9, 0x86, 0x94, 0x3f, 0x0f, 0x7f, 0x63, 0x16, 0xe3, 0x5f, 0x97, - 0x60, 0xd8, 0x97, 0x57, 0x93, 0x84, 0x48, 0xad, 0xd5, 0x8c, 0xab, 0x25, 0xb5, 0xa6, 0xa9, 0x36, - 0x37, 0x0d, 0xa0, 0xa0, 0x39, 0x02, 0xe9, 0x75, 0xe8, 0xde, 0x20, 0x17, 0x89, 0xa7, 0x07, 0xe5, - 0xcf, 0x48, 0x90, 0x0e, 0x27, 0xb6, 0x21, 0x31, 0xa5, 0x37, 0x53, 0x4c, 0xf9, 0xd3, 0x12, 0x8c, - 0x06, 0xb3, 0xd9, 0x90, 0x78, 0x77, 0xbc, 0xa9, 0xe2, 0xfd, 0x51, 0x04, 0x46, 0x02, 0x39, 0x6c, - 0xaf, 0xd2, 0xbd, 0x00, 0xe3, 0x5a, 0x05, 0xd7, 0x4d, 0xc3, 0xc1, 0x7a, 0x79, 0xbf, 0x54, 0xc3, - 0x57, 0x70, 0x2d, 0x23, 0xd3, 0xa0, 0x71, 0xba, 0x73, 0x96, 0x3c, 0xbb, 0xe8, 0xd1, 0x2d, 0x11, - 0xb2, 0xdc, 0xc4, 0x62, 0xa1, 0xb8, 0xbc, 0xb6, 0xba, 0x51, 0x5c, 0x99, 0x7f, 0x47, 0x69, 0x73, - 0xe5, 0xd2, 0xca, 0xea, 0x33, 0x2b, 0x4a, 0x5a, 0x0b, 0xa1, 0xdd, 0x46, 0xb7, 0x5f, 0x83, 0x74, - 0x58, 0x28, 0x74, 0x04, 0x5a, 0x89, 0x95, 0x1e, 0x40, 0x13, 0x30, 0xb6, 0xb2, 0x5a, 0x5a, 0x5f, - 0x2c, 0x14, 0x4b, 0xc5, 0x0b, 0x17, 0x8a, 0xf3, 0x1b, 0xeb, 0x6c, 0xdf, 0xc3, 0xc5, 0xde, 0x08, - 0x38, 0xb8, 0xfc, 0x72, 0x14, 0x26, 0x5a, 0x48, 0x82, 0xe6, 0xf8, 0x8a, 0x85, 0x2d, 0xa2, 0x1e, - 0xec, 0x45, 0xfa, 0x59, 0x92, 0x33, 0xac, 0xa9, 0x96, 0xc3, 0x17, 0x38, 0xf7, 0x01, 0xd1, 0x92, - 0xee, 0x68, 0xdb, 0x1a, 0xb6, 0xf8, 0x7e, 0x12, 0x5b, 0xc6, 0x8c, 0x79, 0x70, 0xb6, 0xa5, 0xf4, - 0x00, 0x20, 0xd3, 0xb0, 0x35, 0x47, 0xbb, 0x82, 0x4b, 0x9a, 0x2e, 0x36, 0x9f, 0xc8, 0xb2, 0x26, - 0xa6, 0xa4, 0x45, 0xcd, 0xa2, 0xee, 0xb8, 0xd8, 0x3a, 0xae, 0xaa, 0x21, 0x6c, 0x12, 0xcc, 0xa3, - 0x4a, 0x5a, 0xd4, 0xb8, 0xd8, 0x77, 0x40, 0xaa, 0x62, 0x34, 0x48, 0xae, 0xc7, 0xf0, 0xc8, 0xdc, - 0x21, 0x29, 0xc3, 0x0c, 0xe6, 0xa2, 0xf0, 0x2c, 0xde, 0xdb, 0xf5, 0x4a, 0x29, 0xc3, 0x0c, 0xc6, - 0x50, 0xee, 0x85, 0x31, 0xb5, 0x5a, 0xb5, 0x08, 0x73, 0xc1, 0x88, 0xad, 0x4b, 0x46, 0x5d, 0x30, - 0x45, 0xcc, 0x3e, 0x05, 0x09, 0xa1, 0x07, 0x32, 0x55, 0x13, 0x4d, 0x94, 0x4c, 0xb6, 0xd8, 0x8e, - 0x9c, 0x4c, 0x2a, 0x09, 0x5d, 0x54, 0xde, 0x01, 0x29, 0xcd, 0x2e, 0x79, 0x9b, 0xf8, 0x91, 0x99, - 0xc8, 0xc9, 0x84, 0x32, 0xac, 0xd9, 0xee, 0x06, 0xa8, 0xfc, 0xf9, 0x08, 0x8c, 0x06, 0x0f, 0x21, - 0x50, 0x01, 0x12, 0x35, 0xa3, 0xac, 0x52, 0xd3, 0x62, 0x27, 0x60, 0x27, 0xbb, 0x9c, 0x5b, 0xcc, - 0x2e, 0x71, 0x7c, 0xc5, 0xa5, 0xcc, 0xfe, 0xae, 0x04, 0x09, 0x01, 0x46, 0x87, 0x21, 0x66, 0xaa, - 0xce, 0x0e, 0x65, 0x17, 0xcf, 0x47, 0xd2, 0x92, 0x42, 0xcb, 0x04, 0x6e, 0x9b, 0xaa, 0x4e, 0x4d, - 0x80, 0xc3, 0x49, 0x99, 0x8c, 0x6b, 0x0d, 0xab, 0x15, 0xba, 0xe8, 0x31, 0xea, 0x75, 0xac, 0x3b, - 0xb6, 0x18, 0x57, 0x0e, 0x9f, 0xe7, 0x60, 0x74, 0x3f, 0x8c, 0x3b, 0x96, 0xaa, 0xd5, 0x02, 0xb8, - 0x31, 0x8a, 0x9b, 0x16, 0x15, 0x2e, 0x72, 0x0e, 0x8e, 0x0a, 0xbe, 0x15, 0xec, 0xa8, 0xe5, 0x1d, - 0x5c, 0xf1, 0x88, 0x06, 0xe9, 0xe6, 0xc6, 0x11, 0x8e, 0x50, 0xe0, 0xf5, 0x82, 0x56, 0xfe, 0xae, - 0x04, 0xe3, 0x62, 0x99, 0x56, 0x71, 0x95, 0xb5, 0x0c, 0xa0, 0xea, 0xba, 0xe1, 0xf8, 0xd5, 0xd5, - 0x6c, 0xca, 0x4d, 0x74, 0xb3, 0x73, 0x2e, 0x91, 0xe2, 0x63, 0x90, 0xad, 0x03, 0x78, 0x35, 0x6d, - 0xd5, 0x36, 0x0d, 0xc3, 0xfc, 0x84, 0x89, 0x1e, 0x53, 0xb2, 0x85, 0x3d, 0x30, 0x10, 0x59, 0xcf, - 0xa1, 0x49, 0x88, 0x6f, 0xe1, 0xaa, 0xa6, 0xf3, 0x7d, 0x63, 0x56, 0x10, 0xdb, 0x2f, 0x31, 0x77, - 0xfb, 0x25, 0xff, 0x97, 0x61, 0xa2, 0x6c, 0xd4, 0xc3, 0xe2, 0xe6, 0xd3, 0xa1, 0xcd, 0x05, 0xfb, - 0xa2, 0xf4, 0xdc, 0x83, 0x1c, 0xa9, 0x6a, 0xd4, 0x54, 0xbd, 0x3a, 0x6b, 0x58, 0x55, 0xef, 0x98, - 0x95, 0x64, 0x3c, 0xb6, 0xef, 0xb0, 0xd5, 0xdc, 0xfa, 0x33, 0x49, 0xfa, 0xe5, 0x48, 0x74, 0x61, - 0x2d, 0xff, 0x85, 0x48, 0x76, 0x81, 0x11, 0xae, 0x09, 0x65, 0x28, 0x78, 0xbb, 0x86, 0xcb, 0xa4, - 0x83, 0xf0, 0xc3, 0xfb, 0x61, 0xb2, 0x6a, 0x54, 0x0d, 0xca, 0xe9, 0x34, 0xf9, 0xc5, 0xcf, 0x69, - 0x93, 0x2e, 0x34, 0xdb, 0xf5, 0x50, 0x37, 0xb7, 0x02, 0x13, 0x1c, 0xb9, 0x44, 0x0f, 0x8a, 0xd8, - 0x32, 0x06, 0x75, 0xdc, 0x43, 0xcb, 0x7c, 0xf9, 0x07, 0x74, 0xfa, 0x56, 0xc6, 0x39, 0x29, 0xa9, - 0x63, 0x2b, 0x9d, 0x9c, 0x02, 0x87, 0x02, 0xfc, 0x98, 0x93, 0x62, 0xab, 0x0b, 0xc7, 0xdf, 0xe2, - 0x1c, 0x27, 0x7c, 0x1c, 0xd7, 0x39, 0x69, 0x6e, 0x1e, 0x46, 0xfa, 0xe1, 0xf5, 0x2f, 0x38, 0xaf, - 0x14, 0xf6, 0x33, 0x59, 0x80, 0x31, 0xca, 0xa4, 0xdc, 0xb0, 0x1d, 0xa3, 0x4e, 0x23, 0x60, 0x67, - 0x36, 0xbf, 0xfd, 0x03, 0xe6, 0x35, 0xa3, 0x84, 0x6c, 0xde, 0xa5, 0xca, 0xe5, 0x80, 0x9e, 0x8d, - 0x55, 0x70, 0xb9, 0xd6, 0x85, 0xc3, 0x37, 0xb9, 0x20, 0x2e, 0x7e, 0xee, 0x32, 0x4c, 0x92, 0xdf, - 0x34, 0x40, 0xf9, 0x25, 0xe9, 0xbe, 0xe1, 0x96, 0xf9, 0xee, 0x07, 0x98, 0x63, 0x4e, 0xb8, 0x0c, - 0x7c, 0x32, 0xf9, 0x46, 0xb1, 0x8a, 0x1d, 0x07, 0x5b, 0x76, 0x49, 0xad, 0xb5, 0x12, 0xcf, 0xb7, - 0x63, 0x91, 0xf9, 0xe4, 0x8f, 0x82, 0xa3, 0xb8, 0xc0, 0x28, 0xe7, 0x6a, 0xb5, 0xdc, 0x26, 0x1c, - 0x69, 0x61, 0x15, 0x3d, 0xf0, 0x7c, 0x99, 0xf3, 0x9c, 0x6c, 0xb2, 0x0c, 0xc2, 0x76, 0x0d, 0x04, - 0xdc, 0x1d, 0xcb, 0x1e, 0x78, 0x7e, 0x8a, 0xf3, 0x44, 0x9c, 0x56, 0x0c, 0x29, 0xe1, 0xf8, 0x14, - 0x8c, 0x5f, 0xc1, 0xd6, 0x96, 0x61, 0xf3, 0x5d, 0xa2, 0x1e, 0xd8, 0x7d, 0x9a, 0xb3, 0x1b, 0xe3, - 0x84, 0x74, 0xdb, 0x88, 0xf0, 0x7a, 0x02, 0x12, 0xdb, 0x6a, 0x19, 0xf7, 0xc0, 0xe2, 0x3a, 0x67, - 0x31, 0x44, 0xf0, 0x09, 0xe9, 0x1c, 0xa4, 0xaa, 0x06, 0x9f, 0xa3, 0xba, 0x93, 0x7f, 0x86, 0x93, - 0x0f, 0x0b, 0x1a, 0xce, 0xc2, 0x34, 0xcc, 0x46, 0x8d, 0x4c, 0x60, 0xdd, 0x59, 0xfc, 0x2d, 0xc1, - 0x42, 0xd0, 0x70, 0x16, 0x7d, 0xa8, 0xf5, 0x15, 0xc1, 0xc2, 0xf6, 0xe9, 0xf3, 0x49, 0x18, 0x36, - 0xf4, 0xda, 0xbe, 0xa1, 0xf7, 0x22, 0xc4, 0x67, 0x39, 0x07, 0xe0, 0x24, 0x84, 0xc1, 0x79, 0x48, - 0xf6, 0x3a, 0x10, 0x7f, 0xfb, 0x47, 0xc2, 0x3d, 0xc4, 0x08, 0x2c, 0xc0, 0x98, 0x08, 0x50, 0x9a, - 0xa1, 0xf7, 0xc0, 0xe2, 0xef, 0x70, 0x16, 0xa3, 0x3e, 0x32, 0xde, 0x0d, 0x07, 0xdb, 0x4e, 0x15, - 0xf7, 0xc2, 0xe4, 0xf3, 0xa2, 0x1b, 0x9c, 0x84, 0xab, 0x72, 0x0b, 0xeb, 0xe5, 0x9d, 0xde, 0x38, - 0xfc, 0xaa, 0x50, 0xa5, 0xa0, 0x21, 0x2c, 0xe6, 0x61, 0xa4, 0xae, 0x5a, 0xf6, 0x8e, 0x5a, 0xeb, - 0x69, 0x38, 0xfe, 0x2e, 0xe7, 0x91, 0x72, 0x89, 0xb8, 0x46, 0x1a, 0x7a, 0x3f, 0x6c, 0xbe, 0x20, - 0x34, 0xe2, 0x23, 0xe3, 0xae, 0x67, 0x3b, 0x74, 0x4b, 0xad, 0x1f, 0x6e, 0xbf, 0x26, 0x5c, 0x8f, - 0xd1, 0x2e, 0xfb, 0x39, 0x9e, 0x87, 0xa4, 0xad, 0xbd, 0xd8, 0x13, 0x9b, 0x2f, 0x8a, 0x91, 0xa6, - 0x04, 0x84, 0xf8, 0x1d, 0x70, 0xb4, 0xe5, 0x34, 0xd1, 0x03, 0xb3, 0xbf, 0xc7, 0x99, 0x1d, 0x6e, - 0x31, 0x55, 0xf0, 0x90, 0xd0, 0x2f, 0xcb, 0xbf, 0x2f, 0x42, 0x02, 0x0e, 0xf1, 0x5a, 0x23, 0xab, - 0x06, 0x5b, 0xdd, 0xee, 0x4f, 0x6b, 0xbf, 0x2e, 0xb4, 0xc6, 0x68, 0x03, 0x5a, 0xdb, 0x80, 0xc3, - 0x9c, 0x63, 0x7f, 0xe3, 0xfa, 0x25, 0x11, 0x58, 0x19, 0xf5, 0x66, 0x70, 0x74, 0xdf, 0x09, 0x59, - 0x57, 0x9d, 0x22, 0x3d, 0xb5, 0x4b, 0x75, 0xd5, 0xec, 0x81, 0xf3, 0x97, 0x39, 0x67, 0x11, 0xf1, - 0xdd, 0xfc, 0xd6, 0x5e, 0x56, 0x4d, 0xc2, 0xfc, 0x59, 0xc8, 0x08, 0xe6, 0x0d, 0xdd, 0xc2, 0x65, - 0xa3, 0xaa, 0x6b, 0x2f, 0xe2, 0x4a, 0x0f, 0xac, 0x7f, 0x23, 0x34, 0x54, 0x9b, 0x3e, 0x72, 0xc2, - 0x79, 0x11, 0xd2, 0x6e, 0xae, 0x52, 0xd2, 0xea, 0xa6, 0x61, 0x39, 0x5d, 0x38, 0x7e, 0x45, 0x8c, - 0x94, 0x4b, 0xb7, 0x48, 0xc9, 0x72, 0x45, 0x60, 0xe7, 0xcc, 0xbd, 0x9a, 0xe4, 0x57, 0x39, 0xa3, - 0x11, 0x8f, 0x8a, 0x07, 0x8e, 0xb2, 0x51, 0x37, 0x55, 0xab, 0x97, 0xf8, 0xf7, 0x0f, 0x44, 0xe0, - 0xe0, 0x24, 0x3c, 0x70, 0x90, 0x8c, 0x8e, 0xcc, 0xf6, 0x3d, 0x70, 0xf8, 0x9a, 0x08, 0x1c, 0x82, - 0x86, 0xb3, 0x10, 0x09, 0x43, 0x0f, 0x2c, 0xfe, 0xa1, 0x60, 0x21, 0x68, 0x08, 0x8b, 0xa7, 0xbd, - 0x89, 0xd6, 0xc2, 0x55, 0xcd, 0x76, 0x2c, 0x96, 0x14, 0x77, 0x66, 0xf5, 0x8f, 0x7e, 0x14, 0x4c, - 0xc2, 0x14, 0x1f, 0x29, 0x89, 0x44, 0x7c, 0x93, 0x95, 0xae, 0x99, 0xba, 0x0b, 0xf6, 0x9b, 0x22, - 0x12, 0xf9, 0xc8, 0x88, 0x6c, 0xbe, 0x0c, 0x91, 0xa8, 0xbd, 0x4c, 0x56, 0x0a, 0x3d, 0xb0, 0xfb, - 0xc7, 0x21, 0xe1, 0xd6, 0x05, 0x2d, 0xe1, 0xe9, 0xcb, 0x7f, 0x1a, 0xfa, 0x2e, 0xde, 0xef, 0xc9, - 0x3a, 0xff, 0x49, 0x28, 0xff, 0xd9, 0x64, 0x94, 0x2c, 0x86, 0x8c, 0x85, 0xf2, 0x29, 0xd4, 0xed, - 0x56, 0x51, 0xe6, 0x7d, 0x3f, 0xe1, 0xfd, 0x0d, 0xa6, 0x53, 0xb9, 0x25, 0x62, 0xe4, 0xc1, 0xa4, - 0xa7, 0x3b, 0xb3, 0x0f, 0xfc, 0xc4, 0xb5, 0xf3, 0x40, 0xce, 0x93, 0xbb, 0x00, 0x23, 0x81, 0x84, - 0xa7, 0x3b, 0xab, 0x0f, 0x72, 0x56, 0x29, 0x7f, 0xbe, 0x93, 0x3b, 0x0b, 0x31, 0x92, 0xbc, 0x74, - 0x27, 0xff, 0x2b, 0x9c, 0x9c, 0xa2, 0xe7, 0xde, 0x0a, 0x09, 0x91, 0xb4, 0x74, 0x27, 0xfd, 0x10, - 0x27, 0x75, 0x49, 0x08, 0xb9, 0x48, 0x58, 0xba, 0x93, 0xff, 0x55, 0x41, 0x2e, 0x48, 0x08, 0x79, - 0xef, 0x2a, 0xfc, 0xfa, 0xcf, 0xc7, 0xf8, 0xa4, 0x23, 0x74, 0x77, 0x1e, 0x86, 0x78, 0xa6, 0xd2, - 0x9d, 0xfa, 0x23, 0xbc, 0x71, 0x41, 0x91, 0x7b, 0x0c, 0xe2, 0x3d, 0x2a, 0xfc, 0x17, 0x38, 0x29, - 0xc3, 0xcf, 0xcd, 0xc3, 0xb0, 0x2f, 0x3b, 0xe9, 0x4e, 0xfe, 0xd7, 0x38, 0xb9, 0x9f, 0x8a, 0x88, - 0xce, 0xb3, 0x93, 0xee, 0x0c, 0x7e, 0x51, 0x88, 0xce, 0x29, 0x88, 0xda, 0x44, 0x62, 0xd2, 0x9d, - 0xfa, 0xa3, 0x42, 0xeb, 0x82, 0x24, 0xf7, 0x24, 0x24, 0xdd, 0xc9, 0xa6, 0x3b, 0xfd, 0xc7, 0x38, - 0xbd, 0x47, 0x43, 0x34, 0xe0, 0x9b, 0xec, 0xba, 0xb3, 0xf8, 0xeb, 0x42, 0x03, 0x3e, 0x2a, 0xe2, - 0x46, 0xe1, 0x04, 0xa6, 0x3b, 0xa7, 0x8f, 0x0b, 0x37, 0x0a, 0xe5, 0x2f, 0x64, 0x34, 0x69, 0xcc, - 0xef, 0xce, 0xe2, 0x6f, 0x88, 0xd1, 0xa4, 0xf8, 0x44, 0x8c, 0x70, 0x46, 0xd0, 0x9d, 0xc7, 0x2f, - 0x09, 0x31, 0x42, 0x09, 0x41, 0x6e, 0x0d, 0x50, 0x73, 0x36, 0xd0, 0x9d, 0xdf, 0x27, 0x38, 0xbf, - 0xf1, 0xa6, 0x64, 0x20, 0xf7, 0x0c, 0x1c, 0x6e, 0x9d, 0x09, 0x74, 0xe7, 0xfa, 0xc9, 0x9f, 0x84, - 0xd6, 0x6e, 0xfe, 0x44, 0x20, 0xb7, 0xe1, 0x4d, 0x29, 0xfe, 0x2c, 0xa0, 0x3b, 0xdb, 0x97, 0x7f, - 0x12, 0x0c, 0xdc, 0xfe, 0x24, 0x20, 0x37, 0x07, 0xe0, 0x4d, 0xc0, 0xdd, 0x79, 0x7d, 0x9a, 0xf3, - 0xf2, 0x11, 0x11, 0xd7, 0xe0, 0xf3, 0x6f, 0x77, 0xfa, 0xeb, 0xc2, 0x35, 0x38, 0x05, 0x71, 0x0d, - 0x31, 0xf5, 0x76, 0xa7, 0xfe, 0x8c, 0x70, 0x0d, 0x41, 0x42, 0x2c, 0xdb, 0x37, 0xbb, 0x75, 0xe7, - 0xf0, 0x59, 0x61, 0xd9, 0x3e, 0xaa, 0xdc, 0x0a, 0x8c, 0x37, 0x4d, 0x88, 0xdd, 0x59, 0xfd, 0x32, - 0x67, 0x95, 0x0e, 0xcf, 0x87, 0xfe, 0xc9, 0x8b, 0x4f, 0x86, 0xdd, 0xb9, 0x7d, 0x2e, 0x34, 0x79, - 0xf1, 0xb9, 0x30, 0x77, 0x1e, 0x12, 0x7a, 0xa3, 0x56, 0x23, 0xce, 0x83, 0x3a, 0xdf, 0x04, 0xcc, - 0xfc, 0xe7, 0x9f, 0x72, 0xed, 0x08, 0x82, 0xdc, 0x59, 0x88, 0xe3, 0xfa, 0x16, 0xae, 0x74, 0xa3, - 0xfc, 0xe1, 0x4f, 0x45, 0xc0, 0x24, 0xd8, 0xb9, 0x27, 0x01, 0xd8, 0xd6, 0x08, 0x3d, 0x0c, 0xec, - 0x42, 0xfb, 0x5f, 0x7e, 0xca, 0xaf, 0xde, 0x78, 0x24, 0x1e, 0x03, 0x76, 0x91, 0xa7, 0x33, 0x83, - 0x1f, 0x05, 0x19, 0xd0, 0x11, 0x79, 0x02, 0x86, 0x9e, 0xb7, 0x0d, 0xdd, 0x51, 0xab, 0xdd, 0xa8, - 0xff, 0x2b, 0xa7, 0x16, 0xf8, 0x44, 0x61, 0x75, 0xc3, 0xc2, 0x8e, 0x5a, 0xb5, 0xbb, 0xd1, 0xfe, - 0x37, 0x4e, 0xeb, 0x12, 0x10, 0xe2, 0xb2, 0x6a, 0x3b, 0xbd, 0xf4, 0xfb, 0x4f, 0x04, 0xb1, 0x20, - 0x20, 0x42, 0x93, 0xdf, 0xbb, 0x78, 0xbf, 0x1b, 0xed, 0x8f, 0x85, 0xd0, 0x1c, 0x3f, 0xf7, 0x56, - 0x48, 0x92, 0x9f, 0xec, 0x3e, 0x5d, 0x17, 0xe2, 0x3f, 0xe5, 0xc4, 0x1e, 0x05, 0x69, 0xd9, 0x76, - 0x2a, 0x8e, 0xd6, 0x5d, 0xd9, 0x37, 0xf9, 0x48, 0x0b, 0xfc, 0xdc, 0x1c, 0x0c, 0xdb, 0x4e, 0xa5, - 0xd2, 0xe0, 0xf9, 0x69, 0x17, 0xf2, 0xff, 0xfe, 0x53, 0x77, 0xcb, 0xc2, 0xa5, 0x21, 0xa3, 0x7d, - 0x75, 0xd7, 0x31, 0x0d, 0x7a, 0xe0, 0xd1, 0x8d, 0xc3, 0x4f, 0x38, 0x07, 0x1f, 0x49, 0x6e, 0x1e, - 0x52, 0xa4, 0x2f, 0x16, 0x36, 0x31, 0x3d, 0x9d, 0xea, 0xc2, 0xe2, 0x7f, 0x70, 0x05, 0x04, 0x88, - 0xf2, 0x3f, 0xf7, 0xcd, 0x57, 0xa7, 0xa4, 0xef, 0xbc, 0x3a, 0x25, 0xfd, 0xd1, 0xab, 0x53, 0xd2, - 0x47, 0xbf, 0x3f, 0x35, 0xf0, 0x9d, 0xef, 0x4f, 0x0d, 0xfc, 0xfe, 0xf7, 0xa7, 0x06, 0x5a, 0xef, - 0x12, 0xc3, 0x82, 0xb1, 0x60, 0xb0, 0xfd, 0xe1, 0xe7, 0xe4, 0xaa, 0xe6, 0xec, 0x34, 0xb6, 0x66, - 0xcb, 0x46, 0x9d, 0x6e, 0xe3, 0x7a, 0xbb, 0xb5, 0xee, 0x22, 0x07, 0xde, 0x1f, 0x85, 0xa3, 0x65, - 0xc3, 0xae, 0x1b, 0x76, 0x89, 0xed, 0xf7, 0xb2, 0x02, 0xdf, 0xf1, 0x4d, 0xf9, 0xab, 0x7a, 0xd8, - 0xf4, 0xbd, 0x08, 0xa3, 0xb4, 0xeb, 0x74, 0xbb, 0x8b, 0x5a, 0x5b, 0xd7, 0x00, 0xf1, 0xad, 0x7f, - 0x1b, 0xa7, 0xbd, 0x1e, 0x71, 0x09, 0xe9, 0xe9, 0xfd, 0x06, 0x4c, 0x6a, 0x75, 0xb3, 0x86, 0xe9, - 0x36, 0x7f, 0xc9, 0xad, 0xeb, 0xce, 0xef, 0xdb, 0x9c, 0xdf, 0x84, 0x47, 0xbe, 0x28, 0xa8, 0x73, - 0x4b, 0x30, 0xae, 0x96, 0xcb, 0xd8, 0x0c, 0xb0, 0xec, 0x32, 0x2c, 0x42, 0xc0, 0x34, 0xa7, 0x74, - 0xb9, 0xe5, 0x9f, 0x6c, 0x37, 0x34, 0xcf, 0xdd, 0xed, 0xd3, 0xbc, 0x85, 0xab, 0x58, 0x7f, 0x50, - 0xc7, 0xce, 0x55, 0xc3, 0xda, 0xe5, 0xea, 0x7d, 0x90, 0x35, 0x35, 0xc8, 0x6e, 0x30, 0xc3, 0x07, - 0xa3, 0x30, 0xc5, 0x2a, 0x4e, 0x6f, 0xa9, 0x36, 0x3e, 0x7d, 0xe5, 0xe1, 0x2d, 0xec, 0xa8, 0x0f, - 0x9f, 0x2e, 0x1b, 0x9a, 0xce, 0x47, 0x62, 0x82, 0x8f, 0x0b, 0xa9, 0x9f, 0xe5, 0xf5, 0xd9, 0x96, - 0xdb, 0xf4, 0xf2, 0x02, 0xc4, 0xe6, 0x0d, 0x4d, 0x47, 0x93, 0x10, 0xaf, 0x60, 0xdd, 0xa8, 0xf3, - 0x3b, 0x77, 0xac, 0x80, 0xee, 0x84, 0x41, 0xb5, 0x6e, 0x34, 0x74, 0x87, 0x9d, 0x50, 0xe4, 0x87, - 0xbf, 0x79, 0x63, 0x7a, 0xe0, 0x0f, 0x6e, 0x4c, 0x47, 0x17, 0x75, 0x47, 0xe1, 0x55, 0xb9, 0xd8, - 0x6b, 0xaf, 0x4c, 0x4b, 0xf2, 0x53, 0x30, 0x54, 0xc0, 0xe5, 0x83, 0xf0, 0x2a, 0xe0, 0x72, 0x88, - 0xd7, 0x7d, 0x90, 0x58, 0xd4, 0x1d, 0x76, 0x2b, 0xf2, 0x04, 0x44, 0x35, 0x9d, 0x5d, 0xb4, 0x09, - 0xb5, 0x4f, 0xe0, 0x04, 0xb5, 0x80, 0xcb, 0x2e, 0x6a, 0x05, 0x97, 0xc3, 0xa8, 0x84, 0x3d, 0x81, - 0xe7, 0x0b, 0xbf, 0xff, 0x1f, 0xa7, 0x06, 0x5e, 0x7a, 0x75, 0x6a, 0xa0, 0xed, 0x48, 0xf8, 0x7d, - 0x80, 0xab, 0x98, 0x0f, 0x81, 0x5d, 0xd9, 0x65, 0x67, 0x24, 0xee, 0x30, 0xfc, 0xce, 0x20, 0xc8, - 0x1c, 0xc7, 0x76, 0xd4, 0x5d, 0x4d, 0xaf, 0xba, 0x23, 0xa1, 0x36, 0x9c, 0x9d, 0x17, 0xf9, 0x50, - 0x1c, 0xe6, 0x43, 0xc1, 0x71, 0x3a, 0x8f, 0x46, 0xb6, 0xbd, 0x77, 0x65, 0xbb, 0x8c, 0xb9, 0xfc, - 0xaf, 0xa2, 0x80, 0xd6, 0x1d, 0x75, 0x17, 0xcf, 0x35, 0x9c, 0x1d, 0xc3, 0xd2, 0x5e, 0x64, 0xb1, - 0x0c, 0x03, 0xd4, 0xd5, 0xbd, 0x92, 0x63, 0xec, 0x62, 0xdd, 0xa6, 0xaa, 0x19, 0x3e, 0x73, 0x74, - 0xb6, 0x85, 0x7d, 0xcc, 0x92, 0xa1, 0xcb, 0xdf, 0xff, 0x85, 0xef, 0x4d, 0xdf, 0xdb, 0x5d, 0x0b, - 0x14, 0x99, 0x24, 0xd7, 0x7b, 0x1b, 0x94, 0x31, 0xba, 0x0c, 0xec, 0x92, 0x45, 0xa9, 0xa6, 0xd9, - 0x0e, 0xbf, 0xa7, 0x7d, 0x76, 0xb6, 0x75, 0xdf, 0x67, 0x9b, 0xc5, 0x9c, 0xbd, 0xac, 0xd6, 0xb4, - 0x8a, 0xea, 0x18, 0x96, 0x7d, 0x71, 0x40, 0x49, 0x52, 0x56, 0x4b, 0x9a, 0xed, 0xa0, 0x0d, 0x48, - 0x56, 0xb0, 0xbe, 0xcf, 0xd8, 0x46, 0x5f, 0x1f, 0xdb, 0x04, 0xe1, 0x44, 0xb9, 0x3e, 0x0b, 0x48, - 0xf5, 0xe3, 0x89, 0x87, 0x49, 0xec, 0x7e, 0x65, 0x1b, 0xf6, 0x01, 0xce, 0xf4, 0x1d, 0xc5, 0xb8, - 0x1a, 0x06, 0x65, 0xef, 0x01, 0xf0, 0xda, 0x44, 0x19, 0x18, 0x52, 0x2b, 0x15, 0x0b, 0xdb, 0x36, - 0x3d, 0x00, 0x4c, 0x2a, 0xa2, 0x98, 0x1b, 0xff, 0xd7, 0x5f, 0x7d, 0x70, 0x24, 0xc0, 0x31, 0x9f, - 0x02, 0xb8, 0xe2, 0x92, 0x9e, 0xfa, 0x8c, 0x04, 0xe3, 0x4d, 0x2d, 0x22, 0x19, 0xa6, 0xe6, 0x36, - 0x37, 0x2e, 0xae, 0x2a, 0x8b, 0xcf, 0xcd, 0x6d, 0x2c, 0xae, 0xae, 0x94, 0xd8, 0x95, 0xff, 0x95, - 0xf5, 0xb5, 0xe2, 0xfc, 0xe2, 0x85, 0xc5, 0x62, 0x21, 0x3d, 0x80, 0xa6, 0xe1, 0x58, 0x0b, 0x9c, - 0x42, 0x71, 0xa9, 0xb8, 0x30, 0xb7, 0x51, 0x4c, 0x4b, 0xe8, 0x0e, 0x38, 0xd1, 0x92, 0x89, 0x8b, - 0x12, 0x69, 0x83, 0xa2, 0x14, 0x5d, 0x94, 0x68, 0xfe, 0x42, 0x5b, 0x2f, 0x7a, 0xa0, 0xa3, 0xfd, - 0xec, 0xb9, 0xee, 0x12, 0xf4, 0xa7, 0xf7, 0x45, 0xe0, 0x68, 0x78, 0xca, 0x50, 0xf5, 0xfd, 0x36, - 0xaf, 0x3e, 0xdb, 0x44, 0xb3, 0x8b, 0x10, 0x9d, 0xd3, 0xf7, 0xd1, 0x51, 0x96, 0x4f, 0x97, 0x1a, - 0x56, 0x8d, 0xc7, 0xa0, 0x21, 0x52, 0xde, 0xb4, 0x6a, 0x24, 0x36, 0x89, 0x8b, 0xfe, 0xd2, 0xc9, - 0x14, 0xbf, 0xbd, 0x9f, 0x4b, 0x7f, 0xe2, 0x95, 0xe9, 0x81, 0x2f, 0xbd, 0x32, 0x3d, 0xf0, 0xe3, - 0xcf, 0x4e, 0x0f, 0xbc, 0xf4, 0x87, 0x33, 0x03, 0xf9, 0xdd, 0x70, 0xf7, 0xbe, 0xde, 0x75, 0x36, - 0x4d, 0xcc, 0xe9, 0xfb, 0x34, 0x10, 0xad, 0x49, 0xcf, 0xc5, 0x69, 0xe7, 0xc4, 0x01, 0xea, 0x54, - 0xf8, 0x00, 0xf5, 0x19, 0x5c, 0xab, 0x5d, 0xd2, 0x8d, 0xab, 0x74, 0x54, 0x3d, 0x1d, 0x7c, 0x3c, - 0x02, 0x53, 0x4d, 0xd3, 0x26, 0xcf, 0x30, 0xda, 0x3d, 0x7f, 0xcd, 0x41, 0xa2, 0x20, 0x12, 0x97, - 0x0c, 0x0c, 0xd9, 0xb8, 0x6c, 0xe8, 0x15, 0xe6, 0xe9, 0x51, 0x45, 0x14, 0x49, 0xb7, 0x75, 0x55, - 0x37, 0x6c, 0x7e, 0xe7, 0x9e, 0x15, 0xf2, 0x9f, 0x92, 0xfa, 0xcb, 0x17, 0x46, 0x44, 0x4b, 0xa2, - 0x9b, 0x0f, 0x77, 0x3d, 0x52, 0xde, 0x25, 0xbd, 0x74, 0x3b, 0x11, 0x38, 0x56, 0xee, 0x55, 0x2b, - 0xbf, 0x14, 0x81, 0xe9, 0xb0, 0x56, 0x48, 0xda, 0x66, 0x3b, 0x6a, 0xdd, 0x6c, 0xa7, 0x96, 0xf3, - 0x90, 0xdc, 0x10, 0x38, 0x7d, 0xeb, 0xe5, 0x7a, 0x9f, 0x7a, 0x19, 0x75, 0x9b, 0x12, 0x8a, 0x39, - 0xd3, 0xa3, 0x62, 0xdc, 0x7e, 0x1c, 0x48, 0x33, 0x5f, 0x88, 0xc1, 0x09, 0xfa, 0x28, 0xcb, 0xaa, - 0x6b, 0xba, 0x73, 0xba, 0x6c, 0xed, 0x9b, 0x0e, 0x4d, 0xdc, 0x8c, 0x6d, 0xae, 0x97, 0x71, 0xaf, - 0x7a, 0x96, 0x55, 0xb7, 0xf1, 0x9c, 0x6d, 0x88, 0xaf, 0x11, 0x3a, 0xa2, 0x11, 0xc7, 0x70, 0xd4, - 0x1a, 0xd7, 0x14, 0x2b, 0x10, 0x28, 0x7b, 0xc8, 0x15, 0x61, 0x50, 0x4d, 0xbc, 0xe1, 0xaa, 0x61, - 0x75, 0x9b, 0xdd, 0x87, 0x8f, 0x52, 0x87, 0x4a, 0x10, 0x00, 0xbd, 0xfa, 0x3e, 0x09, 0x71, 0xb5, - 0xc1, 0xae, 0x72, 0x44, 0x89, 0xa7, 0xd1, 0x82, 0x7c, 0x09, 0x86, 0xf8, 0x81, 0x32, 0x4a, 0x43, - 0x74, 0x17, 0xef, 0xd3, 0x76, 0x52, 0x0a, 0xf9, 0x89, 0x66, 0x21, 0x4e, 0x85, 0xe7, 0x13, 0x48, - 0x66, 0xb6, 0x49, 0xfa, 0x59, 0x2a, 0xa4, 0xc2, 0xd0, 0xe4, 0xa7, 0x20, 0x51, 0x30, 0xea, 0x9a, - 0x6e, 0x04, 0xb9, 0x25, 0x19, 0x37, 0x2a, 0xb3, 0xd9, 0xe0, 0xf9, 0x86, 0xc2, 0x0a, 0xe8, 0x30, - 0x0c, 0xb2, 0xf7, 0x11, 0xfc, 0x3a, 0x0a, 0x2f, 0xc9, 0xf3, 0x30, 0x44, 0x79, 0xaf, 0x9a, 0x08, - 0xf1, 0x97, 0x75, 0xfc, 0x21, 0x06, 0x4d, 0x4d, 0x39, 0xfb, 0x88, 0x27, 0x2c, 0x82, 0x58, 0x45, - 0x75, 0x54, 0xde, 0x6f, 0xfa, 0x5b, 0x7e, 0x1b, 0x24, 0x38, 0x13, 0x1b, 0x9d, 0x81, 0xa8, 0x61, - 0xda, 0xfc, 0x42, 0x49, 0xb6, 0x5d, 0x57, 0x56, 0xcd, 0x7c, 0x8c, 0x64, 0x2a, 0x0a, 0x41, 0xce, - 0x2b, 0x6d, 0x83, 0xea, 0xe3, 0xbe, 0xa0, 0xea, 0x1b, 0x72, 0xdf, 0x4f, 0x36, 0xa4, 0x4d, 0xe6, - 0xe0, 0x1a, 0xcb, 0x67, 0x23, 0x30, 0xe5, 0xab, 0xbd, 0x82, 0x2d, 0x5b, 0x33, 0x74, 0x3e, 0x9f, - 0x33, 0x6b, 0x41, 0x3e, 0x21, 0x79, 0x7d, 0x1b, 0x73, 0x79, 0x2b, 0x44, 0xe7, 0x4c, 0x13, 0x65, - 0x21, 0x41, 0xcb, 0x65, 0x83, 0xd9, 0x4b, 0x4c, 0x71, 0xcb, 0xa4, 0xce, 0x36, 0xb6, 0x9d, 0xab, - 0xaa, 0xe5, 0x3e, 0x21, 0x14, 0x65, 0xf9, 0x09, 0x48, 0xce, 0x1b, 0xba, 0x8d, 0x75, 0xbb, 0x41, - 0x7d, 0x70, 0xab, 0x66, 0x94, 0x77, 0x39, 0x07, 0x56, 0x20, 0x0a, 0x57, 0x4d, 0x93, 0x52, 0xc6, - 0x14, 0xf2, 0x93, 0xe5, 0x86, 0xf9, 0xf5, 0xb6, 0x2a, 0x7a, 0xa2, 0x7f, 0x15, 0xf1, 0x4e, 0xba, - 0x3a, 0xfa, 0xdf, 0x12, 0x1c, 0x6f, 0x76, 0xa8, 0x5d, 0xbc, 0x6f, 0xf7, 0xeb, 0x4f, 0xcf, 0x42, - 0x72, 0x8d, 0xbe, 0xe3, 0xbf, 0x84, 0xf7, 0x51, 0x16, 0x86, 0x70, 0xe5, 0xcc, 0xd9, 0xb3, 0x0f, - 0x3f, 0xc1, 0xac, 0xfd, 0xe2, 0x80, 0x22, 0x00, 0x68, 0x0a, 0x92, 0x36, 0x2e, 0x9b, 0x67, 0xce, - 0x9e, 0xdb, 0x7d, 0x98, 0x99, 0x17, 0xc9, 0x80, 0x5c, 0x50, 0x2e, 0x41, 0x7a, 0xfd, 0xda, 0x67, - 0xa7, 0xa5, 0x7c, 0x1c, 0xa2, 0x76, 0xa3, 0x7e, 0x5b, 0x6d, 0xe4, 0xe5, 0x38, 0xcc, 0xf8, 0x29, - 0x69, 0xa4, 0x72, 0xb3, 0x12, 0xae, 0x83, 0xb4, 0x4f, 0x07, 0x14, 0xa3, 0x4d, 0x32, 0xdb, 0x51, - 0x93, 0xf2, 0x6f, 0x48, 0x90, 0x72, 0x53, 0xa5, 0x75, 0xec, 0xa0, 0xf3, 0xfe, 0xfc, 0x87, 0xbb, - 0xcd, 0xb1, 0xd9, 0x70, 0x5b, 0x5e, 0x4a, 0xa7, 0xf8, 0xd0, 0xd1, 0x63, 0xd4, 0x10, 0x4d, 0xc3, - 0xe6, 0xcf, 0xca, 0xba, 0x90, 0xba, 0xc8, 0xe8, 0x01, 0x40, 0x34, 0xc2, 0x95, 0xae, 0x18, 0x8e, - 0xa6, 0x57, 0x4b, 0xa6, 0x71, 0x95, 0x3f, 0xd6, 0x8d, 0x2a, 0x69, 0x5a, 0x73, 0x99, 0x56, 0xac, - 0x11, 0x38, 0x11, 0x3a, 0xe9, 0x72, 0x09, 0xa6, 0x77, 0x24, 0x08, 0x88, 0x22, 0x3a, 0x0f, 0x43, - 0x66, 0x63, 0xab, 0x24, 0x22, 0xc6, 0xf0, 0x99, 0xe3, 0xad, 0xfc, 0x5f, 0xd8, 0x07, 0x8f, 0x00, - 0x83, 0x66, 0x63, 0x8b, 0x58, 0xcb, 0x1d, 0x90, 0x6a, 0x21, 0xcc, 0xf0, 0x15, 0x4f, 0x0e, 0xfa, - 0xf9, 0x08, 0xde, 0x83, 0x92, 0x69, 0x69, 0x86, 0xa5, 0x39, 0xfb, 0x34, 0x7f, 0x8d, 0x2a, 0x69, - 0x51, 0xb1, 0xc6, 0xe1, 0xf2, 0x2e, 0x8c, 0xad, 0xd3, 0xf5, 0xad, 0x27, 0xf9, 0x59, 0x4f, 0x3e, - 0xa9, 0xbb, 0x7c, 0x6d, 0x25, 0x8b, 0x34, 0x49, 0x96, 0x7f, 0xba, 0xad, 0x75, 0x3e, 0xd6, 0xbf, - 0x75, 0x06, 0x33, 0xc4, 0x3f, 0x39, 0x1a, 0x70, 0x4e, 0x66, 0x9c, 0xfe, 0xf0, 0xd5, 0xab, 0x61, - 0x76, 0xcb, 0x26, 0xb2, 0x9d, 0x27, 0xd5, 0x6c, 0x97, 0x30, 0x9a, 0xed, 0xea, 0x42, 0xf2, 0x13, - 0x30, 0xb2, 0xa6, 0x5a, 0xce, 0x3a, 0x76, 0x2e, 0x62, 0xb5, 0x82, 0xad, 0xe0, 0xac, 0x3b, 0x22, - 0x66, 0x5d, 0x04, 0x31, 0x3a, 0xb5, 0xb2, 0x59, 0x87, 0xfe, 0x96, 0x77, 0x20, 0x46, 0x6f, 0x86, - 0xba, 0x33, 0x32, 0xa7, 0x60, 0x33, 0x32, 0x89, 0xa5, 0xfb, 0x0e, 0xb6, 0x45, 0x7a, 0x4b, 0x0b, - 0xe8, 0x51, 0x31, 0xaf, 0x46, 0x3b, 0xcf, 0xab, 0xdc, 0x10, 0xf9, 0xec, 0x5a, 0x83, 0xa1, 0x3c, - 0x09, 0xc5, 0x8b, 0x05, 0x57, 0x10, 0xc9, 0x13, 0x04, 0x2d, 0xc3, 0x98, 0xa9, 0x5a, 0x0e, 0x7d, - 0x12, 0xb3, 0x43, 0x7b, 0xc1, 0x6d, 0x7d, 0xba, 0xd9, 0xf3, 0x02, 0x9d, 0xe5, 0xad, 0x8c, 0x98, - 0x7e, 0xa0, 0xfc, 0xc7, 0x31, 0x18, 0xe4, 0xca, 0x78, 0x2b, 0x0c, 0x71, 0xb5, 0x72, 0xeb, 0x3c, - 0x31, 0xdb, 0x3c, 0x31, 0xcd, 0xba, 0x13, 0x08, 0xe7, 0x27, 0x68, 0xd0, 0x3d, 0x90, 0x28, 0xef, - 0xa8, 0x9a, 0x5e, 0xd2, 0x2a, 0x62, 0xab, 0xe1, 0xd5, 0x1b, 0xd3, 0x43, 0xf3, 0x04, 0xb6, 0x58, - 0x50, 0x86, 0x68, 0xe5, 0x62, 0x85, 0x64, 0x02, 0x3b, 0x58, 0xab, 0xee, 0x38, 0xdc, 0xc3, 0x78, - 0x09, 0x3d, 0x0e, 0x31, 0x62, 0x10, 0xfc, 0xc1, 0x64, 0xb6, 0x69, 0xc3, 0xc7, 0x4d, 0xf6, 0xf2, - 0x09, 0xd2, 0xf0, 0x47, 0xbf, 0x37, 0x2d, 0x29, 0x94, 0x02, 0xcd, 0xc3, 0x48, 0x4d, 0xb5, 0x9d, - 0x12, 0x9d, 0xc1, 0x48, 0xf3, 0x71, 0xbe, 0xde, 0x6e, 0x52, 0x08, 0x57, 0x2c, 0x17, 0x7d, 0x98, - 0x50, 0x31, 0x50, 0x05, 0x9d, 0x84, 0x34, 0x65, 0x52, 0x36, 0xea, 0x75, 0xcd, 0x61, 0xb9, 0xd5, - 0x20, 0xd5, 0xfb, 0x28, 0x81, 0xcf, 0x53, 0x30, 0xcd, 0xb0, 0x8e, 0x41, 0x92, 0x3e, 0xd1, 0xa2, - 0x28, 0xec, 0x3a, 0x72, 0x82, 0x00, 0x68, 0xe5, 0xbd, 0x30, 0xe6, 0xc5, 0x47, 0x86, 0x92, 0x60, - 0x5c, 0x3c, 0x30, 0x45, 0x7c, 0x08, 0x26, 0x75, 0xbc, 0x47, 0x2f, 0x48, 0x07, 0xb0, 0x93, 0x14, - 0x1b, 0x91, 0xba, 0xcb, 0x41, 0x8a, 0xbb, 0x61, 0xb4, 0x2c, 0x94, 0xcf, 0x70, 0x81, 0xe2, 0x8e, - 0xb8, 0x50, 0x8a, 0x76, 0x14, 0x12, 0xaa, 0x69, 0x32, 0x84, 0x61, 0x1e, 0x1f, 0x4d, 0x93, 0x56, - 0x9d, 0x82, 0x71, 0xda, 0x47, 0x0b, 0xdb, 0x8d, 0x9a, 0xc3, 0x99, 0xa4, 0x28, 0xce, 0x18, 0xa9, - 0x50, 0x18, 0x9c, 0xe2, 0xde, 0x09, 0x23, 0xf8, 0x8a, 0x56, 0xc1, 0x7a, 0x19, 0x33, 0xbc, 0x11, - 0x8a, 0x97, 0x12, 0x40, 0x8a, 0x74, 0x1f, 0xb8, 0x71, 0xaf, 0x24, 0x62, 0xf2, 0x28, 0xe3, 0x27, - 0xe0, 0x73, 0x0c, 0x2c, 0x67, 0x20, 0x56, 0x50, 0x1d, 0x95, 0x24, 0x18, 0xce, 0x1e, 0x9b, 0x68, - 0x52, 0x0a, 0xf9, 0x29, 0xbf, 0x16, 0x81, 0xd8, 0x65, 0xc3, 0xc1, 0xe8, 0x11, 0x5f, 0x02, 0x38, - 0xda, 0xca, 0x9e, 0xd7, 0xb5, 0xaa, 0x8e, 0x2b, 0xcb, 0x76, 0xd5, 0xf7, 0x3d, 0x05, 0xcf, 0x9c, - 0x22, 0x01, 0x73, 0x9a, 0x84, 0xb8, 0x65, 0x34, 0xf4, 0x8a, 0xb8, 0xc9, 0x4b, 0x0b, 0xa8, 0x08, - 0x09, 0xd7, 0x4a, 0x62, 0xdd, 0xac, 0x64, 0x8c, 0x58, 0x09, 0xb1, 0x61, 0x0e, 0x50, 0x86, 0xb6, - 0xb8, 0xb1, 0xe4, 0x21, 0xe9, 0x06, 0x2f, 0x6e, 0x6d, 0xbd, 0x19, 0xac, 0x47, 0x46, 0x26, 0x13, - 0x77, 0xec, 0x5d, 0xe5, 0x31, 0x8b, 0x4b, 0xbb, 0x15, 0x5c, 0x7b, 0x01, 0xb3, 0xe2, 0xdf, 0x76, - 0x18, 0xa2, 0xfd, 0xf2, 0xcc, 0x8a, 0x7d, 0xdf, 0xe1, 0x38, 0x24, 0x6d, 0xad, 0xaa, 0xab, 0x4e, - 0xc3, 0xc2, 0xdc, 0xf2, 0x3c, 0x80, 0xfc, 0x75, 0x09, 0x06, 0x99, 0x25, 0xfb, 0xf4, 0x26, 0xb5, - 0xd6, 0x5b, 0xa4, 0x9d, 0xde, 0xa2, 0x07, 0xd7, 0xdb, 0x1c, 0x80, 0x2b, 0x8c, 0xcd, 0x9f, 0xdc, - 0xb7, 0xc8, 0x18, 0x98, 0x88, 0xeb, 0x5a, 0x95, 0x3b, 0xaa, 0x8f, 0x48, 0xfe, 0x0f, 0x12, 0x49, - 0x62, 0x79, 0x3d, 0x9a, 0x83, 0x11, 0x21, 0x57, 0x69, 0xbb, 0xa6, 0x56, 0xb9, 0xed, 0x9c, 0x68, - 0x2b, 0xdc, 0x85, 0x9a, 0x5a, 0x55, 0x86, 0xb9, 0x3c, 0xa4, 0xd0, 0x7a, 0x1c, 0x22, 0x6d, 0xc6, - 0x21, 0x30, 0xf0, 0xd1, 0x83, 0x0d, 0x7c, 0x60, 0x88, 0x62, 0xe1, 0x21, 0xfa, 0x4a, 0x84, 0x2e, - 0x66, 0x4c, 0xc3, 0x56, 0x6b, 0x6f, 0x84, 0x47, 0x1c, 0x83, 0xa4, 0x69, 0xd4, 0x4a, 0xac, 0x86, - 0xdd, 0x70, 0x4f, 0x98, 0x46, 0x4d, 0x69, 0x1a, 0xf6, 0xf8, 0x2d, 0x72, 0x97, 0xc1, 0x5b, 0xa0, - 0xb5, 0xa1, 0xb0, 0xd6, 0x2c, 0x48, 0x31, 0x55, 0xf0, 0xb9, 0xec, 0x21, 0xa2, 0x03, 0x3a, 0x39, - 0x4a, 0xcd, 0x73, 0x2f, 0x13, 0x9b, 0x61, 0x2a, 0x1c, 0x8f, 0x50, 0xb0, 0xd0, 0xdf, 0x6a, 0x15, - 0xec, 0x37, 0x4b, 0x85, 0xe3, 0xc9, 0x7f, 0x53, 0x02, 0x58, 0x22, 0x9a, 0xa5, 0xfd, 0x25, 0xb3, - 0x90, 0x4d, 0x45, 0x28, 0x05, 0x5a, 0x9e, 0x6a, 0x37, 0x68, 0xbc, 0xfd, 0x94, 0xed, 0x97, 0x7b, - 0x1e, 0x46, 0x3c, 0x63, 0xb4, 0xb1, 0x10, 0x66, 0xaa, 0x43, 0x56, 0xbd, 0x8e, 0x1d, 0x25, 0x75, - 0xc5, 0x57, 0x92, 0xff, 0xb9, 0x04, 0x49, 0x2a, 0xd3, 0x32, 0x76, 0xd4, 0xc0, 0x18, 0x4a, 0x07, - 0x1f, 0xc3, 0x13, 0x00, 0x8c, 0x8d, 0xad, 0xbd, 0x88, 0xb9, 0x65, 0x25, 0x29, 0x64, 0x5d, 0x7b, - 0x11, 0xa3, 0x73, 0xae, 0xc2, 0xa3, 0x9d, 0x15, 0x2e, 0xb2, 0x6e, 0xae, 0xf6, 0x23, 0x30, 0x44, - 0x3f, 0x51, 0xb5, 0x67, 0xf3, 0x44, 0x7a, 0x50, 0x6f, 0xd4, 0x37, 0xf6, 0x6c, 0xf9, 0x79, 0x18, - 0xda, 0xd8, 0x63, 0x7b, 0x23, 0xc7, 0x20, 0x69, 0x19, 0x06, 0x9f, 0x93, 0x59, 0x2e, 0x94, 0x20, - 0x00, 0x3a, 0x05, 0x89, 0xfd, 0x80, 0x88, 0xb7, 0x1f, 0xe0, 0x6d, 0x68, 0x44, 0x7b, 0xda, 0xd0, - 0x38, 0xf5, 0xef, 0x24, 0x18, 0xf6, 0xc5, 0x07, 0xf4, 0x30, 0x1c, 0xca, 0x2f, 0xad, 0xce, 0x5f, - 0x2a, 0x2d, 0x16, 0x4a, 0x17, 0x96, 0xe6, 0x16, 0xbc, 0x37, 0x5c, 0xd9, 0xc3, 0xd7, 0xae, 0xcf, - 0x20, 0x1f, 0xee, 0xa6, 0x4e, 0x77, 0x94, 0xd0, 0x69, 0x98, 0x0c, 0x92, 0xcc, 0xe5, 0xd7, 0x8b, - 0x2b, 0x1b, 0x69, 0x29, 0x7b, 0xe8, 0xda, 0xf5, 0x99, 0x71, 0x1f, 0xc5, 0xdc, 0x96, 0x8d, 0x75, - 0xa7, 0x99, 0x60, 0x7e, 0x75, 0x79, 0x79, 0x71, 0x23, 0x1d, 0x69, 0x22, 0xe0, 0x01, 0xfb, 0x3e, - 0x18, 0x0f, 0x12, 0xac, 0x2c, 0x2e, 0xa5, 0xa3, 0x59, 0x74, 0xed, 0xfa, 0xcc, 0xa8, 0x0f, 0x7b, - 0x45, 0xab, 0x65, 0x13, 0x1f, 0xfe, 0xdc, 0xd4, 0xc0, 0xaf, 0xfe, 0xca, 0x94, 0x44, 0x7a, 0x36, - 0x12, 0x88, 0x11, 0xe8, 0x01, 0x38, 0xb2, 0xbe, 0xb8, 0xb0, 0x52, 0x2c, 0x94, 0x96, 0xd7, 0x17, - 0xc4, 0x1e, 0xb4, 0xe8, 0xdd, 0xd8, 0xb5, 0xeb, 0x33, 0xc3, 0xbc, 0x4b, 0xed, 0xb0, 0xd7, 0x94, - 0xe2, 0xe5, 0xd5, 0x8d, 0x62, 0x5a, 0x62, 0xd8, 0x6b, 0x16, 0xbe, 0x62, 0x38, 0xec, 0x1b, 0x76, - 0x0f, 0xc1, 0xd1, 0x16, 0xd8, 0x6e, 0xc7, 0xc6, 0xaf, 0x5d, 0x9f, 0x19, 0x59, 0xb3, 0x30, 0xf3, - 0x1f, 0x4a, 0x31, 0x0b, 0x99, 0x66, 0x8a, 0xd5, 0xb5, 0xd5, 0xf5, 0xb9, 0xa5, 0xf4, 0x4c, 0x36, - 0x7d, 0xed, 0xfa, 0x4c, 0x4a, 0x04, 0x43, 0xba, 0xd1, 0xef, 0xf6, 0xec, 0xb6, 0xae, 0x78, 0x4e, - 0xc3, 0x5d, 0x6d, 0xce, 0x98, 0xc4, 0xe9, 0xc4, 0x81, 0x4e, 0x99, 0xda, 0xee, 0xb3, 0x67, 0xbb, - 0x6c, 0x3f, 0x77, 0x5f, 0x3a, 0x1d, 0xfc, 0x04, 0x2b, 0xdb, 0x71, 0x71, 0x27, 0x7f, 0x44, 0x82, - 0xd1, 0x8b, 0x9a, 0xed, 0x18, 0x96, 0x56, 0x56, 0x6b, 0xf4, 0xe5, 0xd6, 0xb9, 0x5e, 0x63, 0x6b, - 0xc8, 0xd5, 0x9f, 0x84, 0xc1, 0x2b, 0x6a, 0x8d, 0x05, 0xb5, 0x28, 0xfd, 0xd0, 0x4c, 0x9b, 0x23, - 0x1f, 0x37, 0xb4, 0x09, 0x06, 0x8c, 0x4c, 0xfe, 0xf5, 0x08, 0x8c, 0x51, 0x67, 0xb0, 0xd9, 0x27, - 0xc8, 0xc8, 0x1a, 0x2b, 0x0f, 0x31, 0x4b, 0x75, 0xf8, 0xa6, 0x61, 0x7e, 0x96, 0x9f, 0x3e, 0xde, - 0xd3, 0xc3, 0x59, 0x5a, 0x01, 0x97, 0x15, 0x4a, 0x8b, 0xde, 0x05, 0x89, 0xba, 0xba, 0x57, 0xa2, - 0x7c, 0xd8, 0xca, 0x65, 0xae, 0x3f, 0x3e, 0x37, 0x6f, 0x4c, 0x8f, 0xed, 0xab, 0xf5, 0x5a, 0x4e, - 0x16, 0x7c, 0x64, 0x65, 0xa8, 0xae, 0xee, 0x11, 0x11, 0x91, 0x09, 0x63, 0x04, 0x5a, 0xde, 0x51, - 0xf5, 0x2a, 0x66, 0x8d, 0xd0, 0x2d, 0xd0, 0xfc, 0xc5, 0xbe, 0x1b, 0x39, 0xec, 0x35, 0xe2, 0x63, - 0x27, 0x2b, 0x23, 0x75, 0x75, 0x6f, 0x9e, 0x02, 0x48, 0x8b, 0xb9, 0xc4, 0x27, 0x5e, 0x99, 0x1e, - 0xa0, 0x27, 0xba, 0xdf, 0x95, 0x00, 0x3c, 0x8d, 0xa1, 0x77, 0x41, 0xba, 0xec, 0x96, 0x28, 0xad, - 0x38, 0x9b, 0xbc, 0xb7, 0xdd, 0x58, 0x84, 0xf4, 0xcd, 0xe6, 0xe6, 0xef, 0xdc, 0x98, 0x96, 0x94, - 0xb1, 0x72, 0x68, 0x28, 0xde, 0x09, 0xc3, 0x0d, 0xb3, 0xa2, 0x3a, 0xb8, 0x44, 0xd7, 0x71, 0x91, - 0xae, 0xf3, 0xfc, 0x14, 0xe1, 0x75, 0xf3, 0xc6, 0x34, 0x62, 0xdd, 0xf2, 0x11, 0xcb, 0x74, 0xf6, - 0x07, 0x06, 0x21, 0x04, 0xbe, 0x3e, 0x7d, 0x4b, 0x82, 0xe1, 0x82, 0xef, 0x4e, 0x65, 0x06, 0x86, - 0xea, 0x86, 0xae, 0xed, 0x72, 0x7b, 0x4c, 0x2a, 0xa2, 0x88, 0xb2, 0x90, 0x60, 0x8f, 0x59, 0x9d, - 0x7d, 0xb1, 0x15, 0x2a, 0xca, 0x84, 0xea, 0x2a, 0xde, 0xb2, 0x35, 0x31, 0x1a, 0x8a, 0x28, 0xa2, - 0x0b, 0x90, 0xb6, 0x71, 0xb9, 0x61, 0x69, 0xce, 0x7e, 0xa9, 0x6c, 0xe8, 0x8e, 0x5a, 0x76, 0xd8, - 0xb3, 0xc8, 0xfc, 0xb1, 0x9b, 0x37, 0xa6, 0x8f, 0x30, 0x59, 0xc3, 0x18, 0xb2, 0x32, 0x26, 0x40, - 0xf3, 0x0c, 0x42, 0x5a, 0xa8, 0x60, 0x47, 0xd5, 0x6a, 0x76, 0x86, 0x5d, 0x4e, 0x10, 0x45, 0x5f, - 0x5f, 0xbe, 0x38, 0xe4, 0xdf, 0xd8, 0xba, 0x00, 0x69, 0xc3, 0xc4, 0x56, 0x20, 0x11, 0x95, 0xc2, - 0x2d, 0x87, 0x31, 0x64, 0x65, 0x4c, 0x80, 0x44, 0x92, 0xea, 0x90, 0x61, 0x16, 0x0b, 0x45, 0xb3, - 0xb1, 0xe5, 0xed, 0x87, 0x4d, 0x36, 0x8d, 0xc6, 0x9c, 0xbe, 0x9f, 0x7f, 0xc4, 0xe3, 0x1e, 0xa6, - 0x93, 0xbf, 0xfd, 0xd5, 0x07, 0x27, 0xb9, 0x69, 0x78, 0xfb, 0x53, 0x97, 0xf0, 0x3e, 0x19, 0x7e, - 0x8e, 0xba, 0x46, 0x31, 0x49, 0xda, 0xf9, 0xbc, 0xaa, 0xd5, 0xc4, 0xf3, 0x7e, 0x85, 0x97, 0x50, - 0x0e, 0x06, 0x6d, 0x47, 0x75, 0x1a, 0x36, 0x3f, 0xe9, 0x95, 0xdb, 0x99, 0x5a, 0xde, 0xd0, 0x2b, - 0xeb, 0x14, 0x53, 0xe1, 0x14, 0xe8, 0x02, 0x0c, 0xf2, 0x23, 0xf4, 0x78, 0xdf, 0xfe, 0x4d, 0xef, - 0x4a, 0x30, 0x6a, 0xa2, 0x91, 0x0a, 0xae, 0xe1, 0x2a, 0x4b, 0xab, 0x76, 0x54, 0xb2, 0xfa, 0xa0, - 0xdf, 0xde, 0xcb, 0x2f, 0xf6, 0xed, 0x84, 0x5c, 0x53, 0x61, 0x7e, 0xb2, 0x32, 0xe6, 0x82, 0xd6, - 0x29, 0x04, 0x5d, 0x0a, 0x5c, 0xfe, 0xe5, 0x1f, 0xa8, 0xbc, 0xb3, 0x5d, 0xf7, 0x7d, 0x36, 0x2d, - 0xf6, 0x27, 0xfc, 0x57, 0x87, 0x2f, 0x40, 0xba, 0xa1, 0x6f, 0x19, 0x3a, 0x7d, 0x83, 0xcb, 0xf3, - 0x7b, 0xb2, 0xbe, 0x8b, 0xfa, 0x8d, 0x23, 0x8c, 0x21, 0x2b, 0x63, 0x2e, 0xe8, 0x22, 0x5b, 0x05, - 0x54, 0x60, 0xd4, 0xc3, 0xa2, 0x8e, 0x9a, 0xec, 0xea, 0xa8, 0x77, 0x70, 0x47, 0x3d, 0x14, 0x6e, - 0xc5, 0xf3, 0xd5, 0x11, 0x17, 0x48, 0xc8, 0xd0, 0x45, 0x00, 0x2f, 0x3c, 0xd0, 0x7d, 0x8a, 0xe1, - 0xf6, 0x03, 0xef, 0xc5, 0x18, 0xb1, 0xde, 0xf3, 0x68, 0xd1, 0x7b, 0x60, 0xa2, 0xae, 0xe9, 0x25, - 0x1b, 0xd7, 0xb6, 0x4b, 0x5c, 0xc1, 0x84, 0x25, 0xfd, 0x84, 0x52, 0x7e, 0xa9, 0x3f, 0x7b, 0xb8, - 0x79, 0x63, 0x3a, 0xcb, 0x43, 0x68, 0x33, 0x4b, 0x59, 0x19, 0xaf, 0x6b, 0xfa, 0x3a, 0xae, 0x6d, - 0x17, 0x5c, 0x58, 0x2e, 0xf5, 0xe1, 0x57, 0xa6, 0x07, 0xb8, 0xbb, 0x0e, 0xc8, 0xe7, 0xe8, 0xde, - 0x39, 0x77, 0x33, 0x6c, 0x93, 0x35, 0x89, 0x2a, 0x0a, 0xfc, 0xaa, 0x81, 0x07, 0x60, 0x6e, 0xfe, - 0xd2, 0x1f, 0xce, 0x48, 0xf2, 0x17, 0x25, 0x18, 0x2c, 0x5c, 0x5e, 0x53, 0x35, 0x0b, 0x2d, 0xc2, - 0xb8, 0x67, 0x39, 0x41, 0x27, 0x3f, 0x7e, 0xf3, 0xc6, 0x74, 0x26, 0x6c, 0x5c, 0xae, 0x97, 0x7b, - 0x06, 0x2c, 0xdc, 0x7c, 0xb1, 0xdd, 0xc2, 0x35, 0xc0, 0xaa, 0x09, 0x45, 0x6e, 0x5e, 0xd6, 0x86, - 0xba, 0x59, 0x84, 0x21, 0x26, 0xad, 0x8d, 0x72, 0x10, 0x37, 0xc9, 0x0f, 0x7e, 0x30, 0x30, 0xd5, - 0xd6, 0x78, 0x29, 0xbe, 0xbb, 0x91, 0x49, 0x48, 0xe4, 0x8f, 0x45, 0x00, 0x0a, 0x97, 0x2f, 0x6f, - 0x58, 0x9a, 0x59, 0xc3, 0xce, 0xad, 0xec, 0xf9, 0x06, 0x1c, 0xf2, 0xad, 0x92, 0xac, 0x72, 0xa8, - 0xf7, 0x33, 0x37, 0x6f, 0x4c, 0x1f, 0x0f, 0xf7, 0xde, 0x87, 0x26, 0x2b, 0x13, 0xde, 0x7a, 0xc9, - 0x2a, 0xb7, 0xe4, 0x5a, 0xb1, 0x1d, 0x97, 0x6b, 0xb4, 0x3d, 0x57, 0x1f, 0x9a, 0x9f, 0x6b, 0xc1, - 0x76, 0x5a, 0xab, 0x76, 0x1d, 0x86, 0x3d, 0x95, 0xd8, 0xa8, 0x00, 0x09, 0x87, 0xff, 0xe6, 0x1a, - 0x96, 0xdb, 0x6b, 0x58, 0x90, 0x71, 0x2d, 0xbb, 0x94, 0xf2, 0x9f, 0x49, 0x00, 0x9e, 0xcd, 0xfe, - 0x6c, 0x9a, 0x18, 0x09, 0xe5, 0x3c, 0xf0, 0x46, 0x0f, 0x94, 0xaa, 0x71, 0xea, 0x90, 0x3e, 0x7f, - 0x3e, 0x02, 0x13, 0x9b, 0x22, 0xf2, 0xfc, 0xcc, 0xeb, 0x60, 0x0d, 0x86, 0xb0, 0xee, 0x58, 0x1a, - 0x55, 0x02, 0x19, 0xed, 0x87, 0xda, 0x8d, 0x76, 0x8b, 0x3e, 0xd1, 0x8f, 0x48, 0x89, 0x4d, 0x77, - 0xce, 0x26, 0xa4, 0x8d, 0x5f, 0x8c, 0x42, 0xa6, 0x1d, 0x25, 0x9a, 0x87, 0xb1, 0xb2, 0x85, 0xd9, - 0xc5, 0x2b, 0xff, 0xce, 0x5f, 0x3e, 0xeb, 0x65, 0x96, 0x21, 0x04, 0x59, 0x19, 0x15, 0x10, 0x3e, - 0x7b, 0x54, 0x81, 0xa4, 0x7d, 0xc4, 0xec, 0xe8, 0xfd, 0xad, 0xde, 0xf2, 0x3c, 0x99, 0x4f, 0x1f, - 0xa2, 0x91, 0x20, 0x03, 0x36, 0x7f, 0x8c, 0x7a, 0x50, 0x3a, 0x81, 0xbc, 0x00, 0x63, 0x9a, 0xae, - 0x39, 0x9a, 0x5a, 0x2b, 0x6d, 0xa9, 0x35, 0x55, 0x2f, 0x1f, 0x24, 0x6b, 0x66, 0x21, 0x9f, 0x37, - 0x1b, 0x62, 0x27, 0x2b, 0xa3, 0x1c, 0x92, 0x67, 0x00, 0x74, 0x11, 0x86, 0x44, 0x53, 0xb1, 0x03, - 0x65, 0x1b, 0x82, 0xdc, 0x97, 0xe0, 0xfd, 0x42, 0x14, 0xc6, 0x15, 0x5c, 0xf9, 0xff, 0x43, 0xd1, - 0xdf, 0x50, 0x2c, 0x03, 0x30, 0x77, 0x27, 0x01, 0xf6, 0x00, 0xa3, 0x41, 0x02, 0x46, 0x92, 0x71, - 0x28, 0xd8, 0x8e, 0x6f, 0x3c, 0x6e, 0x44, 0x20, 0xe5, 0x1f, 0x8f, 0xbf, 0xa0, 0xb3, 0x12, 0x5a, - 0xf4, 0x22, 0x51, 0x8c, 0x7f, 0x7a, 0xb7, 0x4d, 0x24, 0x6a, 0xb2, 0xde, 0xce, 0x21, 0xe8, 0x66, - 0x0c, 0x06, 0xd7, 0x54, 0x4b, 0xad, 0xdb, 0xa8, 0xdc, 0x94, 0x69, 0x8a, 0xed, 0xc7, 0xa6, 0x0f, - 0xac, 0xf3, 0xdd, 0x8e, 0x2e, 0x89, 0xe6, 0x27, 0x5a, 0x24, 0x9a, 0x6f, 0x87, 0x51, 0xb2, 0x1c, - 0xf6, 0x5d, 0x61, 0x20, 0xda, 0x1e, 0xc9, 0x1f, 0xf5, 0xb8, 0x04, 0xeb, 0xd9, 0x6a, 0xf9, 0xb2, - 0xff, 0x0e, 0xc3, 0x30, 0xc1, 0xf0, 0x02, 0x33, 0x21, 0x3f, 0xec, 0x2d, 0x4b, 0x7d, 0x95, 0xb2, - 0x02, 0x75, 0x75, 0xaf, 0xc8, 0x0a, 0x68, 0x09, 0xd0, 0x8e, 0xbb, 0x33, 0x52, 0xf2, 0xd4, 0x49, - 0xe8, 0x4f, 0xdc, 0xbc, 0x31, 0x7d, 0x94, 0xd1, 0x37, 0xe3, 0xc8, 0xca, 0xb8, 0x07, 0x14, 0xdc, - 0x1e, 0x05, 0x20, 0xfd, 0x2a, 0xb1, 0x2b, 0xdc, 0x6c, 0xb9, 0x73, 0xe8, 0xe6, 0x8d, 0xe9, 0x71, - 0xc6, 0xc5, 0xab, 0x93, 0x95, 0x24, 0x29, 0x14, 0xe8, 0xed, 0x6e, 0x9e, 0x1d, 0x87, 0x56, 0xf5, - 0x7c, 0x6d, 0xb3, 0xd4, 0xf7, 0xda, 0xc6, 0x97, 0x1d, 0x87, 0x58, 0xb2, 0xec, 0x38, 0xb8, 0x1b, - 0xd0, 0x2e, 0x37, 0x1f, 0x7a, 0x63, 0x72, 0x73, 0xcf, 0xab, 0x3f, 0x27, 0x01, 0xf2, 0x2a, 0x14, - 0x6c, 0x9b, 0x64, 0x6d, 0x4a, 0x16, 0x21, 0x3e, 0xa9, 0xa4, 0xce, 0x8b, 0x10, 0x8f, 0x5e, 0x2c, - 0x42, 0x7c, 0x51, 0xe2, 0x09, 0x6f, 0x6a, 0x88, 0x74, 0xbb, 0xcb, 0xcd, 0xdd, 0x23, 0x3c, 0x17, - 0x0c, 0xc8, 0xff, 0x52, 0x82, 0xa3, 0x4d, 0xde, 0xe4, 0x0a, 0xfb, 0x97, 0x00, 0x59, 0xbe, 0x4a, - 0xfe, 0x0d, 0x49, 0x26, 0x74, 0xdf, 0xce, 0x39, 0x6e, 0x35, 0xcd, 0x39, 0xb7, 0x6e, 0x76, 0x63, - 0x8f, 0x05, 0xfe, 0x99, 0x04, 0x93, 0xfe, 0xe6, 0xdd, 0x8e, 0xac, 0x40, 0xca, 0xdf, 0x3a, 0xef, - 0xc2, 0x5d, 0xbd, 0x74, 0x81, 0x4b, 0x1f, 0xa0, 0x47, 0x4f, 0x7b, 0xa1, 0x8a, 0xed, 0x1b, 0x3e, - 0xdc, 0xb3, 0x36, 0x84, 0x4c, 0xe1, 0x90, 0x15, 0xa3, 0xe3, 0xf1, 0x7f, 0x24, 0x88, 0xad, 0x19, - 0x46, 0x0d, 0x19, 0x30, 0xae, 0x1b, 0x4e, 0x89, 0x78, 0x15, 0xae, 0xf8, 0xef, 0xec, 0x27, 0xf3, - 0xf3, 0xfd, 0x29, 0xe9, 0x87, 0x37, 0xa6, 0x9b, 0x59, 0x29, 0x63, 0xba, 0xe1, 0xe4, 0x29, 0x84, - 0x5f, 0xdb, 0x7f, 0x0f, 0x8c, 0x04, 0x1b, 0x63, 0x33, 0xc4, 0x33, 0x7d, 0x37, 0x16, 0x64, 0x73, - 0xf3, 0xc6, 0xf4, 0xa4, 0x17, 0x2d, 0x5c, 0xb0, 0xac, 0xa4, 0xb6, 0x7c, 0xad, 0xb3, 0xab, 0x6d, - 0x3f, 0x7e, 0x65, 0x5a, 0x3a, 0xf5, 0x35, 0x09, 0xc0, 0xdb, 0x75, 0x41, 0x0f, 0xc0, 0x91, 0xfc, - 0xea, 0x4a, 0xa1, 0xb4, 0xbe, 0x31, 0xb7, 0xb1, 0xb9, 0x1e, 0xbc, 0xdf, 0x2e, 0x8e, 0x06, 0x6c, - 0x13, 0x97, 0xb5, 0x6d, 0x0d, 0x57, 0xd0, 0x3d, 0x30, 0x19, 0xc4, 0x26, 0xa5, 0x62, 0x21, 0x2d, - 0x65, 0x53, 0xd7, 0xae, 0xcf, 0x24, 0x58, 0x1e, 0x8a, 0x2b, 0xe8, 0x24, 0x1c, 0x6a, 0xc6, 0x5b, - 0x5c, 0x59, 0x48, 0x47, 0xb2, 0x23, 0xd7, 0xae, 0xcf, 0x24, 0xdd, 0x84, 0x15, 0xc9, 0x80, 0xfc, - 0x98, 0x9c, 0x5f, 0x34, 0x0b, 0xd7, 0xae, 0xcf, 0x0c, 0x32, 0x05, 0x66, 0x63, 0x1f, 0xfe, 0xdc, - 0xd4, 0xc0, 0x2d, 0xbf, 0x05, 0xff, 0xa7, 0x43, 0x6d, 0x77, 0xfc, 0xab, 0x58, 0xc7, 0xb6, 0x66, - 0x1f, 0x68, 0xc7, 0xbf, 0xa7, 0x53, 0x04, 0xf9, 0xf7, 0xe2, 0x90, 0x5a, 0x60, 0xad, 0x90, 0x81, - 0xc0, 0xe8, 0x2d, 0x30, 0x68, 0xd2, 0x29, 0xd4, 0x3d, 0x42, 0x6c, 0x63, 0xf0, 0x6c, 0xa2, 0x75, - 0xef, 0xb1, 0xb1, 0x69, 0xd7, 0xe6, 0x17, 0x59, 0xd8, 0xfd, 0x3a, 0xef, 0xc6, 0x58, 0xaa, 0xaf, - 0xbd, 0x2e, 0x16, 0x91, 0xf9, 0xb6, 0x52, 0x98, 0x9f, 0xcc, 0xee, 0xc4, 0x6c, 0x10, 0x08, 0xbb, - 0x19, 0xf7, 0x41, 0x09, 0x0e, 0x51, 0x2c, 0x2f, 0x09, 0xa1, 0x98, 0x62, 0xa1, 0x73, 0xaa, 0x5d, - 0x17, 0x96, 0x54, 0xdb, 0xbb, 0xe7, 0xc2, 0xee, 0xb2, 0xdd, 0xc5, 0x93, 0x80, 0xe3, 0xbe, 0xc6, - 0xc3, 0x6c, 0x65, 0x65, 0xa2, 0xd6, 0x44, 0x69, 0xa3, 0x85, 0xc0, 0x65, 0xc6, 0x58, 0x7f, 0xc7, - 0x0c, 0xfe, 0x8b, 0x8d, 0x4f, 0xc1, 0xb0, 0x17, 0x4b, 0x6c, 0xfe, 0x3f, 0x6f, 0x7a, 0x9f, 0x3b, - 0xfc, 0xc4, 0xe8, 0x43, 0x12, 0x1c, 0xf2, 0x32, 0x19, 0x3f, 0x5b, 0xf6, 0xbf, 0x81, 0xee, 0xef, - 0x63, 0x11, 0x18, 0x56, 0x4e, 0x4b, 0xbe, 0xb2, 0x32, 0xd9, 0x68, 0x26, 0x25, 0xcb, 0xcf, 0x11, - 0x7f, 0x64, 0xb5, 0x33, 0xe2, 0xf3, 0x97, 0xbd, 0x87, 0xe6, 0x20, 0x03, 0xf6, 0xff, 0x4a, 0x4c, - 0xc3, 0x72, 0x70, 0x85, 0x6e, 0x46, 0x26, 0x14, 0xb7, 0x2c, 0xaf, 0x00, 0x6a, 0x1e, 0xdc, 0xf0, - 0xe5, 0x4d, 0xef, 0x6d, 0x0e, 0x9a, 0x84, 0xb8, 0xff, 0x7a, 0x23, 0x2b, 0xe4, 0x12, 0x1f, 0xe6, - 0xd3, 0xe7, 0x2d, 0xf7, 0xf9, 0xef, 0x45, 0xe0, 0x94, 0xff, 0x68, 0xec, 0x85, 0x06, 0xb6, 0xf6, - 0x5d, 0x17, 0x35, 0xd5, 0xaa, 0xa6, 0xfb, 0x5f, 0x80, 0x1c, 0xf5, 0x4f, 0xf8, 0x14, 0x57, 0xe8, - 0x49, 0xfe, 0xb0, 0x04, 0xc3, 0x6b, 0x6a, 0x15, 0x2b, 0xf8, 0x85, 0x06, 0xb6, 0x9d, 0x16, 0x37, - 0xec, 0x0f, 0xc3, 0xa0, 0xb1, 0xbd, 0x2d, 0xce, 0xf3, 0x63, 0x0a, 0x2f, 0x91, 0x3e, 0xd7, 0xb4, - 0xba, 0xc6, 0xae, 0xc2, 0xc5, 0x14, 0x56, 0x40, 0xd3, 0x30, 0x5c, 0x36, 0x1a, 0x3a, 0x77, 0xb9, - 0x4c, 0x4c, 0x7c, 0x67, 0xa6, 0xa1, 0x33, 0x97, 0x23, 0x4a, 0xb4, 0xf0, 0x15, 0x6c, 0xd9, 0xec, - 0xcb, 0x9a, 0x09, 0x45, 0x14, 0xe5, 0x27, 0x21, 0xc5, 0x24, 0xe1, 0x93, 0xf1, 0x51, 0x48, 0xd0, - 0x5b, 0x66, 0x9e, 0x3c, 0x43, 0xa4, 0x7c, 0x89, 0xdd, 0xd3, 0x67, 0xfc, 0x99, 0x48, 0xac, 0x90, - 0xcf, 0xb7, 0xd5, 0xf2, 0xc9, 0xee, 0x51, 0x83, 0xe9, 0xd0, 0xd5, 0xf0, 0x6f, 0xc5, 0xe1, 0x10, - 0x3f, 0xb8, 0x54, 0x4d, 0xed, 0xf4, 0x8e, 0xe3, 0x88, 0x77, 0x23, 0xc0, 0x57, 0x00, 0xaa, 0xa9, - 0xc9, 0xfb, 0x10, 0xbb, 0xe8, 0x38, 0x26, 0x3a, 0x05, 0x71, 0xab, 0x51, 0xc3, 0x62, 0x23, 0xcc, - 0x3d, 0xaa, 0x50, 0x4d, 0x6d, 0x96, 0x20, 0x28, 0x8d, 0x1a, 0x56, 0x18, 0x0a, 0x2a, 0xc2, 0xf4, - 0x76, 0xa3, 0x56, 0xdb, 0x2f, 0x55, 0x30, 0xfd, 0x57, 0x61, 0xee, 0x3f, 0xdb, 0xc0, 0x7b, 0xa6, - 0x2a, 0x3e, 0xd9, 0x49, 0x14, 0x73, 0x9c, 0xa2, 0x15, 0x28, 0x96, 0xf8, 0x47, 0x1b, 0x45, 0x81, - 0x23, 0xff, 0x41, 0x04, 0x12, 0x82, 0x35, 0xbd, 0x38, 0x8f, 0x6b, 0xb8, 0xec, 0x18, 0xe2, 0x20, - 0xc9, 0x2d, 0x23, 0x04, 0xd1, 0x2a, 0x1f, 0xbc, 0xe4, 0xc5, 0x01, 0x85, 0x14, 0x08, 0xcc, 0x7d, - 0xce, 0x40, 0x60, 0x66, 0x83, 0x8c, 0x67, 0xcc, 0x34, 0xc4, 0x8a, 0xf5, 0xe2, 0x80, 0x42, 0x4b, - 0x28, 0x03, 0x83, 0xc4, 0x69, 0x1c, 0x36, 0x5a, 0x04, 0xce, 0xcb, 0xe8, 0x30, 0xc4, 0x4d, 0xd5, - 0x29, 0xb3, 0x9b, 0x86, 0xa4, 0x82, 0x15, 0xd1, 0x63, 0x30, 0xc8, 0x5e, 0xa4, 0x87, 0xff, 0x0f, - 0x0f, 0x51, 0x06, 0xfb, 0xf4, 0x1f, 0x91, 0x7b, 0x4d, 0x75, 0x1c, 0x6c, 0xe9, 0x84, 0x21, 0x43, - 0x47, 0x08, 0x62, 0x5b, 0x46, 0x65, 0x9f, 0xff, 0x6f, 0x20, 0xfa, 0x9b, 0xff, 0x33, 0x12, 0x6a, - 0x0f, 0x25, 0x5a, 0xc9, 0xfe, 0x25, 0x5a, 0x4a, 0x00, 0xf3, 0x04, 0xa9, 0x08, 0x13, 0x6a, 0xa5, - 0xa2, 0xb1, 0x7f, 0xd3, 0x53, 0xda, 0xd2, 0x68, 0xf0, 0xb0, 0xe9, 0x3f, 0xbc, 0x6b, 0x37, 0x16, - 0xc8, 0x23, 0xc8, 0x73, 0xfc, 0x7c, 0x12, 0x86, 0x4c, 0x26, 0x94, 0x7c, 0x1e, 0xc6, 0x9b, 0x24, - 0x25, 0xf2, 0xed, 0x6a, 0x7a, 0x45, 0xbc, 0xf1, 0x20, 0xbf, 0x09, 0x8c, 0x7e, 0xac, 0x93, 0x1d, - 0xd1, 0xd1, 0xdf, 0xf9, 0xf7, 0xb7, 0x7f, 0x0a, 0x34, 0xea, 0x7b, 0x0a, 0xa4, 0x9a, 0x5a, 0x3e, - 0x49, 0xf9, 0xf3, 0x07, 0x40, 0x73, 0xcd, 0x0f, 0x80, 0xaa, 0x58, 0x17, 0x13, 0x33, 0xa9, 0x52, - 0x4d, 0xcd, 0xa6, 0xe6, 0xe8, 0x7d, 0x3c, 0xd4, 0x3e, 0xef, 0xfb, 0x4d, 0xdf, 0x03, 0xc5, 0x16, - 0xe6, 0xd6, 0x16, 0x5d, 0x3b, 0xfe, 0x46, 0x04, 0x8e, 0xfb, 0xec, 0xd8, 0x87, 0xdc, 0x6c, 0xce, - 0xd9, 0xd6, 0x16, 0xdf, 0xc3, 0xbb, 0xec, 0x4b, 0x10, 0x23, 0xf8, 0xa8, 0xcb, 0xbf, 0x0a, 0xc9, - 0x7c, 0xe9, 0xdb, 0xff, 0x54, 0x0e, 0x1e, 0xe6, 0x05, 0x46, 0x85, 0x32, 0xc9, 0x7f, 0xa8, 0x77, - 0xfd, 0xa5, 0xbd, 0xef, 0xa6, 0xda, 0xb7, 0x4e, 0x8d, 0x61, 0x1d, 0xfe, 0xe0, 0x6c, 0xdb, 0x77, - 0xbb, 0x2c, 0x98, 0x76, 0xce, 0xaf, 0xfa, 0x88, 0xd4, 0xed, 0x9e, 0x45, 0x74, 0x1a, 0xc1, 0x1e, - 0x33, 0xb5, 0x3d, 0x38, 0xfc, 0x34, 0x69, 0xdb, 0xdb, 0x3d, 0x10, 0x21, 0xff, 0xb0, 0x7b, 0xc8, - 0x29, 0xf1, 0xff, 0x37, 0x28, 0x0e, 0x30, 0xc1, 0x93, 0x8f, 0xaf, 0x1d, 0xef, 0x99, 0x6d, 0x3b, - 0x95, 0xcc, 0xfa, 0xa6, 0x11, 0xc5, 0x47, 0x29, 0xff, 0x9a, 0x04, 0x47, 0x9a, 0x9a, 0xe6, 0x31, - 0x7e, 0xa1, 0xc5, 0x0b, 0x8e, 0x03, 0x25, 0x3d, 0x0b, 0x2d, 0x84, 0xbd, 0xb7, 0xab, 0xb0, 0x4c, - 0x8a, 0x80, 0xb4, 0x6f, 0x83, 0x43, 0x41, 0x61, 0x85, 0x9a, 0xee, 0x86, 0xd1, 0xe0, 0x46, 0x39, - 0x57, 0xd7, 0x48, 0x60, 0xab, 0x5c, 0x2e, 0x85, 0xf5, 0xec, 0xf6, 0xb5, 0x08, 0x49, 0x17, 0x95, - 0x67, 0xc7, 0x3d, 0x77, 0xd5, 0xa3, 0x94, 0x3f, 0x26, 0xc1, 0x4c, 0xb0, 0x05, 0x5f, 0x9e, 0xd4, - 0x9f, 0xb0, 0xb7, 0x6c, 0x88, 0x5f, 0x93, 0xe0, 0x8e, 0x0e, 0x32, 0x71, 0x05, 0xbc, 0x08, 0x93, - 0xbe, 0x4d, 0x02, 0x11, 0xc2, 0xc5, 0xb0, 0x9f, 0xea, 0x9e, 0xa1, 0xba, 0x6b, 0xe2, 0x63, 0x44, - 0x29, 0x5f, 0xf8, 0xde, 0xf4, 0x44, 0x73, 0x9d, 0xad, 0x4c, 0x34, 0x2f, 0xec, 0x6f, 0xa1, 0x7d, - 0xbc, 0x2c, 0xc1, 0x7d, 0xc1, 0xae, 0xb6, 0x48, 0x75, 0xdf, 0xac, 0x71, 0xf8, 0xf7, 0x12, 0x9c, - 0xea, 0x45, 0x38, 0x3e, 0x20, 0x5b, 0x30, 0xe1, 0x25, 0xe1, 0xe1, 0xf1, 0xe8, 0x2b, 0xb5, 0x67, - 0x56, 0x8a, 0x5c, 0x6e, 0xb7, 0x41, 0xf1, 0x26, 0x77, 0x2c, 0xff, 0x90, 0xbb, 0x4a, 0x0e, 0x6e, - 0x72, 0x0b, 0x25, 0x07, 0xb6, 0xb9, 0x5b, 0x8c, 0x45, 0xa4, 0xc5, 0x58, 0x78, 0x59, 0xbb, 0x7c, - 0x85, 0xc7, 0xad, 0x16, 0xdb, 0x73, 0xef, 0x84, 0x89, 0x16, 0xa6, 0xcc, 0xbd, 0xba, 0x0f, 0x4b, - 0x56, 0x50, 0xb3, 0xb1, 0xca, 0xfb, 0x30, 0x4d, 0xdb, 0x6d, 0xa1, 0xe8, 0xdb, 0xdd, 0xe5, 0x3a, - 0x8f, 0x2d, 0x2d, 0x9b, 0xe6, 0x7d, 0x5f, 0x84, 0x41, 0x36, 0xce, 0xbc, 0xbb, 0x07, 0x30, 0x14, - 0xce, 0x40, 0xfe, 0x94, 0x88, 0x65, 0x05, 0x21, 0x76, 0x6b, 0x1f, 0xea, 0xa5, 0xaf, 0xb7, 0xc8, - 0x87, 0x7c, 0xca, 0xf8, 0xae, 0x88, 0x6a, 0xad, 0xa5, 0xe3, 0xea, 0x28, 0xdf, 0xb2, 0xa8, 0xc6, - 0x74, 0x73, 0x7b, 0xc3, 0xd7, 0xaf, 0x88, 0xf0, 0xe5, 0xf6, 0xa9, 0x4b, 0xf8, 0x7a, 0x73, 0x54, - 0xef, 0x06, 0xb2, 0x2e, 0x62, 0xfe, 0x79, 0x0c, 0x64, 0x3f, 0x96, 0xe0, 0x28, 0xed, 0x9b, 0x7f, - 0x8f, 0xa2, 0x5f, 0x95, 0x3f, 0x00, 0xc8, 0xb6, 0xca, 0xa5, 0x96, 0xde, 0x9d, 0xb6, 0xad, 0xf2, - 0xe5, 0xc0, 0xfc, 0xf2, 0x00, 0xa0, 0x4a, 0x60, 0x27, 0x8a, 0x62, 0xb3, 0xcb, 0x83, 0xe9, 0x8a, - 0x6f, 0xa3, 0xa3, 0xc5, 0x70, 0xc6, 0x6e, 0xc1, 0x70, 0x7e, 0x47, 0x82, 0x6c, 0xab, 0x2e, 0xf3, - 0xe1, 0xd3, 0xe0, 0x70, 0xe0, 0xfc, 0x20, 0x3c, 0x82, 0x0f, 0xf4, 0xb2, 0xcb, 0x13, 0x72, 0xa3, - 0x43, 0x16, 0xbe, 0xdd, 0x79, 0xc0, 0x74, 0xd0, 0x42, 0x9b, 0x33, 0xeb, 0x37, 0xcd, 0x7d, 0xbe, - 0xda, 0x14, 0x57, 0xff, 0x5c, 0xe4, 0xde, 0x7b, 0x30, 0xd5, 0x46, 0xea, 0xdb, 0x3d, 0xef, 0xed, - 0xb4, 0x1d, 0xcc, 0x5b, 0x9d, 0xbe, 0x3f, 0xca, 0x3d, 0x21, 0x78, 0x31, 0xdd, 0xb7, 0x16, 0x6b, - 0xf5, 0xb2, 0x4d, 0x7e, 0x07, 0x1c, 0x6b, 0x49, 0xc5, 0x65, 0xcb, 0x41, 0x6c, 0x47, 0xb3, 0x1d, - 0x2e, 0xd6, 0x3d, 0xed, 0xc4, 0x0a, 0x51, 0x53, 0x1a, 0x19, 0x41, 0x9a, 0xb2, 0x5e, 0x33, 0x8c, - 0x1a, 0x17, 0x43, 0xbe, 0x04, 0xe3, 0x3e, 0x18, 0x6f, 0xe4, 0x1c, 0xc4, 0x4c, 0x83, 0x7f, 0xb5, - 0x61, 0xf8, 0xcc, 0xf1, 0xb6, 0x1b, 0xfb, 0x86, 0x51, 0xe3, 0xdd, 0xa6, 0xf8, 0xf2, 0x24, 0x20, - 0xc6, 0x8c, 0xee, 0xf1, 0x8b, 0x26, 0xd6, 0x61, 0x22, 0x00, 0xe5, 0x8d, 0xbc, 0xae, 0xf3, 0x83, - 0x33, 0x3f, 0x3c, 0x04, 0x71, 0xca, 0x15, 0x7d, 0x52, 0x0a, 0x7c, 0x56, 0x69, 0xb6, 0x1d, 0x9b, - 0xd6, 0x6b, 0xe2, 0xec, 0xe9, 0x9e, 0xf1, 0x79, 0xce, 0x76, 0xea, 0xfd, 0xff, 0xe6, 0x07, 0x1f, - 0x8f, 0xdc, 0x85, 0xe4, 0xd3, 0x6d, 0x56, 0xe3, 0x3e, 0x7f, 0xf9, 0x7c, 0xe0, 0x93, 0x00, 0x0f, - 0xf6, 0xd6, 0x94, 0x90, 0x6c, 0xb6, 0x57, 0x74, 0x2e, 0xd8, 0x79, 0x2a, 0xd8, 0x59, 0xf4, 0x48, - 0x77, 0xc1, 0x4e, 0xbf, 0x3b, 0xe8, 0x34, 0xef, 0x45, 0xbf, 0x27, 0xc1, 0x64, 0xab, 0x25, 0x1d, - 0x7a, 0xbc, 0x37, 0x29, 0x9a, 0x53, 0x8a, 0xec, 0x13, 0x07, 0xa0, 0xe4, 0x5d, 0x59, 0xa0, 0x5d, - 0x99, 0x43, 0x4f, 0x1e, 0xa0, 0x2b, 0xa7, 0xfd, 0x5b, 0xff, 0xff, 0x4b, 0x82, 0x13, 0x1d, 0x57, - 0x48, 0x68, 0xae, 0x37, 0x29, 0x3b, 0xe4, 0x4e, 0xd9, 0xfc, 0xeb, 0x61, 0xc1, 0x7b, 0xfc, 0x34, - 0xed, 0xf1, 0x25, 0xb4, 0x78, 0x90, 0x1e, 0xb7, 0x3c, 0x5f, 0x41, 0xbf, 0x1d, 0xbc, 0x70, 0xd9, - 0xd9, 0x9c, 0x9a, 0x16, 0x1e, 0x5d, 0x1c, 0xa3, 0x39, 0xa9, 0x95, 0x9f, 0xa5, 0x5d, 0x50, 0xd0, - 0xda, 0xeb, 0x1c, 0xb4, 0xd3, 0xef, 0x0e, 0x06, 0xfe, 0xf7, 0xa2, 0xff, 0x29, 0xb5, 0xbe, 0x3f, - 0xf9, 0x58, 0x47, 0x11, 0xdb, 0x2f, 0xaa, 0xb2, 0x8f, 0xf7, 0x4f, 0xc8, 0x3b, 0x59, 0xa7, 0x9d, - 0xac, 0x22, 0x7c, 0xab, 0x3b, 0xd9, 0x72, 0x10, 0xd1, 0xb7, 0x24, 0x98, 0x6c, 0xb5, 0x26, 0xe9, - 0xe2, 0x96, 0x1d, 0x16, 0x59, 0x5d, 0xdc, 0xb2, 0xd3, 0x02, 0x48, 0x7e, 0x0b, 0xed, 0xfc, 0x39, - 0xf4, 0x68, 0xbb, 0xce, 0x77, 0x1c, 0x45, 0xe2, 0x8b, 0x1d, 0x93, 0xfc, 0x2e, 0xbe, 0xd8, 0xcb, - 0x3a, 0xa6, 0x8b, 0x2f, 0xf6, 0xb4, 0xc6, 0xe8, 0xee, 0x8b, 0x6e, 0xcf, 0x7a, 0x1c, 0x46, 0x1b, - 0x7d, 0x43, 0x82, 0x91, 0x40, 0x46, 0x8c, 0x1e, 0xee, 0x28, 0x68, 0xab, 0x05, 0x43, 0xf6, 0x4c, - 0x3f, 0x24, 0xbc, 0x2f, 0x8b, 0xb4, 0x2f, 0xf3, 0x68, 0xee, 0x20, 0x7d, 0x09, 0x1e, 0xa3, 0x7e, - 0x47, 0x82, 0x89, 0x16, 0x59, 0x66, 0x17, 0x2f, 0x6c, 0x9f, 0x34, 0x67, 0x1f, 0xef, 0x9f, 0x90, - 0xf7, 0xea, 0x02, 0xed, 0xd5, 0xdb, 0xd1, 0xdb, 0x0e, 0xd2, 0x2b, 0xdf, 0xfc, 0x7c, 0xc3, 0xbb, - 0x92, 0xe5, 0x6b, 0x07, 0x9d, 0xeb, 0x53, 0x30, 0xd1, 0xa1, 0xc7, 0xfa, 0xa6, 0xe3, 0xfd, 0x79, - 0x86, 0xf6, 0xe7, 0x69, 0xb4, 0xfa, 0xfa, 0xfa, 0xd3, 0x3c, 0xad, 0x7f, 0xa5, 0xf9, 0x61, 0x64, - 0x67, 0x2b, 0x6a, 0x99, 0xac, 0x66, 0x1f, 0xe9, 0x8b, 0x86, 0x77, 0xea, 0x71, 0xda, 0xa9, 0x33, - 0xe8, 0xa1, 0x76, 0x9d, 0xf2, 0xdd, 0x39, 0xd4, 0xf4, 0x6d, 0xe3, 0xf4, 0xbb, 0x59, 0x0a, 0xfc, - 0x5e, 0xf4, 0x3e, 0x71, 0xe7, 0xe9, 0x64, 0xc7, 0x76, 0x7d, 0x79, 0x6c, 0xf6, 0xbe, 0x1e, 0x30, - 0xb9, 0x5c, 0x77, 0x51, 0xb9, 0xa6, 0xd0, 0xf1, 0x76, 0x72, 0x91, 0x5c, 0x16, 0x7d, 0x44, 0x72, - 0xaf, 0x88, 0x9e, 0xea, 0xcc, 0xdb, 0x9f, 0xec, 0x66, 0xef, 0xef, 0x09, 0x97, 0x4b, 0x72, 0x0f, - 0x95, 0x64, 0x06, 0x4d, 0xb5, 0x95, 0x84, 0xa5, 0xbe, 0xb7, 0xfa, 0x52, 0xc1, 0xb5, 0x23, 0x30, - 0xdd, 0xa6, 0x45, 0x67, 0xaf, 0xcb, 0x19, 0x57, 0x87, 0xf7, 0xc1, 0x5d, 0xdf, 0xff, 0xde, 0xea, - 0xef, 0xda, 0xf6, 0x78, 0x20, 0xf6, 0x3b, 0x31, 0x40, 0xcb, 0x76, 0x75, 0xde, 0xc2, 0xec, 0x7f, - 0x6c, 0x72, 0x2f, 0x0f, 0x3d, 0x7c, 0x93, 0x5e, 0xd7, 0xc3, 0xb7, 0xe5, 0xc0, 0x53, 0xb2, 0x48, - 0x7f, 0xcf, 0x55, 0x7b, 0x7e, 0x4f, 0x16, 0x7d, 0x43, 0xee, 0xac, 0xb6, 0xbe, 0x6e, 0x1e, 0xbb, - 0x75, 0xef, 0x52, 0xe2, 0x07, 0x7d, 0x9b, 0xc3, 0x9f, 0x89, 0x0e, 0x76, 0x78, 0x26, 0x9a, 0x69, - 0xfb, 0x16, 0x94, 0x53, 0xa3, 0xb3, 0xe2, 0x2b, 0xaf, 0x43, 0xbd, 0x5d, 0x92, 0xe5, 0x9f, 0x81, - 0xf5, 0xb6, 0x10, 0x8e, 0x43, 0xb6, 0xd9, 0x9c, 0x5c, 0xa7, 0xfe, 0x78, 0x14, 0xd2, 0xcb, 0x76, - 0xb5, 0x58, 0xd1, 0x9c, 0xdb, 0x64, 0x6b, 0x4f, 0xb6, 0x7f, 0xeb, 0x83, 0x6e, 0xde, 0x98, 0x1e, - 0x65, 0x3a, 0xed, 0xa0, 0xc9, 0x3a, 0x8c, 0x85, 0xef, 0x62, 0x33, 0xcb, 0x2a, 0x1c, 0xe4, 0xa1, - 0x77, 0xd3, 0x1d, 0xec, 0xd1, 0xe0, 0x9b, 0x6b, 0xb4, 0xd7, 0xda, 0x98, 0x99, 0x41, 0x5d, 0xbc, - 0xad, 0x97, 0xaf, 0xdd, 0x31, 0xcb, 0x42, 0x26, 0x3c, 0x28, 0xee, 0x88, 0xfd, 0xb1, 0x04, 0xc3, - 0xcb, 0xb6, 0x48, 0x05, 0xf1, 0xcf, 0xe8, 0xb3, 0xac, 0xc7, 0xdc, 0x4f, 0xa4, 0x47, 0x7b, 0xb3, - 0x5b, 0xf1, 0xd9, 0x74, 0x4f, 0x09, 0x87, 0x60, 0xc2, 0xd7, 0x4f, 0xb7, 0xff, 0xbf, 0x1b, 0xa1, - 0xf1, 0x31, 0x8f, 0xab, 0x9a, 0xee, 0x66, 0x91, 0xf8, 0x2f, 0xea, 0xa3, 0x13, 0x4f, 0xcf, 0xb1, - 0x83, 0xea, 0x79, 0x97, 0x06, 0x88, 0x90, 0x3e, 0xdd, 0x8d, 0xaf, 0xe5, 0xe6, 0x27, 0x51, 0x52, - 0x1f, 0x5f, 0x1b, 0x0a, 0x3d, 0x7c, 0x92, 0x5f, 0x93, 0x60, 0x64, 0xd9, 0xae, 0x6e, 0xea, 0x95, - 0xff, 0xe7, 0xed, 0x77, 0x1b, 0x0e, 0x05, 0x7a, 0x7a, 0x9b, 0x54, 0x7a, 0xe6, 0xe5, 0x18, 0x44, - 0x97, 0xed, 0x2a, 0x7a, 0x01, 0xc6, 0xc2, 0x49, 0x43, 0xdb, 0x5c, 0xb0, 0x79, 0x46, 0x68, 0xbf, - 0x5e, 0x6b, 0x3f, 0x7b, 0xa0, 0x5d, 0x18, 0x09, 0xce, 0x1c, 0x27, 0x3b, 0x30, 0x09, 0x60, 0x66, - 0x1f, 0xea, 0x15, 0xd3, 0x6d, 0xec, 0x5d, 0x90, 0x70, 0x83, 0xde, 0x9d, 0x1d, 0xa8, 0x05, 0x52, - 0xfb, 0xec, 0xb6, 0x45, 0x58, 0x21, 0xda, 0x0b, 0x87, 0x94, 0x4e, 0xda, 0x0b, 0xe1, 0x76, 0xd4, - 0x5e, 0x3b, 0xd7, 0xda, 0x02, 0xf0, 0xf9, 0xc1, 0xdd, 0x1d, 0x38, 0x78, 0x68, 0xd9, 0x07, 0x7b, - 0x42, 0x73, 0x0f, 0x9d, 0x6e, 0x71, 0x32, 0xfe, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xa8, - 0xd3, 0x61, 0xd9, 0x98, 0x00, 0x00, + // 7678 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7c, 0x7b, 0x90, 0x24, 0xc9, + 0x79, 0xd7, 0xf4, 0x63, 0xfa, 0xf1, 0x4d, 0x4f, 0x77, 0x4d, 0xcd, 0xec, 0x6e, 0x6f, 0xef, 0xed, + 0xcc, 0x5c, 0xdd, 0x6b, 0xef, 0x35, 0x7b, 0xb7, 0x77, 0xbb, 0x77, 0xdb, 0x8b, 0x7c, 0xee, 0xd7, + 0xce, 0xf6, 0xde, 0xbc, 0x54, 0x3d, 0xb3, 0x77, 0x3a, 0x1b, 0x8a, 0x9a, 0xea, 0x9c, 0x9e, 0xba, + 0xa9, 0xae, 0x2a, 0x55, 0x55, 0xef, 0xee, 0x5c, 0x28, 0x88, 0x73, 0xc8, 0x80, 0xb4, 0x0e, 0xdb, + 0x92, 0x4d, 0x60, 0x59, 0xd6, 0x8a, 0x93, 0x05, 0xc8, 0x08, 0x81, 0xb1, 0x65, 0x04, 0x86, 0x00, + 0x04, 0x11, 0x80, 0x6c, 0x22, 0x08, 0xe9, 0x1f, 0x70, 0x10, 0xb0, 0x98, 0x93, 0x02, 0x84, 0x91, + 0xb1, 0x59, 0x1f, 0x11, 0x26, 0x14, 0x0e, 0x88, 0x7c, 0xd5, 0xa3, 0x1f, 0xd3, 0x3d, 0x8b, 0xee, + 0xec, 0x08, 0xf8, 0x6b, 0x26, 0xbf, 0xfc, 0x7e, 0xbf, 0xcc, 0xfc, 0xf2, 0xcb, 0x2f, 0xbf, 0xcc, + 0xaa, 0x6a, 0xf8, 0x83, 0x2b, 0xb0, 0xdc, 0xb1, 0xac, 0x8e, 0x81, 0xce, 0xdb, 0x8e, 0xe5, 0x59, + 0xbb, 0xbd, 0xbd, 0xf3, 0x6d, 0xe4, 0x6a, 0x8e, 0x6e, 0x7b, 0x96, 0xb3, 0x42, 0x64, 0x62, 0x81, + 0x6a, 0xac, 0x70, 0x0d, 0x69, 0x1d, 0xe6, 0xae, 0xea, 0x06, 0xaa, 0xfb, 0x8a, 0x2d, 0xe4, 0x89, + 0x2f, 0x43, 0x72, 0x4f, 0x37, 0x50, 0x31, 0xb6, 0x9c, 0x38, 0x37, 0x73, 0xe1, 0xd1, 0x95, 0x3e, + 0xd0, 0x4a, 0x14, 0xb1, 0x85, 0xc5, 0x32, 0x41, 0x48, 0xdf, 0x49, 0xc2, 0xfc, 0x90, 0x5a, 0x51, + 0x84, 0xa4, 0xa9, 0x76, 0x31, 0x63, 0xec, 0x5c, 0x56, 0x26, 0xff, 0x8b, 0x45, 0x48, 0xdb, 0xaa, + 0x76, 0xa0, 0x76, 0x50, 0x31, 0x4e, 0xc4, 0xbc, 0x28, 0x2e, 0x02, 0xb4, 0x91, 0x8d, 0xcc, 0x36, + 0x32, 0xb5, 0xc3, 0x62, 0x62, 0x39, 0x71, 0x2e, 0x2b, 0x87, 0x24, 0xe2, 0xd3, 0x30, 0x67, 0xf7, + 0x76, 0x0d, 0x5d, 0x53, 0x42, 0x6a, 0xb0, 0x9c, 0x38, 0x37, 0x2d, 0x0b, 0xb4, 0xa2, 0x1e, 0x28, + 0x3f, 0x01, 0x85, 0x5b, 0x48, 0x3d, 0x08, 0xab, 0xce, 0x10, 0xd5, 0x3c, 0x16, 0x87, 0x14, 0x6b, + 0x90, 0xeb, 0x22, 0xd7, 0x55, 0x3b, 0x48, 0xf1, 0x0e, 0x6d, 0x54, 0x4c, 0x92, 0xd1, 0x2f, 0x0f, + 0x8c, 0xbe, 0x7f, 0xe4, 0x33, 0x0c, 0xb5, 0x7d, 0x68, 0x23, 0xb1, 0x02, 0x59, 0x64, 0xf6, 0xba, + 0x94, 0x61, 0x7a, 0x84, 0xfd, 0x1a, 0x66, 0xaf, 0xdb, 0xcf, 0x92, 0xc1, 0x30, 0x46, 0x91, 0x76, + 0x91, 0x73, 0x53, 0xd7, 0x50, 0x31, 0x45, 0x08, 0x9e, 0x18, 0x20, 0x68, 0xd1, 0xfa, 0x7e, 0x0e, + 0x8e, 0x13, 0x6b, 0x90, 0x45, 0xb7, 0x3d, 0x64, 0xba, 0xba, 0x65, 0x16, 0xd3, 0x84, 0xe4, 0xb1, + 0x21, 0xb3, 0x88, 0x8c, 0x76, 0x3f, 0x45, 0x80, 0x13, 0x2f, 0x41, 0xda, 0xb2, 0x3d, 0xdd, 0x32, + 0xdd, 0x62, 0x66, 0x39, 0x76, 0x6e, 0xe6, 0xc2, 0x43, 0x43, 0x1d, 0x61, 0x93, 0xea, 0xc8, 0x5c, + 0x59, 0x6c, 0x82, 0xe0, 0x5a, 0x3d, 0x47, 0x43, 0x8a, 0x66, 0xb5, 0x91, 0xa2, 0x9b, 0x7b, 0x56, + 0x31, 0x4b, 0x08, 0x96, 0x06, 0x07, 0x42, 0x14, 0x6b, 0x56, 0x1b, 0x35, 0xcd, 0x3d, 0x4b, 0xce, + 0xbb, 0x91, 0xb2, 0x78, 0x12, 0x52, 0xee, 0xa1, 0xe9, 0xa9, 0xb7, 0x8b, 0x39, 0xe2, 0x21, 0xac, + 0x24, 0xfd, 0x7a, 0x0a, 0x0a, 0x93, 0xb8, 0xd8, 0x15, 0x98, 0xde, 0xc3, 0xa3, 0x2c, 0xc6, 0x8f, + 0x63, 0x03, 0x8a, 0x89, 0x1a, 0x31, 0xf5, 0x80, 0x46, 0xac, 0xc0, 0x8c, 0x89, 0x5c, 0x0f, 0xb5, + 0xa9, 0x47, 0x24, 0x26, 0xf4, 0x29, 0xa0, 0xa0, 0x41, 0x97, 0x4a, 0x3e, 0x90, 0x4b, 0xbd, 0x0e, + 0x05, 0xbf, 0x4b, 0x8a, 0xa3, 0x9a, 0x1d, 0xee, 0x9b, 0xe7, 0xc7, 0xf5, 0x64, 0xa5, 0xc1, 0x71, + 0x32, 0x86, 0xc9, 0x79, 0x14, 0x29, 0x8b, 0x75, 0x00, 0xcb, 0x44, 0xd6, 0x9e, 0xd2, 0x46, 0x9a, + 0x51, 0xcc, 0x8c, 0xb0, 0xd2, 0x26, 0x56, 0x19, 0xb0, 0x92, 0x45, 0xa5, 0x9a, 0x21, 0x5e, 0x0e, + 0x5c, 0x2d, 0x3d, 0xc2, 0x53, 0xd6, 0xe9, 0x22, 0x1b, 0xf0, 0xb6, 0x1d, 0xc8, 0x3b, 0x08, 0xfb, + 0x3d, 0x6a, 0xb3, 0x91, 0x65, 0x49, 0x27, 0x56, 0xc6, 0x8e, 0x4c, 0x66, 0x30, 0x3a, 0xb0, 0x59, + 0x27, 0x5c, 0x14, 0x1f, 0x01, 0x5f, 0xa0, 0x10, 0xb7, 0x02, 0x12, 0x85, 0x72, 0x5c, 0xb8, 0xa1, + 0x76, 0x51, 0xe9, 0x2d, 0xc8, 0x47, 0xcd, 0x23, 0x2e, 0xc0, 0xb4, 0xeb, 0xa9, 0x8e, 0x47, 0xbc, + 0x70, 0x5a, 0xa6, 0x05, 0x51, 0x80, 0x04, 0x32, 0xdb, 0x24, 0xca, 0x4d, 0xcb, 0xf8, 0x5f, 0xf1, + 0x87, 0x83, 0x01, 0x27, 0xc8, 0x80, 0x1f, 0x1f, 0x9c, 0xd1, 0x08, 0x73, 0xff, 0xb8, 0x4b, 0x2f, + 0xc1, 0x6c, 0x64, 0x00, 0x93, 0x36, 0x2d, 0x7d, 0x0c, 0x4e, 0x0c, 0xa5, 0x16, 0x5f, 0x87, 0x85, + 0x9e, 0xa9, 0x9b, 0x1e, 0x72, 0x6c, 0x07, 0x61, 0x8f, 0xa5, 0x4d, 0x15, 0xff, 0x4b, 0x7a, 0x84, + 0xcf, 0xed, 0x84, 0xb5, 0x29, 0x8b, 0x3c, 0xdf, 0x1b, 0x14, 0x3e, 0x95, 0xcd, 0x7c, 0x37, 0x2d, + 0xbc, 0xfd, 0xf6, 0xdb, 0x6f, 0xc7, 0xa5, 0x7f, 0x9a, 0x82, 0x85, 0x61, 0x6b, 0x66, 0xe8, 0xf2, + 0x3d, 0x09, 0x29, 0xb3, 0xd7, 0xdd, 0x45, 0x0e, 0x31, 0xd2, 0xb4, 0xcc, 0x4a, 0x62, 0x05, 0xa6, + 0x0d, 0x75, 0x17, 0x19, 0xc5, 0xe4, 0x72, 0xec, 0x5c, 0xfe, 0xc2, 0xd3, 0x13, 0xad, 0xca, 0x95, + 0x35, 0x0c, 0x91, 0x29, 0x52, 0xfc, 0x21, 0x48, 0xb2, 0x10, 0x8d, 0x19, 0x9e, 0x9a, 0x8c, 0x01, + 0xaf, 0x25, 0x99, 0xe0, 0xc4, 0x33, 0x90, 0xc5, 0x7f, 0xa9, 0x6f, 0xa4, 0x48, 0x9f, 0x33, 0x58, + 0x80, 0xfd, 0x42, 0x2c, 0x41, 0x86, 0x2c, 0x93, 0x36, 0xe2, 0x5b, 0x9b, 0x5f, 0xc6, 0x8e, 0xd5, + 0x46, 0x7b, 0x6a, 0xcf, 0xf0, 0x94, 0x9b, 0xaa, 0xd1, 0x43, 0xc4, 0xe1, 0xb3, 0x72, 0x8e, 0x09, + 0x6f, 0x60, 0x99, 0xb8, 0x04, 0x33, 0x74, 0x55, 0xe9, 0x66, 0x1b, 0xdd, 0x26, 0xd1, 0x73, 0x5a, + 0xa6, 0x0b, 0xad, 0x89, 0x25, 0xb8, 0xf9, 0x37, 0x5d, 0xcb, 0xe4, 0xae, 0x49, 0x9a, 0xc0, 0x02, + 0xd2, 0xfc, 0x4b, 0xfd, 0x81, 0xfb, 0xec, 0xf0, 0xe1, 0x0d, 0xac, 0xa5, 0x27, 0xa0, 0x40, 0x34, + 0x5e, 0x60, 0x53, 0xaf, 0x1a, 0xc5, 0xb9, 0xe5, 0xd8, 0xb9, 0x8c, 0x9c, 0xa7, 0xe2, 0x4d, 0x26, + 0x95, 0xbe, 0x16, 0x87, 0x24, 0x09, 0x2c, 0x05, 0x98, 0xd9, 0xfe, 0xc8, 0x56, 0x43, 0xa9, 0x6f, + 0xee, 0x54, 0xd7, 0x1a, 0x42, 0x4c, 0xcc, 0x03, 0x10, 0xc1, 0xd5, 0xb5, 0xcd, 0xca, 0xb6, 0x10, + 0xf7, 0xcb, 0xcd, 0x8d, 0xed, 0x4b, 0x2f, 0x0a, 0x09, 0x1f, 0xb0, 0x43, 0x05, 0xc9, 0xb0, 0xc2, + 0x0b, 0x17, 0x84, 0x69, 0x51, 0x80, 0x1c, 0x25, 0x68, 0xbe, 0xde, 0xa8, 0x5f, 0x7a, 0x51, 0x48, + 0x45, 0x25, 0x2f, 0x5c, 0x10, 0xd2, 0xe2, 0x2c, 0x64, 0x89, 0xa4, 0xba, 0xb9, 0xb9, 0x26, 0x64, + 0x7c, 0xce, 0xd6, 0xb6, 0xdc, 0xdc, 0x58, 0x15, 0xb2, 0x3e, 0xe7, 0xaa, 0xbc, 0xb9, 0xb3, 0x25, + 0x80, 0xcf, 0xb0, 0xde, 0x68, 0xb5, 0x2a, 0xab, 0x0d, 0x61, 0xc6, 0xd7, 0xa8, 0x7e, 0x64, 0xbb, + 0xd1, 0x12, 0x72, 0x91, 0x6e, 0xbd, 0x70, 0x41, 0x98, 0xf5, 0x9b, 0x68, 0x6c, 0xec, 0xac, 0x0b, + 0x79, 0x71, 0x0e, 0x66, 0x69, 0x13, 0xbc, 0x13, 0x85, 0x3e, 0xd1, 0xa5, 0x17, 0x05, 0x21, 0xe8, + 0x08, 0x65, 0x99, 0x8b, 0x08, 0x2e, 0xbd, 0x28, 0x88, 0x52, 0x0d, 0xa6, 0x89, 0x1b, 0x8a, 0x22, + 0xe4, 0xd7, 0x2a, 0xd5, 0xc6, 0x9a, 0xb2, 0xb9, 0xb5, 0xdd, 0xdc, 0xdc, 0xa8, 0xac, 0x09, 0xb1, + 0x40, 0x26, 0x37, 0x3e, 0xbc, 0xd3, 0x94, 0x1b, 0x75, 0x21, 0x1e, 0x96, 0x6d, 0x35, 0x2a, 0xdb, + 0x8d, 0xba, 0x90, 0x90, 0x34, 0x58, 0x18, 0x16, 0x50, 0x87, 0x2e, 0xa1, 0x90, 0x2f, 0xc4, 0x47, + 0xf8, 0x02, 0xe1, 0xea, 0xf7, 0x05, 0xe9, 0xdb, 0x71, 0x98, 0x1f, 0xb2, 0xa9, 0x0c, 0x6d, 0xe4, + 0x15, 0x98, 0xa6, 0xbe, 0x4c, 0xb7, 0xd9, 0x27, 0x87, 0xee, 0x4e, 0xc4, 0xb3, 0x07, 0xb6, 0x5a, + 0x82, 0x0b, 0xa7, 0x1a, 0x89, 0x11, 0xa9, 0x06, 0xa6, 0x18, 0x70, 0xd8, 0x3f, 0x3d, 0x10, 0xfc, + 0xe9, 0xfe, 0x78, 0x69, 0x92, 0xfd, 0x91, 0xc8, 0x8e, 0xb7, 0x09, 0x4c, 0x0f, 0xd9, 0x04, 0xae, + 0xc0, 0xdc, 0x00, 0xd1, 0xc4, 0xc1, 0xf8, 0xe3, 0x31, 0x28, 0x8e, 0x32, 0xce, 0x98, 0x90, 0x18, + 0x8f, 0x84, 0xc4, 0x2b, 0xfd, 0x16, 0x7c, 0x78, 0xf4, 0x24, 0x0c, 0xcc, 0xf5, 0x97, 0x62, 0x70, + 0x72, 0x78, 0x4a, 0x39, 0xb4, 0x0f, 0x3f, 0x04, 0xa9, 0x2e, 0xf2, 0xf6, 0x2d, 0x9e, 0x56, 0x3d, + 0x3e, 0x64, 0xb3, 0xc6, 0xd5, 0xfd, 0x93, 0xcd, 0x50, 0xe1, 0xdd, 0x3e, 0x31, 0x2a, 0x2f, 0xa4, + 0xbd, 0x19, 0xe8, 0xe9, 0x27, 0xe3, 0x70, 0x62, 0x28, 0xf9, 0xd0, 0x8e, 0x9e, 0x05, 0xd0, 0x4d, + 0xbb, 0xe7, 0xd1, 0xd4, 0x89, 0x46, 0xe2, 0x2c, 0x91, 0x90, 0xe0, 0x85, 0xa3, 0x6c, 0xcf, 0xf3, + 0xeb, 0x13, 0xa4, 0x1e, 0xa8, 0x88, 0x28, 0xbc, 0x1c, 0x74, 0x34, 0x49, 0x3a, 0xba, 0x38, 0x62, + 0xa4, 0x03, 0x8e, 0xf9, 0x1c, 0x08, 0x9a, 0xa1, 0x23, 0xd3, 0x53, 0x5c, 0xcf, 0x41, 0x6a, 0x57, + 0x37, 0x3b, 0x64, 0xab, 0xc9, 0x94, 0xa7, 0xf7, 0x54, 0xc3, 0x45, 0x72, 0x81, 0x56, 0xb7, 0x78, + 0x2d, 0x46, 0x10, 0x07, 0x72, 0x42, 0x88, 0x54, 0x04, 0x41, 0xab, 0x7d, 0x84, 0xf4, 0xe9, 0x2c, + 0xcc, 0x84, 0x12, 0x70, 0xf1, 0x61, 0xc8, 0xbd, 0xa9, 0xde, 0x54, 0x15, 0x7e, 0xa8, 0xa2, 0x96, + 0x98, 0xc1, 0xb2, 0x2d, 0x76, 0xb0, 0x7a, 0x0e, 0x16, 0x88, 0x8a, 0xd5, 0xf3, 0x90, 0xa3, 0x68, + 0x86, 0xea, 0xba, 0xc4, 0x68, 0x19, 0xa2, 0x2a, 0xe2, 0xba, 0x4d, 0x5c, 0x55, 0xe3, 0x35, 0xe2, + 0x45, 0x98, 0x27, 0x88, 0x6e, 0xcf, 0xf0, 0x74, 0xdb, 0x40, 0x0a, 0x3e, 0xe6, 0xb9, 0x64, 0xcb, + 0xf1, 0x7b, 0x36, 0x87, 0x35, 0xd6, 0x99, 0x02, 0xee, 0x91, 0x2b, 0xd6, 0xe1, 0x2c, 0x81, 0x75, + 0x90, 0x89, 0x1c, 0xd5, 0x43, 0x0a, 0xfa, 0x68, 0x4f, 0x35, 0x5c, 0x45, 0x35, 0xdb, 0xca, 0xbe, + 0xea, 0xee, 0x17, 0x17, 0x30, 0x41, 0x35, 0x5e, 0x8c, 0xc9, 0xa7, 0xb1, 0xe2, 0x2a, 0xd3, 0x6b, + 0x10, 0xb5, 0x8a, 0xd9, 0xbe, 0xa6, 0xba, 0xfb, 0x62, 0x19, 0x4e, 0x12, 0x16, 0xd7, 0x73, 0x74, + 0xb3, 0xa3, 0x68, 0xfb, 0x48, 0x3b, 0x50, 0x7a, 0xde, 0xde, 0xcb, 0xc5, 0x33, 0xe1, 0xf6, 0x49, + 0x0f, 0x5b, 0x44, 0xa7, 0x86, 0x55, 0x76, 0xbc, 0xbd, 0x97, 0xc5, 0x16, 0xe4, 0xf0, 0x64, 0x74, + 0xf5, 0xb7, 0x90, 0xb2, 0x67, 0x39, 0x64, 0x0f, 0xcd, 0x0f, 0x09, 0x4d, 0x21, 0x0b, 0xae, 0x6c, + 0x32, 0xc0, 0xba, 0xd5, 0x46, 0xe5, 0xe9, 0xd6, 0x56, 0xa3, 0x51, 0x97, 0x67, 0x38, 0xcb, 0x55, + 0xcb, 0xc1, 0x0e, 0xd5, 0xb1, 0x7c, 0x03, 0xcf, 0x50, 0x87, 0xea, 0x58, 0xdc, 0xbc, 0x17, 0x61, + 0x5e, 0xd3, 0xe8, 0x98, 0x75, 0x4d, 0x61, 0x87, 0x31, 0xb7, 0x28, 0x44, 0x8c, 0xa5, 0x69, 0xab, + 0x54, 0x81, 0xf9, 0xb8, 0x2b, 0x5e, 0x86, 0x13, 0x81, 0xb1, 0xc2, 0xc0, 0xb9, 0x81, 0x51, 0xf6, + 0x43, 0x2f, 0xc2, 0xbc, 0x7d, 0x38, 0x08, 0x14, 0x23, 0x2d, 0xda, 0x87, 0xfd, 0xb0, 0x97, 0x60, + 0xc1, 0xde, 0xb7, 0x07, 0x71, 0x4f, 0x85, 0x71, 0xa2, 0xbd, 0x6f, 0xf7, 0x03, 0x1f, 0x23, 0x27, + 0x73, 0x07, 0x69, 0xaa, 0x87, 0xda, 0xc5, 0x53, 0x61, 0xf5, 0x50, 0x85, 0xb8, 0x02, 0x82, 0xa6, + 0x29, 0xc8, 0x54, 0x77, 0x0d, 0xa4, 0xa8, 0x0e, 0x32, 0x55, 0xb7, 0xb8, 0x44, 0x94, 0x93, 0x9e, + 0xd3, 0x43, 0x72, 0x5e, 0xd3, 0x1a, 0xa4, 0xb2, 0x42, 0xea, 0xc4, 0xa7, 0x60, 0xce, 0xda, 0x7d, + 0x53, 0xa3, 0x1e, 0xa9, 0xd8, 0x0e, 0xda, 0xd3, 0x6f, 0x17, 0x1f, 0x25, 0xe6, 0x2d, 0xe0, 0x0a, + 0xe2, 0x8f, 0x5b, 0x44, 0x2c, 0x3e, 0x09, 0x82, 0xe6, 0xee, 0xab, 0x8e, 0x4d, 0x42, 0xb2, 0x6b, + 0xab, 0x1a, 0x2a, 0x3e, 0x46, 0x55, 0xa9, 0x7c, 0x83, 0x8b, 0xf1, 0x8a, 0x70, 0x6f, 0xe9, 0x7b, + 0x1e, 0x67, 0x7c, 0x82, 0xae, 0x08, 0x22, 0x63, 0x6c, 0xe7, 0x40, 0xc0, 0x96, 0x88, 0x34, 0x7c, + 0x8e, 0xa8, 0xe5, 0xed, 0x7d, 0x3b, 0xdc, 0xee, 0x23, 0x30, 0x8b, 0x35, 0x83, 0x46, 0x9f, 0xa4, + 0x89, 0x9b, 0xbd, 0x1f, 0x6a, 0xf1, 0x45, 0x38, 0x89, 0x95, 0xba, 0xc8, 0x53, 0xdb, 0xaa, 0xa7, + 0x86, 0xb4, 0x9f, 0x21, 0xda, 0xd8, 0xec, 0xeb, 0xac, 0x32, 0xd2, 0x4f, 0xa7, 0xb7, 0x7b, 0xe8, + 0x3b, 0xd6, 0xb3, 0xb4, 0x9f, 0x58, 0xc6, 0x5d, 0xeb, 0x7d, 0x4b, 0xce, 0xa5, 0x32, 0xe4, 0xc2, + 0x7e, 0x2f, 0x66, 0x81, 0x7a, 0xbe, 0x10, 0xc3, 0x49, 0x50, 0x6d, 0xb3, 0x8e, 0xd3, 0x97, 0x37, + 0x1a, 0x42, 0x1c, 0xa7, 0x51, 0x6b, 0xcd, 0xed, 0x86, 0x22, 0xef, 0x6c, 0x6c, 0x37, 0xd7, 0x1b, + 0x42, 0x22, 0x94, 0xd8, 0x5f, 0x4f, 0x66, 0x1e, 0x17, 0x9e, 0xc0, 0x59, 0x43, 0x3e, 0x7a, 0x52, + 0x13, 0xff, 0x14, 0x9c, 0xe2, 0xd7, 0x2a, 0x2e, 0xf2, 0x94, 0x5b, 0xba, 0x43, 0x16, 0x64, 0x57, + 0xa5, 0x9b, 0xa3, 0xef, 0x3f, 0x0b, 0x4c, 0xab, 0x85, 0xbc, 0xd7, 0x74, 0x07, 0x2f, 0xb7, 0xae, + 0xea, 0x89, 0x6b, 0xb0, 0x64, 0x5a, 0x8a, 0xeb, 0xa9, 0x66, 0x5b, 0x75, 0xda, 0x4a, 0x70, 0xa1, + 0xa5, 0xa8, 0x9a, 0x86, 0x5c, 0xd7, 0xa2, 0x1b, 0xa1, 0xcf, 0xf2, 0x90, 0x69, 0xb5, 0x98, 0x72, + 0xb0, 0x43, 0x54, 0x98, 0x6a, 0x9f, 0xfb, 0x26, 0x46, 0xb9, 0xef, 0x19, 0xc8, 0x76, 0x55, 0x5b, + 0x41, 0xa6, 0xe7, 0x1c, 0x92, 0xfc, 0x3c, 0x23, 0x67, 0xba, 0xaa, 0xdd, 0xc0, 0xe5, 0x0f, 0xe4, + 0x98, 0x74, 0x3d, 0x99, 0x49, 0x0a, 0xd3, 0xd7, 0x93, 0x99, 0x69, 0x21, 0x75, 0x3d, 0x99, 0x49, + 0x09, 0xe9, 0xeb, 0xc9, 0x4c, 0x46, 0xc8, 0x5e, 0x4f, 0x66, 0xb2, 0x02, 0x48, 0x3f, 0x93, 0x84, + 0x5c, 0x38, 0x83, 0xc7, 0x07, 0x22, 0x8d, 0xec, 0x61, 0x31, 0x12, 0xe5, 0x1e, 0x39, 0x32, 0xdf, + 0x5f, 0xa9, 0xe1, 0xcd, 0xad, 0x9c, 0xa2, 0xe9, 0xb2, 0x4c, 0x91, 0x38, 0xb1, 0xc0, 0xee, 0x87, + 0x68, 0x7a, 0x92, 0x91, 0x59, 0x49, 0x5c, 0x85, 0xd4, 0x9b, 0x2e, 0xe1, 0x4e, 0x11, 0xee, 0x47, + 0x8f, 0xe6, 0xbe, 0xde, 0x22, 0xe4, 0xd9, 0xeb, 0x2d, 0x65, 0x63, 0x53, 0x5e, 0xaf, 0xac, 0xc9, + 0x0c, 0x2e, 0x9e, 0x86, 0xa4, 0xa1, 0xbe, 0x75, 0x18, 0xdd, 0x06, 0x89, 0x48, 0x5c, 0x81, 0x42, + 0xcf, 0xbc, 0x89, 0x1c, 0x7d, 0x4f, 0x47, 0x6d, 0x85, 0x68, 0x15, 0xc2, 0x5a, 0xf9, 0xa0, 0x76, + 0x0d, 0xeb, 0x4f, 0x38, 0x8d, 0xa7, 0x21, 0x79, 0x0b, 0xa9, 0x07, 0xd1, 0xcd, 0x8a, 0x88, 0xde, + 0xc7, 0xe5, 0x74, 0x1e, 0xa6, 0x89, 0x7d, 0x45, 0x00, 0x66, 0x61, 0x61, 0x4a, 0xcc, 0x40, 0xb2, + 0xb6, 0x29, 0xe3, 0x25, 0x25, 0x40, 0x8e, 0x4a, 0x95, 0xad, 0x66, 0xa3, 0xd6, 0x10, 0xe2, 0xd2, + 0x45, 0x48, 0x51, 0xa3, 0xe1, 0xe5, 0xe6, 0x9b, 0x4d, 0x98, 0x62, 0x45, 0xc6, 0x11, 0xe3, 0xb5, + 0x3b, 0xeb, 0xd5, 0x86, 0x2c, 0xc4, 0x07, 0x9c, 0x45, 0x72, 0x21, 0x17, 0xce, 0xe4, 0x3f, 0x98, + 0xe3, 0xfc, 0xd7, 0x63, 0x30, 0x13, 0xca, 0xcc, 0x71, 0x4a, 0xa5, 0x1a, 0x86, 0x75, 0x4b, 0x51, + 0x0d, 0x5d, 0x75, 0x99, 0x2b, 0x01, 0x11, 0x55, 0xb0, 0x64, 0xd2, 0xa9, 0xfb, 0x80, 0x16, 0xd9, + 0xb4, 0x90, 0x92, 0x3e, 0x1f, 0x03, 0xa1, 0x3f, 0x35, 0xee, 0xeb, 0x66, 0xec, 0x8f, 0xb3, 0x9b, + 0xd2, 0xe7, 0x62, 0x90, 0x8f, 0xe6, 0xc3, 0x7d, 0xdd, 0x7b, 0xf8, 0x8f, 0xb5, 0x7b, 0xbf, 0x1d, + 0x87, 0xd9, 0x48, 0x16, 0x3c, 0x69, 0xef, 0x3e, 0x0a, 0x73, 0x7a, 0x1b, 0x75, 0x6d, 0xcb, 0x43, + 0xa6, 0x76, 0xa8, 0x18, 0xe8, 0x26, 0x32, 0x8a, 0x12, 0x09, 0x32, 0xe7, 0x8f, 0xce, 0xb3, 0x57, + 0x9a, 0x01, 0x6e, 0x0d, 0xc3, 0xca, 0xf3, 0xcd, 0x7a, 0x63, 0x7d, 0x6b, 0x73, 0xbb, 0xb1, 0x51, + 0xfb, 0x88, 0xb2, 0xb3, 0xf1, 0xea, 0xc6, 0xe6, 0x6b, 0x1b, 0xb2, 0xa0, 0xf7, 0xa9, 0xbd, 0x8f, + 0xcb, 0x7e, 0x0b, 0x84, 0xfe, 0x4e, 0x89, 0xa7, 0x60, 0x58, 0xb7, 0x84, 0x29, 0x71, 0x1e, 0x0a, + 0x1b, 0x9b, 0x4a, 0xab, 0x59, 0x6f, 0x28, 0x8d, 0xab, 0x57, 0x1b, 0xb5, 0xed, 0x16, 0xbd, 0x39, + 0xf1, 0xb5, 0xb7, 0x23, 0x0b, 0x5c, 0xfa, 0x6c, 0x02, 0xe6, 0x87, 0xf4, 0x44, 0xac, 0xb0, 0x33, + 0x0f, 0x3d, 0x86, 0x3d, 0x3b, 0x49, 0xef, 0x57, 0x70, 0xd6, 0xb1, 0xa5, 0x3a, 0x1e, 0x3b, 0x22, + 0x3d, 0x09, 0xd8, 0x4a, 0xa6, 0x87, 0x83, 0xab, 0xc3, 0x6e, 0xa4, 0xe8, 0x41, 0xa8, 0x10, 0xc8, + 0xe9, 0xa5, 0xd4, 0x33, 0x20, 0xda, 0x96, 0xab, 0x7b, 0xfa, 0x4d, 0xa4, 0xe8, 0x26, 0xbf, 0xbe, + 0xc2, 0x07, 0xa3, 0xa4, 0x2c, 0xf0, 0x9a, 0xa6, 0xe9, 0xf9, 0xda, 0x26, 0xea, 0xa8, 0x7d, 0xda, + 0x38, 0xf8, 0x27, 0x64, 0x81, 0xd7, 0xf8, 0xda, 0x0f, 0x43, 0xae, 0x6d, 0xf5, 0x70, 0xb6, 0x48, + 0xf5, 0xf0, 0x5e, 0x13, 0x93, 0x67, 0xa8, 0xcc, 0x57, 0x61, 0xe7, 0x80, 0xe0, 0xde, 0x2c, 0x27, + 0xcf, 0x50, 0x19, 0x55, 0x79, 0x02, 0x0a, 0x6a, 0xa7, 0xe3, 0x60, 0x72, 0x4e, 0x44, 0x4f, 0x36, + 0x79, 0x5f, 0x4c, 0x14, 0x4b, 0xd7, 0x21, 0xc3, 0xed, 0x80, 0x37, 0x7b, 0x6c, 0x09, 0xc5, 0xa6, + 0xc7, 0xf5, 0xf8, 0xb9, 0xac, 0x9c, 0x31, 0x79, 0xe5, 0xc3, 0x90, 0xd3, 0x5d, 0x25, 0x78, 0x0c, + 0x10, 0x5f, 0x8e, 0x9f, 0xcb, 0xc8, 0x33, 0xba, 0xeb, 0x5f, 0xa1, 0x4a, 0x5f, 0x8a, 0x43, 0x3e, + 0xfa, 0x18, 0x43, 0xac, 0x43, 0xc6, 0xb0, 0x34, 0x95, 0xb8, 0x16, 0x7d, 0x86, 0x76, 0x6e, 0xcc, + 0x93, 0x8f, 0x95, 0x35, 0xa6, 0x2f, 0xfb, 0xc8, 0xd2, 0xbf, 0x8e, 0x41, 0x86, 0x8b, 0xc5, 0x93, + 0x90, 0xb4, 0x55, 0x6f, 0x9f, 0xd0, 0x4d, 0x57, 0xe3, 0x42, 0x4c, 0x26, 0x65, 0x2c, 0x77, 0x6d, + 0xd5, 0x24, 0x2e, 0xc0, 0xe4, 0xb8, 0x8c, 0xe7, 0xd5, 0x40, 0x6a, 0x9b, 0x1c, 0x9b, 0xac, 0x6e, + 0x17, 0x99, 0x9e, 0xcb, 0xe7, 0x95, 0xc9, 0x6b, 0x4c, 0x2c, 0x3e, 0x0d, 0x73, 0x9e, 0xa3, 0xea, + 0x46, 0x44, 0x37, 0x49, 0x74, 0x05, 0x5e, 0xe1, 0x2b, 0x97, 0xe1, 0x34, 0xe7, 0x6d, 0x23, 0x4f, + 0xd5, 0xf6, 0x51, 0x3b, 0x00, 0xa5, 0xc8, 0xf5, 0xc8, 0x29, 0xa6, 0x50, 0x67, 0xf5, 0x1c, 0x2b, + 0x7d, 0x2b, 0x06, 0x73, 0xfc, 0xa0, 0xd7, 0xf6, 0x8d, 0xb5, 0x0e, 0xa0, 0x9a, 0xa6, 0xe5, 0x85, + 0xcd, 0x35, 0xe8, 0xca, 0x03, 0xb8, 0x95, 0x8a, 0x0f, 0x92, 0x43, 0x04, 0xa5, 0x2e, 0x40, 0x50, + 0x33, 0xd2, 0x6c, 0x4b, 0x30, 0xc3, 0x9e, 0x51, 0x91, 0x07, 0x9d, 0xf4, 0x6a, 0x00, 0xa8, 0x08, + 0x9f, 0x08, 0xc5, 0x05, 0x98, 0xde, 0x45, 0x1d, 0xdd, 0x64, 0x37, 0xcf, 0xb4, 0xc0, 0x2f, 0x70, + 0x92, 0xfe, 0x05, 0x4e, 0xf5, 0xcf, 0xc1, 0xbc, 0x66, 0x75, 0xfb, 0xbb, 0x5b, 0x15, 0xfa, 0xae, + 0x27, 0xdc, 0x6b, 0xb1, 0x37, 0x9e, 0x65, 0x4a, 0x1d, 0xcb, 0x50, 0xcd, 0xce, 0x8a, 0xe5, 0x74, + 0x82, 0x07, 0xb5, 0x38, 0x43, 0x72, 0x43, 0x8f, 0x6b, 0xed, 0xdd, 0x3f, 0x8c, 0xc5, 0x7e, 0x31, + 0x9e, 0x58, 0xdd, 0xaa, 0x7e, 0x39, 0x5e, 0x5a, 0xa5, 0xc0, 0x2d, 0x6e, 0x0c, 0x19, 0xed, 0x19, + 0x48, 0xc3, 0x03, 0x84, 0xdf, 0x7d, 0x1a, 0x16, 0x3a, 0x56, 0xc7, 0x22, 0x4c, 0xe7, 0xf1, 0x7f, + 0xec, 0x49, 0x6f, 0xd6, 0x97, 0x96, 0xc6, 0x3e, 0x16, 0x2e, 0x6f, 0xc0, 0x3c, 0x53, 0x56, 0xc8, + 0xa3, 0x26, 0x7a, 0x10, 0x12, 0x8f, 0xbc, 0x85, 0x2b, 0xfe, 0xca, 0x77, 0xc8, 0xf6, 0x2d, 0xcf, + 0x31, 0x28, 0xae, 0xa3, 0x67, 0xa5, 0xb2, 0x0c, 0x27, 0x22, 0x7c, 0x74, 0x91, 0x22, 0x67, 0x0c, + 0xe3, 0x3f, 0x67, 0x8c, 0xf3, 0x21, 0xc6, 0x16, 0x83, 0x96, 0x6b, 0x30, 0x7b, 0x1c, 0xae, 0x7f, + 0xc1, 0xb8, 0x72, 0x28, 0x4c, 0xb2, 0x0a, 0x05, 0x42, 0xa2, 0xf5, 0x5c, 0xcf, 0xea, 0x92, 0x08, + 0x78, 0x34, 0xcd, 0xbf, 0xfc, 0x0e, 0x5d, 0x35, 0x79, 0x0c, 0xab, 0xf9, 0xa8, 0x72, 0x19, 0xc8, + 0xd3, 0xb5, 0x36, 0xd2, 0x8c, 0x31, 0x0c, 0xdf, 0x60, 0x1d, 0xf1, 0xf5, 0xcb, 0x37, 0x60, 0x01, + 0xff, 0x4f, 0x02, 0x54, 0xb8, 0x27, 0xe3, 0xaf, 0xec, 0x8a, 0xdf, 0xfa, 0x38, 0x5d, 0x98, 0xf3, + 0x3e, 0x41, 0xa8, 0x4f, 0xa1, 0x59, 0xec, 0x20, 0xcf, 0x43, 0x8e, 0xab, 0xa8, 0xc6, 0xb0, 0xee, + 0x85, 0xee, 0x3c, 0x8a, 0x3f, 0xff, 0xbd, 0xe8, 0x2c, 0xae, 0x52, 0x64, 0xc5, 0x30, 0xca, 0x3b, + 0x70, 0x6a, 0x88, 0x57, 0x4c, 0xc0, 0xf9, 0x59, 0xc6, 0xb9, 0x30, 0xe0, 0x19, 0x98, 0x76, 0x0b, + 0xb8, 0xdc, 0x9f, 0xcb, 0x09, 0x38, 0x7f, 0x81, 0x71, 0x8a, 0x0c, 0xcb, 0xa7, 0x14, 0x33, 0x5e, + 0x87, 0xb9, 0x9b, 0xc8, 0xd9, 0xb5, 0x5c, 0x76, 0xcf, 0x34, 0x01, 0xdd, 0xe7, 0x18, 0x5d, 0x81, + 0x01, 0xc9, 0xc5, 0x13, 0xe6, 0xba, 0x0c, 0x99, 0x3d, 0x55, 0x43, 0x13, 0x50, 0xdc, 0x65, 0x14, + 0x69, 0xac, 0x8f, 0xa1, 0x15, 0xc8, 0x75, 0x2c, 0xb6, 0x47, 0x8d, 0x87, 0x7f, 0x9e, 0xc1, 0x67, + 0x38, 0x86, 0x51, 0xd8, 0x96, 0xdd, 0x33, 0xf0, 0x06, 0x36, 0x9e, 0xe2, 0xaf, 0x70, 0x0a, 0x8e, + 0x61, 0x14, 0xc7, 0x30, 0xeb, 0x3b, 0x9c, 0xc2, 0x0d, 0xd9, 0xf3, 0x15, 0x98, 0xb1, 0x4c, 0xe3, + 0xd0, 0x32, 0x27, 0xe9, 0xc4, 0x17, 0x18, 0x03, 0x30, 0x08, 0x26, 0xb8, 0x02, 0xd9, 0x49, 0x27, + 0xe2, 0xaf, 0x7d, 0x8f, 0x2f, 0x0f, 0x3e, 0x03, 0xab, 0x50, 0xe0, 0x01, 0x4a, 0xb7, 0xcc, 0x09, + 0x28, 0xfe, 0x3a, 0xa3, 0xc8, 0x87, 0x60, 0x6c, 0x18, 0x1e, 0x72, 0xbd, 0x0e, 0x9a, 0x84, 0xe4, + 0x4b, 0x7c, 0x18, 0x0c, 0xc2, 0x4c, 0xb9, 0x8b, 0x4c, 0x6d, 0x7f, 0x32, 0x86, 0x5f, 0xe2, 0xa6, + 0xe4, 0x18, 0x4c, 0x51, 0x83, 0xd9, 0xae, 0xea, 0xb8, 0xfb, 0xaa, 0x31, 0xd1, 0x74, 0xfc, 0x0d, + 0xc6, 0x91, 0xf3, 0x41, 0xcc, 0x22, 0x3d, 0xf3, 0x38, 0x34, 0x5f, 0xe6, 0x16, 0x09, 0xc1, 0xd8, + 0xd2, 0x73, 0x3d, 0x72, 0x29, 0x77, 0x1c, 0xb6, 0xbf, 0xc9, 0x97, 0x1e, 0xc5, 0xae, 0x87, 0x19, + 0xaf, 0x40, 0xd6, 0xd5, 0xdf, 0x9a, 0x88, 0xe6, 0x2b, 0x7c, 0xa6, 0x09, 0x00, 0x83, 0x3f, 0x02, + 0xa7, 0x87, 0x6e, 0x13, 0x13, 0x90, 0xfd, 0x2d, 0x46, 0x76, 0x72, 0xc8, 0x56, 0xc1, 0x42, 0xc2, + 0x71, 0x29, 0xff, 0x36, 0x0f, 0x09, 0xa8, 0x8f, 0x6b, 0x0b, 0x9f, 0x1a, 0x5c, 0x75, 0xef, 0x78, + 0x56, 0xfb, 0x65, 0x6e, 0x35, 0x8a, 0x8d, 0x58, 0x6d, 0x1b, 0x4e, 0x32, 0xc6, 0xe3, 0xcd, 0xeb, + 0xdf, 0xe1, 0x81, 0x95, 0xa2, 0x77, 0xa2, 0xb3, 0xfb, 0x23, 0x50, 0xf2, 0xcd, 0xc9, 0xd3, 0x53, + 0x57, 0xe9, 0xaa, 0xf6, 0x04, 0xcc, 0xbf, 0xc2, 0x98, 0x79, 0xc4, 0xf7, 0xf3, 0x5b, 0x77, 0x5d, + 0xb5, 0x31, 0xf9, 0xeb, 0x50, 0xe4, 0xe4, 0x3d, 0xd3, 0x41, 0x9a, 0xd5, 0x31, 0xf5, 0xb7, 0x50, + 0x7b, 0x02, 0xea, 0x5f, 0xed, 0x9b, 0xaa, 0x9d, 0x10, 0x1c, 0x33, 0x37, 0x41, 0xf0, 0x73, 0x15, + 0x45, 0xef, 0xda, 0x96, 0xe3, 0x8d, 0x61, 0xfc, 0x2a, 0x9f, 0x29, 0x1f, 0xd7, 0x24, 0xb0, 0x72, + 0x03, 0xe8, 0x93, 0xea, 0x49, 0x5d, 0xf2, 0xd7, 0x18, 0xd1, 0x6c, 0x80, 0x62, 0x81, 0x43, 0xb3, + 0xba, 0xb6, 0xea, 0x4c, 0x12, 0xff, 0xfe, 0x2e, 0x0f, 0x1c, 0x0c, 0xc2, 0x02, 0x07, 0xce, 0xe8, + 0xf0, 0x6e, 0x3f, 0x01, 0xc3, 0xd7, 0x78, 0xe0, 0xe0, 0x18, 0x46, 0xc1, 0x13, 0x86, 0x09, 0x28, + 0xfe, 0x1e, 0xa7, 0xe0, 0x18, 0x4c, 0xf1, 0xe1, 0x60, 0xa3, 0x75, 0x50, 0x47, 0x77, 0x3d, 0x87, + 0x26, 0xc5, 0x47, 0x53, 0xfd, 0xfd, 0xef, 0x45, 0x93, 0x30, 0x39, 0x04, 0xc5, 0x91, 0x88, 0x5d, + 0xd3, 0x92, 0x33, 0xd3, 0xf8, 0x8e, 0xfd, 0x3a, 0x8f, 0x44, 0x21, 0x18, 0xee, 0x5b, 0x28, 0x43, + 0xc4, 0x66, 0xd7, 0xf0, 0x49, 0x61, 0x02, 0xba, 0x7f, 0xd0, 0xd7, 0xb9, 0x16, 0xc7, 0x62, 0xce, + 0x50, 0xfe, 0xd3, 0x33, 0x0f, 0xd0, 0xe1, 0x44, 0xde, 0xf9, 0x0f, 0xfb, 0xf2, 0x9f, 0x1d, 0x8a, + 0xa4, 0x31, 0xa4, 0xd0, 0x97, 0x4f, 0x89, 0xe3, 0xde, 0x4b, 0x2a, 0xfe, 0xd8, 0x7b, 0x6c, 0xbc, + 0xd1, 0x74, 0xaa, 0xbc, 0x86, 0x9d, 0x3c, 0x9a, 0xf4, 0x8c, 0x27, 0xfb, 0xf8, 0x7b, 0xbe, 0x9f, + 0x47, 0x72, 0x9e, 0xf2, 0x55, 0x98, 0x8d, 0x24, 0x3c, 0xe3, 0xa9, 0x7e, 0x9c, 0x51, 0xe5, 0xc2, + 0xf9, 0x4e, 0xf9, 0x22, 0x24, 0x71, 0xf2, 0x32, 0x1e, 0xfe, 0xe7, 0x19, 0x9c, 0xa8, 0x97, 0x3f, + 0x04, 0x19, 0x9e, 0xb4, 0x8c, 0x87, 0xfe, 0x05, 0x06, 0xf5, 0x21, 0x18, 0xce, 0x13, 0x96, 0xf1, + 0xf0, 0xbf, 0xc8, 0xe1, 0x1c, 0x82, 0xe1, 0x93, 0x9b, 0xf0, 0xeb, 0x3f, 0x91, 0x64, 0x9b, 0x0e, + 0xb7, 0xdd, 0x15, 0x48, 0xb3, 0x4c, 0x65, 0x3c, 0xfa, 0x93, 0xac, 0x71, 0x8e, 0x28, 0xbf, 0x04, + 0xd3, 0x13, 0x1a, 0xfc, 0x27, 0x19, 0x94, 0xea, 0x97, 0x6b, 0x30, 0x13, 0xca, 0x4e, 0xc6, 0xc3, + 0x7f, 0x8a, 0xc1, 0xc3, 0x28, 0xdc, 0x75, 0x96, 0x9d, 0x8c, 0x27, 0xf8, 0x69, 0xde, 0x75, 0x86, + 0xc0, 0x66, 0xe3, 0x89, 0xc9, 0x78, 0xf4, 0xa7, 0xb8, 0xd5, 0x39, 0xa4, 0xfc, 0x0a, 0x64, 0xfd, + 0xcd, 0x66, 0x3c, 0xfe, 0xd3, 0x0c, 0x1f, 0x60, 0xb0, 0x05, 0x42, 0x9b, 0xdd, 0x78, 0x8a, 0x9f, + 0xe1, 0x16, 0x08, 0xa1, 0xf0, 0x32, 0xea, 0x4f, 0x60, 0xc6, 0x33, 0xfd, 0x2c, 0x5f, 0x46, 0x7d, + 0xf9, 0x0b, 0x9e, 0x4d, 0x12, 0xf3, 0xc7, 0x53, 0xfc, 0x25, 0x3e, 0x9b, 0x44, 0x1f, 0x77, 0xa3, + 0x3f, 0x23, 0x18, 0xcf, 0xf1, 0x73, 0xbc, 0x1b, 0x7d, 0x09, 0x41, 0x79, 0x0b, 0xc4, 0xc1, 0x6c, + 0x60, 0x3c, 0xdf, 0x67, 0x18, 0xdf, 0xdc, 0x40, 0x32, 0x50, 0x7e, 0x0d, 0x4e, 0x0e, 0xcf, 0x04, + 0xc6, 0xb3, 0xfe, 0xfc, 0x7b, 0x7d, 0x67, 0xb7, 0x70, 0x22, 0x50, 0xde, 0x0e, 0xb6, 0x94, 0x70, + 0x16, 0x30, 0x9e, 0xf6, 0xb3, 0xef, 0x45, 0x03, 0x77, 0x38, 0x09, 0x28, 0x57, 0x00, 0x82, 0x0d, + 0x78, 0x3c, 0xd7, 0xe7, 0x18, 0x57, 0x08, 0x84, 0x97, 0x06, 0xdb, 0x7f, 0xc7, 0xe3, 0xef, 0xf2, + 0xa5, 0xc1, 0x10, 0x78, 0x69, 0xf0, 0xad, 0x77, 0x3c, 0xfa, 0xf3, 0x7c, 0x69, 0x70, 0x08, 0xf6, + 0xec, 0xd0, 0xee, 0x36, 0x9e, 0xe1, 0x0b, 0xdc, 0xb3, 0x43, 0xa8, 0xf2, 0x06, 0xcc, 0x0d, 0x6c, + 0x88, 0xe3, 0xa9, 0x7e, 0x91, 0x51, 0x09, 0xfd, 0xfb, 0x61, 0x78, 0xf3, 0x62, 0x9b, 0xe1, 0x78, + 0xb6, 0x2f, 0xf6, 0x6d, 0x5e, 0x6c, 0x2f, 0x2c, 0x5f, 0x81, 0x8c, 0xd9, 0x33, 0x0c, 0xbc, 0x78, + 0xc4, 0xa3, 0xdf, 0x25, 0x2c, 0xfe, 0xd7, 0xef, 0x33, 0xeb, 0x70, 0x40, 0xf9, 0x22, 0x4c, 0xa3, + 0xee, 0x2e, 0x6a, 0x8f, 0x43, 0xfe, 0xce, 0xf7, 0x79, 0xc0, 0xc4, 0xda, 0xe5, 0x57, 0x00, 0xe8, + 0xd5, 0x08, 0x79, 0x78, 0x38, 0x06, 0xfb, 0xdf, 0xbe, 0xcf, 0x5e, 0xde, 0x09, 0x20, 0x01, 0x01, + 0x7d, 0x15, 0xe8, 0x68, 0x82, 0xef, 0x45, 0x09, 0xc8, 0x8c, 0x5c, 0x86, 0xf4, 0x9b, 0xae, 0x65, + 0x7a, 0x6a, 0x67, 0x1c, 0xfa, 0x77, 0x19, 0x9a, 0xeb, 0x63, 0x83, 0x75, 0x2d, 0x07, 0x79, 0x6a, + 0xc7, 0x1d, 0x87, 0xfd, 0xef, 0x0c, 0xeb, 0x03, 0x30, 0x58, 0x53, 0x5d, 0x6f, 0x92, 0x71, 0xff, + 0x1e, 0x07, 0x73, 0x00, 0xee, 0x34, 0xfe, 0xff, 0x00, 0x1d, 0x8e, 0xc3, 0xfe, 0x3e, 0xef, 0x34, + 0xd3, 0x2f, 0x7f, 0x08, 0xb2, 0xf8, 0x5f, 0xfa, 0x46, 0xde, 0x18, 0xf0, 0xff, 0x60, 0xe0, 0x00, + 0x81, 0x5b, 0x76, 0xbd, 0xb6, 0xa7, 0x8f, 0x37, 0xf6, 0x7d, 0x36, 0xd3, 0x5c, 0xbf, 0x5c, 0x81, + 0x19, 0xd7, 0x6b, 0xb7, 0x7b, 0x2c, 0x3f, 0x1d, 0x03, 0xff, 0x83, 0xef, 0xfb, 0x57, 0x16, 0x3e, + 0x06, 0xcf, 0xf6, 0xad, 0x03, 0xcf, 0xb6, 0xc8, 0x03, 0x8f, 0x71, 0x0c, 0xef, 0x31, 0x86, 0x10, + 0xa4, 0x5c, 0x83, 0x1c, 0x1e, 0x8b, 0x83, 0x6c, 0x44, 0x9e, 0x4e, 0x8d, 0xa1, 0xf8, 0x9f, 0xcc, + 0x00, 0x11, 0x50, 0xf5, 0xcf, 0x7e, 0xe3, 0xdd, 0xc5, 0xd8, 0x37, 0xdf, 0x5d, 0x8c, 0xfd, 0xf6, + 0xbb, 0x8b, 0xb1, 0x4f, 0x7d, 0x7b, 0x71, 0xea, 0x9b, 0xdf, 0x5e, 0x9c, 0xfa, 0xad, 0x6f, 0x2f, + 0x4e, 0x0d, 0xbf, 0x25, 0x86, 0x55, 0x6b, 0xd5, 0xa2, 0xf7, 0xc3, 0x6f, 0x3c, 0xd6, 0xd1, 0xbd, + 0xfd, 0xde, 0xee, 0x8a, 0x66, 0x75, 0xcf, 0x6b, 0x96, 0xdb, 0xb5, 0xdc, 0xf3, 0xd1, 0x7b, 0x5d, + 0xf2, 0x1f, 0xfc, 0x51, 0x0c, 0x9f, 0x99, 0xa3, 0xd7, 0xb9, 0xaa, 0x79, 0x38, 0xea, 0xf3, 0x9e, + 0x4b, 0x90, 0xa8, 0x98, 0x87, 0xe2, 0x69, 0x1a, 0xe0, 0x94, 0x9e, 0x63, 0xb0, 0xd7, 0xc2, 0xd2, + 0xb8, 0xbc, 0xe3, 0x18, 0xe2, 0x42, 0xf0, 0xee, 0x66, 0xec, 0x5c, 0x8e, 0xbd, 0x90, 0x59, 0xfd, + 0xa9, 0xd8, 0xf1, 0x46, 0x92, 0xa9, 0x98, 0x87, 0x64, 0x20, 0x5b, 0xb1, 0x37, 0x9e, 0x19, 0x7b, + 0xcf, 0x7d, 0x60, 0x5a, 0xb7, 0x4c, 0xdc, 0x6d, 0x7b, 0x97, 0xdf, 0x71, 0x2f, 0xf6, 0xdf, 0x71, + 0xbf, 0x86, 0x0c, 0xe3, 0x55, 0xac, 0xb7, 0x8d, 0x21, 0xbb, 0x29, 0xfa, 0x06, 0x32, 0xfc, 0x6c, + 0x1c, 0x16, 0x07, 0xae, 0xb3, 0x99, 0x13, 0x8c, 0x32, 0x42, 0x19, 0x32, 0x75, 0xee, 0x5b, 0x45, + 0x48, 0xbb, 0x48, 0xb3, 0xcc, 0xb6, 0x4b, 0x0c, 0x91, 0x90, 0x79, 0x11, 0x1b, 0xc2, 0x54, 0x4d, + 0xcb, 0x65, 0x2f, 0x56, 0xd2, 0x42, 0xf5, 0x17, 0x8e, 0x69, 0x88, 0x59, 0xde, 0x12, 0xb7, 0xc6, + 0xf3, 0x13, 0x5a, 0x83, 0x0f, 0x22, 0x72, 0xf3, 0x3f, 0xa9, 0x55, 0x7e, 0x2e, 0x0e, 0x4b, 0xfd, + 0x56, 0xc1, 0x2b, 0xcb, 0xf5, 0xd4, 0xae, 0x3d, 0xca, 0x2c, 0x57, 0x20, 0xbb, 0xcd, 0x75, 0x8e, + 0x6d, 0x97, 0xbb, 0xc7, 0xb4, 0x4b, 0xde, 0x6f, 0x8a, 0x1b, 0xe6, 0xc2, 0x84, 0x86, 0xf1, 0xc7, + 0xf1, 0x40, 0x96, 0xf9, 0x5f, 0x29, 0x38, 0x4d, 0x97, 0x93, 0x42, 0x97, 0x12, 0x2d, 0x30, 0x9b, + 0xe4, 0xc2, 0x55, 0xe3, 0x9f, 0x93, 0x48, 0xaf, 0xc2, 0x7c, 0x13, 0x47, 0x0b, 0x7c, 0x0a, 0x0a, + 0x9e, 0xf0, 0x0c, 0x7d, 0xf7, 0x74, 0x39, 0x92, 0xf0, 0xb3, 0x27, 0x4c, 0x61, 0x91, 0xf4, 0x63, + 0x31, 0x10, 0x5a, 0x9a, 0x6a, 0xa8, 0xce, 0xff, 0x2d, 0x95, 0xf8, 0x12, 0x00, 0xf9, 0x66, 0x29, + 0xf8, 0xc8, 0x28, 0x7f, 0xa1, 0xb8, 0x12, 0x1e, 0xdc, 0x0a, 0x6d, 0x89, 0x7c, 0xc1, 0x90, 0x25, + 0xba, 0xf8, 0xdf, 0xa7, 0x5e, 0x07, 0x08, 0x2a, 0xc4, 0x33, 0x70, 0xaa, 0x55, 0xab, 0xac, 0x55, + 0x64, 0x85, 0xbe, 0x0c, 0xbf, 0xd1, 0xda, 0x6a, 0xd4, 0x9a, 0x57, 0x9b, 0x8d, 0xba, 0x30, 0x25, + 0x9e, 0x04, 0x31, 0x5c, 0xe9, 0xbf, 0x97, 0x72, 0x02, 0xe6, 0xc2, 0x72, 0xfa, 0x46, 0x7d, 0x1c, + 0x67, 0x8a, 0x7a, 0xd7, 0x36, 0x10, 0x79, 0xf4, 0xa7, 0xe8, 0xdc, 0x6a, 0xe3, 0x93, 0x90, 0xdf, + 0xf8, 0x37, 0xf4, 0x2d, 0xeb, 0xf9, 0x00, 0xee, 0xdb, 0xbc, 0xbc, 0x06, 0x73, 0xaa, 0xa6, 0x21, + 0x3b, 0x42, 0x39, 0x26, 0x54, 0x63, 0x42, 0xf2, 0x30, 0x93, 0x21, 0x03, 0xb6, 0x97, 0x20, 0xe5, + 0x92, 0xd1, 0x8f, 0xa3, 0xf8, 0x4d, 0x46, 0xc1, 0xd4, 0xcb, 0x26, 0xcc, 0xe1, 0xcc, 0x4f, 0x75, + 0x50, 0xa8, 0x1b, 0x47, 0xdf, 0x33, 0xfc, 0xa3, 0xaf, 0x3e, 0x47, 0x1e, 0x6d, 0x3e, 0x1c, 0x9d, + 0x96, 0x21, 0xee, 0x24, 0x0b, 0x8c, 0x3b, 0xe8, 0x28, 0x82, 0x3c, 0x6f, 0x8f, 0x75, 0xf8, 0xe8, + 0xc6, 0xfe, 0x31, 0x6b, 0x6c, 0x71, 0x98, 0x0f, 0x84, 0x5a, 0x9a, 0x65, 0xac, 0xb4, 0xa2, 0xda, + 0x18, 0xb5, 0xa6, 0xdf, 0x78, 0x7a, 0x70, 0x77, 0xa2, 0x7f, 0x9e, 0x25, 0xcc, 0x57, 0xc2, 0xcd, + 0xf8, 0x6b, 0xef, 0xc7, 0x13, 0xb0, 0xc8, 0x94, 0x77, 0x55, 0x17, 0x9d, 0xbf, 0xf9, 0xfc, 0x2e, + 0xf2, 0xd4, 0xe7, 0xcf, 0x6b, 0x96, 0xce, 0x63, 0xf5, 0x3c, 0x5b, 0x8e, 0xb8, 0x7e, 0x85, 0xd5, + 0x97, 0x86, 0x3e, 0xd0, 0x94, 0x56, 0x21, 0x59, 0xb3, 0x74, 0x13, 0xc7, 0xa3, 0x36, 0x32, 0xad, + 0x2e, 0x5b, 0x22, 0xb4, 0x20, 0x3e, 0x02, 0x29, 0xb5, 0x6b, 0xf5, 0x4c, 0x8f, 0x2e, 0x8f, 0xea, + 0xcc, 0x37, 0xee, 0x2d, 0x4d, 0xfd, 0xbb, 0x7b, 0x4b, 0x89, 0xa6, 0xe9, 0xc9, 0xac, 0xaa, 0x9c, + 0xfc, 0xee, 0x3b, 0x4b, 0x31, 0xe9, 0x3a, 0xa4, 0xeb, 0x48, 0x7b, 0x10, 0xae, 0x3a, 0xd2, 0xfa, + 0xb8, 0x9e, 0x84, 0x4c, 0xd3, 0xf4, 0xe8, 0x1b, 0xe8, 0x67, 0x21, 0xa1, 0x9b, 0xf4, 0xa5, 0xc6, + 0xbe, 0xf6, 0xb1, 0x1c, 0xab, 0xd6, 0x91, 0xe6, 0xab, 0xb6, 0x91, 0xd6, 0xaf, 0x8a, 0xe9, 0xb1, + 0xbc, 0x5a, 0xff, 0xad, 0xff, 0xb4, 0x38, 0xf5, 0xf6, 0xbb, 0x8b, 0x53, 0x23, 0xe7, 0x43, 0x1a, + 0x39, 0x1f, 0x6e, 0xfb, 0x80, 0x86, 0x4f, 0x7f, 0x1a, 0xbe, 0x9c, 0x84, 0xb3, 0xe4, 0xe3, 0x23, + 0xa7, 0xab, 0x9b, 0xde, 0x79, 0xcd, 0x39, 0xb4, 0x3d, 0x0b, 0x07, 0x39, 0x6b, 0x8f, 0xcd, 0xc2, + 0x5c, 0x50, 0xbd, 0x42, 0xab, 0x47, 0xcc, 0xc1, 0x1e, 0x4c, 0x6f, 0x61, 0x1c, 0x36, 0x9c, 0x67, + 0x79, 0xaa, 0xc1, 0x36, 0x0b, 0x5a, 0xc0, 0x52, 0xfa, 0xc1, 0x52, 0x9c, 0x4a, 0x75, 0xfe, 0xad, + 0x92, 0x81, 0xd4, 0x3d, 0xfa, 0xde, 0x77, 0x82, 0x64, 0x19, 0x19, 0x2c, 0x20, 0xaf, 0x78, 0x2f, + 0xc0, 0xb4, 0xda, 0xa3, 0x2f, 0x1c, 0x24, 0x70, 0xfa, 0x41, 0x0a, 0xd2, 0xab, 0x90, 0x66, 0x8f, + 0x3d, 0x45, 0x01, 0x12, 0x07, 0xe8, 0x90, 0xb4, 0x93, 0x93, 0xf1, 0xbf, 0xe2, 0x0a, 0x4c, 0x93, + 0xce, 0xb3, 0x0f, 0x5a, 0x8a, 0x2b, 0x03, 0xbd, 0x5f, 0x21, 0x9d, 0x94, 0xa9, 0x9a, 0x74, 0x1d, + 0x32, 0x75, 0xab, 0xab, 0x9b, 0x56, 0x94, 0x2d, 0x4b, 0xd9, 0x48, 0x9f, 0xed, 0x1e, 0x9b, 0x6b, + 0x99, 0x16, 0xc4, 0x93, 0x90, 0xa2, 0xdf, 0x01, 0xb0, 0x97, 0x26, 0x58, 0x49, 0xaa, 0x41, 0x9a, + 0x70, 0x6f, 0xda, 0x38, 0x52, 0xfb, 0xaf, 0x5c, 0x66, 0xd9, 0x57, 0x61, 0x8c, 0x3e, 0x1e, 0x74, + 0x56, 0x84, 0x64, 0x5b, 0xf5, 0x54, 0x36, 0x6e, 0xf2, 0xbf, 0xf4, 0x43, 0x90, 0x61, 0x24, 0xae, + 0x78, 0x01, 0x12, 0x96, 0xed, 0xb2, 0xd7, 0x1e, 0x4a, 0xa3, 0x86, 0xb2, 0x69, 0x57, 0x93, 0xd8, + 0x4b, 0x64, 0xac, 0x5c, 0x95, 0x47, 0xba, 0xc5, 0xcb, 0x21, 0xb7, 0x08, 0x4d, 0x79, 0xe8, 0x5f, + 0x3a, 0xa5, 0x03, 0xee, 0xe0, 0x3b, 0xcb, 0x17, 0xe2, 0xb0, 0x18, 0xaa, 0xbd, 0x89, 0x1c, 0x7c, + 0xf6, 0xa7, 0x1e, 0xc5, 0xbc, 0x45, 0x0c, 0x75, 0x92, 0xd5, 0x8f, 0x70, 0x97, 0x0f, 0x41, 0xa2, + 0x62, 0xdb, 0x62, 0x09, 0x32, 0xa4, 0xac, 0x59, 0xd4, 0x5f, 0x92, 0xb2, 0x5f, 0xc6, 0x75, 0xae, + 0xb5, 0xe7, 0xdd, 0x52, 0x1d, 0xff, 0x53, 0x39, 0x5e, 0x96, 0x2e, 0x43, 0xb6, 0x66, 0x99, 0x2e, + 0x32, 0xdd, 0x1e, 0x49, 0x43, 0x76, 0x0d, 0x4b, 0x3b, 0x60, 0x0c, 0xb4, 0x80, 0x0d, 0xae, 0xda, + 0x36, 0x41, 0x26, 0x65, 0xfc, 0x2f, 0x5d, 0x97, 0xd5, 0xd6, 0x48, 0x13, 0x5d, 0x3e, 0xbe, 0x89, + 0xd8, 0x20, 0x7d, 0x1b, 0xfd, 0x51, 0x0c, 0x1e, 0x1a, 0x5c, 0x50, 0x07, 0xe8, 0xd0, 0x3d, 0xee, + 0x7a, 0x7a, 0x1d, 0xb2, 0x5b, 0xe4, 0x7b, 0xf5, 0x57, 0xd1, 0xa1, 0x58, 0x82, 0x34, 0x6a, 0x5f, + 0xb8, 0x78, 0xf1, 0xf9, 0xcb, 0xd4, 0xdb, 0xaf, 0x4d, 0xc9, 0x5c, 0x20, 0x2e, 0x42, 0xd6, 0x45, + 0x9a, 0x7d, 0xe1, 0xe2, 0xa5, 0x83, 0xe7, 0xa9, 0x7b, 0x5d, 0x9b, 0x92, 0x03, 0x51, 0x39, 0x83, + 0x47, 0xfd, 0xdd, 0x2f, 0x2c, 0xc5, 0xaa, 0xd3, 0x90, 0x70, 0x7b, 0xdd, 0xf7, 0xd5, 0x47, 0x3e, + 0x3b, 0x0d, 0xcb, 0x61, 0x24, 0x49, 0xd6, 0x6e, 0xaa, 0x86, 0xde, 0x56, 0x83, 0x5f, 0x1a, 0x10, + 0x42, 0x36, 0x20, 0x1a, 0xc3, 0x4d, 0x50, 0x3a, 0xd2, 0x92, 0xd2, 0xaf, 0xc6, 0x20, 0x77, 0x83, + 0x33, 0xb7, 0x90, 0x27, 0x5e, 0x01, 0xf0, 0x5b, 0xe2, 0xcb, 0xe6, 0xcc, 0x4a, 0x7f, 0x5b, 0x2b, + 0x3e, 0x46, 0x0e, 0xa9, 0x8b, 0x2f, 0x11, 0x47, 0xb4, 0x2d, 0x97, 0x7d, 0x3e, 0x35, 0x06, 0xea, + 0x2b, 0x8b, 0xcf, 0x80, 0x48, 0x22, 0x9c, 0x72, 0xd3, 0xf2, 0x74, 0xb3, 0xa3, 0xd8, 0xd6, 0x2d, + 0xf6, 0x51, 0x6a, 0x42, 0x16, 0x48, 0xcd, 0x0d, 0x52, 0xb1, 0x85, 0xe5, 0xb8, 0xd3, 0x59, 0x9f, + 0x05, 0x67, 0xd6, 0x6a, 0xbb, 0xed, 0x20, 0xd7, 0x65, 0x41, 0x8c, 0x17, 0xc5, 0x2b, 0x90, 0xb6, + 0x7b, 0xbb, 0x0a, 0x8f, 0x18, 0x33, 0x17, 0x1e, 0x1a, 0xb6, 0xfe, 0xb9, 0x7f, 0xb0, 0x08, 0x90, + 0xb2, 0x7b, 0xbb, 0xd8, 0x5b, 0x1e, 0x86, 0xdc, 0x90, 0xce, 0xcc, 0xdc, 0x0c, 0xfa, 0x41, 0x7e, + 0x26, 0x81, 0x8d, 0x40, 0xb1, 0x1d, 0xdd, 0x72, 0x74, 0xef, 0x90, 0xbc, 0xbb, 0x94, 0x90, 0x05, + 0x5e, 0xb1, 0xc5, 0xe4, 0xd2, 0x01, 0x14, 0x5a, 0x24, 0xe3, 0x0a, 0x7a, 0x7e, 0x31, 0xe8, 0x5f, + 0x6c, 0x7c, 0xff, 0x46, 0xf6, 0x2c, 0x3e, 0xd0, 0xb3, 0xea, 0x87, 0x47, 0x7a, 0xe7, 0x4b, 0xc7, + 0xf7, 0xce, 0xe8, 0x6e, 0xf7, 0x7b, 0xa7, 0x23, 0x8b, 0x93, 0x3a, 0x67, 0x38, 0x7c, 0x4d, 0xea, + 0x98, 0xe3, 0x0e, 0x54, 0xa5, 0xa3, 0x37, 0xd5, 0xd2, 0x98, 0x30, 0x5a, 0x1a, 0xbb, 0x84, 0xa4, + 0xcb, 0x30, 0xbb, 0xa5, 0x3a, 0x5e, 0x0b, 0x79, 0xd7, 0x90, 0xda, 0x46, 0x4e, 0x74, 0xd7, 0x9d, + 0xe5, 0xbb, 0xae, 0x08, 0x49, 0xb2, 0xb5, 0xd2, 0x5d, 0x87, 0xfc, 0x2f, 0xed, 0x43, 0x92, 0xbc, + 0xbf, 0xe8, 0xef, 0xc8, 0x0c, 0x41, 0x77, 0x64, 0x1c, 0x4b, 0x0f, 0x3d, 0xe4, 0xf2, 0x33, 0x3f, + 0x29, 0x88, 0x2f, 0xf2, 0x7d, 0x35, 0x71, 0xf4, 0xbe, 0xca, 0x1c, 0x91, 0xed, 0xae, 0x06, 0xa4, + 0xab, 0x38, 0x14, 0x37, 0xeb, 0x7e, 0x47, 0x62, 0x41, 0x47, 0xc4, 0x75, 0x28, 0xd8, 0xaa, 0xe3, + 0x91, 0x4f, 0x3f, 0xf6, 0xc9, 0x28, 0x98, 0xaf, 0x2f, 0x0d, 0xae, 0xbc, 0xc8, 0x60, 0x59, 0x2b, + 0xb3, 0x76, 0x58, 0x28, 0xfd, 0xe7, 0x24, 0xa4, 0x98, 0x31, 0x3e, 0x04, 0x69, 0x66, 0x56, 0xe6, + 0x9d, 0x67, 0x57, 0x06, 0x37, 0xa6, 0x15, 0x7f, 0x03, 0x61, 0x7c, 0x1c, 0x23, 0x3e, 0x0e, 0x19, + 0x6d, 0x5f, 0xd5, 0x4d, 0x45, 0x6f, 0xf3, 0x34, 0xef, 0xdd, 0x7b, 0x4b, 0xe9, 0x1a, 0x96, 0x35, + 0xeb, 0x72, 0x9a, 0x54, 0x36, 0xdb, 0x38, 0x13, 0xd8, 0x47, 0x7a, 0x67, 0xdf, 0x63, 0x2b, 0x8c, + 0x95, 0xc4, 0x97, 0x21, 0x89, 0x1d, 0x82, 0x7d, 0x18, 0x58, 0x1a, 0x48, 0xc7, 0xfd, 0xf3, 0x6e, + 0x35, 0x83, 0x1b, 0xfe, 0xd4, 0x7f, 0x5c, 0x8a, 0xc9, 0x04, 0x21, 0xd6, 0x60, 0xd6, 0x50, 0x5d, + 0x4f, 0x21, 0x3b, 0x18, 0x6e, 0x7e, 0x9a, 0x50, 0x9c, 0x1e, 0x34, 0x08, 0x33, 0x2c, 0xeb, 0xfa, + 0x0c, 0x46, 0x51, 0x51, 0x5b, 0x3c, 0x07, 0x02, 0x21, 0xd1, 0xac, 0x6e, 0x57, 0xf7, 0x68, 0x6e, + 0x95, 0x22, 0x76, 0xcf, 0x63, 0x79, 0x8d, 0x88, 0x49, 0x86, 0x75, 0x06, 0xb2, 0xe4, 0x53, 0x24, + 0xa2, 0x42, 0x5f, 0x9a, 0xcd, 0x60, 0x01, 0xa9, 0x7c, 0x02, 0x0a, 0x41, 0x7c, 0xa4, 0x2a, 0x19, + 0xca, 0x12, 0x88, 0x89, 0xe2, 0x73, 0xb0, 0x60, 0xa2, 0xdb, 0xe4, 0x35, 0xde, 0x88, 0x76, 0x96, + 0x68, 0x8b, 0xb8, 0xee, 0x46, 0x14, 0xf1, 0x18, 0xe4, 0x35, 0x6e, 0x7c, 0xaa, 0x0b, 0x44, 0x77, + 0xd6, 0x97, 0x12, 0xb5, 0xd3, 0x90, 0x51, 0x6d, 0x9b, 0x2a, 0xcc, 0xb0, 0xf8, 0x68, 0xdb, 0xa4, + 0xea, 0x29, 0x98, 0x23, 0x63, 0x74, 0x90, 0xdb, 0x33, 0x3c, 0x46, 0x92, 0x23, 0x3a, 0x05, 0x5c, + 0x21, 0x53, 0x39, 0xd1, 0x7d, 0x04, 0x66, 0xd1, 0x4d, 0xbd, 0x8d, 0x4c, 0x0d, 0x51, 0xbd, 0x59, + 0xa2, 0x97, 0xe3, 0x42, 0xa2, 0xf4, 0x24, 0xf8, 0x71, 0x4f, 0xe1, 0x31, 0x39, 0x4f, 0xf9, 0xb8, + 0xbc, 0x42, 0xc5, 0x52, 0x11, 0x92, 0x75, 0xd5, 0x53, 0x71, 0x82, 0xe1, 0xdd, 0xa6, 0x1b, 0x4d, + 0x4e, 0xc6, 0xff, 0x4a, 0xdf, 0x8d, 0x43, 0xf2, 0x86, 0xe5, 0x21, 0xf1, 0x85, 0x50, 0x02, 0x98, + 0x1f, 0xe6, 0xcf, 0x2d, 0xbd, 0x63, 0xa2, 0xf6, 0xba, 0xdb, 0x09, 0xfd, 0x6e, 0x40, 0xe0, 0x4e, + 0xf1, 0x88, 0x3b, 0x2d, 0xc0, 0xb4, 0x63, 0xf5, 0xcc, 0x36, 0x7f, 0xdf, 0x94, 0x14, 0xc4, 0x06, + 0x64, 0x7c, 0x2f, 0x49, 0x8e, 0xf3, 0x92, 0x02, 0xf6, 0x12, 0xec, 0xc3, 0x4c, 0x20, 0xa7, 0x77, + 0x99, 0xb3, 0x54, 0x21, 0xeb, 0x07, 0x2f, 0xe6, 0x6d, 0x93, 0x39, 0x6c, 0x00, 0xc3, 0x9b, 0x89, + 0x3f, 0xf7, 0xbe, 0xf1, 0xa8, 0xc7, 0x09, 0x7e, 0x05, 0xb3, 0x5e, 0xc4, 0xad, 0xd8, 0x6f, 0x18, + 0xa4, 0xc9, 0xb8, 0x02, 0xb7, 0xa2, 0xbf, 0x63, 0xf0, 0x10, 0x64, 0x5d, 0xbd, 0x63, 0xaa, 0x5e, + 0xcf, 0x41, 0xcc, 0xf3, 0x02, 0x81, 0xf4, 0xf5, 0x18, 0xa4, 0xa8, 0x27, 0x87, 0xec, 0x16, 0x1b, + 0x6e, 0xb7, 0xf8, 0x28, 0xbb, 0x25, 0x1e, 0xdc, 0x6e, 0x15, 0x00, 0xbf, 0x33, 0x2e, 0xfb, 0xb4, + 0x7c, 0x48, 0xc6, 0x40, 0xbb, 0xd8, 0xd2, 0x3b, 0x6c, 0xa1, 0x86, 0x40, 0xd2, 0x7f, 0x88, 0xe1, + 0x24, 0x96, 0xd5, 0x8b, 0x15, 0x98, 0xe5, 0xfd, 0x52, 0xf6, 0x0c, 0xb5, 0xc3, 0x7c, 0xe7, 0xec, + 0xc8, 0xce, 0x5d, 0x35, 0xd4, 0x8e, 0x3c, 0xc3, 0xfa, 0x83, 0x0b, 0xc3, 0xe7, 0x21, 0x3e, 0x62, + 0x1e, 0x22, 0x13, 0x9f, 0x78, 0xb0, 0x89, 0x8f, 0x4c, 0x51, 0xb2, 0x7f, 0x8a, 0xbe, 0x1a, 0x27, + 0x87, 0x19, 0xdb, 0x72, 0x55, 0xe3, 0x83, 0x58, 0x11, 0x67, 0x20, 0x6b, 0x5b, 0x86, 0x42, 0x6b, + 0xe8, 0x7b, 0xd8, 0x19, 0xdb, 0x32, 0xe4, 0x81, 0x69, 0x9f, 0xfe, 0x01, 0x2d, 0x97, 0xd4, 0x0f, + 0xc0, 0x6a, 0xe9, 0x7e, 0xab, 0x39, 0x90, 0xa3, 0xa6, 0x60, 0x7b, 0xd9, 0x73, 0xd8, 0x06, 0x64, + 0x73, 0x8c, 0x0d, 0xee, 0xbd, 0xb4, 0xdb, 0x54, 0x53, 0x66, 0x7a, 0x18, 0x41, 0x43, 0xff, 0xb0, + 0x53, 0x70, 0xd8, 0x2d, 0x65, 0xa6, 0x27, 0xfd, 0xe5, 0x18, 0xc0, 0x1a, 0xb6, 0x2c, 0x19, 0x2f, + 0xde, 0x85, 0x5c, 0xd2, 0x05, 0x25, 0xd2, 0xf2, 0xe2, 0xa8, 0x49, 0x63, 0xed, 0xe7, 0xdc, 0x70, + 0xbf, 0x6b, 0x30, 0x1b, 0x38, 0xa3, 0x8b, 0x78, 0x67, 0x16, 0x8f, 0xc8, 0xaa, 0x5b, 0xc8, 0x93, + 0x73, 0x37, 0x43, 0x25, 0xe9, 0x9f, 0xc5, 0x20, 0x4b, 0xfa, 0xb4, 0x8e, 0x3c, 0x35, 0x32, 0x87, + 0xb1, 0x07, 0x9f, 0xc3, 0xb3, 0x00, 0x94, 0xc6, 0xd5, 0xdf, 0x42, 0xcc, 0xb3, 0xb2, 0x44, 0xd2, + 0xd2, 0xdf, 0x42, 0xe2, 0x25, 0xdf, 0xe0, 0x89, 0xa3, 0x0d, 0xce, 0xb3, 0x6e, 0x66, 0xf6, 0x53, + 0x90, 0x26, 0x3f, 0xc5, 0x74, 0xdb, 0x65, 0x89, 0x74, 0xca, 0xec, 0x75, 0xb7, 0x6f, 0xbb, 0xd2, + 0x9b, 0x90, 0xde, 0xbe, 0x4d, 0xef, 0x46, 0xce, 0x40, 0xd6, 0xb1, 0x2c, 0xb6, 0x27, 0xd3, 0x5c, + 0x28, 0x83, 0x05, 0x64, 0x0b, 0xe2, 0xf7, 0x01, 0xf1, 0xe0, 0x3e, 0x20, 0xb8, 0xd0, 0x48, 0x4c, + 0x74, 0xa1, 0xf1, 0xd4, 0xbf, 0x8d, 0xc1, 0x4c, 0x28, 0x3e, 0x88, 0xcf, 0xc3, 0x89, 0xea, 0xda, + 0x66, 0xed, 0x55, 0xa5, 0x59, 0x57, 0xae, 0xae, 0x55, 0x56, 0x83, 0x2f, 0x8d, 0x4a, 0x27, 0xef, + 0xdc, 0x5d, 0x16, 0x43, 0xba, 0x3b, 0x26, 0xb9, 0x54, 0x17, 0xcf, 0xc3, 0x42, 0x14, 0x52, 0xa9, + 0xb6, 0x1a, 0x1b, 0xdb, 0x42, 0xac, 0x74, 0xe2, 0xce, 0xdd, 0xe5, 0xb9, 0x10, 0xa2, 0xb2, 0xeb, + 0x22, 0xd3, 0x1b, 0x04, 0xd4, 0x36, 0xd7, 0xd7, 0x9b, 0xdb, 0x42, 0x7c, 0x00, 0xc0, 0x02, 0xf6, + 0x93, 0x30, 0x17, 0x05, 0x6c, 0x34, 0xd7, 0x84, 0x44, 0x49, 0xbc, 0x73, 0x77, 0x39, 0x1f, 0xd2, + 0xde, 0xd0, 0x8d, 0x52, 0xe6, 0x13, 0x5f, 0x5c, 0x9c, 0xfa, 0xa5, 0xbf, 0xba, 0x18, 0xc3, 0x23, + 0x9b, 0x8d, 0xc4, 0x08, 0xf1, 0x19, 0x38, 0xd5, 0x6a, 0xae, 0x6e, 0x34, 0xea, 0xca, 0x7a, 0x6b, + 0x95, 0x5f, 0x4b, 0xf3, 0xd1, 0x15, 0xee, 0xdc, 0x5d, 0x9e, 0x61, 0x43, 0x1a, 0xa5, 0xbd, 0x25, + 0x37, 0x6e, 0x6c, 0x6e, 0x37, 0x84, 0x18, 0xd5, 0xde, 0x72, 0xd0, 0x4d, 0xcb, 0xa3, 0xbf, 0xd5, + 0xf6, 0x1c, 0x9c, 0x1e, 0xa2, 0xed, 0x0f, 0x6c, 0xee, 0xce, 0xdd, 0xe5, 0xd9, 0x2d, 0x07, 0xd1, + 0xf5, 0x43, 0x10, 0x2b, 0x50, 0x1c, 0x44, 0x6c, 0x6e, 0x6d, 0xb6, 0x2a, 0x6b, 0xc2, 0x72, 0x49, + 0xb8, 0x73, 0x77, 0x39, 0xc7, 0x83, 0x21, 0xd6, 0x0f, 0x46, 0xf6, 0xbe, 0x9e, 0x78, 0xce, 0xc3, + 0xa3, 0xec, 0x0e, 0xd0, 0xf5, 0xd4, 0x03, 0xdd, 0xec, 0xf8, 0x37, 0xad, 0xac, 0xcc, 0x4e, 0x3e, + 0x27, 0xd9, 0x65, 0x2b, 0x97, 0x1e, 0x79, 0xdf, 0x5a, 0x1a, 0xfd, 0x98, 0xb1, 0x34, 0xe6, 0x09, + 0xdc, 0xf8, 0xa3, 0xd3, 0xe8, 0x47, 0x32, 0xa5, 0x31, 0x37, 0xc6, 0xa5, 0x23, 0x0f, 0x77, 0xd2, + 0x27, 0x63, 0x90, 0xbf, 0xa6, 0xbb, 0x9e, 0xe5, 0xe8, 0x9a, 0x6a, 0x90, 0xef, 0x8b, 0x2e, 0x4d, + 0x1a, 0x5b, 0xfb, 0x96, 0xfa, 0x2b, 0x90, 0xba, 0xa9, 0x1a, 0x34, 0xa8, 0x85, 0x2f, 0xee, 0xfb, + 0xcd, 0x17, 0x84, 0x36, 0x4e, 0x40, 0x61, 0xd2, 0x2f, 0xc7, 0xa1, 0x40, 0x16, 0x83, 0x4b, 0x7f, + 0x6a, 0x0b, 0x9f, 0xb1, 0xaa, 0x90, 0x74, 0x54, 0x8f, 0x5d, 0x1a, 0x56, 0x57, 0xd8, 0xcd, 0xef, + 0xe3, 0xe3, 0x6f, 0x73, 0x57, 0xea, 0x48, 0x93, 0x09, 0x56, 0xfc, 0x51, 0xc8, 0x74, 0xd5, 0xdb, + 0x0a, 0xe1, 0xa1, 0x27, 0x97, 0xca, 0xf1, 0x78, 0xee, 0xdf, 0x5b, 0x2a, 0x1c, 0xaa, 0x5d, 0xa3, + 0x2c, 0x71, 0x1e, 0x49, 0x4e, 0x77, 0xd5, 0xdb, 0xb8, 0x8b, 0xa2, 0x0d, 0x05, 0x2c, 0xd5, 0xf6, + 0x55, 0xb3, 0x83, 0x68, 0x23, 0xe4, 0x0a, 0xb4, 0x7a, 0xed, 0xd8, 0x8d, 0x9c, 0x0c, 0x1a, 0x09, + 0xd1, 0x49, 0xf2, 0x6c, 0x57, 0xbd, 0x5d, 0x23, 0x02, 0xdc, 0x62, 0x39, 0xf3, 0x99, 0x77, 0x96, + 0xa6, 0xc8, 0x6d, 0xfa, 0xb7, 0x62, 0x00, 0x81, 0xc5, 0xc4, 0x1f, 0x05, 0x41, 0xf3, 0x4b, 0x04, + 0xeb, 0xb2, 0x39, 0x7c, 0x62, 0xd4, 0x5c, 0xf4, 0xd9, 0x9b, 0xee, 0xcd, 0xdf, 0xbc, 0xb7, 0x14, + 0x93, 0x0b, 0x5a, 0xdf, 0x54, 0xfc, 0x08, 0xcc, 0xf4, 0xec, 0xb6, 0xea, 0x21, 0x85, 0x9c, 0xe3, + 0xe2, 0x63, 0xf7, 0xf9, 0x45, 0xcc, 0x75, 0xff, 0xde, 0x92, 0x48, 0x87, 0x15, 0x02, 0x4b, 0x64, + 0xf7, 0x07, 0x2a, 0xc1, 0x80, 0xd0, 0x98, 0x7e, 0x23, 0x06, 0x33, 0xf5, 0xd0, 0xa3, 0xba, 0x22, + 0xa4, 0xbb, 0x96, 0xa9, 0x1f, 0x30, 0x7f, 0xcc, 0xca, 0xbc, 0x28, 0x96, 0x20, 0x43, 0x3f, 0xb9, + 0xf4, 0x0e, 0xf9, 0x55, 0x28, 0x2f, 0x63, 0xd4, 0x2d, 0xb4, 0xeb, 0xea, 0x7c, 0x36, 0x64, 0x5e, + 0x14, 0xaf, 0x82, 0xe0, 0x22, 0xad, 0xe7, 0xe8, 0xde, 0xa1, 0xa2, 0x59, 0xa6, 0xa7, 0x6a, 0x1e, + 0xfd, 0x78, 0xaf, 0x7a, 0xe6, 0xfe, 0xbd, 0xa5, 0x53, 0xb4, 0xaf, 0xfd, 0x1a, 0x92, 0x5c, 0xe0, + 0xa2, 0x1a, 0x95, 0xe0, 0x16, 0xda, 0xc8, 0x53, 0x75, 0xc3, 0x2d, 0xd2, 0x67, 0x5d, 0xbc, 0x18, + 0x1a, 0xcb, 0x57, 0xd2, 0xe1, 0x8b, 0xad, 0xab, 0x20, 0x58, 0x36, 0x72, 0x22, 0x89, 0x68, 0xac, + 0xbf, 0xe5, 0x7e, 0x0d, 0x49, 0x2e, 0x70, 0x11, 0x4f, 0x52, 0x3d, 0x3c, 0xcd, 0xfc, 0xa0, 0x68, + 0xf7, 0x76, 0x83, 0xfb, 0xb0, 0x85, 0x81, 0xd9, 0xa8, 0x98, 0x87, 0xd5, 0x17, 0x02, 0xf6, 0x7e, + 0x9c, 0xf4, 0x9b, 0xbf, 0xf6, 0xec, 0x02, 0x73, 0x8d, 0xe0, 0x7e, 0xea, 0x55, 0x74, 0x88, 0xa7, + 0x9f, 0xa9, 0x6e, 0x11, 0x4d, 0x9c, 0x76, 0xbe, 0xa9, 0xea, 0x06, 0xff, 0x08, 0x5d, 0x66, 0x25, + 0xb1, 0x0c, 0x29, 0xd7, 0x53, 0xbd, 0x9e, 0xcb, 0x7e, 0x5c, 0x4e, 0x1a, 0xe5, 0x6a, 0x55, 0xcb, + 0x6c, 0xb7, 0x88, 0xa6, 0xcc, 0x10, 0xe2, 0x55, 0x48, 0x79, 0xd6, 0x01, 0x32, 0x99, 0x09, 0x8f, + 0xb5, 0xbe, 0xc9, 0x73, 0x2a, 0x8a, 0xc6, 0x16, 0x69, 0x23, 0x03, 0x75, 0x68, 0x5a, 0xb5, 0xaf, + 0xe2, 0xd3, 0x07, 0xf9, 0x8d, 0xb9, 0x6a, 0xf3, 0xd8, 0x8b, 0x90, 0x59, 0xaa, 0x9f, 0x4f, 0x92, + 0x0b, 0xbe, 0xa8, 0x45, 0x24, 0xe2, 0xab, 0xd1, 0xc7, 0xcc, 0xf4, 0x87, 0x18, 0x1f, 0x19, 0x35, + 0xfc, 0x90, 0x4f, 0xf3, 0xfb, 0x89, 0xf0, 0x13, 0xe9, 0xab, 0x20, 0xf4, 0xcc, 0x5d, 0xcb, 0x24, + 0x5f, 0x8a, 0xb2, 0xfc, 0x1e, 0x9f, 0xef, 0x12, 0x61, 0xe7, 0xe8, 0xd7, 0x90, 0xe4, 0x82, 0x2f, + 0xba, 0x46, 0x4f, 0x01, 0x6d, 0xc8, 0x07, 0x5a, 0x64, 0xa1, 0x66, 0xc7, 0x2e, 0xd4, 0x87, 0xd9, + 0x42, 0x3d, 0xd1, 0xdf, 0x4a, 0xb0, 0x56, 0x67, 0x7d, 0x21, 0x86, 0x89, 0xd7, 0x00, 0x82, 0xf0, + 0x40, 0xee, 0x29, 0x66, 0x46, 0x4f, 0x7c, 0x10, 0x63, 0xf8, 0x79, 0x2f, 0xc0, 0x8a, 0x1f, 0x83, + 0xf9, 0xae, 0x6e, 0x2a, 0x2e, 0x32, 0xf6, 0x14, 0x66, 0x60, 0x4c, 0x49, 0x7e, 0x2a, 0xa8, 0xba, + 0x76, 0x3c, 0x7f, 0xb8, 0x7f, 0x6f, 0xa9, 0xc4, 0x42, 0xe8, 0x20, 0xa5, 0x24, 0xcf, 0x75, 0x75, + 0xb3, 0x85, 0x8c, 0xbd, 0xba, 0x2f, 0x2b, 0xe7, 0x3e, 0xf1, 0xce, 0xd2, 0x14, 0x5b, 0xae, 0x53, + 0xd2, 0x25, 0x72, 0x77, 0xce, 0x96, 0x19, 0x72, 0xf1, 0x99, 0x44, 0xe5, 0x05, 0x72, 0xa3, 0x91, + 0x95, 0x03, 0x01, 0x5d, 0xe6, 0x6f, 0xff, 0xfb, 0xe5, 0x98, 0xf4, 0x95, 0x18, 0xa4, 0xea, 0x37, + 0xb6, 0x54, 0xdd, 0x11, 0x9b, 0x30, 0x17, 0x78, 0x4e, 0x74, 0x91, 0x3f, 0x74, 0xff, 0xde, 0x52, + 0xb1, 0xdf, 0xb9, 0xfc, 0x55, 0x1e, 0x38, 0x30, 0x5f, 0xe6, 0xcd, 0x51, 0x07, 0xd7, 0x08, 0xd5, + 0x80, 0x8a, 0x34, 0x78, 0xac, 0xed, 0x1b, 0x66, 0x03, 0xd2, 0xb4, 0xb7, 0xae, 0x58, 0x86, 0x69, + 0x1b, 0xff, 0xc3, 0x1e, 0x0c, 0x2c, 0x8e, 0x74, 0x5e, 0xa2, 0xef, 0x5f, 0x64, 0x62, 0x88, 0xf4, + 0xe9, 0x38, 0x40, 0xfd, 0xc6, 0x8d, 0x6d, 0x47, 0xb7, 0x0d, 0xe4, 0xfd, 0x20, 0x47, 0xbe, 0x0d, + 0x27, 0x42, 0xa7, 0x24, 0x47, 0xeb, 0x1b, 0xfd, 0xf2, 0xfd, 0x7b, 0x4b, 0x0f, 0xf5, 0x8f, 0x3e, + 0xa4, 0x26, 0xc9, 0xf3, 0xc1, 0x79, 0xc9, 0xd1, 0x86, 0xb2, 0xb6, 0x5d, 0xcf, 0x67, 0x4d, 0x8c, + 0x66, 0x0d, 0xa9, 0x85, 0x59, 0xeb, 0xae, 0x37, 0xdc, 0xb4, 0x2d, 0x98, 0x09, 0x4c, 0xe2, 0x8a, + 0x75, 0xc8, 0x78, 0xec, 0x7f, 0x66, 0x61, 0x69, 0xb4, 0x85, 0x39, 0x8c, 0x59, 0xd9, 0x47, 0x4a, + 0x7f, 0x18, 0x03, 0x08, 0x7c, 0xf6, 0x4f, 0xa6, 0x8b, 0xe1, 0x50, 0xce, 0x02, 0x6f, 0xe2, 0x81, + 0x52, 0x35, 0x86, 0xee, 0xb3, 0xe7, 0x4f, 0xc4, 0x61, 0x7e, 0x87, 0x47, 0x9e, 0x3f, 0xf1, 0x36, + 0xd8, 0x82, 0x34, 0x32, 0x3d, 0x47, 0x27, 0x46, 0xc0, 0xb3, 0xfd, 0xdc, 0xa8, 0xd9, 0x1e, 0x32, + 0x26, 0xf2, 0x63, 0x49, 0xfc, 0xd2, 0x9d, 0xd1, 0xf4, 0x59, 0xe3, 0xa7, 0x13, 0x50, 0x1c, 0x85, + 0x14, 0x6b, 0x50, 0xd0, 0x1c, 0x44, 0x04, 0x4a, 0xf8, 0xe6, 0xaf, 0x5a, 0x0a, 0x32, 0xcb, 0x3e, + 0x05, 0x49, 0xce, 0x73, 0x09, 0xdb, 0x3d, 0x3a, 0x80, 0xd3, 0x3e, 0xec, 0x76, 0x58, 0x6b, 0xc2, + 0x3c, 0x4f, 0x62, 0xdb, 0x07, 0x6f, 0x24, 0x4a, 0x40, 0xf7, 0x8f, 0x7c, 0x20, 0x25, 0x1b, 0xc8, + 0x47, 0xa1, 0xa0, 0x9b, 0xba, 0xa7, 0xab, 0x86, 0xb2, 0xab, 0x1a, 0xaa, 0xa9, 0x3d, 0x48, 0xd6, + 0x4c, 0x43, 0x3e, 0x6b, 0xb6, 0x8f, 0x4e, 0x92, 0xf3, 0x4c, 0x52, 0xa5, 0x02, 0xf1, 0x1a, 0xa4, + 0x79, 0x53, 0xc9, 0x07, 0xca, 0x36, 0x38, 0x3c, 0x94, 0xe0, 0xfd, 0x64, 0x02, 0xe6, 0x64, 0xd4, + 0xfe, 0xff, 0x53, 0x71, 0xbc, 0xa9, 0x58, 0x07, 0xa0, 0xcb, 0x1d, 0x07, 0xd8, 0x07, 0x98, 0x0d, + 0x1c, 0x30, 0xb2, 0x94, 0xa1, 0xee, 0x7a, 0xa1, 0xf9, 0xb8, 0x17, 0x87, 0x5c, 0x78, 0x3e, 0xfe, + 0x1f, 0xdd, 0x95, 0xc4, 0x66, 0x10, 0x89, 0x92, 0xec, 0x27, 0x66, 0x47, 0x44, 0xa2, 0x01, 0xef, + 0x3d, 0x3a, 0x04, 0xdd, 0x4f, 0x42, 0x6a, 0x4b, 0x75, 0xd4, 0xae, 0x2b, 0x6a, 0x03, 0x99, 0x26, + 0xbf, 0x7e, 0x1c, 0xf8, 0x21, 0x71, 0x76, 0xdb, 0x31, 0x26, 0xd1, 0xfc, 0xcc, 0x90, 0x44, 0xf3, + 0x87, 0x21, 0x8f, 0x8f, 0xc3, 0xa1, 0x57, 0x18, 0xb0, 0xb5, 0x67, 0xab, 0xa7, 0x03, 0x96, 0x68, + 0x3d, 0x3d, 0x2d, 0xdf, 0x08, 0xbf, 0xc3, 0x30, 0x83, 0x35, 0x82, 0xc0, 0x8c, 0xe1, 0x27, 0x83, + 0x63, 0x69, 0xa8, 0x52, 0x92, 0xa1, 0xab, 0xde, 0x6e, 0xd0, 0x82, 0xb8, 0x06, 0xe2, 0xbe, 0x7f, + 0x33, 0xa2, 0x04, 0xe6, 0xc4, 0xf8, 0xb3, 0xf7, 0xef, 0x2d, 0x9d, 0xa6, 0xf8, 0x41, 0x1d, 0x49, + 0x9e, 0x0b, 0x84, 0x9c, 0xed, 0x45, 0x00, 0x3c, 0x2e, 0x85, 0xbe, 0x3e, 0x47, 0x8f, 0x3b, 0x27, + 0xee, 0xdf, 0x5b, 0x9a, 0xa3, 0x2c, 0x41, 0x9d, 0x24, 0x67, 0x71, 0xa1, 0x4e, 0xde, 0xac, 0x63, + 0xd9, 0x71, 0xdf, 0xa9, 0x9e, 0x9d, 0x6d, 0xd6, 0x8e, 0x7d, 0xb6, 0x09, 0x65, 0xc7, 0x7d, 0x94, + 0x34, 0x3b, 0x8e, 0xde, 0x06, 0x8c, 0xca, 0xcd, 0xd3, 0x1f, 0x4c, 0x6e, 0x1e, 0xac, 0xea, 0x2f, + 0xc6, 0x40, 0x0c, 0x2a, 0x64, 0xe4, 0xda, 0xf8, 0x6c, 0x8a, 0x0f, 0x21, 0xa1, 0x5e, 0xc5, 0x8e, + 0x3e, 0x84, 0x04, 0x78, 0x7e, 0x08, 0x09, 0x45, 0x89, 0xcb, 0xc1, 0xd6, 0x10, 0x67, 0x3e, 0x3c, + 0xe4, 0x3d, 0xcb, 0x95, 0x9a, 0xa5, 0x73, 0xf4, 0xc0, 0x5e, 0x30, 0x25, 0xfd, 0xab, 0x18, 0x9c, + 0x1e, 0x58, 0x4d, 0x7e, 0x67, 0xff, 0x0c, 0x88, 0x4e, 0xa8, 0x92, 0xfd, 0x56, 0x22, 0xed, 0xf4, + 0xb1, 0x17, 0xe7, 0x9c, 0x33, 0xb0, 0xe7, 0xfc, 0xe0, 0x76, 0x37, 0xfa, 0xa2, 0xe6, 0x3f, 0x89, + 0xc1, 0x42, 0xb8, 0x79, 0x7f, 0x20, 0x1b, 0x90, 0x0b, 0xb7, 0xce, 0x86, 0xf0, 0xe8, 0x24, 0x43, + 0x60, 0xbd, 0x8f, 0xe0, 0xc5, 0x0f, 0x07, 0xa1, 0x8a, 0xde, 0x1b, 0x3e, 0x3f, 0xb1, 0x35, 0x78, + 0x9f, 0xfa, 0x43, 0x56, 0x92, 0xcc, 0xc7, 0xff, 0x8e, 0x41, 0x72, 0xcb, 0xb2, 0x0c, 0xd1, 0x82, + 0x39, 0xd3, 0xf2, 0x14, 0xbc, 0xaa, 0x50, 0x5b, 0x61, 0x17, 0x0e, 0x74, 0x0f, 0xa8, 0x1d, 0xcf, + 0x48, 0xbf, 0x73, 0x6f, 0x69, 0x90, 0x4a, 0x2e, 0x98, 0x96, 0x57, 0x25, 0x92, 0x6d, 0x7a, 0x1d, + 0xf1, 0x31, 0x98, 0x8d, 0x36, 0x46, 0x77, 0x88, 0xd7, 0x8e, 0xdd, 0x58, 0x94, 0xe6, 0xfe, 0xbd, + 0xa5, 0x85, 0x20, 0x5a, 0xf8, 0x62, 0x49, 0xce, 0xed, 0x86, 0x5a, 0xa7, 0xaf, 0xb6, 0xfd, 0xfe, + 0x3b, 0x4b, 0xb1, 0xa7, 0xbe, 0x16, 0x03, 0x08, 0x6e, 0x5d, 0xc4, 0x67, 0xe0, 0x54, 0x75, 0x73, + 0xa3, 0xae, 0xb4, 0xb6, 0x2b, 0xdb, 0x3b, 0xad, 0xe8, 0xdb, 0xea, 0xfc, 0xd1, 0x80, 0x6b, 0x23, + 0x8d, 0xfc, 0x6e, 0xa4, 0xf8, 0x38, 0x2c, 0x44, 0xb5, 0x71, 0xa9, 0x51, 0x17, 0x62, 0xa5, 0xdc, + 0x9d, 0xbb, 0xcb, 0x19, 0x9a, 0x87, 0xa2, 0xb6, 0x78, 0x0e, 0x4e, 0x0c, 0xea, 0x35, 0x37, 0x56, + 0x85, 0x78, 0x69, 0xf6, 0xce, 0xdd, 0xe5, 0xac, 0x9f, 0xb0, 0x8a, 0x12, 0x88, 0x61, 0x4d, 0xc6, + 0x97, 0x28, 0xc1, 0x9d, 0xbb, 0xcb, 0x29, 0x6a, 0xc0, 0x52, 0xf2, 0x13, 0x5f, 0x5c, 0x9c, 0xaa, + 0x5e, 0x1d, 0x79, 0xf9, 0xff, 0xcc, 0x91, 0xb6, 0xbb, 0xed, 0x5f, 0xe8, 0x47, 0x6e, 0xfc, 0xff, + 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x02, 0x30, 0x18, 0xeb, 0x67, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -1894,7 +1757,7 @@ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descri if err != nil { panic(err) } - if err := github_com_gogo_protobuf_proto.Unmarshal(ungzipped, d); err != nil { + if err := github_com_cosmos_gogoproto_proto.Unmarshal(ungzipped, d); err != nil { panic(err) } return d @@ -2274,7 +2137,7 @@ func (m *Commission) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.UpdateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.UpdateTime):]) + n2, err2 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.UpdateTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.UpdateTime):]) if err2 != nil { return 0, err2 } @@ -2393,7 +2256,7 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x52 - n5, err5 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.UnbondingTime):]) + n5, err5 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.UnbondingTime):]) if err5 != nil { return 0, err5 } @@ -2798,7 +2661,7 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error } i-- dAtA[i] = 0x1a - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + n8, err8 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) if err8 != nil { return 0, err8 } @@ -2854,7 +2717,7 @@ func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + n9, err9 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) if err9 != nil { return 0, err9 } @@ -2990,7 +2853,7 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x10 } - n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime):]) + n10, err10 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingTime):]) if err10 != nil { return 0, err10 } @@ -3228,7 +3091,7 @@ func (m *Commission) Size() (n int) { _ = l l = m.CommissionRates.Size() n += 1 + l + sovStaking(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.UpdateTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.UpdateTime) n += 1 + l + sovStaking(uint64(l)) return n } @@ -3291,7 +3154,7 @@ func (m *Validator) Size() (n int) { if m.UnbondingHeight != 0 { n += 1 + sovStaking(uint64(m.UnbondingHeight)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.UnbondingTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.UnbondingTime) n += 1 + l + sovStaking(uint64(l)) l = m.Commission.Size() n += 1 + l + sovStaking(uint64(l)) @@ -3434,7 +3297,7 @@ func (m *UnbondingDelegationEntry) Size() (n int) { if m.CreationHeight != 0 { n += 1 + sovStaking(uint64(m.CreationHeight)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime) n += 1 + l + sovStaking(uint64(l)) l = m.InitialBalance.Size() n += 1 + l + sovStaking(uint64(l)) @@ -3452,7 +3315,7 @@ func (m *RedelegationEntry) Size() (n int) { if m.CreationHeight != 0 { n += 1 + sovStaking(uint64(m.CreationHeight)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime) n += 1 + l + sovStaking(uint64(l)) l = m.InitialBalance.Size() n += 1 + l + sovStaking(uint64(l)) @@ -3494,7 +3357,7 @@ func (m *Params) Size() (n int) { } var l int _ = l - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingTime) n += 1 + l + sovStaking(uint64(l)) if m.MaxValidators != 0 { n += 1 + sovStaking(uint64(m.MaxValidators)) @@ -3956,7 +3819,7 @@ func (m *Commission) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.UpdateTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.UpdateTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -4476,7 +4339,7 @@ func (m *Validator) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.UnbondingTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.UnbondingTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -5451,7 +5314,7 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -5621,7 +5484,7 @@ func (m *RedelegationEntry) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -5952,7 +5815,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.UnbondingTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.UnbondingTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index c3a1bf706599..1ee5c02b970b 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -6,14 +6,14 @@ package types import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types1 "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -1106,7 +1106,7 @@ func (m *MsgBeginRedelegateResponse) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + n8, err8 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) if err8 != nil { return 0, err8 } @@ -1184,7 +1184,7 @@ func (m *MsgUndelegateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n10, err10 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + n10, err10 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) if err10 != nil { return 0, err10 } @@ -1333,7 +1333,7 @@ func (m *MsgBeginRedelegateResponse) Size() (n int) { } var l int _ = l - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime) n += 1 + l + sovTx(uint64(l)) return n } @@ -1363,7 +1363,7 @@ func (m *MsgUndelegateResponse) Size() (n int) { } var l int _ = l - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime) n += 1 + l + sovTx(uint64(l)) return n } @@ -2378,7 +2378,7 @@ func (m *MsgBeginRedelegateResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2608,7 +2608,7 @@ func (m *MsgUndelegateResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/upgrade/types/query.pb.go b/x/upgrade/types/query.pb.go index 9b2daef286eb..ce9d0a31a148 100644 --- a/x/upgrade/types/query.pb.go +++ b/x/upgrade/types/query.pb.go @@ -7,8 +7,8 @@ import ( context "context" fmt "fmt" _ "github.com/cosmos/cosmos-sdk/codec/types" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/upgrade/types/query.pb.gw.go b/x/upgrade/types/query.pb.gw.go index ab64b67348a6..951ddc24b5c0 100644 --- a/x/upgrade/types/query.pb.gw.go +++ b/x/upgrade/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" ) @@ -30,6 +31,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join func request_Query_CurrentPlan_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryCurrentPlanRequest @@ -196,12 +198,14 @@ func local_request_Query_ModuleVersions_0(ctx context.Context, marshaler runtime // 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_CurrentPlan_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 { @@ -209,6 +213,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_CurrentPlan_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) @@ -222,6 +227,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_AppliedPlan_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 { @@ -229,6 +236,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_AppliedPlan_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) @@ -242,6 +250,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_UpgradedConsensusState_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 { @@ -249,6 +259,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_UpgradedConsensusState_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) @@ -262,6 +273,8 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv mux.Handle("GET", pattern_Query_ModuleVersions_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 { @@ -269,6 +282,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } resp, md, err := local_request_Query_ModuleVersions_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) diff --git a/x/upgrade/types/upgrade.pb.go b/x/upgrade/types/upgrade.pb.go index 686389974b23..5acda72d833e 100644 --- a/x/upgrade/types/upgrade.pb.go +++ b/x/upgrade/types/upgrade.pb.go @@ -6,9 +6,9 @@ package types import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" @@ -416,7 +416,7 @@ func (m *Plan) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + n2, err2 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) if err2 != nil { return 0, err2 } @@ -574,7 +574,7 @@ func (m *Plan) Size() (n int) { if l > 0 { n += 1 + l + sovUpgrade(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time) n += 1 + l + sovUpgrade(uint64(l)) if m.Height != 0 { n += 1 + sovUpgrade(uint64(m.Height)) @@ -738,7 +738,7 @@ func (m *Plan) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex