From cae21ecd251cea44f56209e0a4586ca2979c6c87 Mon Sep 17 00:00:00 2001 From: zemyblue Date: Tue, 10 Jan 2023 16:29:24 +0900 Subject: [PATCH] feat: apply the wasm module of lbm-sdk (#1) * feat: apply the wasm module of lbm-sdk from 3bdcb6ffe01c81615bedb777ca0e039cc46ef00c * ci: add github action and change default md files. * fix: lint errors * chore: update changelog * fix: codeql-analizer warning * feat: copy `lbm.wasm.v1` proto files from lbm-sdk. And add ostracon proto files in third_party * chore: remove comment * chore: apply review feedback and remove replacement of lbm-sdk * fix: fix wrong Metrics provide initiation. * chore: apply feedback. - add new line --- .circleci/config.yml | 220 ---- .github/CODEOWNERS | 5 - .github/PULL_REQUEST_TEMPLATE.md | 26 + .github/dependabot.yml | 24 +- .github/workflows/codeql-analizer.yml | 6 +- .github/workflows/lint.yml | 32 + .github/workflows/proto-buf-publisher.yml | 34 - .github/workflows/test.yml | 76 ++ CHANGELOG.md | 371 +----- COSMWASM_CHANGELOG.md | 371 ++++++ Dockerfile | 18 +- Makefile | 26 +- README.md | 126 +-- app/ante.go | 14 +- app/app.go | 292 +++-- app/app_test.go | 23 +- app/encoding.go | 4 +- app/export.go | 17 +- app/params/encoding.go | 6 +- app/params/proto.go | 6 +- app/sim_test.go | 53 +- app/test_access.go | 24 +- app/test_helpers.go | 55 +- benchmarks/app_test.go | 37 +- benchmarks/bench_test.go | 17 +- cmd/wasmd/genaccounts.go | 20 +- cmd/wasmd/genwasm.go | 5 +- cmd/wasmd/main.go | 6 +- cmd/wasmd/root.go | 56 +- contrib/prototools-docker/Dockerfile | 2 +- docs/proto/proto-docs.md | 274 +++++ go.mod | 123 +- go.sum | 661 +++++++++-- proto/cosmwasm/wasm/v1/genesis.proto | 5 +- proto/cosmwasm/wasm/v1/ibc.proto | 2 +- proto/cosmwasm/wasm/v1/proposal.proto | 6 +- proto/cosmwasm/wasm/v1/query.proto | 4 +- proto/cosmwasm/wasm/v1/tx.proto | 6 +- proto/cosmwasm/wasm/v1/types.proto | 7 +- proto/lbm/wasm/v1/event.proto | 16 + proto/lbm/wasm/v1/proposal.proto | 29 + proto/lbm/wasm/v1/query.proto | 49 + proto/lbm/wasm/v1/tx.proto | 46 + scripts/protocgen.sh | 4 +- .../base/query/v1beta1/pagination.proto | 2 +- .../proto/cosmos/base/v1beta1/coin.proto | 2 +- third_party/proto/ostracon/abci/types.proto | 410 +++++++ third_party/proto/ostracon/crypto/keys.proto | 17 + third_party/proto/ostracon/crypto/proof.proto | 41 + .../proto/ostracon/libs/bits/types.proto | 9 + third_party/proto/ostracon/p2p/types.proto | 34 + third_party/proto/ostracon/types/block.proto | 15 + .../proto/ostracon/types/evidence.proto | 41 + third_party/proto/ostracon/types/params.proto | 80 ++ third_party/proto/ostracon/types/types.proto | 157 +++ .../proto/ostracon/types/validator.proto | 28 + third_party/proto/ostracon/types/voter.proto | 11 + .../proto/ostracon/version/types.proto | 24 + .../proto/tendermint/blockchain/types.pb.go | 3 +- .../proto/tendermint/consensus/types.pb.go | 5 +- .../proto/tendermint/consensus/wal.pb.go | 3 +- third_party/proto/tendermint/p2p/conn.pb.go | 3 +- .../proto/tendermint/privval/types.pb.go | 5 +- .../proto/tendermint/state/types.pb.go | 7 +- .../proto/tendermint/types/types.pb.go | 5 +- .../proto/tendermint/types/validator.pb.go | 3 +- x/wasm/Governance.md | 204 ---- x/wasm/IBC.md | 137 --- x/wasm/README.md | 219 ---- x/wasm/alias.go | 84 +- x/wasm/client/cli/genesis_msg.go | 50 +- x/wasm/client/cli/genesis_msg_test.go | 71 +- x/wasm/client/cli/gov_tx.go | 122 +- x/wasm/client/cli/new_tx.go | 18 +- x/wasm/client/cli/os/file.go | 62 + x/wasm/client/cli/os/file_test.go | 42 + x/wasm/client/cli/query.go | 93 +- x/wasm/client/cli/query_test.go | 450 ++++++++ x/wasm/client/cli/tx.go | 131 ++- x/wasm/client/proposal_handler.go | 27 +- x/wasm/client/proposal_handler_test.go | 298 ----- x/wasm/client/rest/gov.go | 523 --------- x/wasm/client/rest/new_tx.go | 86 -- x/wasm/client/rest/query.go | 270 ----- x/wasm/client/rest/rest.go | 13 - x/wasm/client/rest/tx.go | 149 --- x/wasm/client/testutil/cli_test.go | 18 + x/wasm/client/testutil/gov.go | 131 +++ x/wasm/client/testutil/query.go | 537 +++++++++ x/wasm/client/testutil/suite.go | 156 +++ .../testutil/testdata/wasm_genesis.json | 71 ++ x/wasm/client/testutil/tx.go | 245 ++++ x/wasm/common_test.go | 17 +- x/wasm/genesis_test.go | 5 +- x/wasm/handler.go | 18 +- x/wasm/ibc.go | 29 +- x/wasm/ibc_reflect_test.go | 13 +- x/wasm/ibc_test.go | 7 +- x/wasm/ibctesting/README.md | 2 - x/wasm/ibctesting/chain.go | 249 ++-- x/wasm/ibctesting/coordinator.go | 17 +- x/wasm/ibctesting/endpoint.go | 30 +- x/wasm/ibctesting/event_utils.go | 6 +- x/wasm/ibctesting/path.go | 4 +- x/wasm/ibctesting/wasm.go | 19 +- x/wasm/ioutils/ioutil.go | 5 +- x/wasm/ioutils/ioutil_test.go | 8 +- x/wasm/ioutils/utils_test.go | 11 +- x/wasm/keeper/ante.go | 6 +- x/wasm/keeper/ante_test.go | 23 +- x/wasm/keeper/api.go | 44 +- x/wasm/keeper/authz_policy.go | 14 +- x/wasm/keeper/bench_test.go | 34 +- x/wasm/keeper/contract_keeper.go | 15 +- x/wasm/keeper/events.go | 8 +- x/wasm/keeper/events_test.go | 22 +- x/wasm/keeper/gas_register.go | 115 +- x/wasm/keeper/gas_register_test.go | 432 ------- x/wasm/keeper/genesis.go | 24 +- x/wasm/keeper/genesis_test.go | 87 +- x/wasm/keeper/handler_plugin.go | 18 +- x/wasm/keeper/handler_plugin_encoders.go | 40 +- x/wasm/keeper/handler_plugin_encoders_test.go | 29 +- x/wasm/keeper/handler_plugin_test.go | 62 +- x/wasm/keeper/ibc.go | 10 +- x/wasm/keeper/ibc_test.go | 8 +- x/wasm/keeper/keeper.go | 226 +++- x/wasm/keeper/keeper_extension.go | 67 ++ x/wasm/keeper/keeper_test.go | 291 +++-- x/wasm/keeper/legacy_querier.go | 37 +- x/wasm/keeper/legacy_querier_test.go | 24 +- x/wasm/keeper/metrics.go | 110 +- x/wasm/keeper/migrations.go | 20 + x/wasm/keeper/msg_dispatcher.go | 10 +- x/wasm/keeper/msg_dispatcher_test.go | 21 +- x/wasm/keeper/msg_server.go | 46 +- x/wasm/keeper/options.go | 20 +- x/wasm/keeper/options_test.go | 34 +- x/wasm/keeper/proposal_handler.go | 63 +- x/wasm/keeper/proposal_integration_test.go | 139 ++- x/wasm/keeper/querier.go | 84 +- x/wasm/keeper/querier_test.go | 189 +++- x/wasm/keeper/query_plugins.go | 71 +- x/wasm/keeper/query_plugins_test.go | 60 +- x/wasm/keeper/recurse_test.go | 33 +- x/wasm/keeper/reflect_test.go | 53 +- x/wasm/keeper/relay.go | 33 +- x/wasm/keeper/relay_test.go | 53 +- x/wasm/keeper/snapshotter.go | 19 +- x/wasm/keeper/snapshotter_integration_test.go | 37 +- x/wasm/keeper/staking_test.go | 41 +- x/wasm/keeper/submsg_test.go | 40 +- x/wasm/keeper/test_common.go | 153 +-- x/wasm/keeper/test_fuzz.go | 7 +- x/wasm/keeper/testdata/burner.wasm | Bin 124838 -> 127056 bytes x/wasm/keeper/testdata/download_releases.sh | 4 +- x/wasm/keeper/testdata/hackatom.wasm | Bin 208805 -> 216295 bytes x/wasm/keeper/testdata/hackatom.wasm.gzip | Bin 74777 -> 78110 bytes x/wasm/keeper/testdata/ibc_reflect.wasm | Bin 274438 -> 264774 bytes x/wasm/keeper/testdata/ibc_reflect_send.wasm | Bin 278731 -> 277579 bytes x/wasm/keeper/testdata/reflect.go | 12 + x/wasm/keeper/testdata/reflect.wasm | Bin 262794 -> 264620 bytes x/wasm/keeper/testdata/staking.wasm | Bin 229117 -> 229214 bytes x/wasm/keeper/testdata/version.txt | 2 +- x/wasm/keeper/wasmtesting/coin_transferrer.go | 12 +- x/wasm/keeper/wasmtesting/gas_register.go | 66 -- x/wasm/keeper/wasmtesting/message_router.go | 4 +- x/wasm/keeper/wasmtesting/messenger.go | 4 +- x/wasm/keeper/wasmtesting/mock_engine.go | 12 +- x/wasm/keeper/wasmtesting/mock_keepers.go | 10 +- x/wasm/keeper/wasmtesting/msg_dispatcher.go | 4 +- x/wasm/keeper/wasmtesting/query_handler.go | 4 +- x/wasm/keeper/wasmtesting/store.go | 4 +- x/wasm/lbmtypes/codec.go | 54 + x/wasm/lbmtypes/event.pb.go | 490 ++++++++ x/wasm/lbmtypes/proposal.go | 76 ++ x/wasm/lbmtypes/proposal.pb.go | 721 ++++++++++++ x/wasm/lbmtypes/query.pb.go | 1005 +++++++++++++++++ x/wasm/lbmtypes/query.pb.gw.go | 264 +++++ x/wasm/lbmtypes/tx.go | 60 + x/wasm/lbmtypes/tx.pb.go | 963 ++++++++++++++++ x/wasm/lbmtypes/tx_test.go | 137 +++ x/wasm/lbmtypes/validation.go | 27 + x/wasm/module.go | 47 +- x/wasm/module_test.go | 244 +++- x/wasm/relay_pingpong_test.go | 26 +- x/wasm/relay_test.go | 27 +- x/wasm/simulation/genesis.go | 22 +- x/wasm/simulation/operations.go | 44 +- x/wasm/simulation/operations_test.go | 74 ++ x/wasm/simulation/params.go | 11 +- x/wasm/types/ante.go | 2 +- x/wasm/types/codec.go | 41 +- x/wasm/types/encoder.go | 22 + x/wasm/types/errors.go | 5 +- x/wasm/types/events.go | 3 + x/wasm/types/expected_keepers.go | 16 +- x/wasm/types/exported_keepers.go | 14 +- x/wasm/types/genesis.go | 11 +- x/wasm/types/genesis.pb.go | 193 ++-- x/wasm/types/genesis_test.go | 12 +- x/wasm/types/iavl_range_test.go | 11 +- x/wasm/types/ibc.pb.go | 39 +- x/wasm/types/json_matching.go | 2 +- x/wasm/types/json_matching_test.go | 1 - x/wasm/types/keys.go | 20 +- x/wasm/types/keys_test.go | 23 +- x/wasm/types/params.go | 83 +- x/wasm/types/params_test.go | 44 +- x/wasm/types/proposal.go | 16 +- x/wasm/types/proposal.pb.go | 205 +--- x/wasm/types/proposal_test.go | 105 +- x/wasm/types/query.pb.go | 308 ++--- x/wasm/types/query.pb.gw.go | 71 +- x/wasm/types/store.go | 30 + x/wasm/types/test_fixtures.go | 38 +- x/wasm/types/tx.go | 4 +- x/wasm/types/tx.pb.go | 209 ++-- x/wasm/types/tx_test.go | 37 +- x/wasm/types/types.go | 18 +- x/wasm/types/types.pb.go | 321 +++--- x/wasm/types/types_test.go | 15 +- x/wasm/types/validation.go | 2 +- x/wasm/types/wasmer_engine.go | 5 +- 224 files changed, 12136 insertions(+), 5948 deletions(-) delete mode 100644 .circleci/config.yml delete mode 100644 .github/CODEOWNERS create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/lint.yml delete mode 100644 .github/workflows/proto-buf-publisher.yml create mode 100644 .github/workflows/test.yml create mode 100644 COSMWASM_CHANGELOG.md create mode 100644 proto/lbm/wasm/v1/event.proto create mode 100644 proto/lbm/wasm/v1/proposal.proto create mode 100644 proto/lbm/wasm/v1/query.proto create mode 100644 proto/lbm/wasm/v1/tx.proto create mode 100644 third_party/proto/ostracon/abci/types.proto create mode 100644 third_party/proto/ostracon/crypto/keys.proto create mode 100644 third_party/proto/ostracon/crypto/proof.proto create mode 100644 third_party/proto/ostracon/libs/bits/types.proto create mode 100644 third_party/proto/ostracon/p2p/types.proto create mode 100644 third_party/proto/ostracon/types/block.proto create mode 100644 third_party/proto/ostracon/types/evidence.proto create mode 100644 third_party/proto/ostracon/types/params.proto create mode 100644 third_party/proto/ostracon/types/types.proto create mode 100644 third_party/proto/ostracon/types/validator.proto create mode 100644 third_party/proto/ostracon/types/voter.proto create mode 100644 third_party/proto/ostracon/version/types.proto delete mode 100644 x/wasm/Governance.md delete mode 100644 x/wasm/IBC.md delete mode 100644 x/wasm/README.md create mode 100644 x/wasm/client/cli/os/file.go create mode 100644 x/wasm/client/cli/os/file_test.go create mode 100644 x/wasm/client/cli/query_test.go delete mode 100644 x/wasm/client/proposal_handler_test.go delete mode 100644 x/wasm/client/rest/gov.go delete mode 100644 x/wasm/client/rest/new_tx.go delete mode 100644 x/wasm/client/rest/query.go delete mode 100644 x/wasm/client/rest/rest.go delete mode 100644 x/wasm/client/rest/tx.go create mode 100644 x/wasm/client/testutil/cli_test.go create mode 100644 x/wasm/client/testutil/gov.go create mode 100644 x/wasm/client/testutil/query.go create mode 100644 x/wasm/client/testutil/suite.go create mode 100644 x/wasm/client/testutil/testdata/wasm_genesis.json create mode 100644 x/wasm/client/testutil/tx.go delete mode 100644 x/wasm/ibctesting/README.md delete mode 100644 x/wasm/keeper/gas_register_test.go create mode 100644 x/wasm/keeper/keeper_extension.go create mode 100644 x/wasm/keeper/migrations.go create mode 100644 x/wasm/keeper/testdata/reflect.go delete mode 100644 x/wasm/keeper/wasmtesting/gas_register.go create mode 100644 x/wasm/lbmtypes/codec.go create mode 100644 x/wasm/lbmtypes/event.pb.go create mode 100644 x/wasm/lbmtypes/proposal.go create mode 100644 x/wasm/lbmtypes/proposal.pb.go create mode 100644 x/wasm/lbmtypes/query.pb.go create mode 100644 x/wasm/lbmtypes/query.pb.gw.go create mode 100644 x/wasm/lbmtypes/tx.go create mode 100644 x/wasm/lbmtypes/tx.pb.go create mode 100644 x/wasm/lbmtypes/tx_test.go create mode 100644 x/wasm/lbmtypes/validation.go create mode 100644 x/wasm/simulation/operations_test.go create mode 100644 x/wasm/types/encoder.go create mode 100644 x/wasm/types/store.go diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 6de8b2694b..0000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,220 +0,0 @@ -version: 2.1 - -executors: - golang: - docker: - - image: circleci/golang:1.17 - working_directory: /go/src/github.com/cosmwasm/wasmd - -commands: - make: - parameters: - description: - type: string - target: - type: string - steps: - - attach_workspace: - at: /tmp/bin - - restore_cache: - name: "Restore source code cache" - keys: - - go-src-v1-{{ .Revision }} - - checkout - - restore_cache: - name: "Restore go modules cache" - keys: - - go-mod-v1-{{ checksum "go.sum" }} - - run: - name: << parameters.description >> - command: | - export BINDIR=/tmp/bin - make << parameters.target >> - -jobs: - setup-dependencies: - executor: golang - steps: - - checkout - - restore_cache: - name: "Restore go modules cache" - keys: - - go-mod-v1-{{ checksum "go.sum" }} - - run: - name: Cache go modules - command: make go-mod-cache - - run: - name: Build - command: make build - - run: - name: "Git garbage collection" - command: git gc - - save_cache: - name: "Save go modules cache" - key: go-mod-v1-{{ checksum "go.sum" }} - paths: - - "/go/pkg/mod" - - save_cache: - name: "Save source code cache" - key: go-src-v1-{{ .Revision }} - paths: - - ".git" - - lint: - docker: - - image: golangci/golangci-lint:v1.43.0 - steps: - - checkout - - run: - name: Lint - command: | - golangci-lint run --version - golangci-lint run --tests=false --timeout=5m0s - - test-cover: - executor: golang - parallelism: 4 - steps: - - checkout - - restore_cache: - keys: - - go-mod-v1-{{ checksum "go.sum" }} - - run: - name: Run tests with coverage - command: | - export GORACE=halt_on_error=1 - export VERSION="$(git describe --tags --long | sed 's/v\(.*\)/\1/')" - export GO111MODULE=on - mkdir -p /tmp/logs /tmp/workspace/profiles - for pkg in $(go list ./... | grep -v '/simulation' | circleci tests split); do - id=$(echo "$pkg" | sed 's|[/.]|_|g') - go test -mod=readonly -timeout 8m -race -coverprofile=/tmp/workspace/profiles/$id.out -covermode=atomic -tags='ledger test_ledger_mock' "$pkg" | tee "/tmp/logs/$id-$RANDOM.log" - done - - persist_to_workspace: - root: /tmp/workspace - paths: - - "profiles/*" - - store_artifacts: - path: /tmp/logs - - benchmark: - executor: golang - parallelism: 1 - steps: - - checkout - - restore_cache: - keys: - - go-mod-v1-{{ checksum "go.sum" }} - - run: - name: Benchmarks for gas calculations - command: | - cd ./x/wasm/keeper - go test -bench . - - run: - name: Benchmarks to compare with native modules - command: | - cd ./benchmarks - go test -bench . - - upload-coverage: - executor: golang - steps: - - attach_workspace: - at: /tmp/workspace - - checkout - - run: - name: gather - command: | - set -ex - - echo "--> Concatenating profiles:" - ls /tmp/workspace/profiles/ - echo "mode: atomic" > coverage.txt - for prof in $(ls /tmp/workspace/profiles/); do - tail -n +2 /tmp/workspace/profiles/"$prof" >> coverage.txt - done - - run: - name: upload - command: bash <(curl -s https://codecov.io/bash) -f coverage.txt - - docker-image: - executor: golang - steps: - - attach_workspace: - at: /tmp/workspace - - checkout - - setup_remote_docker: - # >= v20.10 https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.14.0#faccessat2 - version: 20.10.11 - - run: - name: Build Docker artifact - command: docker build --pull -t "cosmwasm/wasmd:${CIRCLE_SHA1}" . - - run: - name: Push application Docker image to docker hub - command: | - if [ "${CIRCLE_BRANCH}" = "master" ]; then - docker tag "cosmwasm/wasmd:${CIRCLE_SHA1}" cosmwasm/wasmd:latest - docker login --password-stdin -u "$DOCKER_USER" \<<<"$DOCKER_PASS" - docker push cosmwasm/wasmd:latest - docker logout - fi - - docker-tagged: - executor: golang - steps: - - attach_workspace: - at: /tmp/workspace - - checkout - - setup_remote_docker: - # >= v20.10 https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.14.0#faccessat2 - version: 20.10.11 - - run: - name: Build Docker artifact - command: docker build --pull -t "cosmwasm/wasmd:${CIRCLE_TAG}" . - - run: - name: Push application Docker image to docker hub - command: | - docker login --password-stdin -u "$DOCKER_USER" \<<<"$DOCKER_PASS" - docker push "cosmwasm/wasmd:${CIRCLE_TAG}" - docker logout - -workflows: - version: 2 - test-suite: - jobs: - # this is now a slow process... let's only run on master - - docker-image: - requires: - - setup-dependencies - filters: - branches: - only: - - master - - docker-tagged: - filters: - tags: - only: - - /^v.*/ - branches: - ignore: - - /.*/ - requires: - - setup-dependencies - - setup-dependencies: - # filters here are needed to enable this job also for tags - filters: - tags: - only: - - /^v.*/ - - lint: - requires: - - setup-dependencies - - test-cover: - requires: - - setup-dependencies - - upload-coverage: - requires: - - test-cover - - benchmark: - requires: - - test-cover diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 0cafc186e0..0000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,5 +0,0 @@ -# CODEOWNERS: https://help.github.com/articles/about-codeowners/ - -# Primary repo maintainers -* @ethanfrey -* @alpe diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..dc944d5be1 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ + + +## Description + +closes: #XXXX + +## Motivation and context + + + +## How has this been tested? + + + + +## Screenshots (if appropriate): + +## Checklist: + + + +- [ ] I followed the [contributing guidelines](https://github.com/line/lbm-sdk/blob/main/CONTRIBUTING.md) and [code of conduct](https://github.com/line/lbm-sdk/blob/main/CODE_OF_CONDUCT.md). +- [ ] I have added a relevant changelog to `CHANGELOG.md` +- [ ] I have added tests to cover my changes. +- [ ] I have updated the documentation accordingly. +- [ ] I have updated API documentation `client/docs/swagger-ui/swagger.yaml` \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1c9557cc89..088cbc66e1 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,27 +6,15 @@ updates: interval: daily open-pull-requests-limit: 10 ignore: - - dependency-name: github.com/CosmWasm/wasmvm + - dependency-name: github.com/line/wasmvm versions: - - 0.14.0-beta2 - - 0.14.0-beta3 - - 0.14.0-beta4 - - 0.14.0-beta5 - - 0.14.0-rc1 - - dependency-name: github.com/tendermint/tendermint + - 1.0.0-0.10.0 + - dependency-name: github.com/line/ostracon versions: - - 0.34.10 - - 0.34.4 - - 0.34.7 - - 0.34.8 - - 0.34.9 - - dependency-name: github.com/cosmos/cosmos-sdk + - 1.0.7 + - dependency-name: github.com/line/lbm-sdk versions: - - 0.41.4 - - 0.42.0 - - 0.42.1 - - 0.42.2 - - 0.42.4 + - 0.46.0 - dependency-name: google.golang.org/grpc versions: - 1.36.0 diff --git a/.github/workflows/codeql-analizer.yml b/.github/workflows/codeql-analizer.yml index 0232dc356e..c1ee968796 100644 --- a/.github/workflows/codeql-analizer.yml +++ b/.github/workflows/codeql-analizer.yml @@ -23,13 +23,13 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: 'go' queries: crypto-com/cosmos-sdk-codeql@main,security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000000..8c4291f86b --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,32 @@ +name: Lint + +on: + pull_request: + push: + branches: + - main + +jobs: + golangci: + name: golangci-lint + runs-on: ubuntu-latest + timeout-minutes: 6 + steps: + - uses: actions/setup-go@v3.5.0 + with: + go-version: 1.18 + - uses: actions/checkout@v3 + - uses: technote-space/get-diff-action@v6.1.2 + id: git_diff + with: + PATTERNS: | + **/**.go + go.mod + go.sum + - uses: golangci/golangci-lint-action@master + with: + # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. + version: v1.50.1 + args: --timeout 10m + github-token: ${{ secrets.GITHUB_TOKEN }} + if: env.GIT_DIFF diff --git a/.github/workflows/proto-buf-publisher.yml b/.github/workflows/proto-buf-publisher.yml deleted file mode 100644 index db849119ba..0000000000 --- a/.github/workflows/proto-buf-publisher.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Proto Buf Publishing - Action -# Protobuf runs buf (https://buf.build/) push updated proto files to https://buf.build/cosmwasm/wasmd -# This workflow is only run when a .proto file has been changed -on: - push: - branches: - - master - paths: - - 'proto/**' - -jobs: - push: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: bufbuild/buf-setup-action@v0.7.0 - - # lint checks - - uses: bufbuild/buf-lint-action@v1 - with: - input: 'proto' - - # TODO: Add this when project is more stable. - # backward compatibility breaking checks - #- uses: bufbuild/buf-breaking-action@v1 - # with: - # input: 'proto' - # against: 'https://github.com/CosmWasm/wasmd.git#branch=master' - - # publish proto files - - uses: bufbuild/buf-push-action@v1 - with: - input: 'proto' - buf_token: ${{ secrets.BUF_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000000..522cbf4b4f --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,76 @@ +name: Tests + +on: + pull_request: + push: + branches: + - main + +jobs: + cleanup-runs: + runs-on: ubuntu-latest + steps: + - uses: rokroskar/workflow-run-cleanup-action@master + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + if: "!startsWith(github.ref, 'refs/tags/') && github.ref != 'refs/heads/main'" + + test-cover: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3.5.0 + with: + go-version: 1.18 + - name: Display go version + run: go version + - name: Check if difference + uses: technote-space/get-diff-action@v6.1.2 + id: git_diff + with: + PATTERNS: | + **/**.go + go.mod + go.sum + .github/workflows/test.yml + - name: Build + run: make build + if: env.GIT_DIFF + - name: Test & Coverage repoting + run: make test-cover + if: env.GIT_DIFF + - name: Upload coverage report + uses: codecov/codecov-action@v3.1.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + file: ./coverage.txt + if: env.GIT_DIFF + + benchmark: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3.5.0 + with: + go-version: 1.18 + - name: Display go version + run: go version + - name: Check if difference + uses: technote-space/get-diff-action@v6.1.2 + id: git_diff + with: + PATTERNS: | + **/**.go + go.mod + go.sum + .github/workflows/test.yml + - name: Benchmarks for gas calculations + run: | + cd ./x/wasm/keeper + go test -bench . + if: env.GIT_DIFF + - name: Benchmarks to compare with native modules + run: | + cd ./benchmarks + go test -bench . + if: env.GIT_DIFF diff --git a/CHANGELOG.md b/CHANGELOG.md index a718846617..46050685b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,371 +1,22 @@ # Changelog -## [Unreleased](https://github.com/CosmWasm/wasmd/tree/HEAD) +## [Unreleased](https://github.com/line/wasmd/tree/HEAD) -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.27.0...HEAD) +### Improvements +* [\#1](https://github.com/line/wasmd/pull/1) apply all changes of `x/wasm` in lbm-sdk until [lbm-sdk@3bdcb6ffe01c81615bedb777ca0e039cc46ef00c](https://github.com/line/lbm-sdk/tree/3bdcb6ffe01c81615bedb777ca0e039cc46ef00c) -## [v0.27.0](https://github.com/CosmWasm/wasmd/tree/v0.27.0) (2022-05-19) +### Bug Fixes -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.26.0...v0.27.0) +### Breaking Changes -**API Breaking** -Yes +### Build, CI -**Fixed bugs:** +### Document Updates -- Fix: allow no admin in instantiation through proposal [\#828](https://github.com/CosmWasm/wasmd/pull/828) ([jhernandezb](https://github.com/jhernandezb)) -- Fix SudoContractProposal and ExecuteContractProposal [\#808](https://github.com/CosmWasm/wasmd/pull/808) ([the-frey](https://github.com/the-frey)) -**Implemented Enhancements** -- Add UpdateInstantiateConfig governance proposal [\#820](https://github.com/CosmWasm/wasmd/pull/796) ([jhernandezb](https://github.com/jhernandezb)) -- Upgrade wasmvm to v1.0.0 [\#844](https://github.com/CosmWasm/wasmd/pull/844) and [\#858](https://github.com/CosmWasm/wasmd/pull/858) -- Support state sync [\#478](https://github.com/CosmWasm/wasmd/issues/478) -- Upgrade to ibc-go v3 [\#806](https://github.com/CosmWasm/wasmd/issues/806) -- Initial ICA integration [\#837](https://github.com/CosmWasm/wasmd/pull/837) ([ethanfrey](https://github.com/ethanfrey)) -- Consolidate MaxWasmSize constraints into a single var [\#826](https://github.com/CosmWasm/wasmd/pull/826) -- Add AccessConfig to CodeInfo query response [\#829](https://github.com/CosmWasm/wasmd/issues/829) -- Bump sdk to v0.45.4 [\#818](https://github.com/CosmWasm/wasmd/pull/818) ([alpe](https://github.com/alpe)) -- Bump buf docker image to fix proto generation issues [\#820](https://github.com/CosmWasm/wasmd/pull/820) ([alpe](https://github.com/alpe)) -- Add MsgStoreCode and MsgInstantiateContract support to simulations [\#831](https://github.com/CosmWasm/wasmd/pull/831) ([pinosu](https://github.com/pinosu)) +## [cosmwasm/wasmd v0.27.0](https://github.com/CosmWasm/wasmd/blob/v0.27.0/CHANGELOG.md) (2022-05-19) +Initial wasmd is based on the cosmwasm/wasmd v0.27.0 -**Implemented Enhancements** +* cosmwasm/wasmd [v0.27.0](https://github.com/CosmWasm/wasmd/releases/tag/v0.27.0) -- Make MaxLabelSize a var not const [\#822](https://github.com/CosmWasm/wasmd/pull/822) - -## [v0.26.0](https://github.com/CosmWasm/wasmd/tree/v0.26.0) (2022-04-21) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.25.0...v0.26.0) - -**Fixed bugs:** - -- Unpack contract details from genesis [\#802](https://github.com/CosmWasm/wasmd/pull/802) - -**Closed issues:** - -- Issue Updating uploadAccess Param [\#804](https://github.com/CosmWasm/wasmd/issues/804) -- Add tx query to wasmd QueryPlugins for smart contract [\#788](https://github.com/CosmWasm/wasmd/issues/788) - -**Merged pull requests:** - -- Disable stargate queries [\#812](https://github.com/CosmWasm/wasmd/pull/812) -- Gov param change examples [\#805](https://github.com/CosmWasm/wasmd/pull/805) -- Create link to SECURITY.md in other repo [\#801](https://github.com/CosmWasm/wasmd/pull/801) -- Tests some event edge cases [\#799](https://github.com/CosmWasm/wasmd/pull/799) - -## [v0.25.0](https://github.com/CosmWasm/wasmd/tree/v0.25.0) (2022-04-06) - -**API Breaking** -- Upgrade wasmvm to v1.0.0-beta10 [\#790](https://github.com/CosmWasm/wasmd/pull/790), [\#800](https://github.com/CosmWasm/wasmd/pull/800) - -**Implemented Enhancements** -- Fix: close iterators [\#792](https://github.com/CosmWasm/wasmd/pull/792) -- Use callback pattern for contract state iterator [\#794](https://github.com/CosmWasm/wasmd/pull/794) -- Bump github.com/stretchr/testify from 1.7.0 to 1.7.1 [\#787](https://github.com/CosmWasm/wasmd/pull/787) -- Bump github.com/cosmos/ibc-go/v2 from 2.0.3 to 2.2.0 [\#786](https://github.com/CosmWasm/wasmd/pull/786) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.24.0...v0.25.0) - -## [v0.24.0](https://github.com/CosmWasm/wasmd/tree/v0.24.0) (2022-03-09) - -**API Breaking** -- Add cosmwasm project prefix to REST query paths [\#743](https://github.com/CosmWasm/wasmd/issues/743) -- Add support for old contract addresses of length 20 [\#758](https://github.com/CosmWasm/wasmd/issues/758) -- Update wasmvm to 1.0.0-beta7 (incl wasmer 2.2) [\#774](https://github.com/CosmWasm/wasmd/issues/774) - -**Fixed bugs** -- Add missing colons in String of some proposals [\#752](https://github.com/CosmWasm/wasmd/pull/752) -- Replace custom codec with SDK codec (needed for rosetta) [\#760](https://github.com/CosmWasm/wasmd/pull/760) -- Support `--no-admin` flag on cli for gov instantiation [\#771](https://github.com/CosmWasm/wasmd/pull/771) - -**Implemented Enhancements** -- Add support for Buf Build [\#753](https://github.com/CosmWasm/wasmd/pull/753), [\#755](https://github.com/CosmWasm/wasmd/pull/755), [\#756](https://github.com/CosmWasm/wasmd/pull/756) -- Redact most errors sent to contracts, for better determinism guarantees [\#765](https://github.com/CosmWasm/wasmd/pull/765), [\#775](https://github.com/CosmWasm/wasmd/pull/775) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.23.0...v0.24.0) - -## [v0.23.0](https://github.com/CosmWasm/wasmd/tree/v0.23.0) (2022-01-28) - -**Fixed bugs** -- Set end block order [\#736](https://github.com/CosmWasm/wasmd/issues/736) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.22.0...v0.23.0) - -## [v0.22.0](https://github.com/CosmWasm/wasmd/tree/v0.22.0) (2022-01-20) - -**Api Breaking:** -- Upgrade to cosmos-sdk v0.45.0 [\#717](https://github.com/CosmWasm/wasmd/pull/717) -- Upgrade wasmvm to v1.0.0-beta5 [\#714](https://github.com/CosmWasm/wasmd/pull/714) - -**Implemented Enhancements:** -- Use proper SystemError::NoSuchContract on ContractInfo if missing [\#687](https://github.com/CosmWasm/wasmd/issues/687) -- Benchmark tests flickering: directory not empty [\#659](https://github.com/CosmWasm/wasmd/issues/659) -- Implement PinCode and UnpinCode proposal client handlers [\#707](https://github.com/CosmWasm/wasmd/pull/707) ([orkunkl](https://github.com/orkunkl)) -- Use replace statements to enforce consistent versioning. [\#692](https://github.com/CosmWasm/wasmd/pull/692) ([faddat](https://github.com/faddat)) -- Fixed circleci by removing the golang executor from a docker build -- Go 1.17 provides a much clearer go.mod file [\#679](https://github.com/CosmWasm/wasmd/pull/679) ([faddat](https://github.com/faddat)) -- Autopin wasm code uploaded by gov proposal [\#726](https://github.com/CosmWasm/wasmd/pull/726) ([ethanfrey](https://github.com/ethanfrey)) -- You must explicitly declare --no-admin on cli instantiate if that is what you want [\#727](https://github.com/CosmWasm/wasmd/pull/727) ([ethanfrey](https://github.com/ethanfrey)) -- Add governance proposals for Wasm Execute and Sudo [\#730](https://github.com/CosmWasm/wasmd/pull/730) ([ethanfrey](https://github.com/ethanfrey)) -- Remove unused run-as flag from Wasm Migrate proposals [\#730](https://github.com/CosmWasm/wasmd/pull/730) ([ethanfrey](https://github.com/ethanfrey)) -- Expose wasm/Keeper.SetParams [\#732](https://github.com/CosmWasm/wasmd/pull/732) ([ethanfrey](https://github.com/ethanfrey)) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.21.0...v0.22.0) - - -## [v0.21.0](https://github.com/CosmWasm/wasmd/tree/v0.21.0) (2021-11-17) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.20.0...v0.21.0) - -**Fixed bugs + Api Breaking:** -- Prevent infinite gas consumption in simulation queries [\#670](https://github.com/CosmWasm/wasmd/issues/670) -- Amino JSON representation of inner message in Msg{Instantiate,Migrate,Execute}Contract [\#642](https://github.com/CosmWasm/wasmd/issues/642) - -**Implemented Enhancements:** -- Bump wasmvm to v1.0.0-beta2 [\#676](https://github.com/CosmWasm/wasmd/pull/676) -- Add Benchmarks to compare with native modules [\#635](https://github.com/CosmWasm/wasmd/issues/635) -- Document M1 is not supported [\#653](https://github.com/CosmWasm/wasmd/issues/653) -- Open read access to sequences [\#669](https://github.com/CosmWasm/wasmd/pull/669) -- Remove unused flags from command prompt for storing contract [\#647](https://github.com/CosmWasm/wasmd/issues/647) -- Ran `make format` [\#649](https://github.com/CosmWasm/wasmd/issues/649) -- Add golangci lint check to circleci jobs [\620](https://github.com/CosmWasm/wasmd/issues/620) -- Updated error log statements in initGenesis for easier debugging: [\#643](https://github.com/CosmWasm/wasmd/issues/643) -- Bump github.com/cosmos/iavl from 0.17.1 to 0.17.2 [\#673](https://github.com/CosmWasm/wasmd/pull/673) -- Bump github.com/rs/zerolog from 1.25.0 to 1.26.0 [\#666](https://github.com/CosmWasm/wasmd/pull/666) - -## [v0.20.0](https://github.com/CosmWasm/wasmd/tree/v0.20.0) (2021-10-08) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.19.0...v0.20.0) - -**Fixed bugs:** - -- Add capabilities to begin block [\#626](https://github.com/CosmWasm/wasmd/pull/626) - -**Api Breaking:** -- Update to wasmvm 1.0.0-soon2 [\#624](https://github.com/CosmWasm/wasmd/issues/624) - -**Implemented Enhancements:** - -- Upgrade Cosmos-sdk v0.42.10 [\#627](https://github.com/CosmWasm/wasmd/pull/627) ([alpe](https://github.com/alpe)) -- Add transaction index implemented as counter [\#601](https://github.com/CosmWasm/wasmd/issues/601) -- Fix inconsistent return of `contractAddress` from `keeper/init()`? [\#616](https://github.com/CosmWasm/wasmd/issues/616) -- Query pinned wasm codes [\#596](https://github.com/CosmWasm/wasmd/issues/596) -- Doc IBC Events [\#593](https://github.com/CosmWasm/wasmd/issues/593) -- Allow contract Info query from the contract [\#584](https://github.com/CosmWasm/wasmd/issues/584) -- Revisit reply gas costs for submessages. [\#450](https://github.com/CosmWasm/wasmd/issues/450) -- Benchmarks for gas pricing [\#634](https://github.com/CosmWasm/wasmd/pull/634) -- Treat all contracts as pinned for gas costs in reply [\#630](https://github.com/CosmWasm/wasmd/pull/630) -- Bump github.com/spf13/viper from 1.8.1 to 1.9.0 [\#615](https://github.com/CosmWasm/wasmd/pull/615) - -## [v0.19.0](https://github.com/CosmWasm/wasmd/tree/v0.19.0) (2021-09-15) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.18.0...v0.19.0) - -**Fixed bugs:** - -- Ensure Queries are executed read only [\#610](https://github.com/CosmWasm/wasmd/issues/610) -- Fix bug in query handler initialization on reply [\#604](https://github.com/CosmWasm/wasmd/issues/604) - -**Api Breaking:** -- Bump Go version to 1.16 [\#612](https://github.com/CosmWasm/wasmd/pull/612) - -**Implemented Enhancements:** - -- Ensure query isolation [\#611](https://github.com/CosmWasm/wasmd/pull/611) -- Optimize BalanceQuery [\#609](https://github.com/CosmWasm/wasmd/pull/609) -- Bump wasmvm to v0.16.1 [\#605](https://github.com/CosmWasm/wasmd/pull/605) -- Bump github.com/rs/zerolog from 1.23.0 to 1.25.0 [\#603](https://github.com/CosmWasm/wasmd/pull/603) -- Add decorator options [\#598](https://github.com/CosmWasm/wasmd/pull/598) -- Bump github.com/spf13/cast from 1.4.0 to 1.4.1 [\#592](https://github.com/CosmWasm/wasmd/pull/592) - -## [v0.18.0](https://github.com/CosmWasm/wasmd/tree/v0.18.0) (2021-08-16) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.17.0...v0.18.0) - -**Api Breaking:** -- Events documented and refactored [\#448](https://github.com/CosmWasm/wasmd/issues/448), [\#589](https://github.com/CosmWasm/wasmd/pull/589), [\#587](https://github.com/CosmWasm/wasmd/issues/587) -- Add organisation to grpc gateway path [\#578](https://github.com/CosmWasm/wasmd/pull/578) -- Move Proto version from `v1beta1` to `v1` for all cosmwasm.wasm.* types - [\#563](https://github.com/CosmWasm/wasmd/pull/563) -- Renamed InitMsg and MigrateMsg fields to Msg. This applies to protobuf Msg - and Proposals, as well as REST and CLI [\#563](https://github.com/CosmWasm/wasmd/pull/563) -- Removed source and builder fields from StoreCode and CodeInfo. They were rarely used. - [\#564](https://github.com/CosmWasm/wasmd/pull/564) -- Changed contract address derivation function. If you hardcoded the first contract - addresses anywhere (in scripts?), please update them. - [\#565](https://github.com/CosmWasm/wasmd/pull/565) - -**Implemented Enhancements:** -- Cosmos SDK 0.42.9, wasmvm 0.16.0 [\#582](https://github.com/CosmWasm/wasmd/pull/582) -- Better ibc contract interface [\#570](https://github.com/CosmWasm/wasmd/pull/570) ([ethanfrey](https://github.com/ethanfrey)) -- Reject invalid events/attributes returned from contracts [\#560](https://github.com/CosmWasm/wasmd/pull/560) -- IBC Query methods from Wasm contracts only return OPEN channels [\#568](https://github.com/CosmWasm/wasmd/pull/568) -- Extendable gas costs [\#525](https://github.com/CosmWasm/wasmd/issues/525) -- Limit init/migrate/execute payload message size [\#203](https://github.com/CosmWasm/wasmd/issues/203) -- Add cli alias [\#496](https://github.com/CosmWasm/wasmd/issues/496) -- Remove max gas limit [\#529](https://github.com/CosmWasm/wasmd/pull/529) ([alpe](https://github.com/alpe)) -- Add SECURITY.md [\#303](https://github.com/CosmWasm/wasmd/issues/303) - -## [v0.17.0](https://github.com/CosmWasm/wasmd/tree/v0.17.0) (2021-05-26) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.16.0...v0.17.0) - -**Features:** -- Remove json type cast for contract msgs [\#520](https://github.com/CosmWasm/wasmd/pull/520) ([alpe](https://github.com/alpe)) -- Bump github.com/cosmos/cosmos-sdk from 0.42.4 to 0.42.5 [\#519](https://github.com/CosmWasm/wasmd/pull/519) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview)) - -## [v0.16.0](https://github.com/CosmWasm/wasmd/tree/v0.16.0) (2021-04-30) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.15.1...v0.16.0) - -**Features:** -- Upgrade to wasmvm v0.14.0-rc1 [\#508](https://github.com/CosmWasm/wasmd/pull/508) ([alpe](https://github.com/alpe)) -- Use the cache metrics from WasmVM [\#500](https://github.com/CosmWasm/wasmd/issues/500) -- Update IBC.md [\#494](https://github.com/CosmWasm/wasmd/pull/494) ([ethanfrey](https://github.com/ethanfrey)) -- Extend ContractInfo for custom data [\#492](https://github.com/CosmWasm/wasmd/pull/492) ([alpe](https://github.com/alpe)) -- Reply response on submessages can overwrite "caller" result [\#495](https://github.com/CosmWasm/wasmd/issues/495) -- Update to sdk 0.42.4 [\#485](https://github.com/CosmWasm/wasmd/issues/485) -- Add extension points to the CLI [\#477](https://github.com/CosmWasm/wasmd/pull/477) ([alpe](https://github.com/alpe)) -- Simplify staking reward query [\#399](https://github.com/CosmWasm/wasmd/issues/399) -- Update IBC.md [\#398](https://github.com/CosmWasm/wasmd/issues/398) -- Add IBCQuery support [\#434](https://github.com/CosmWasm/wasmd/issues/434) -- Follow proto dir best practice \(in cosmos eco\) [\#342](https://github.com/CosmWasm/wasmd/issues/342) -- Remove internal package [\#464](https://github.com/CosmWasm/wasmd/pull/464) ([alpe](https://github.com/alpe)) -- Introduce new interfaces for extendability [\#471](https://github.com/CosmWasm/wasmd/pull/471) ([alpe](https://github.com/alpe)) -- Handle non default IBC transfer port in message encoder [\#396](https://github.com/CosmWasm/wasmd/issues/396) -- Collect Contract Metrics [\#387](https://github.com/CosmWasm/wasmd/issues/387) -- Add Submessages for IBC callbacks [\#449](https://github.com/CosmWasm/wasmd/issues/449) -- Handle wasmvm Burn message [\#489](https://github.com/CosmWasm/wasmd/pull/489) ([alpe](https://github.com/alpe)) -- Add telemetry [\#463](https://github.com/CosmWasm/wasmd/pull/463) ([alpe](https://github.com/alpe)) -- Handle non default transfer port id [\#462](https://github.com/CosmWasm/wasmd/pull/462) ([alpe](https://github.com/alpe)) -- Allow subsecond block times [\#453](https://github.com/CosmWasm/wasmd/pull/453) ([ethanfrey](https://github.com/ethanfrey)) -- Submsg and replies [\#441](https://github.com/CosmWasm/wasmd/pull/441) ([ethanfrey](https://github.com/ethanfrey)) -- Ibc query support [\#439](https://github.com/CosmWasm/wasmd/pull/439) ([ethanfrey](https://github.com/ethanfrey)) -- Pin/Unpin contract in cache [\#436](https://github.com/CosmWasm/wasmd/pull/436) ([alpe](https://github.com/alpe)) -- Stargate msg and query [\#435](https://github.com/CosmWasm/wasmd/pull/435) ([ethanfrey](https://github.com/ethanfrey)) -- Sudo entry point [\#433](https://github.com/CosmWasm/wasmd/pull/433) ([ethanfrey](https://github.com/ethanfrey)) -- Add custom message handler option [\#402](https://github.com/CosmWasm/wasmd/pull/402) ([alpe](https://github.com/alpe)) -- Expose contract pinning [\#401](https://github.com/CosmWasm/wasmd/issues/401) -- Add support for Stargate CosmosMsg/QueryRequest [\#388](https://github.com/CosmWasm/wasmd/issues/388) -- Add MsgInstantiateContractResponse.data [\#385](https://github.com/CosmWasm/wasmd/issues/385) -- Added randomized simulation parameters generation [\#389](https://github.com/CosmWasm/wasmd/pull/389) ([bragaz](https://github.com/bragaz)) -- Implement IBC contract support [\#394](https://github.com/CosmWasm/wasmd/pull/394) ([alpe](https://github.com/alpe)) - -**Api breaking:** -- Improve list contracts by code query [\#497](https://github.com/CosmWasm/wasmd/pull/497) ([alpe](https://github.com/alpe)) -- Rename to just `funds` [/#423](https://github.com/CosmWasm/wasmd/issues/423) - -**Fixed bugs:** - -- Correct order for migrated contracts [\#323](https://github.com/CosmWasm/wasmd/issues/323) -- Keeper Send Coins does not perform expected validation [\#414](https://github.com/CosmWasm/wasmd/issues/414) - -## [v0.15.1](https://github.com/CosmWasm/wasmd/tree/v0.15.1) (2021-02-18) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.15.0...v0.15.1) - -**Implemented enhancements:** - -- Support custom MessageHandler in wasm [\#327](https://github.com/CosmWasm/wasmd/issues/327) - -**Fixed bugs:** - -- Fix Parameter change via proposal [\#392](https://github.com/CosmWasm/wasmd/issues/392) - -## [v0.15.0](https://github.com/CosmWasm/wasmd/tree/v0.15.0) (2021-01-27) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.14.1...v0.15.0) - -**Features:** -- Upgrade to cosmos-sdk v0.41.0 [\#390](https://github.com/CosmWasm/wasmd/pull/390) - -## [v0.14.1](https://github.com/CosmWasm/wasmd/tree/v0.14.1) (2021-01-20) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.14.0...v0.14.1) - -**Features:** -- Upgrade to cosmos-sdk v0.40.1 final + Tendermint 0.34.3 [\#380](https://github.com/CosmWasm/wasmd/pull/380) - -## [v0.14.0](https://github.com/CosmWasm/wasmd/tree/v0.14.0) (2021-01-11) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.13.0...v0.14.0) - -**Features:** -- Upgrade to cosmos-sdk v0.40.0 final [\#354](https://github.com/CosmWasm/wasmd/pull/369) -- Refactor to GRPC message server [\#366](https://github.com/CosmWasm/wasmd/pull/366) -- Make it easy to initialize contracts in genesis file with new CLI commands[\#326](https://github.com/CosmWasm/wasmd/issues/326) -- Upgrade to WasmVM v0.13.0 [\#358](https://github.com/CosmWasm/wasmd/pull/358) -- Upgrade to cosmos-sdk v0.40.0-rc6 [\#354](https://github.com/CosmWasm/wasmd/pull/354) -- Upgrade to cosmos-sdk v0.40.0-rc5 [\#344](https://github.com/CosmWasm/wasmd/issues/344) -- Add Dependabot to keep dependencies secure and up-to-date [\#336](https://github.com/CosmWasm/wasmd/issues/336) - -**Fixed bugs:** - -- Dependabot can't resolve your Go dependency files [\#339](https://github.com/CosmWasm/wasmd/issues/339) -- Errors in `InitGenesis` [\#335](https://github.com/CosmWasm/wasmd/issues/335) -- Invalid homeDir for export command [\#334](https://github.com/CosmWasm/wasmd/issues/334) - -## [v0.13.0](https://github.com/CosmWasm/wasmd/tree/v0.13.0) (2020-12-04) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.12.1...v0.13.0) - -**Fixed bugs:** - -- REST handler wrong `Sender` source [\#324](https://github.com/CosmWasm/wasmd/issues/324) - -**Closed issues:** - -- Change proto package to match \.\.\ [\#329](https://github.com/CosmWasm/wasmd/issues/329) -- Out of gas causes panic when external contract store query executed [\#321](https://github.com/CosmWasm/wasmd/issues/321) -- Check codecov report [\#298](https://github.com/CosmWasm/wasmd/issues/298) -- cosmwasm.GoAPI will not work on sdk.ValAddress [\#264](https://github.com/CosmWasm/wasmd/issues/264) -- Stargate: Add pagination support for queries [\#242](https://github.com/CosmWasm/wasmd/issues/242) - -**Merged pull requests:** - -- Rename protobuf package [\#330](https://github.com/CosmWasm/wasmd/pull/330) ([alpe](https://github.com/alpe)) -- Use base request data for sender [\#325](https://github.com/CosmWasm/wasmd/pull/325) ([alpe](https://github.com/alpe)) -- Handle panics in query contract smart [\#322](https://github.com/CosmWasm/wasmd/pull/322) ([alpe](https://github.com/alpe)) - -## [v0.12.1](https://github.com/CosmWasm/wasmd/tree/v0.12.1) (2020-11-23) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.12.0...v0.12.1) - -**Closed issues:** - -- Complete IBC Mock testing [\#255](https://github.com/CosmWasm/wasmd/issues/255) -- Idea: do multiple queries in one API call [\#72](https://github.com/CosmWasm/wasmd/issues/72) - -**Merged pull requests:** - -- Exclude generate proto code files in coverage [\#320](https://github.com/CosmWasm/wasmd/pull/320) ([alpe](https://github.com/alpe)) -- Upgrade wasmvm to 0.12.0 [\#319](https://github.com/CosmWasm/wasmd/pull/319) ([webmaster128](https://github.com/webmaster128)) -- Fix chain id setup in contrib/local/setup\_wasmd.sh [\#318](https://github.com/CosmWasm/wasmd/pull/318) ([orkunkl](https://github.com/orkunkl)) -- Add pagination to grpc queries [\#317](https://github.com/CosmWasm/wasmd/pull/317) ([alpe](https://github.com/alpe)) - -## [v0.12.0](https://github.com/CosmWasm/wasmd/tree/v0.12.0) (2020-11-17) - -[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.12.0-alpha1...v0.12.0) - -**Closed issues:** - -- Merge wasmd and wasmcli into a single binary [\#308](https://github.com/CosmWasm/wasmd/issues/308) -- Change bech32 prefix for wasmd [\#313](https://github.com/CosmWasm/wasmd/issues/313) -- Upgrade go-cowasmwasm to wasmvm 0.12 [\#309](https://github.com/CosmWasm/wasmd/issues/309) -- Use string type for AccAddresses in proto [\#306](https://github.com/CosmWasm/wasmd/issues/306) -- Upgrade to cosmos/sdk v0.40.0-rc2 [\#296](https://github.com/CosmWasm/wasmd/issues/296) -- Generate protobuf outputs in a container [\#295](https://github.com/CosmWasm/wasmd/issues/295) -- Instantiate contract process ordering [\#292](https://github.com/CosmWasm/wasmd/issues/292) -- Make Wasm maxSize a configuration option [\#289](https://github.com/CosmWasm/wasmd/issues/289) -- Return error if wasm to big [\#287](https://github.com/CosmWasm/wasmd/issues/287) - -**Merged pull requests:** - -- Set bech32 prefix [\#316](https://github.com/CosmWasm/wasmd/pull/316) ([alpe](https://github.com/alpe)) -- Replace sdk.AccAddress with bech32 string [\#314](https://github.com/CosmWasm/wasmd/pull/314) ([alpe](https://github.com/alpe)) -- Integrate wasmcli into wasmd [\#312](https://github.com/CosmWasm/wasmd/pull/312) ([alpe](https://github.com/alpe)) -- Upgrade wasmvm aka go-cosmwasm [\#311](https://github.com/CosmWasm/wasmd/pull/311) ([alpe](https://github.com/alpe)) -- Upgrade to Stargate RC3 [\#305](https://github.com/CosmWasm/wasmd/pull/305) ([alpe](https://github.com/alpe)) -- Containerized Protobuf generation [\#304](https://github.com/CosmWasm/wasmd/pull/304) ([alpe](https://github.com/alpe)) -- Reject wasm code exceeding limit [\#302](https://github.com/CosmWasm/wasmd/pull/302) ([alpe](https://github.com/alpe)) -- Support self calling contract on instantiation [\#300](https://github.com/CosmWasm/wasmd/pull/300) ([alpe](https://github.com/alpe)) -- Upgrade to Stargate RC2 [\#299](https://github.com/CosmWasm/wasmd/pull/299) ([alpe](https://github.com/alpe)) +Please refer [CHANGELOG_OF_COSMWASM_WASMD_v0.27.0](https://github.com/CosmWasm/wasmd/blob/v0.27.0/CHANGELOG.md) \ No newline at end of file diff --git a/COSMWASM_CHANGELOG.md b/COSMWASM_CHANGELOG.md new file mode 100644 index 0000000000..a718846617 --- /dev/null +++ b/COSMWASM_CHANGELOG.md @@ -0,0 +1,371 @@ +# Changelog + +## [Unreleased](https://github.com/CosmWasm/wasmd/tree/HEAD) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.27.0...HEAD) + +## [v0.27.0](https://github.com/CosmWasm/wasmd/tree/v0.27.0) (2022-05-19) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.26.0...v0.27.0) + +**API Breaking** +Yes + +**Fixed bugs:** + +- Fix: allow no admin in instantiation through proposal [\#828](https://github.com/CosmWasm/wasmd/pull/828) ([jhernandezb](https://github.com/jhernandezb)) +- Fix SudoContractProposal and ExecuteContractProposal [\#808](https://github.com/CosmWasm/wasmd/pull/808) ([the-frey](https://github.com/the-frey)) + +**Implemented Enhancements** +- Add UpdateInstantiateConfig governance proposal [\#820](https://github.com/CosmWasm/wasmd/pull/796) ([jhernandezb](https://github.com/jhernandezb)) +- Upgrade wasmvm to v1.0.0 [\#844](https://github.com/CosmWasm/wasmd/pull/844) and [\#858](https://github.com/CosmWasm/wasmd/pull/858) +- Support state sync [\#478](https://github.com/CosmWasm/wasmd/issues/478) +- Upgrade to ibc-go v3 [\#806](https://github.com/CosmWasm/wasmd/issues/806) +- Initial ICA integration [\#837](https://github.com/CosmWasm/wasmd/pull/837) ([ethanfrey](https://github.com/ethanfrey)) +- Consolidate MaxWasmSize constraints into a single var [\#826](https://github.com/CosmWasm/wasmd/pull/826) +- Add AccessConfig to CodeInfo query response [\#829](https://github.com/CosmWasm/wasmd/issues/829) +- Bump sdk to v0.45.4 [\#818](https://github.com/CosmWasm/wasmd/pull/818) ([alpe](https://github.com/alpe)) +- Bump buf docker image to fix proto generation issues [\#820](https://github.com/CosmWasm/wasmd/pull/820) ([alpe](https://github.com/alpe)) +- Add MsgStoreCode and MsgInstantiateContract support to simulations [\#831](https://github.com/CosmWasm/wasmd/pull/831) ([pinosu](https://github.com/pinosu)) + +**Implemented Enhancements** + +- Make MaxLabelSize a var not const [\#822](https://github.com/CosmWasm/wasmd/pull/822) + +## [v0.26.0](https://github.com/CosmWasm/wasmd/tree/v0.26.0) (2022-04-21) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.25.0...v0.26.0) + +**Fixed bugs:** + +- Unpack contract details from genesis [\#802](https://github.com/CosmWasm/wasmd/pull/802) + +**Closed issues:** + +- Issue Updating uploadAccess Param [\#804](https://github.com/CosmWasm/wasmd/issues/804) +- Add tx query to wasmd QueryPlugins for smart contract [\#788](https://github.com/CosmWasm/wasmd/issues/788) + +**Merged pull requests:** + +- Disable stargate queries [\#812](https://github.com/CosmWasm/wasmd/pull/812) +- Gov param change examples [\#805](https://github.com/CosmWasm/wasmd/pull/805) +- Create link to SECURITY.md in other repo [\#801](https://github.com/CosmWasm/wasmd/pull/801) +- Tests some event edge cases [\#799](https://github.com/CosmWasm/wasmd/pull/799) + +## [v0.25.0](https://github.com/CosmWasm/wasmd/tree/v0.25.0) (2022-04-06) + +**API Breaking** +- Upgrade wasmvm to v1.0.0-beta10 [\#790](https://github.com/CosmWasm/wasmd/pull/790), [\#800](https://github.com/CosmWasm/wasmd/pull/800) + +**Implemented Enhancements** +- Fix: close iterators [\#792](https://github.com/CosmWasm/wasmd/pull/792) +- Use callback pattern for contract state iterator [\#794](https://github.com/CosmWasm/wasmd/pull/794) +- Bump github.com/stretchr/testify from 1.7.0 to 1.7.1 [\#787](https://github.com/CosmWasm/wasmd/pull/787) +- Bump github.com/cosmos/ibc-go/v2 from 2.0.3 to 2.2.0 [\#786](https://github.com/CosmWasm/wasmd/pull/786) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.24.0...v0.25.0) + +## [v0.24.0](https://github.com/CosmWasm/wasmd/tree/v0.24.0) (2022-03-09) + +**API Breaking** +- Add cosmwasm project prefix to REST query paths [\#743](https://github.com/CosmWasm/wasmd/issues/743) +- Add support for old contract addresses of length 20 [\#758](https://github.com/CosmWasm/wasmd/issues/758) +- Update wasmvm to 1.0.0-beta7 (incl wasmer 2.2) [\#774](https://github.com/CosmWasm/wasmd/issues/774) + +**Fixed bugs** +- Add missing colons in String of some proposals [\#752](https://github.com/CosmWasm/wasmd/pull/752) +- Replace custom codec with SDK codec (needed for rosetta) [\#760](https://github.com/CosmWasm/wasmd/pull/760) +- Support `--no-admin` flag on cli for gov instantiation [\#771](https://github.com/CosmWasm/wasmd/pull/771) + +**Implemented Enhancements** +- Add support for Buf Build [\#753](https://github.com/CosmWasm/wasmd/pull/753), [\#755](https://github.com/CosmWasm/wasmd/pull/755), [\#756](https://github.com/CosmWasm/wasmd/pull/756) +- Redact most errors sent to contracts, for better determinism guarantees [\#765](https://github.com/CosmWasm/wasmd/pull/765), [\#775](https://github.com/CosmWasm/wasmd/pull/775) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.23.0...v0.24.0) + +## [v0.23.0](https://github.com/CosmWasm/wasmd/tree/v0.23.0) (2022-01-28) + +**Fixed bugs** +- Set end block order [\#736](https://github.com/CosmWasm/wasmd/issues/736) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.22.0...v0.23.0) + +## [v0.22.0](https://github.com/CosmWasm/wasmd/tree/v0.22.0) (2022-01-20) + +**Api Breaking:** +- Upgrade to cosmos-sdk v0.45.0 [\#717](https://github.com/CosmWasm/wasmd/pull/717) +- Upgrade wasmvm to v1.0.0-beta5 [\#714](https://github.com/CosmWasm/wasmd/pull/714) + +**Implemented Enhancements:** +- Use proper SystemError::NoSuchContract on ContractInfo if missing [\#687](https://github.com/CosmWasm/wasmd/issues/687) +- Benchmark tests flickering: directory not empty [\#659](https://github.com/CosmWasm/wasmd/issues/659) +- Implement PinCode and UnpinCode proposal client handlers [\#707](https://github.com/CosmWasm/wasmd/pull/707) ([orkunkl](https://github.com/orkunkl)) +- Use replace statements to enforce consistent versioning. [\#692](https://github.com/CosmWasm/wasmd/pull/692) ([faddat](https://github.com/faddat)) +- Fixed circleci by removing the golang executor from a docker build +- Go 1.17 provides a much clearer go.mod file [\#679](https://github.com/CosmWasm/wasmd/pull/679) ([faddat](https://github.com/faddat)) +- Autopin wasm code uploaded by gov proposal [\#726](https://github.com/CosmWasm/wasmd/pull/726) ([ethanfrey](https://github.com/ethanfrey)) +- You must explicitly declare --no-admin on cli instantiate if that is what you want [\#727](https://github.com/CosmWasm/wasmd/pull/727) ([ethanfrey](https://github.com/ethanfrey)) +- Add governance proposals for Wasm Execute and Sudo [\#730](https://github.com/CosmWasm/wasmd/pull/730) ([ethanfrey](https://github.com/ethanfrey)) +- Remove unused run-as flag from Wasm Migrate proposals [\#730](https://github.com/CosmWasm/wasmd/pull/730) ([ethanfrey](https://github.com/ethanfrey)) +- Expose wasm/Keeper.SetParams [\#732](https://github.com/CosmWasm/wasmd/pull/732) ([ethanfrey](https://github.com/ethanfrey)) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.21.0...v0.22.0) + + +## [v0.21.0](https://github.com/CosmWasm/wasmd/tree/v0.21.0) (2021-11-17) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.20.0...v0.21.0) + +**Fixed bugs + Api Breaking:** +- Prevent infinite gas consumption in simulation queries [\#670](https://github.com/CosmWasm/wasmd/issues/670) +- Amino JSON representation of inner message in Msg{Instantiate,Migrate,Execute}Contract [\#642](https://github.com/CosmWasm/wasmd/issues/642) + +**Implemented Enhancements:** +- Bump wasmvm to v1.0.0-beta2 [\#676](https://github.com/CosmWasm/wasmd/pull/676) +- Add Benchmarks to compare with native modules [\#635](https://github.com/CosmWasm/wasmd/issues/635) +- Document M1 is not supported [\#653](https://github.com/CosmWasm/wasmd/issues/653) +- Open read access to sequences [\#669](https://github.com/CosmWasm/wasmd/pull/669) +- Remove unused flags from command prompt for storing contract [\#647](https://github.com/CosmWasm/wasmd/issues/647) +- Ran `make format` [\#649](https://github.com/CosmWasm/wasmd/issues/649) +- Add golangci lint check to circleci jobs [\620](https://github.com/CosmWasm/wasmd/issues/620) +- Updated error log statements in initGenesis for easier debugging: [\#643](https://github.com/CosmWasm/wasmd/issues/643) +- Bump github.com/cosmos/iavl from 0.17.1 to 0.17.2 [\#673](https://github.com/CosmWasm/wasmd/pull/673) +- Bump github.com/rs/zerolog from 1.25.0 to 1.26.0 [\#666](https://github.com/CosmWasm/wasmd/pull/666) + +## [v0.20.0](https://github.com/CosmWasm/wasmd/tree/v0.20.0) (2021-10-08) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.19.0...v0.20.0) + +**Fixed bugs:** + +- Add capabilities to begin block [\#626](https://github.com/CosmWasm/wasmd/pull/626) + +**Api Breaking:** +- Update to wasmvm 1.0.0-soon2 [\#624](https://github.com/CosmWasm/wasmd/issues/624) + +**Implemented Enhancements:** + +- Upgrade Cosmos-sdk v0.42.10 [\#627](https://github.com/CosmWasm/wasmd/pull/627) ([alpe](https://github.com/alpe)) +- Add transaction index implemented as counter [\#601](https://github.com/CosmWasm/wasmd/issues/601) +- Fix inconsistent return of `contractAddress` from `keeper/init()`? [\#616](https://github.com/CosmWasm/wasmd/issues/616) +- Query pinned wasm codes [\#596](https://github.com/CosmWasm/wasmd/issues/596) +- Doc IBC Events [\#593](https://github.com/CosmWasm/wasmd/issues/593) +- Allow contract Info query from the contract [\#584](https://github.com/CosmWasm/wasmd/issues/584) +- Revisit reply gas costs for submessages. [\#450](https://github.com/CosmWasm/wasmd/issues/450) +- Benchmarks for gas pricing [\#634](https://github.com/CosmWasm/wasmd/pull/634) +- Treat all contracts as pinned for gas costs in reply [\#630](https://github.com/CosmWasm/wasmd/pull/630) +- Bump github.com/spf13/viper from 1.8.1 to 1.9.0 [\#615](https://github.com/CosmWasm/wasmd/pull/615) + +## [v0.19.0](https://github.com/CosmWasm/wasmd/tree/v0.19.0) (2021-09-15) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.18.0...v0.19.0) + +**Fixed bugs:** + +- Ensure Queries are executed read only [\#610](https://github.com/CosmWasm/wasmd/issues/610) +- Fix bug in query handler initialization on reply [\#604](https://github.com/CosmWasm/wasmd/issues/604) + +**Api Breaking:** +- Bump Go version to 1.16 [\#612](https://github.com/CosmWasm/wasmd/pull/612) + +**Implemented Enhancements:** + +- Ensure query isolation [\#611](https://github.com/CosmWasm/wasmd/pull/611) +- Optimize BalanceQuery [\#609](https://github.com/CosmWasm/wasmd/pull/609) +- Bump wasmvm to v0.16.1 [\#605](https://github.com/CosmWasm/wasmd/pull/605) +- Bump github.com/rs/zerolog from 1.23.0 to 1.25.0 [\#603](https://github.com/CosmWasm/wasmd/pull/603) +- Add decorator options [\#598](https://github.com/CosmWasm/wasmd/pull/598) +- Bump github.com/spf13/cast from 1.4.0 to 1.4.1 [\#592](https://github.com/CosmWasm/wasmd/pull/592) + +## [v0.18.0](https://github.com/CosmWasm/wasmd/tree/v0.18.0) (2021-08-16) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.17.0...v0.18.0) + +**Api Breaking:** +- Events documented and refactored [\#448](https://github.com/CosmWasm/wasmd/issues/448), [\#589](https://github.com/CosmWasm/wasmd/pull/589), [\#587](https://github.com/CosmWasm/wasmd/issues/587) +- Add organisation to grpc gateway path [\#578](https://github.com/CosmWasm/wasmd/pull/578) +- Move Proto version from `v1beta1` to `v1` for all cosmwasm.wasm.* types + [\#563](https://github.com/CosmWasm/wasmd/pull/563) +- Renamed InitMsg and MigrateMsg fields to Msg. This applies to protobuf Msg + and Proposals, as well as REST and CLI [\#563](https://github.com/CosmWasm/wasmd/pull/563) +- Removed source and builder fields from StoreCode and CodeInfo. They were rarely used. + [\#564](https://github.com/CosmWasm/wasmd/pull/564) +- Changed contract address derivation function. If you hardcoded the first contract + addresses anywhere (in scripts?), please update them. + [\#565](https://github.com/CosmWasm/wasmd/pull/565) + +**Implemented Enhancements:** +- Cosmos SDK 0.42.9, wasmvm 0.16.0 [\#582](https://github.com/CosmWasm/wasmd/pull/582) +- Better ibc contract interface [\#570](https://github.com/CosmWasm/wasmd/pull/570) ([ethanfrey](https://github.com/ethanfrey)) +- Reject invalid events/attributes returned from contracts [\#560](https://github.com/CosmWasm/wasmd/pull/560) +- IBC Query methods from Wasm contracts only return OPEN channels [\#568](https://github.com/CosmWasm/wasmd/pull/568) +- Extendable gas costs [\#525](https://github.com/CosmWasm/wasmd/issues/525) +- Limit init/migrate/execute payload message size [\#203](https://github.com/CosmWasm/wasmd/issues/203) +- Add cli alias [\#496](https://github.com/CosmWasm/wasmd/issues/496) +- Remove max gas limit [\#529](https://github.com/CosmWasm/wasmd/pull/529) ([alpe](https://github.com/alpe)) +- Add SECURITY.md [\#303](https://github.com/CosmWasm/wasmd/issues/303) + +## [v0.17.0](https://github.com/CosmWasm/wasmd/tree/v0.17.0) (2021-05-26) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.16.0...v0.17.0) + +**Features:** +- Remove json type cast for contract msgs [\#520](https://github.com/CosmWasm/wasmd/pull/520) ([alpe](https://github.com/alpe)) +- Bump github.com/cosmos/cosmos-sdk from 0.42.4 to 0.42.5 [\#519](https://github.com/CosmWasm/wasmd/pull/519) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview)) + +## [v0.16.0](https://github.com/CosmWasm/wasmd/tree/v0.16.0) (2021-04-30) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.15.1...v0.16.0) + +**Features:** +- Upgrade to wasmvm v0.14.0-rc1 [\#508](https://github.com/CosmWasm/wasmd/pull/508) ([alpe](https://github.com/alpe)) +- Use the cache metrics from WasmVM [\#500](https://github.com/CosmWasm/wasmd/issues/500) +- Update IBC.md [\#494](https://github.com/CosmWasm/wasmd/pull/494) ([ethanfrey](https://github.com/ethanfrey)) +- Extend ContractInfo for custom data [\#492](https://github.com/CosmWasm/wasmd/pull/492) ([alpe](https://github.com/alpe)) +- Reply response on submessages can overwrite "caller" result [\#495](https://github.com/CosmWasm/wasmd/issues/495) +- Update to sdk 0.42.4 [\#485](https://github.com/CosmWasm/wasmd/issues/485) +- Add extension points to the CLI [\#477](https://github.com/CosmWasm/wasmd/pull/477) ([alpe](https://github.com/alpe)) +- Simplify staking reward query [\#399](https://github.com/CosmWasm/wasmd/issues/399) +- Update IBC.md [\#398](https://github.com/CosmWasm/wasmd/issues/398) +- Add IBCQuery support [\#434](https://github.com/CosmWasm/wasmd/issues/434) +- Follow proto dir best practice \(in cosmos eco\) [\#342](https://github.com/CosmWasm/wasmd/issues/342) +- Remove internal package [\#464](https://github.com/CosmWasm/wasmd/pull/464) ([alpe](https://github.com/alpe)) +- Introduce new interfaces for extendability [\#471](https://github.com/CosmWasm/wasmd/pull/471) ([alpe](https://github.com/alpe)) +- Handle non default IBC transfer port in message encoder [\#396](https://github.com/CosmWasm/wasmd/issues/396) +- Collect Contract Metrics [\#387](https://github.com/CosmWasm/wasmd/issues/387) +- Add Submessages for IBC callbacks [\#449](https://github.com/CosmWasm/wasmd/issues/449) +- Handle wasmvm Burn message [\#489](https://github.com/CosmWasm/wasmd/pull/489) ([alpe](https://github.com/alpe)) +- Add telemetry [\#463](https://github.com/CosmWasm/wasmd/pull/463) ([alpe](https://github.com/alpe)) +- Handle non default transfer port id [\#462](https://github.com/CosmWasm/wasmd/pull/462) ([alpe](https://github.com/alpe)) +- Allow subsecond block times [\#453](https://github.com/CosmWasm/wasmd/pull/453) ([ethanfrey](https://github.com/ethanfrey)) +- Submsg and replies [\#441](https://github.com/CosmWasm/wasmd/pull/441) ([ethanfrey](https://github.com/ethanfrey)) +- Ibc query support [\#439](https://github.com/CosmWasm/wasmd/pull/439) ([ethanfrey](https://github.com/ethanfrey)) +- Pin/Unpin contract in cache [\#436](https://github.com/CosmWasm/wasmd/pull/436) ([alpe](https://github.com/alpe)) +- Stargate msg and query [\#435](https://github.com/CosmWasm/wasmd/pull/435) ([ethanfrey](https://github.com/ethanfrey)) +- Sudo entry point [\#433](https://github.com/CosmWasm/wasmd/pull/433) ([ethanfrey](https://github.com/ethanfrey)) +- Add custom message handler option [\#402](https://github.com/CosmWasm/wasmd/pull/402) ([alpe](https://github.com/alpe)) +- Expose contract pinning [\#401](https://github.com/CosmWasm/wasmd/issues/401) +- Add support for Stargate CosmosMsg/QueryRequest [\#388](https://github.com/CosmWasm/wasmd/issues/388) +- Add MsgInstantiateContractResponse.data [\#385](https://github.com/CosmWasm/wasmd/issues/385) +- Added randomized simulation parameters generation [\#389](https://github.com/CosmWasm/wasmd/pull/389) ([bragaz](https://github.com/bragaz)) +- Implement IBC contract support [\#394](https://github.com/CosmWasm/wasmd/pull/394) ([alpe](https://github.com/alpe)) + +**Api breaking:** +- Improve list contracts by code query [\#497](https://github.com/CosmWasm/wasmd/pull/497) ([alpe](https://github.com/alpe)) +- Rename to just `funds` [/#423](https://github.com/CosmWasm/wasmd/issues/423) + +**Fixed bugs:** + +- Correct order for migrated contracts [\#323](https://github.com/CosmWasm/wasmd/issues/323) +- Keeper Send Coins does not perform expected validation [\#414](https://github.com/CosmWasm/wasmd/issues/414) + +## [v0.15.1](https://github.com/CosmWasm/wasmd/tree/v0.15.1) (2021-02-18) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.15.0...v0.15.1) + +**Implemented enhancements:** + +- Support custom MessageHandler in wasm [\#327](https://github.com/CosmWasm/wasmd/issues/327) + +**Fixed bugs:** + +- Fix Parameter change via proposal [\#392](https://github.com/CosmWasm/wasmd/issues/392) + +## [v0.15.0](https://github.com/CosmWasm/wasmd/tree/v0.15.0) (2021-01-27) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.14.1...v0.15.0) + +**Features:** +- Upgrade to cosmos-sdk v0.41.0 [\#390](https://github.com/CosmWasm/wasmd/pull/390) + +## [v0.14.1](https://github.com/CosmWasm/wasmd/tree/v0.14.1) (2021-01-20) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.14.0...v0.14.1) + +**Features:** +- Upgrade to cosmos-sdk v0.40.1 final + Tendermint 0.34.3 [\#380](https://github.com/CosmWasm/wasmd/pull/380) + +## [v0.14.0](https://github.com/CosmWasm/wasmd/tree/v0.14.0) (2021-01-11) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.13.0...v0.14.0) + +**Features:** +- Upgrade to cosmos-sdk v0.40.0 final [\#354](https://github.com/CosmWasm/wasmd/pull/369) +- Refactor to GRPC message server [\#366](https://github.com/CosmWasm/wasmd/pull/366) +- Make it easy to initialize contracts in genesis file with new CLI commands[\#326](https://github.com/CosmWasm/wasmd/issues/326) +- Upgrade to WasmVM v0.13.0 [\#358](https://github.com/CosmWasm/wasmd/pull/358) +- Upgrade to cosmos-sdk v0.40.0-rc6 [\#354](https://github.com/CosmWasm/wasmd/pull/354) +- Upgrade to cosmos-sdk v0.40.0-rc5 [\#344](https://github.com/CosmWasm/wasmd/issues/344) +- Add Dependabot to keep dependencies secure and up-to-date [\#336](https://github.com/CosmWasm/wasmd/issues/336) + +**Fixed bugs:** + +- Dependabot can't resolve your Go dependency files [\#339](https://github.com/CosmWasm/wasmd/issues/339) +- Errors in `InitGenesis` [\#335](https://github.com/CosmWasm/wasmd/issues/335) +- Invalid homeDir for export command [\#334](https://github.com/CosmWasm/wasmd/issues/334) + +## [v0.13.0](https://github.com/CosmWasm/wasmd/tree/v0.13.0) (2020-12-04) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.12.1...v0.13.0) + +**Fixed bugs:** + +- REST handler wrong `Sender` source [\#324](https://github.com/CosmWasm/wasmd/issues/324) + +**Closed issues:** + +- Change proto package to match \.\.\ [\#329](https://github.com/CosmWasm/wasmd/issues/329) +- Out of gas causes panic when external contract store query executed [\#321](https://github.com/CosmWasm/wasmd/issues/321) +- Check codecov report [\#298](https://github.com/CosmWasm/wasmd/issues/298) +- cosmwasm.GoAPI will not work on sdk.ValAddress [\#264](https://github.com/CosmWasm/wasmd/issues/264) +- Stargate: Add pagination support for queries [\#242](https://github.com/CosmWasm/wasmd/issues/242) + +**Merged pull requests:** + +- Rename protobuf package [\#330](https://github.com/CosmWasm/wasmd/pull/330) ([alpe](https://github.com/alpe)) +- Use base request data for sender [\#325](https://github.com/CosmWasm/wasmd/pull/325) ([alpe](https://github.com/alpe)) +- Handle panics in query contract smart [\#322](https://github.com/CosmWasm/wasmd/pull/322) ([alpe](https://github.com/alpe)) + +## [v0.12.1](https://github.com/CosmWasm/wasmd/tree/v0.12.1) (2020-11-23) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.12.0...v0.12.1) + +**Closed issues:** + +- Complete IBC Mock testing [\#255](https://github.com/CosmWasm/wasmd/issues/255) +- Idea: do multiple queries in one API call [\#72](https://github.com/CosmWasm/wasmd/issues/72) + +**Merged pull requests:** + +- Exclude generate proto code files in coverage [\#320](https://github.com/CosmWasm/wasmd/pull/320) ([alpe](https://github.com/alpe)) +- Upgrade wasmvm to 0.12.0 [\#319](https://github.com/CosmWasm/wasmd/pull/319) ([webmaster128](https://github.com/webmaster128)) +- Fix chain id setup in contrib/local/setup\_wasmd.sh [\#318](https://github.com/CosmWasm/wasmd/pull/318) ([orkunkl](https://github.com/orkunkl)) +- Add pagination to grpc queries [\#317](https://github.com/CosmWasm/wasmd/pull/317) ([alpe](https://github.com/alpe)) + +## [v0.12.0](https://github.com/CosmWasm/wasmd/tree/v0.12.0) (2020-11-17) + +[Full Changelog](https://github.com/CosmWasm/wasmd/compare/v0.12.0-alpha1...v0.12.0) + +**Closed issues:** + +- Merge wasmd and wasmcli into a single binary [\#308](https://github.com/CosmWasm/wasmd/issues/308) +- Change bech32 prefix for wasmd [\#313](https://github.com/CosmWasm/wasmd/issues/313) +- Upgrade go-cowasmwasm to wasmvm 0.12 [\#309](https://github.com/CosmWasm/wasmd/issues/309) +- Use string type for AccAddresses in proto [\#306](https://github.com/CosmWasm/wasmd/issues/306) +- Upgrade to cosmos/sdk v0.40.0-rc2 [\#296](https://github.com/CosmWasm/wasmd/issues/296) +- Generate protobuf outputs in a container [\#295](https://github.com/CosmWasm/wasmd/issues/295) +- Instantiate contract process ordering [\#292](https://github.com/CosmWasm/wasmd/issues/292) +- Make Wasm maxSize a configuration option [\#289](https://github.com/CosmWasm/wasmd/issues/289) +- Return error if wasm to big [\#287](https://github.com/CosmWasm/wasmd/issues/287) + +**Merged pull requests:** + +- Set bech32 prefix [\#316](https://github.com/CosmWasm/wasmd/pull/316) ([alpe](https://github.com/alpe)) +- Replace sdk.AccAddress with bech32 string [\#314](https://github.com/CosmWasm/wasmd/pull/314) ([alpe](https://github.com/alpe)) +- Integrate wasmcli into wasmd [\#312](https://github.com/CosmWasm/wasmd/pull/312) ([alpe](https://github.com/alpe)) +- Upgrade wasmvm aka go-cosmwasm [\#311](https://github.com/CosmWasm/wasmd/pull/311) ([alpe](https://github.com/alpe)) +- Upgrade to Stargate RC3 [\#305](https://github.com/CosmWasm/wasmd/pull/305) ([alpe](https://github.com/alpe)) +- Containerized Protobuf generation [\#304](https://github.com/CosmWasm/wasmd/pull/304) ([alpe](https://github.com/alpe)) +- Reject wasm code exceeding limit [\#302](https://github.com/CosmWasm/wasmd/pull/302) ([alpe](https://github.com/alpe)) +- Support self calling contract on instantiation [\#300](https://github.com/CosmWasm/wasmd/pull/300) ([alpe](https://github.com/alpe)) +- Upgrade to Stargate RC2 [\#299](https://github.com/CosmWasm/wasmd/pull/299) ([alpe](https://github.com/alpe)) diff --git a/Dockerfile b/Dockerfile index 3c0ff55178..2f03892f01 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -# docker build . -t cosmwasm/wasmd:latest -# docker run --rm -it cosmwasm/wasmd:latest /bin/sh -FROM golang:1.17-alpine3.15 AS go-builder +# docker build . -t line/wasmd:latest +# docker run --rm -it line/wasmd:latest /bin/sh +FROM golang:1.18-alpine3.15 AS go-builder ARG arch=x86_64 # this comes from standard alpine nightly file @@ -15,14 +15,14 @@ RUN apk add git WORKDIR /code COPY . /code/ -# See https://github.com/CosmWasm/wasmvm/releases -ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.0.0/libwasmvm_muslc.aarch64.a /lib/libwasmvm_muslc.aarch64.a -ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.0.0/libwasmvm_muslc.x86_64.a /lib/libwasmvm_muslc.x86_64.a -RUN sha256sum /lib/libwasmvm_muslc.aarch64.a | grep 7d2239e9f25e96d0d4daba982ce92367aacf0cbd95d2facb8442268f2b1cc1fc -RUN sha256sum /lib/libwasmvm_muslc.x86_64.a | grep f6282df732a13dec836cda1f399dd874b1e3163504dbd9607c6af915b2740479 +# See https://github.com/line/wasmvm/releases +ADD https://github.com/line/wasmvm/releases/download/v1.0.0-0.10.0/libwasmvm_static.x86_64.a /lib/libwasmvm_static.x86_64.a +ADD https://github.com/line/wasmvm/releases/download/v1.0.0-0.10.0/libwasmvm_static.aarch64.a /lib/libwasmvm_static.aarch64.a +RUN sha256sum /lib/libwasmvm_static.aarch64.a | grep bc3db72ba32f34ad88ceb1d20479411bd7f50ccd6a5ca50cc8ca462a561e6189 +RUN sha256sum /lib/libwasmvm_static.x86_64.a | grep 352fa5de5f9dba66f0a38082541d3e63e21394fee3e577ea35e0906294c61276 # Copy the library you want to the final location that will be found by the linker flag `-lwasmvm_muslc` -RUN cp /lib/libwasmvm_muslc.${arch}.a /lib/libwasmvm_muslc.a +RUN cp /lib/libwasmvm_static.${arch}.a /lib/libwasmvm_static.a # force it to use static lib (from above) not standard libgo_cosmwasm.so file RUN LEDGER_ENABLED=false BUILD_TAGS=muslc LINK_STATICALLY=true make build diff --git a/Makefile b/Makefile index 4a007fd788..e72fe11a57 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ PACKAGES_SIMTEST=$(shell go list ./... | grep '/simulation') VERSION := $(shell echo $(shell git describe --tags) | sed 's/^v//') COMMIT := $(shell git log -1 --format='%H') LEDGER_ENABLED ?= true -SDK_PACK := $(shell go list -m github.com/cosmos/cosmos-sdk | sed 's/ /\@/g') +SDK_PACK := $(shell go list -m github.com/line/lbm-sdk | sed 's/ /\@/g') BINDIR ?= $(GOPATH)/bin SIMAPP = ./app @@ -12,7 +12,7 @@ SIMAPP = ./app DOCKER := $(shell which docker) BUF_IMAGE=bufbuild/buf@sha256:3cb1f8a4b48bd5ad8f09168f10f607ddc318af202f5c057d52a45216793d85e5 #v1.4.0 DOCKER_BUF := $(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace $(BUF_IMAGE) -HTTPS_GIT := https://github.com/CosmWasm/wasmd.git +HTTPS_GIT := https://github.com/line/wasmd.git export GO111MODULE = on @@ -55,15 +55,15 @@ build_tags_comma_sep := $(subst $(empty),$(comma),$(build_tags)) # process linker flags -ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=wasm \ - -X github.com/cosmos/cosmos-sdk/version.AppName=wasmd \ - -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ - -X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \ - -X github.com/CosmWasm/wasmd/app.Bech32Prefix=wasm \ - -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)" +ldflags = -X github.com/line/lbm-sdk/version.Name=wasm \ + -X github.com/line/lbm-sdk/version.AppName=wasmd \ + -X github.com/line/lbm-sdk/version.Version=$(VERSION) \ + -X github.com/line/lbm-sdk/version.Commit=$(COMMIT) \ + -X github.com/line/wasmd/app.Bech32Prefix=wasm \ + -X "github.com/line/lbm-sdk/version.BuildTags=$(build_tags_comma_sep)" ifeq ($(WITH_CLEVELDB),yes) - ldflags += -X github.com/cosmos/cosmos-sdk/types.DBBackend=cleveldb + ldflags += -X github.com/line/lbm-sdk/types.DBBackend=cleveldb endif ifeq ($(LINK_STATICALLY),true) ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static" @@ -159,14 +159,16 @@ lint: format-tools format: format-tools find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs gofumpt -w -s find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs misspell -w - find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs goimports -w -local github.com/CosmWasm/wasmd + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs goimports -w -local github.com/line/wasmd ############################################################################### ### Protobuf ### ############################################################################### +PROTO_VERSION=v0.2 PROTO_BUILDER_IMAGE=tendermintdev/sdk-proto-gen@sha256:372dce7be2f465123e26459973ca798fc489ff2c75aeecd814c0ca8ced24faca PROTO_FORMATTER_IMAGE=tendermintdev/docker-build-proto@sha256:aabcfe2fc19c31c0f198d4cd26393f5e5ca9502d7ea3feafbfe972448fee7cae +PROTO_GEN_SWAGGER_IMAGE=cosmos-sdk-proto-gen-swagger-$(PROTO_VERSION) proto-all: proto-format proto-lint proto-gen format @@ -181,7 +183,9 @@ proto-format: find ./ -not -path "./third_party/*" -name *.proto -exec clang-format -i {} \; proto-swagger-gen: - @./scripts/protoc-swagger-gen.sh + @echo "Generating Protobuf Swagger" + @if $(DOCKER) ps -a --format '{{.Names}}' | grep -Eq "^${PROTO_GEN_SWAGGER_IMAGE}$$"; then $(DOCKER) start -a $(PROTO_GEN_SWAGGER_IMAGE); else $(DOCKER) run --name $(PROTO_GEN_SWAGGER_IMAGE) -v $(CURDIR):/workspace --workdir /workspace $(PROTO_BUILDER_IMAGE) \ + sh ./scripts/protoc-swagger-gen.sh; fi proto-lint: @$(DOCKER_BUF) lint --error-format=json diff --git a/README.md b/README.md index 02ced0d3a9..d04eecf291 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ # Wasm Zone -[![CircleCI](https://circleci.com/gh/CosmWasm/wasmd/tree/master.svg?style=shield)](https://circleci.com/gh/CosmWasm/wasmd/tree/master) -[![codecov](https://codecov.io/gh/cosmwasm/wasmd/branch/master/graph/badge.svg)](https://codecov.io/gh/cosmwasm/wasmd) -[![Go Report Card](https://goreportcard.com/badge/github.com/CosmWasm/wasmd)](https://goreportcard.com/report/github.com/CosmWasm/wasmd) -[![license](https://img.shields.io/github/license/CosmWasm/wasmd.svg)](https://github.com/CosmWasm/wasmd/blob/master/LICENSE) -[![LoC](https://tokei.rs/b1/github/CosmWasm/wasmd)](https://github.com/CosmWasm/wasmd) +[![codecov](https://codecov.io/gh/line/wasmd/branch/main/graph/badge.svg)](https://codecov.io/gh/line/wasmd) +[![Go Report Card](https://goreportcard.com/badge/github.com/line/wasmd)](https://goreportcard.com/report/github.com/line/wasmd) +[![license](https://img.shields.io/github/license/line/wasmd.svg)](https://github.com/line/wasmd/blob/main/LICENSE) +[![LoC](https://tokei.rs/b1/github/line/wasmd)](https://github.com/line/wasmd) This repository hosts `Wasmd`, the first implementation of a cosmos zone with wasm smart contracts enabled. -This code was forked from the `cosmos/gaia` repository as a basis and then we added `x/wasm` and cleaned up -many gaia-specific files. However, the `wasmd` binary should function just like `gaiad` except for the +This code was forked from the `cosmwasm/wasmd` repository as a basis and `cosmwasm/wasmd` was forked +from the `cosmos/gaia` repository, and then we change `x/wasm`. +However, the `wasmd` binary should function just like `gaiad` except for the addition of the `x/wasm` module. -**Note**: Requires [Go 1.17+](https://golang.org/dl/) +**Note**: Requires [Go 1.18+](https://golang.org/dl/) For critical security issues & disclosure, see [SECURITY.md](SECURITY.md). ## Compatibility with CosmWasm contracts @@ -24,28 +24,28 @@ A VM can support one or more contract-VM interface versions. The interface version is communicated by the contract via a Wasm export. This is the current compatibility list: -| wasmd | wasmvm | cosmwasm-vm | cosmwasm-std | -| ----- | ------------ | ----------- | ------------ | -| 0.27 | v1.0.0 | | 1.0 | -| 0.26 | 1.0.0-beta10 | | 1.0 | -| 0.25 | 1.0.0-beta10 | | 1.0 | -| 0.24 | 1.0.0-beta7 | 1.0.0-beta6 | 1.0 | -| 0.23 | | 1.0.0-beta5 | 1.0 | -| 0.22 | | 1.0.0-beta5 | 1.0 | -| 0.21 | | 1.0.0-beta2 | 1.0 | -| 0.20 | | 1.0.0-beta | 1.0 | -| 0.19 | | 0.16 | 0.16 | -| 0.18 | | 0.16 | 0.16 | -| 0.17 | | 0.14 | 0.14 | -| 0.16 | | 0.14 | 0.14 | -| 0.15 | | 0.13 | 0.11-0.13 | -| 0.14 | | 0.13 | 0.11-0.13 | -| 0.13 | | 0.12 | 0.11-0.13 | -| 0.12 | | 0.12 | 0.11-0.13 | -| 0.11 | | 0.11 | 0.11-0.13 | -| 0.10 | | 0.10 | 0.10 | -| 0.9 | | 0.9 | 0.9 | -| 0.8 | | 0.8 | 0.8 | +| line/wasmd | cosmwasm/wasmd | line/wasmvm | cosmwasm/wasmvm | cosmwasm-vm | cosmwasm-std | +|------------|----------------|:--------------|-----------------|-------------|--------------| +| 0.1 | 0.27 | v1.0.0-0.10.0 | v1.0.0 | | 1.0 | +| | 0.26 | | 1.0.0-beta10 | | 1.0 | +| | 0.25 | | 1.0.0-beta10 | | 1.0 | +| | 0.24 | | 1.0.0-beta7 | 1.0.0-beta6 | 1.0 | +| | 0.23 | | | 1.0.0-beta5 | 1.0 | +| | 0.22 | | | 1.0.0-beta5 | 1.0 | +| | 0.21 | | | 1.0.0-beta2 | 1.0 | +| | 0.20 | | | 1.0.0-beta | 1.0 | +| | 0.19 | | | 0.16 | 0.16 | +| | 0.18 | | | 0.16 | 0.16 | +| | 0.17 | | | 0.14 | 0.14 | +| | 0.16 | | | 0.14 | 0.14 | +| | 0.15 | | | 0.13 | 0.11-0.13 | +| | 0.14 | | | 0.13 | 0.11-0.13 | +| | 0.13 | | | 0.12 | 0.11-0.13 | +| | 0.12 | | | 0.12 | 0.11-0.13 | +| | 0.11 | | | 0.11 | 0.11-0.13 | +| | 0.10 | | | 0.10 | 0.10 | +| | 0.9 | | | 0.9 | 0.9 | +| | 0.8 | | | 0.8 | 0.8 | Note: `cosmwasm_std v1.0` means it supports contracts compiled by any `v1.0.0-betaX` or `1.0.x`. It will also run contracts compiled with 1.x assuming they don't opt into any newer features. @@ -115,64 +115,6 @@ make proto-gen ``` The generators are executed within a Docker [container](./contrib/prototools-docker), now. -## Dockerized - -We provide a docker image to help with test setups. There are two modes to use it - -Build: `docker build -t cosmwasm/wasmd:latest .` or pull from dockerhub - -### Dev server - -Bring up a local node with a test account containing tokens - -This is just designed for local testing/CI - do not use these scripts in production. -Very likely you will assign tokens to accounts whose mnemonics are public on github. - -```sh -docker volume rm -f wasmd_data - -# pass password (one time) as env variable for setup, so we don't need to keep typing it -# add some addresses that you have private keys for (locally) to give them genesis funds -docker run --rm -it \ - -e PASSWORD=xxxxxxxxx \ - --mount type=volume,source=wasmd_data,target=/root \ - cosmwasm/wasmd:latest /opt/setup_wasmd.sh cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6 - -# This will start both wasmd and rest-server, both are logged -docker run --rm -it -p 26657:26657 -p 26656:26656 -p 1317:1317 \ - --mount type=volume,source=wasmd_data,target=/root \ - cosmwasm/wasmd:latest /opt/run_wasmd.sh -``` - -### CI - -For CI, we want to generate a template one time and save to disk/repo. Then we can start a chain copying the initial state, but not modifying it. This lets us get the same, fresh start every time. - -```sh -# Init chain and pass addresses so they are non-empty accounts -rm -rf ./template && mkdir ./template -docker run --rm -it \ - -e PASSWORD=xxxxxxxxx \ - --mount type=bind,source=$(pwd)/template,target=/root \ - cosmwasm/wasmd:latest /opt/setup_wasmd.sh cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6 - -sudo chown -R $(id -u):$(id -g) ./template - -# FIRST TIME -# bind to non-/root and pass an argument to run.sh to copy the template into /root -# we need wasmd_data volume mount not just for restart, but also to view logs -docker volume rm -f wasmd_data -docker run --rm -it -p 26657:26657 -p 26656:26656 -p 9090:9090 \ - --mount type=bind,source=$(pwd)/template,target=/template \ - --mount type=volume,source=wasmd_data,target=/root \ - cosmwasm/wasmd:latest /opt/run_wasmd.sh /template - -# RESTART CHAIN with existing state -docker run --rm -it -p 26657:26657 -p 26656:26656 -p 1317:1317 \ - --mount type=volume,source=wasmd_data,target=/root \ - cosmwasm/wasmd:latest /opt/run_wasmd.sh -``` - ## Runtime flags We provide a number of variables in `app/app.go` that are intended to be set via `-ldflags -X ...` @@ -181,10 +123,10 @@ to the configuration. Available flags: -* `-X github.com/CosmWasm/wasmd/app.NodeDir=.corald` - set the config/data directory for the node (default `~/.wasmd`) -* `-X github.com/CosmWasm/wasmd/app.Bech32Prefix=coral` - set the bech32 prefix for all accounts (default `wasm`) -* `-X github.com/CosmWasm/wasmd/app.ProposalsEnabled=true` - enable all x/wasm governance proposals (default `false`) -* `-X github.com/CosmWasm/wasmd/app.EnableSpecificProposals=MigrateContract,UpdateAdmin,ClearAdmin` - +* `-X github.com/line/wasmd/app.NodeDir=.corald` - set the config/data directory for the node (default `~/.wasmd`) +* `-X github.com/line/wasmd/app.Bech32Prefix=coral` - set the bech32 prefix for all accounts (default `wasm`) +* `-X github.com/line/wasmd/app.ProposalsEnabled=true` - enable all x/wasm governance proposals (default `false`) +* `-X github.com/line/wasmd/app.EnableSpecificProposals=MigrateContract,UpdateAdmin,ClearAdmin` - enable a subset of the x/wasm governance proposal types (overrides `ProposalsEnabled`) Examples: diff --git a/app/ante.go b/app/ante.go index 937f87fb9a..1750975565 100644 --- a/app/ante.go +++ b/app/ante.go @@ -1,14 +1,14 @@ package app import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - ibcante "github.com/cosmos/ibc-go/v3/modules/core/ante" - "github.com/cosmos/ibc-go/v3/modules/core/keeper" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + "github.com/line/lbm-sdk/x/auth/ante" + ibcante "github.com/line/lbm-sdk/x/ibc/core/ante" + "github.com/line/lbm-sdk/x/ibc/core/keeper" - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - wasmTypes "github.com/CosmWasm/wasmd/x/wasm/types" + wasmkeeper "github.com/line/wasmd/x/wasm/keeper" + wasmTypes "github.com/line/wasmd/x/wasm/types" ) // HandlerOptions extend the SDK's AnteHandler options by requiring the IBC diff --git a/app/app.go b/app/app.go index 25ea186c8a..2409eac995 100644 --- a/app/app.go +++ b/app/app.go @@ -8,113 +8,111 @@ import ( "path/filepath" "strings" - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" - "github.com/cosmos/cosmos-sdk/client/rpc" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/server/api" - "github.com/cosmos/cosmos-sdk/server/config" - servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/simapp" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" - authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/cosmos/cosmos-sdk/x/auth/vesting" - vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/cosmos/cosmos-sdk/x/authz" - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" - "github.com/cosmos/cosmos-sdk/x/bank" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/capability" - capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - "github.com/cosmos/cosmos-sdk/x/crisis" - crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" - crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" - distr "github.com/cosmos/cosmos-sdk/x/distribution" - distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" - distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - "github.com/cosmos/cosmos-sdk/x/evidence" - evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper" - evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - "github.com/cosmos/cosmos-sdk/x/feegrant" - feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" - feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/cosmos/cosmos-sdk/x/gov" - govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/cosmos/cosmos-sdk/x/mint" - mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - "github.com/cosmos/cosmos-sdk/x/params" - paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" - paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - "github.com/cosmos/cosmos-sdk/x/slashing" - slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" - slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - "github.com/cosmos/cosmos-sdk/x/staking" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/cosmos-sdk/x/upgrade" - upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" - upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - ica "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts" - icacontroller "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/controller" - icacontrollerkeeper "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/controller/keeper" - icacontrollertypes "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/controller/types" - icahost "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/host" - icahostkeeper "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/host/keeper" - icahosttypes "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/host/types" - icatypes "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/types" - transfer "github.com/cosmos/ibc-go/v3/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v3/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v3/modules/core" - ibcclient "github.com/cosmos/ibc-go/v3/modules/core/02-client" - ibcclientclient "github.com/cosmos/ibc-go/v3/modules/core/02-client/client" - ibcclienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - porttypes "github.com/cosmos/ibc-go/v3/modules/core/05-port/types" - ibchost "github.com/cosmos/ibc-go/v3/modules/core/24-host" - ibckeeper "github.com/cosmos/ibc-go/v3/modules/core/keeper" - - // Note: please do your research before using this in production app, this is a demo and not an officially - // supported IBC team implementation. It has no known issues, but do your own research before using it. - intertx "github.com/cosmos/interchain-accounts/x/inter-tx" - intertxkeeper "github.com/cosmos/interchain-accounts/x/inter-tx/keeper" intertxtypes "github.com/cosmos/interchain-accounts/x/inter-tx/types" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" - abci "github.com/tendermint/tendermint/abci/types" - tmjson "github.com/tendermint/tendermint/libs/json" - "github.com/tendermint/tendermint/libs/log" - tmos "github.com/tendermint/tendermint/libs/os" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" - wasmappparams "github.com/CosmWasm/wasmd/app/params" - "github.com/CosmWasm/wasmd/x/wasm" - wasmclient "github.com/CosmWasm/wasmd/x/wasm/client" - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/line/lbm-sdk/baseapp" + "github.com/line/lbm-sdk/client" + nodeservice "github.com/line/lbm-sdk/client/grpc/node" + "github.com/line/lbm-sdk/client/grpc/tmservice" + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/codec/types" + "github.com/line/lbm-sdk/server/api" + "github.com/line/lbm-sdk/server/config" + servertypes "github.com/line/lbm-sdk/server/types" + "github.com/line/lbm-sdk/simapp" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/types/module" + "github.com/line/lbm-sdk/x/auth" + "github.com/line/lbm-sdk/x/auth/ante" + authkeeper "github.com/line/lbm-sdk/x/auth/keeper" + authsims "github.com/line/lbm-sdk/x/auth/simulation" + authtx "github.com/line/lbm-sdk/x/auth/tx" + authtypes "github.com/line/lbm-sdk/x/auth/types" + "github.com/line/lbm-sdk/x/auth/vesting" + vestingtypes "github.com/line/lbm-sdk/x/auth/vesting/types" + "github.com/line/lbm-sdk/x/authz" + authzkeeper "github.com/line/lbm-sdk/x/authz/keeper" + authzmodule "github.com/line/lbm-sdk/x/authz/module" + "github.com/line/lbm-sdk/x/bank" + bankkeeper "github.com/line/lbm-sdk/x/bank/keeper" + banktypes "github.com/line/lbm-sdk/x/bank/types" + "github.com/line/lbm-sdk/x/bankplus" + bankpluskeeper "github.com/line/lbm-sdk/x/bankplus/keeper" + "github.com/line/lbm-sdk/x/capability" + capabilitykeeper "github.com/line/lbm-sdk/x/capability/keeper" + capabilitytypes "github.com/line/lbm-sdk/x/capability/types" + "github.com/line/lbm-sdk/x/crisis" + crisiskeeper "github.com/line/lbm-sdk/x/crisis/keeper" + crisistypes "github.com/line/lbm-sdk/x/crisis/types" + distr "github.com/line/lbm-sdk/x/distribution" + distrclient "github.com/line/lbm-sdk/x/distribution/client" + distrkeeper "github.com/line/lbm-sdk/x/distribution/keeper" + distrtypes "github.com/line/lbm-sdk/x/distribution/types" + "github.com/line/lbm-sdk/x/evidence" + evidencekeeper "github.com/line/lbm-sdk/x/evidence/keeper" + evidencetypes "github.com/line/lbm-sdk/x/evidence/types" + "github.com/line/lbm-sdk/x/feegrant" + feegrantkeeper "github.com/line/lbm-sdk/x/feegrant/keeper" + feegrantmodule "github.com/line/lbm-sdk/x/feegrant/module" + "github.com/line/lbm-sdk/x/genutil" + genutiltypes "github.com/line/lbm-sdk/x/genutil/types" + "github.com/line/lbm-sdk/x/gov" + govkeeper "github.com/line/lbm-sdk/x/gov/keeper" + govtypes "github.com/line/lbm-sdk/x/gov/types" + ica "github.com/line/lbm-sdk/x/ibc/applications/27-interchain-accounts" + icacontroller "github.com/line/lbm-sdk/x/ibc/applications/27-interchain-accounts/controller" + icacontrollerkeeper "github.com/line/lbm-sdk/x/ibc/applications/27-interchain-accounts/controller/keeper" + icacontrollertypes "github.com/line/lbm-sdk/x/ibc/applications/27-interchain-accounts/controller/types" + icahost "github.com/line/lbm-sdk/x/ibc/applications/27-interchain-accounts/host" + icahostkeeper "github.com/line/lbm-sdk/x/ibc/applications/27-interchain-accounts/host/keeper" + icahosttypes "github.com/line/lbm-sdk/x/ibc/applications/27-interchain-accounts/host/types" + icatypes "github.com/line/lbm-sdk/x/ibc/applications/27-interchain-accounts/types" + transfer "github.com/line/lbm-sdk/x/ibc/applications/transfer" + ibctransferkeeper "github.com/line/lbm-sdk/x/ibc/applications/transfer/keeper" + ibctransfertypes "github.com/line/lbm-sdk/x/ibc/applications/transfer/types" + ibc "github.com/line/lbm-sdk/x/ibc/core" + ibcclient "github.com/line/lbm-sdk/x/ibc/core/02-client" + ibcclientclient "github.com/line/lbm-sdk/x/ibc/core/02-client/client" + ibcclienttypes "github.com/line/lbm-sdk/x/ibc/core/02-client/types" + porttypes "github.com/line/lbm-sdk/x/ibc/core/05-port/types" + ibchost "github.com/line/lbm-sdk/x/ibc/core/24-host" + ibckeeper "github.com/line/lbm-sdk/x/ibc/core/keeper" + ibcmock "github.com/line/lbm-sdk/x/ibc/testing/mock" + "github.com/line/lbm-sdk/x/mint" + mintkeeper "github.com/line/lbm-sdk/x/mint/keeper" + minttypes "github.com/line/lbm-sdk/x/mint/types" + "github.com/line/lbm-sdk/x/params" + paramsclient "github.com/line/lbm-sdk/x/params/client" + paramskeeper "github.com/line/lbm-sdk/x/params/keeper" + paramstypes "github.com/line/lbm-sdk/x/params/types" + paramproposal "github.com/line/lbm-sdk/x/params/types/proposal" + "github.com/line/lbm-sdk/x/slashing" + slashingkeeper "github.com/line/lbm-sdk/x/slashing/keeper" + slashingtypes "github.com/line/lbm-sdk/x/slashing/types" + "github.com/line/lbm-sdk/x/staking" + stakingkeeper "github.com/line/lbm-sdk/x/staking/keeper" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + "github.com/line/lbm-sdk/x/upgrade" + upgradeclient "github.com/line/lbm-sdk/x/upgrade/client" + upgradekeeper "github.com/line/lbm-sdk/x/upgrade/keeper" + upgradetypes "github.com/line/lbm-sdk/x/upgrade/types" + abci "github.com/line/ostracon/abci/types" + tmjson "github.com/line/ostracon/libs/json" + "github.com/line/ostracon/libs/log" + tmos "github.com/line/ostracon/libs/os" + ocproto "github.com/line/ostracon/proto/ostracon/types" + + wasmappparams "github.com/line/wasmd/app/params" + "github.com/line/wasmd/x/wasm" + wasmclient "github.com/line/wasmd/x/wasm/client" + wasmkeeper "github.com/line/wasmd/x/wasm/keeper" // unnamed import of statik for swagger UI support - _ "github.com/cosmos/cosmos-sdk/client/docs/statik" + _ "github.com/line/lbm-sdk/client/docs/statik" ) const appName = "WasmApp" @@ -206,7 +204,7 @@ var ( vesting.AppModuleBasic{}, wasm.AppModuleBasic{}, ica.AppModuleBasic{}, - intertx.AppModuleBasic{}, + // intertx.AppModuleBasic{}, // TODO support later ) // module account permissions @@ -228,6 +226,13 @@ var ( _ servertypes.Application = (*WasmApp)(nil) ) +// allowedReceivingModAcc define module accounts that are allowed to receive tokens +func allowedReceivingModAcc() map[string]bool { + return map[string]bool{ + distrtypes.ModuleName: true, + } +} + // WasmApp extended ABCI application type WasmApp struct { *baseapp.BaseApp @@ -258,11 +263,11 @@ type WasmApp struct { ibcKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly icaControllerKeeper icacontrollerkeeper.Keeper icaHostKeeper icahostkeeper.Keeper - interTxKeeper intertxkeeper.Keeper - transferKeeper ibctransferkeeper.Keeper - feeGrantKeeper feegrantkeeper.Keeper - authzKeeper authzkeeper.Keeper - wasmKeeper wasm.Keeper + // interTxKeeper intertxkeeper.Keeper // TODO support later + transferKeeper ibctransferkeeper.Keeper + feeGrantKeeper feegrantkeeper.Keeper + authzKeeper authzkeeper.Keeper + wasmKeeper wasm.Keeper scopedIBCKeeper capabilitykeeper.ScopedKeeper scopedICAHostKeeper capabilitykeeper.ScopedKeeper @@ -271,6 +276,10 @@ type WasmApp struct { scopedTransferKeeper capabilitykeeper.ScopedKeeper scopedWasmKeeper capabilitykeeper.ScopedKeeper + // make IBC modules public for test purposes + // these modules are never directly routed to by the IBC Router + ICAAuthModule ibcmock.IBCModule + // the module manager mm *module.Manager @@ -346,6 +355,10 @@ func NewWasmApp( scopedInterTxKeeper := app.capabilityKeeper.ScopeToModule(intertxtypes.ModuleName) scopedTransferKeeper := app.capabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) scopedWasmKeeper := app.capabilityKeeper.ScopeToModule(wasm.ModuleName) + // NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do + // note replicate if you do not need to test core IBC or light clients. + scopedIBCMockKeeper := app.capabilityKeeper.ScopeToModule(ibcmock.ModuleName) + scopedICAMockKeeper := app.capabilityKeeper.ScopeToModule(ibcmock.ModuleName + icacontrollertypes.SubModuleName) app.capabilityKeeper.Seal() // add keepers @@ -356,12 +369,12 @@ func NewWasmApp( authtypes.ProtoBaseAccount, maccPerms, ) - app.bankKeeper = bankkeeper.NewBaseKeeper( + app.bankKeeper = bankpluskeeper.NewBaseKeeper( appCodec, keys[banktypes.StoreKey], app.accountKeeper, app.getSubspace(banktypes.ModuleName), - app.ModuleAccountAddrs(), + app.BlockedAddrs(), ) app.authzKeeper = authzkeeper.NewKeeper( keys[authzkeeper.StoreKey], @@ -482,14 +495,25 @@ func NewWasmApp( icaModule := ica.NewAppModule(&app.icaControllerKeeper, &app.icaHostKeeper) icaHostIBCModule := icahost.NewIBCModule(app.icaHostKeeper) - // For wasmd we use the demo controller from https://github.com/cosmos/interchain-accounts but see notes below - app.interTxKeeper = intertxkeeper.NewKeeper(appCodec, keys[intertxtypes.StoreKey], app.icaControllerKeeper, scopedInterTxKeeper) + // NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do + // note replicate if you do not need to test core IBC or light clients. + mockModule := ibcmock.NewAppModule(&app.ibcKeeper.PortKeeper) + mockIBCModule := ibcmock.NewIBCModule(&mockModule, ibcmock.NewMockIBCApp(ibcmock.ModuleName, scopedIBCMockKeeper)) + // initialize ICA module with mock module as the authentication module on the controller side + icaAuthModule := ibcmock.NewIBCModule(&mockModule, ibcmock.NewMockIBCApp("", scopedICAMockKeeper)) + app.ICAAuthModule = icaAuthModule + + // TODO support later + //// For wasmd we use the demo controller from https://github.com/cosmos/interchain-accounts but see notes below + // app.interTxKeeper = intertxkeeper.NewKeeper(appCodec, keys[intertxtypes.StoreKey], app.icaControllerKeeper, scopedInterTxKeeper) // Note: please do your research before using this in production app, this is a demo and not an officially // supported IBC team implementation. Do your own research before using it. - interTxModule := intertx.NewAppModule(appCodec, app.interTxKeeper) - interTxIBCModule := intertx.NewIBCModule(app.interTxKeeper) + // interTxModule := intertx.NewAppModule(appCodec, app.interTxKeeper) + // interTxIBCModule := intertx.NewIBCModule(app.interTxKeeper) // You will likely want to swap out the second argument with your own reviewed and maintained ica auth module - icaControllerIBCModule := icacontroller.NewIBCModule(app.icaControllerKeeper, interTxIBCModule) + // icaControllerIBCModule := icacontroller.NewIBCModule(app.icaControllerKeeper, interTxIBCModule) + + icaControllerIBCModule := icacontroller.NewIBCModule(app.icaControllerKeeper, icaAuthModule) // create evidence keeper with router evidenceKeeper := evidencekeeper.NewKeeper( @@ -526,6 +550,8 @@ func NewWasmApp( wasmDir, wasmConfig, supportedFeatures, + nil, + nil, wasmOpts..., ) @@ -541,7 +567,8 @@ func NewWasmApp( AddRoute(ibctransfertypes.ModuleName, transferIBCModule). AddRoute(icacontrollertypes.SubModuleName, icaControllerIBCModule). AddRoute(icahosttypes.SubModuleName, icaHostIBCModule). - AddRoute(intertxtypes.ModuleName, icaControllerIBCModule) + // AddRoute(intertxtypes.ModuleName, icaControllerIBCModule). + AddRoute(ibcmock.ModuleName, mockIBCModule) app.ibcKeeper.SetRouter(ibcRouter) app.govKeeper = govkeeper.NewKeeper( @@ -570,7 +597,7 @@ func NewWasmApp( ), auth.NewAppModule(appCodec, app.accountKeeper, nil), vesting.NewAppModule(app.accountKeeper, app.bankKeeper), - bank.NewAppModule(appCodec, app.bankKeeper, app.accountKeeper), + bankplus.NewAppModule(appCodec, app.bankKeeper, app.accountKeeper), capability.NewAppModule(appCodec, *app.capabilityKeeper), gov.NewAppModule(appCodec, app.govKeeper, app.accountKeeper, app.bankKeeper), mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper), @@ -586,7 +613,6 @@ func NewWasmApp( params.NewAppModule(app.paramsKeeper), transferModule, icaModule, - interTxModule, crisis.NewAppModule(&app.crisisKeeper, skipGenesisInvariants), // always be last to make sure that it checks for all invariants and not only part of them ) @@ -615,7 +641,7 @@ func NewWasmApp( ibctransfertypes.ModuleName, ibchost.ModuleName, icatypes.ModuleName, - intertxtypes.ModuleName, + // intertxtypes.ModuleName, wasm.ModuleName, ) @@ -640,7 +666,7 @@ func NewWasmApp( ibctransfertypes.ModuleName, ibchost.ModuleName, icatypes.ModuleName, - intertxtypes.ModuleName, + // intertxtypes.ModuleName, wasm.ModuleName, ) @@ -672,7 +698,7 @@ func NewWasmApp( ibctransfertypes.ModuleName, ibchost.ModuleName, icatypes.ModuleName, - intertxtypes.ModuleName, + // intertxtypes.ModuleName, // wasm after ibc transfer wasm.ModuleName, ) @@ -692,7 +718,7 @@ func NewWasmApp( // transactions app.sm = module.NewSimulationManager( auth.NewAppModule(appCodec, app.accountKeeper, authsims.RandomGenesisAccounts), - bank.NewAppModule(appCodec, app.bankKeeper, app.accountKeeper), + bankplus.NewAppModule(appCodec, app.bankKeeper, app.accountKeeper), capability.NewAppModule(appCodec, *app.capabilityKeeper), feegrantmodule.NewAppModule(appCodec, app.accountKeeper, app.bankKeeper, app.feeGrantKeeper, app.interfaceRegistry), authzmodule.NewAppModule(appCodec, app.authzKeeper, app.accountKeeper, app.bankKeeper, app.interfaceRegistry), @@ -711,7 +737,6 @@ func NewWasmApp( app.sm.RegisterStoreDecoders() // initialize stores app.MountKVStores(keys) - app.MountTransientStores(tkeys) app.MountMemoryStores(memKeys) anteHandler, err := NewAnteHandler( @@ -760,12 +785,14 @@ func NewWasmApp( if err := app.LoadLatestVersion(); err != nil { tmos.Exit(fmt.Sprintf("failed to load latest version: %s", err)) } - ctx := app.BaseApp.NewUncachedContext(true, tmproto.Header{}) + ctx := app.BaseApp.NewUncachedContext(true, ocproto.Header{}) // Initialize pinned codes in wasmvm as they are not persisted there if err := app.wasmKeeper.InitializePinnedCodes(ctx); err != nil { tmos.Exit(fmt.Sprintf("failed initialize pinned codes %s", err)) } + // Initialize the keeper of bankkeeper + app.bankKeeper.(bankpluskeeper.Keeper).InitializeBankPlus(ctx) } return app @@ -811,6 +838,17 @@ func (app *WasmApp) ModuleAccountAddrs() map[string]bool { return modAccAddrs } +// BlockedAddrs returns all the app's module account addresses that are not +// allowed to receive external tokens. +func (app *WasmApp) BlockedAddrs() map[string]bool { + blockedAddrs := make(map[string]bool) + for acc := range maccPerms { + blockedAddrs[authtypes.NewModuleAddress(acc).String()] = !allowedReceivingModAcc()[acc] + } + + return blockedAddrs +} + // LegacyAmino returns legacy amino codec. // // NOTE: This is solely to be used for testing purposes as it may be desirable @@ -836,16 +874,16 @@ func (app *WasmApp) SimulationManager() *module.SimulationManager { // API server. func (app *WasmApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { clientCtx := apiSvr.ClientCtx - rpc.RegisterRoutes(clientCtx, apiSvr.Router) - // Register legacy tx routes. - authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) // Register new tx routes from grpc-gateway. authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // Register new tendermint queries routes from grpc-gateway. tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register node gRPC service for grpc-gateway. + nodeservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register legacy and grpc-gateway routes for all modules. - ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) + // ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // register swagger API from root so that other applications can override easily @@ -868,6 +906,10 @@ func (app *WasmApp) AppCodec() codec.Codec { return app.appCodec } +func (app *WasmApp) RegisterNodeService(clientCtx client.Context) { + nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter()) +} + // RegisterSwaggerAPI registers swagger route with API Server func RegisterSwaggerAPI(rtr *mux.Router) { statikFS, err := fs.New() diff --git a/app/app_test.go b/app/app_test.go index a3bd66ab6f..ad08c3ef09 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -7,19 +7,19 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" db "github.com/tendermint/tm-db" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/line/ostracon/abci/types" + "github.com/line/ostracon/libs/log" - "github.com/CosmWasm/wasmd/x/wasm" + "github.com/line/wasmd/x/wasm" ) var emptyWasmOpts []wasm.Option = nil func TestWasmdExport(t *testing.T) { db := db.NewMemDB() - gapp := NewWasmApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, MakeEncodingConfig(), wasm.EnableAllProposals, EmptyBaseAppOptions{}, emptyWasmOpts) + gapp := NewWasmApp(log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, MakeEncodingConfig(), wasm.EnableAllProposals, EmptyBaseAppOptions{}, emptyWasmOpts) genesisState := NewDefaultGenesisState() stateBytes, err := json.MarshalIndent(genesisState, "", " ") @@ -35,7 +35,7 @@ func TestWasmdExport(t *testing.T) { gapp.Commit() // Making a new app object with the db, so that initchain hasn't been called - newGapp := NewWasmApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, MakeEncodingConfig(), wasm.EnableAllProposals, EmptyBaseAppOptions{}, emptyWasmOpts) + newGapp := NewWasmApp(log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, MakeEncodingConfig(), wasm.EnableAllProposals, EmptyBaseAppOptions{}, emptyWasmOpts) _, err = newGapp.ExportAppStateAndValidators(false, []string{}) require.NoError(t, err, "ExportAppStateAndValidators should not have an error") } @@ -43,13 +43,18 @@ func TestWasmdExport(t *testing.T) { // ensure that blocked addresses are properly set in bank keeper func TestBlockedAddrs(t *testing.T) { db := db.NewMemDB() - gapp := NewWasmApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, MakeEncodingConfig(), wasm.EnableAllProposals, EmptyBaseAppOptions{}, emptyWasmOpts) + gapp := NewWasmApp(log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, MakeEncodingConfig(), wasm.EnableAllProposals, EmptyBaseAppOptions{}, emptyWasmOpts) + blockedAddrs := gapp.BlockedAddrs() for acc := range maccPerms { + //for acc := range gapp.BlockedAddrs() { t.Run(acc, func(t *testing.T) { - require.True(t, gapp.bankKeeper.BlockedAddr(gapp.accountKeeper.GetModuleAddress(acc)), - "ensure that blocked addresses are properly set in bank keeper", - ) + addr := gapp.accountKeeper.GetModuleAddress(acc) + if blockedAddrs[addr.String()] { + require.True(t, gapp.bankKeeper.BlockedAddr(addr), + "ensure that blocked addresses are properly set in bank keeper", + ) + } }) } } diff --git a/app/encoding.go b/app/encoding.go index 5416f77a97..3c2ec7c072 100644 --- a/app/encoding.go +++ b/app/encoding.go @@ -1,9 +1,9 @@ package app import ( - "github.com/cosmos/cosmos-sdk/std" + "github.com/line/lbm-sdk/std" - "github.com/CosmWasm/wasmd/app/params" + "github.com/line/wasmd/app/params" ) // MakeEncodingConfig creates a new EncodingConfig with all modules registered diff --git a/app/export.go b/app/export.go index 4740592806..cc9735b711 100644 --- a/app/export.go +++ b/app/export.go @@ -4,13 +4,12 @@ import ( "encoding/json" "log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - - servertypes "github.com/cosmos/cosmos-sdk/server/types" - sdk "github.com/cosmos/cosmos-sdk/types" - slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - "github.com/cosmos/cosmos-sdk/x/staking" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + servertypes "github.com/line/lbm-sdk/server/types" + sdk "github.com/line/lbm-sdk/types" + slashingtypes "github.com/line/lbm-sdk/x/slashing/types" + "github.com/line/lbm-sdk/x/staking" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + ocproto "github.com/line/ostracon/proto/ostracon/types" ) // ExportAppStateAndValidators exports the state of the application for a genesis @@ -19,7 +18,7 @@ func (app *WasmApp) ExportAppStateAndValidators( forZeroHeight bool, jailAllowedAddrs []string, ) (servertypes.ExportedApp, error) { // as if they could withdraw from the start of the next block - ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) + ctx := app.NewContext(true, ocproto.Header{Height: app.LastBlockHeight()}) // We export at last height + 1, because that's the height at which // Tendermint will start InitChain. @@ -46,7 +45,7 @@ func (app *WasmApp) ExportAppStateAndValidators( // prepare for fresh start at zero height // NOTE zero height genesis is a temporary feature which will be deprecated -// in favour of export at a block height +// in favour of export at a block height func (app *WasmApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []string) { applyAllowedAddrs := false diff --git a/app/params/encoding.go b/app/params/encoding.go index 3d634abf16..83bece7b19 100644 --- a/app/params/encoding.go +++ b/app/params/encoding.go @@ -1,9 +1,9 @@ package params import ( - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/codec/types" ) // EncodingConfig specifies the concrete encoding types to use for a given app. diff --git a/app/params/proto.go b/app/params/proto.go index 84ff35a399..2f9c999307 100644 --- a/app/params/proto.go +++ b/app/params/proto.go @@ -1,9 +1,9 @@ package params import ( - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/x/auth/tx" + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/codec/types" + "github.com/line/lbm-sdk/x/auth/tx" ) // MakeEncodingConfig creates an EncodingConfig for an amino based test configuration. diff --git a/app/sim_test.go b/app/sim_test.go index d8cf98da53..e9c3f1283b 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -7,33 +7,34 @@ import ( "path/filepath" "testing" - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/simapp" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/kv" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - "github.com/cosmos/cosmos-sdk/x/feegrant" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/cosmos/cosmos-sdk/x/simulation" - slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - ibchost "github.com/cosmos/ibc-go/v3/modules/core/24-host" "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/CosmWasm/wasmd/x/wasm" - wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/baseapp" + "github.com/line/lbm-sdk/simapp" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/types/kv" + simtypes "github.com/line/lbm-sdk/types/simulation" + authtypes "github.com/line/lbm-sdk/x/auth/types" + authzkeeper "github.com/line/lbm-sdk/x/authz/keeper" + banktypes "github.com/line/lbm-sdk/x/bank/types" + capabilitytypes "github.com/line/lbm-sdk/x/capability/types" + distrtypes "github.com/line/lbm-sdk/x/distribution/types" + evidencetypes "github.com/line/lbm-sdk/x/evidence/types" + "github.com/line/lbm-sdk/x/feegrant" + govtypes "github.com/line/lbm-sdk/x/gov/types" + ibctransfertypes "github.com/line/lbm-sdk/x/ibc/applications/transfer/types" + ibchost "github.com/line/lbm-sdk/x/ibc/core/24-host" + minttypes "github.com/line/lbm-sdk/x/mint/types" + paramstypes "github.com/line/lbm-sdk/x/params/types" + "github.com/line/lbm-sdk/x/simulation" + slashingtypes "github.com/line/lbm-sdk/x/slashing/types" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + "github.com/line/ostracon/libs/log" + ocproto "github.com/line/ostracon/proto/ostracon/types" + + "github.com/line/wasmd/x/wasm" + wasmtypes "github.com/line/wasmd/x/wasm/types" ) // Get flags every time the simulator is run @@ -156,8 +157,8 @@ func TestAppImportExport(t *testing.T) { err = json.Unmarshal(exported.AppState, &genesisState) require.NoError(t, err) - ctxA := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) - ctxB := newApp.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) + ctxA := app.NewContext(true, ocproto.Header{Height: app.LastBlockHeight()}) + ctxB := newApp.NewContext(true, ocproto.Header{Height: app.LastBlockHeight()}) newApp.mm.InitGenesis(ctxB, app.AppCodec(), genesisState) newApp.StoreConsensusParams(ctxB, exported.ConsensusParams) diff --git a/app/test_access.go b/app/test_access.go index 6dadec1e0c..e8d9ae80dd 100644 --- a/app/test_access.go +++ b/app/test_access.go @@ -3,19 +3,17 @@ package app import ( "testing" - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/client" - - "github.com/CosmWasm/wasmd/app/params" - - "github.com/cosmos/cosmos-sdk/codec" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - ibctransferkeeper "github.com/cosmos/ibc-go/v3/modules/apps/transfer/keeper" - ibckeeper "github.com/cosmos/ibc-go/v3/modules/core/keeper" - - "github.com/CosmWasm/wasmd/x/wasm" + "github.com/line/lbm-sdk/baseapp" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/codec" + bankkeeper "github.com/line/lbm-sdk/x/bank/keeper" + capabilitykeeper "github.com/line/lbm-sdk/x/capability/keeper" + ibctransferkeeper "github.com/line/lbm-sdk/x/ibc/applications/transfer/keeper" + ibckeeper "github.com/line/lbm-sdk/x/ibc/core/keeper" + stakingkeeper "github.com/line/lbm-sdk/x/staking/keeper" + + "github.com/line/wasmd/app/params" + "github.com/line/wasmd/x/wasm" ) type TestSupport struct { diff --git a/app/test_helpers.go b/app/test_helpers.go index 11e72135b3..f6af83d792 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -10,29 +10,30 @@ import ( "testing" "time" - bam "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/client" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/simapp/helpers" - "github.com/cosmos/cosmos-sdk/snapshots" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/errors" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "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" - tmtypes "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tm-db" - "github.com/CosmWasm/wasmd/x/wasm" + bam "github.com/line/lbm-sdk/baseapp" + "github.com/line/lbm-sdk/client" + codectypes "github.com/line/lbm-sdk/codec/types" + cryptocodec "github.com/line/lbm-sdk/crypto/codec" + "github.com/line/lbm-sdk/crypto/keys/ed25519" + cryptotypes "github.com/line/lbm-sdk/crypto/types" + "github.com/line/lbm-sdk/simapp/helpers" + "github.com/line/lbm-sdk/snapshots" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/types/errors" + authtypes "github.com/line/lbm-sdk/x/auth/types" + bankkeeper "github.com/line/lbm-sdk/x/bank/keeper" + banktypes "github.com/line/lbm-sdk/x/bank/types" + minttypes "github.com/line/lbm-sdk/x/mint/types" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + abci "github.com/line/ostracon/abci/types" + "github.com/line/ostracon/libs/log" + ocproto "github.com/line/ostracon/proto/ostracon/types" + tmtypes "github.com/line/ostracon/types" + + "github.com/line/wasmd/x/wasm" ) // DefaultConsensusParams defines the default Tendermint consensus params used in @@ -42,12 +43,12 @@ var DefaultConsensusParams = &abci.ConsensusParams{ MaxBytes: 8000000, MaxGas: 1234000000, }, - Evidence: &tmproto.EvidenceParams{ + Evidence: &ocproto.EvidenceParams{ MaxAgeNumBlocks: 302400, MaxAgeDuration: 504 * time.Hour, // 3 weeks is the max duration MaxBytes: 10000, }, - Validator: &tmproto.ValidatorParams{ + Validator: &ocproto.ValidatorParams{ PubKeyTypes: []string{ tmtypes.ABCIPubKeyTypeEd25519, }, @@ -86,7 +87,7 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs bondAmt := sdk.NewInt(1000000) for _, val := range valSet.Validators { - pk, err := cryptocodec.FromTmPubKeyInterface(val.PubKey) + pk, err := cryptocodec.FromOcPubKeyInterface(val.PubKey) require.NoError(t, err) pkAny, err := codectypes.NewAnyWithValue(pk) require.NoError(t, err) @@ -142,7 +143,7 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs // commit genesis changes app.Commit() - app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{ + app.BeginBlock(abci.RequestBeginBlock{Header: ocproto.Header{ Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash, ValidatorsHash: valSet.Hash(), @@ -279,7 +280,7 @@ func TestAddr(addr string, bech string) (sdk.AccAddress, error) { // CheckBalance checks the balance of an account. func CheckBalance(t *testing.T, app *WasmApp, addr sdk.AccAddress, balances sdk.Coins) { - ctxCheck := app.BaseApp.NewContext(true, tmproto.Header{}) + ctxCheck := app.BaseApp.NewContext(true, ocproto.Header{}) require.True(t, balances.IsEqual(app.bankKeeper.GetAllBalances(ctxCheck, addr))) } @@ -290,7 +291,7 @@ const DefaultGas = 1200000 // the parameter 'expPass' against the result. A corresponding result is // returned. func SignCheckDeliver( - t *testing.T, txCfg client.TxConfig, app *bam.BaseApp, header tmproto.Header, msgs []sdk.Msg, + t *testing.T, txCfg client.TxConfig, app *bam.BaseApp, header ocproto.Header, msgs []sdk.Msg, chainID string, accNums, accSeqs []uint64, expSimPass, expPass bool, priv ...cryptotypes.PrivKey, ) (sdk.GasInfo, *sdk.Result, error) { tx, err := helpers.GenTx( @@ -339,7 +340,7 @@ func SignCheckDeliver( // SignAndDeliver signs and delivers a transaction. No simulation occurs as the // ibc testing package causes checkState and deliverState to diverge in block time. func SignAndDeliver( - t *testing.T, txCfg client.TxConfig, app *bam.BaseApp, header tmproto.Header, msgs []sdk.Msg, + t *testing.T, txCfg client.TxConfig, app *bam.BaseApp, header ocproto.Header, msgs []sdk.Msg, chainID string, accNums, accSeqs []uint64, expSimPass, expPass bool, priv ...cryptotypes.PrivKey, ) (sdk.GasInfo, *sdk.Result, error) { tx, err := helpers.GenTx( diff --git a/benchmarks/app_test.go b/benchmarks/app_test.go index 1fbfb48663..da19df9252 100644 --- a/benchmarks/app_test.go +++ b/benchmarks/app_test.go @@ -7,23 +7,22 @@ import ( "time" "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/client" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/simapp/helpers" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - - "github.com/CosmWasm/wasmd/app" - "github.com/CosmWasm/wasmd/x/wasm" - wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/crypto/keys/secp256k1" + "github.com/line/lbm-sdk/simapp/helpers" + sdk "github.com/line/lbm-sdk/types" + authtypes "github.com/line/lbm-sdk/x/auth/types" + banktypes "github.com/line/lbm-sdk/x/bank/types" + abci "github.com/line/ostracon/abci/types" + "github.com/line/ostracon/libs/log" + ocproto "github.com/line/ostracon/proto/ostracon/types" + + "github.com/line/wasmd/app" + wasmappparams "github.com/line/wasmd/app/params" + "github.com/line/wasmd/x/wasm" + wasmtypes "github.com/line/wasmd/x/wasm/types" ) func setup(db dbm.DB, withGenesis bool, invCheckPeriod uint, opts ...wasm.Option) (*app.WasmApp, app.GenesisState) { @@ -66,7 +65,7 @@ func SetupWithGenesisAccounts(b testing.TB, db dbm.DB, genAccs []authtypes.Genes ) wasmApp.Commit() - wasmApp.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: wasmApp.LastBlockHeight() + 1}}) + wasmApp.BeginBlock(abci.RequestBeginBlock{Header: ocproto.Header{Height: wasmApp.LastBlockHeight() + 1}}) return wasmApp } @@ -115,8 +114,8 @@ func InitializeWasmApp(b testing.TB, db dbm.DB, numAccounts int) AppInfo { // add wasm contract height := int64(2) - txGen := simappparams.MakeTestEncodingConfig().TxConfig - wasmApp.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: height, Time: time.Now()}}) + txGen := wasmappparams.MakeEncodingConfig().TxConfig + wasmApp.BeginBlock(abci.RequestBeginBlock{Header: ocproto.Header{Height: height, Time: time.Now()}}) // upload the code cw20Code, err := ioutil.ReadFile("./testdata/cw20_base.wasm") @@ -180,7 +179,7 @@ func InitializeWasmApp(b testing.TB, db dbm.DB, numAccounts int) AppInfo { Denom: denom, AccNum: 0, SeqNum: 2, - TxConfig: simappparams.MakeTestEncodingConfig().TxConfig, + TxConfig: wasmappparams.MakeEncodingConfig().TxConfig, } } diff --git a/benchmarks/bench_test.go b/benchmarks/bench_test.go index 9001f1abf4..2815c027d7 100644 --- a/benchmarks/bench_test.go +++ b/benchmarks/bench_test.go @@ -7,16 +7,15 @@ import ( "github.com/stretchr/testify/require" "github.com/syndtr/goleveldb/leveldb/opt" - - abci "github.com/tendermint/tendermint/abci/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/line/lbm-sdk/crypto/keys/secp256k1" + sdk "github.com/line/lbm-sdk/types" + banktypes "github.com/line/lbm-sdk/x/bank/types" + abci "github.com/line/ostracon/abci/types" + ocproto "github.com/line/ostracon/proto/ostracon/types" - wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + wasmtypes "github.com/line/wasmd/x/wasm/types" ) func BenchmarkTxSending(b *testing.B) { @@ -103,12 +102,12 @@ func BenchmarkTxSending(b *testing.B) { b.ResetTimer() for i := 0; i < b.N/blockSize; i++ { - appInfo.App.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: height, Time: time.Now()}}) + appInfo.App.BeginBlock(abci.RequestBeginBlock{Header: ocproto.Header{Height: height, Time: time.Now()}}) for j := 0; j < blockSize; j++ { idx := i*blockSize + j - _, _, err := appInfo.App.Check(txEncoder, txs[idx]) + _, err := appInfo.App.Check(txEncoder, txs[idx]) if err != nil { panic("something is broken in checking transaction") } diff --git a/cmd/wasmd/genaccounts.go b/cmd/wasmd/genaccounts.go index 9acf2cea70..990c6aa898 100644 --- a/cmd/wasmd/genaccounts.go +++ b/cmd/wasmd/genaccounts.go @@ -8,16 +8,16 @@ import ( "github.com/spf13/cobra" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - authvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/client/flags" + "github.com/line/lbm-sdk/crypto/keyring" + "github.com/line/lbm-sdk/server" + sdk "github.com/line/lbm-sdk/types" + authtypes "github.com/line/lbm-sdk/x/auth/types" + authvesting "github.com/line/lbm-sdk/x/auth/vesting/types" + banktypes "github.com/line/lbm-sdk/x/bank/types" + "github.com/line/lbm-sdk/x/genutil" + genutiltypes "github.com/line/lbm-sdk/x/genutil/types" ) const ( diff --git a/cmd/wasmd/genwasm.go b/cmd/wasmd/genwasm.go index fba3d503d2..49fec3b3dd 100644 --- a/cmd/wasmd/genwasm.go +++ b/cmd/wasmd/genwasm.go @@ -1,10 +1,11 @@ package main import ( - "github.com/cosmos/cosmos-sdk/client" "github.com/spf13/cobra" - wasmcli "github.com/CosmWasm/wasmd/x/wasm/client/cli" + "github.com/line/lbm-sdk/client" + + wasmcli "github.com/line/wasmd/x/wasm/client/cli" ) func AddGenesisWasmMsgCmd(defaultNodeHome string) *cobra.Command { diff --git a/cmd/wasmd/main.go b/cmd/wasmd/main.go index 7bd3d01220..4c9723eb88 100644 --- a/cmd/wasmd/main.go +++ b/cmd/wasmd/main.go @@ -3,10 +3,10 @@ package main import ( "os" - "github.com/cosmos/cosmos-sdk/server" - svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + "github.com/line/lbm-sdk/server" + svrcmd "github.com/line/lbm-sdk/server/cmd" - "github.com/CosmWasm/wasmd/app" + "github.com/line/wasmd/app" ) func main() { diff --git a/cmd/wasmd/root.go b/cmd/wasmd/root.go index 99889afb45..9d6b628907 100644 --- a/cmd/wasmd/root.go +++ b/cmd/wasmd/root.go @@ -6,36 +6,38 @@ import ( "os" "path/filepath" - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/config" - "github.com/cosmos/cosmos-sdk/client/debug" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/client/rpc" - "github.com/cosmos/cosmos-sdk/server" - servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/snapshots" - "github.com/cosmos/cosmos-sdk/store" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/version" - authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/crisis" - genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" "github.com/prometheus/client_golang/prometheus" "github.com/spf13/cast" "github.com/spf13/cobra" - tmcli "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/log" + "github.com/spf13/viper" dbm "github.com/tendermint/tm-db" - "github.com/CosmWasm/wasmd/app" - "github.com/CosmWasm/wasmd/app/params" - "github.com/CosmWasm/wasmd/x/wasm" - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/baseapp" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/client/config" + "github.com/line/lbm-sdk/client/debug" + "github.com/line/lbm-sdk/client/flags" + "github.com/line/lbm-sdk/client/keys" + "github.com/line/lbm-sdk/client/rpc" + "github.com/line/lbm-sdk/server" + servertypes "github.com/line/lbm-sdk/server/types" + "github.com/line/lbm-sdk/snapshots" + "github.com/line/lbm-sdk/store" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/version" + authcmd "github.com/line/lbm-sdk/x/auth/client/cli" + authtypes "github.com/line/lbm-sdk/x/auth/types" + banktypes "github.com/line/lbm-sdk/x/bank/types" + "github.com/line/lbm-sdk/x/crisis" + genutilcli "github.com/line/lbm-sdk/x/genutil/client/cli" + tmcli "github.com/line/ostracon/libs/cli" + "github.com/line/ostracon/libs/log" + + "github.com/line/wasmd/app" + "github.com/line/wasmd/app/params" + "github.com/line/wasmd/x/wasm" + wasmkeeper "github.com/line/wasmd/x/wasm/keeper" + wasmtypes "github.com/line/wasmd/x/wasm/types" ) // NewRootCmd creates a new root command for wasmd. It is called once in the @@ -188,8 +190,10 @@ func (ac appCreator) newApp( ) servertypes.Application { var cache sdk.MultiStorePersistentCache + ibCacheMetricsProvider := baseapp.MetricsProvider(cast.ToBool(viper.GetBool(server.FlagPrometheus))) if cast.ToBool(appOpts.Get(server.FlagInterBlockCache)) { - cache = store.NewCommitKVStoreCacheManager() + cache = store.NewCommitKVStoreCacheManager( + cast.ToInt(appOpts.Get(server.FlagInterBlockCacheSize)), ibCacheMetricsProvider) } skipUpgradeHeights := make(map[int64]bool) diff --git a/contrib/prototools-docker/Dockerfile b/contrib/prototools-docker/Dockerfile index 7d5af0d1fb..3ed6974c24 100644 --- a/contrib/prototools-docker/Dockerfile +++ b/contrib/prototools-docker/Dockerfile @@ -39,7 +39,7 @@ RUN GO111MODULE=on go get \ RUN upx --lzma /usr/local/bin/* -FROM golang:1.17.3-alpine +FROM golang:1.18-alpine ENV LD_LIBRARY_PATH=/lib64:/lib WORKDIR /work diff --git a/docs/proto/proto-docs.md b/docs/proto/proto-docs.md index f6c0182b6d..b01be26d6b 100644 --- a/docs/proto/proto-docs.md +++ b/docs/proto/proto-docs.md @@ -80,6 +80,28 @@ - [Query](#cosmwasm.wasm.v1.Query) +- [lbm/wasm/v1/event.proto](#lbm/wasm/v1/event.proto) + - [EventActivateContractProposal](#lbm.wasm.v1.EventActivateContractProposal) + - [EventDeactivateContractProposal](#lbm.wasm.v1.EventDeactivateContractProposal) + +- [lbm/wasm/v1/proposal.proto](#lbm/wasm/v1/proposal.proto) + - [ActivateContractProposal](#lbm.wasm.v1.ActivateContractProposal) + - [DeactivateContractProposal](#lbm.wasm.v1.DeactivateContractProposal) + +- [lbm/wasm/v1/query.proto](#lbm/wasm/v1/query.proto) + - [QueryInactiveContractRequest](#lbm.wasm.v1.QueryInactiveContractRequest) + - [QueryInactiveContractResponse](#lbm.wasm.v1.QueryInactiveContractResponse) + - [QueryInactiveContractsRequest](#lbm.wasm.v1.QueryInactiveContractsRequest) + - [QueryInactiveContractsResponse](#lbm.wasm.v1.QueryInactiveContractsResponse) + + - [Query](#lbm.wasm.v1.Query) + +- [lbm/wasm/v1/tx.proto](#lbm/wasm/v1/tx.proto) + - [MsgStoreCodeAndInstantiateContract](#lbm.wasm.v1.MsgStoreCodeAndInstantiateContract) + - [MsgStoreCodeAndInstantiateContractResponse](#lbm.wasm.v1.MsgStoreCodeAndInstantiateContractResponse) + + - [Msg](#lbm.wasm.v1.Msg) + - [Scalar Value Types](#scalar-value-types) @@ -221,6 +243,9 @@ Params defines the set of wasm parameters. | ----- | ---- | ----- | ----------- | | `code_upload_access` | [AccessConfig](#cosmwasm.wasm.v1.AccessConfig) | | | | `instantiate_default_permission` | [AccessType](#cosmwasm.wasm.v1.AccessType) | | | +| `gas_multiplier` | [uint64](#uint64) | | | +| `instance_cost` | [uint64](#uint64) | | | +| `compile_cost` | [uint64](#uint64) | | | @@ -538,6 +563,7 @@ GenesisState - genesis state of x/wasm | `contracts` | [Contract](#cosmwasm.wasm.v1.Contract) | repeated | | | `sequences` | [Sequence](#cosmwasm.wasm.v1.Sequence) | repeated | | | `gen_msgs` | [GenesisState.GenMsgs](#cosmwasm.wasm.v1.GenesisState.GenMsgs) | repeated | | +| `inactive_contract_addresses` | [string](#string) | repeated | InactiveContractAddresses is a list of contract address that set inactive | @@ -1209,6 +1235,254 @@ Query provides defines the gRPC querier service + +

Top

+ +## lbm/wasm/v1/event.proto + + + + + +### EventActivateContractProposal +EventActivateContractProposal is the event that is emitted when the contract is activates. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `contract` | [string](#string) | | contract is the smart contract's address | + + + + + + + + +### EventDeactivateContractProposal +EventDeactivateContractProposal is the event that is emitted when the contract is deactivate. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `contract` | [string](#string) | | contract is the smart contract's address | + + + + + + + + + + + + + + + + +

Top

+ +## lbm/wasm/v1/proposal.proto + + + + + +### ActivateContractProposal +ActivateContractProposal gov proposal content type deletes a contract from inactive list. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `title` | [string](#string) | | Title is a short summary | +| `description` | [string](#string) | | Description is a human readable text | +| `contract` | [string](#string) | | Contract is the smart contract address to activate | + + + + + + + + +### DeactivateContractProposal +DeactivateContractProposal gov proposal content type adds a contract to inactive list. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `title` | [string](#string) | | Title is a short summary | +| `description` | [string](#string) | | Description is a human readable text | +| `contract` | [string](#string) | | Contract is the smart contract address to deactivate | + + + + + + + + + + + + + + + + +

Top

+ +## lbm/wasm/v1/query.proto + + + + + +### QueryInactiveContractRequest +QueryIsInactiveContractRequest is the request type for Query/IsInactiveContract RPC method. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `address` | [string](#string) | | address is the address of the contract | + + + + + + + + +### QueryInactiveContractResponse +QueryInactiveContractsResponse is the response type for the Query/IsInactiveContract RPC method. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `inactivated` | [bool](#bool) | | inactivated is the result if the contract is inactive contract or not | + + + + + + + + +### QueryInactiveContractsRequest +QueryInactiveContractsRequest is the request type for Query/InactiveContract RPC method. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request | + + + + + + + + +### QueryInactiveContractsResponse +QueryInactiveContractsResponse is the response type for the Query/InactiveContract RPC method. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `addresses` | [string](#string) | repeated | addresses is the inactive address list | +| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination defines the pagination in the response | + + + + + + + + + + + + + + +### Query +Query defines the gRPC querier service. + +| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint | +| ----------- | ------------ | ------------- | ------------| ------- | -------- | +| `InactiveContracts` | [QueryInactiveContractsRequest](#lbm.wasm.v1.QueryInactiveContractsRequest) | [QueryInactiveContractsResponse](#lbm.wasm.v1.QueryInactiveContractsResponse) | InactiveContracts queries all inactive contracts | GET|/lbm/wasm/v1/inactive_contracts| +| `InactiveContract` | [QueryInactiveContractRequest](#lbm.wasm.v1.QueryInactiveContractRequest) | [QueryInactiveContractResponse](#lbm.wasm.v1.QueryInactiveContractResponse) | | GET|/lbm/wasm/v1/inactive_contracts/{address}| + + + + + + +

Top

+ +## lbm/wasm/v1/tx.proto + + + + + +### MsgStoreCodeAndInstantiateContract +MsgStoreCodeAndInstantiateContract submit Wasm code to the system and instantiate a contract using it. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `sender` | [string](#string) | | Sender is the that actor that signed the messages | +| `wasm_byte_code` | [bytes](#bytes) | | WASMByteCode can be raw or gzip compressed | +| `instantiate_permission` | [cosmwasm.wasm.v1.AccessConfig](#cosmwasm.wasm.v1.AccessConfig) | | | +| `admin` | [string](#string) | | Admin is an optional address that can execute migrations | +| `label` | [string](#string) | | Label is optional metadata to be stored with a contract instance. | +| `msg` | [bytes](#bytes) | | Msg json encoded message to be passed to the contract on instantiation | +| `funds` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | Funds coins that are transferred to the contract on instantiation | + + + + + + + + +### MsgStoreCodeAndInstantiateContractResponse +MsgStoreCodeAndInstantiateContractResponse returns store and instantiate result data. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `code_id` | [uint64](#uint64) | | CodeID is the reference to the stored WASM code | +| `address` | [string](#string) | | Address is the bech32 address of the new contract instance | +| `data` | [bytes](#bytes) | | Data contains base64-encoded bytes to returned from the contract | + + + + + + + + + + + + + + +### Msg +Msg defines the wasm Msg service for lbm-sdk. + +| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint | +| ----------- | ------------ | ------------- | ------------| ------- | -------- | +| `StoreCodeAndInstantiateContract` | [MsgStoreCodeAndInstantiateContract](#lbm.wasm.v1.MsgStoreCodeAndInstantiateContract) | [MsgStoreCodeAndInstantiateContractResponse](#lbm.wasm.v1.MsgStoreCodeAndInstantiateContractResponse) | StoreCodeAndInstantiateContract upload code and instantiate a contract using it | | + + + + + ## Scalar Value Types | .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | diff --git a/go.mod b/go.mod index 7a99fc1b93..47b07b5048 100644 --- a/go.mod +++ b/go.mod @@ -1,52 +1,55 @@ -module github.com/CosmWasm/wasmd +module github.com/line/wasmd -go 1.17 +go 1.18 require ( - github.com/CosmWasm/wasmvm v1.0.0 - github.com/cosmos/cosmos-sdk v0.45.4 - github.com/cosmos/iavl v0.17.3 - github.com/cosmos/ibc-go/v3 v3.0.0 + github.com/cosmos/iavl v0.19.4 github.com/cosmos/interchain-accounts v0.1.0 github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b + github.com/go-kit/kit v0.12.0 github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.2 github.com/google/gofuzz v1.2.0 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 + github.com/line/lbm-sdk v0.46.1-0.20230106043757-1ece23d83a0b + github.com/line/ostracon v1.0.7 + github.com/line/wasmvm v1.0.0-0.10.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.12.1 + github.com/prometheus/client_golang v1.14.0 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa - github.com/spf13/cast v1.4.1 - github.com/spf13/cobra v1.4.0 + github.com/spf13/cast v1.5.0 + github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.11.0 - github.com/stretchr/testify v1.7.1 - github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca - github.com/tendermint/tendermint v0.34.19 + github.com/spf13/viper v1.14.0 + github.com/stretchr/testify v1.8.1 + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/tendermint/tm-db v0.6.7 - google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac - google.golang.org/grpc v1.45.0 + google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e + google.golang.org/grpc v1.50.1 gopkg.in/yaml.v2 v2.4.0 ) require ( - filippo.io/edwards25519 v1.0.0-beta.2 // indirect + filippo.io/edwards25519 v1.0.0-rc.1 // indirect github.com/99designs/keyring v1.1.6 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect - github.com/DataDog/zstd v1.4.5 // indirect + github.com/VictoriaMetrics/fastcache v1.12.0 // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect - github.com/armon/go-metrics v0.3.10 // indirect + github.com/armon/go-metrics v0.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect - github.com/btcsuite/btcd v0.22.0-beta // indirect + github.com/btcsuite/btcd v0.22.1 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/coinbase/rosetta-sdk-go v0.7.0 // indirect - github.com/confio/ics23/go v0.7.0 // indirect + github.com/coinbase/rosetta-sdk-go v0.8.2 // indirect + github.com/confio/ics23/go v0.9.0 // indirect + github.com/coniks-sys/coniks-go v0.0.0-20180722014011-11acf4819b71 // indirect github.com/cosmos/btcutil v1.0.4 // indirect + github.com/cosmos/cosmos-sdk v0.45.1 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gorocksdb v1.2.0 // indirect github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect @@ -54,18 +57,18 @@ require ( github.com/danieljoos/wincred v1.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/dgraph-io/badger/v2 v2.2007.2 // indirect - github.com/dgraph-io/ristretto v0.0.3 // indirect + github.com/dgraph-io/badger/v2 v2.2007.4 // indirect + github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/go-kit/kit v0.12.0 // indirect - github.com/go-kit/log v0.2.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/gateway v1.1.0 // indirect - github.com/golang/snappy v0.0.3 // indirect + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.0.0 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/gorilla/handlers v1.5.1 // indirect @@ -75,50 +78,59 @@ require ( github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 // indirect - github.com/improbable-eng/grpc-web v0.14.1 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect + github.com/herumi/bls-eth-go-binary v0.0.0-20220509081320-2d8ab06de53c // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jmhodges/levigo v1.0.0 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/lib/pq v1.10.4 // indirect - github.com/libp2p/go-buffer-pool v0.0.2 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/klauspost/compress v1.15.1 // indirect + github.com/lib/pq v1.10.7 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/line/tm-db/v2 v2.0.0-init.1.0.20220121012851-61d2bc1d9486 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 // indirect github.com/minio/highwayhash v1.0.2 // indirect - github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/pelletier/go-toml v1.9.4 // indirect - github.com/pelletier/go-toml/v2 v2.0.0-beta.8 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.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/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.39.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect + github.com/r2ishiguro/vrf v0.0.0-20180716233122-192de52975eb // indirect github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect github.com/rs/cors v1.8.2 // indirect - github.com/rs/zerolog v1.26.0 // indirect - github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa // indirect - github.com/spf13/afero v1.8.2 // indirect + github.com/rs/zerolog v1.28.0 // indirect + github.com/sasha-s/go-deadlock v0.3.1 // indirect + github.com/spf13/afero v1.9.2 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/subosito/gotenv v1.2.0 // indirect + github.com/stretchr/objx v0.5.0 // indirect + github.com/subosito/gotenv v1.4.1 // indirect github.com/tendermint/btcd v0.1.1 // indirect github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 // indirect github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tendermint/tendermint v0.34.20 // indirect github.com/zondax/hid v0.9.0 // indirect go.etcd.io/bbolt v1.3.6 // indirect - golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect - golang.org/x/net v0.0.0-20220412020605-290c469a71a5 // indirect - golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + golang.org/x/crypto v0.4.0 // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/net v0.4.0 // indirect + golang.org/x/sys v0.3.0 // indirect + golang.org/x/term v0.3.0 // indirect + golang.org/x/text v0.5.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect ) @@ -132,5 +144,4 @@ replace ( // the following version across all dependencies. github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 google.golang.org/grpc => google.golang.org/grpc v1.33.2 - ) diff --git a/go.sum b/go.sum index a2239dce57..9199e30e8b 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= +4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= @@ -13,6 +13,7 @@ cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6 cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= @@ -40,6 +41,8 @@ cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM7 cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= @@ -48,15 +51,21 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.0.0-beta.2 h1:/BZRNzm8N4K4eWfK28dL4yescorxtO7YG1yun8fy+pI= filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= +filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= +filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +github.com/Antonboom/errname v0.1.6/go.mod h1:7lz79JAnuoMNDAWE9MeeIr1/c/VpSUWatBv2FH9NYpI= +github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= @@ -77,32 +86,40 @@ github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -github.com/CosmWasm/wasmvm v1.0.0 h1:NRmnHe3xXsKn2uEcB1F5Ha323JVAhON+BI6L177dlKc= -github.com/CosmWasm/wasmvm v1.0.0/go.mod h1:ei0xpvomwSdONsxDuONzV7bL1jSET1M8brEx0FCXc+A= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.1.0/go.mod h1:LGOGuvEgCfCQsy3JF2tRmpGDpzA53iZfyGEWSPwQ6/4= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.1.0/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= +github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= +github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/Workiva/go-datastructures v1.0.52/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= @@ -110,8 +127,8 @@ github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSa github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= github.com/adlio/schema v1.1.13/go.mod h1:L5Z7tw+7lRK1Fnpi/LT/ooCP1elkXn0krMWBQHUhEDE= -github.com/adlio/schema v1.3.0 h1:eSVYLxYWbm/6ReZBCkLw4Fz7uqC+ZNoPvA39bOwi52A= -github.com/adlio/schema v1.3.0/go.mod h1:51QzxkpeFs6lRY11kPye26IaFPOV+HqEj01t5aXXKfs= +github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -120,8 +137,14 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= @@ -129,20 +152,27 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= +github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -152,13 +182,21 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= +github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= -github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= +github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= +github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -173,11 +211,15 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/bufbuild/buf v1.4.0/go.mod h1:mwHG7klTHnX+rM/ym8LXGl7vYpVmnwT96xWoRB4H5QI= +github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -186,11 +228,15 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= +github.com/chavacava/garif v0.0.0-20220316182200-5cad0b5181d4/go.mod h1:W8EnPSQ8Nv4fUjc/v1/8tHFqhuOJXnRub0dTfuAQktU= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= @@ -203,16 +249,19 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coinbase/rosetta-sdk-go v0.7.0 h1:lmTO/JEpCvZgpbkOITL95rA80CPKb5CtMzLaqF2mCNg= github.com/coinbase/rosetta-sdk-go v0.7.0/go.mod h1:7nD3oBPIiHqhRprqvMgPoGxe/nyq3yftRmpsy29coWE= +github.com/coinbase/rosetta-sdk-go v0.8.2 h1:+sNgMUPpntOsYLy5aRsHqBY6I0MTxZkS4JXV1Un3DKc= +github.com/coinbase/rosetta-sdk-go v0.8.2/go.mod h1:tXPR6AIW9ogsH4tYIaFOKOgfJNanCvcyl7JKLd4DToc= github.com/confio/ics23/go v0.6.6/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= -github.com/confio/ics23/go v0.7.0 h1:00d2kukk7sPoHWL4zZBZwzxnpA2pec1NPdwbSokJ5w8= -github.com/confio/ics23/go v0.7.0/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= +github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= +github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= +github.com/coniks-sys/coniks-go v0.0.0-20180722014011-11acf4819b71 h1:MFLTqgfJclmtaQ1SRUrWwmDX/1UBok3XWUethkJ2swQ= +github.com/coniks-sys/coniks-go v0.0.0-20180722014011-11acf4819b71/go.mod h1:TrHYHH4Wze7v7Hkwu1MH1W+mCPQKM+gs+PicdEV14o8= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.2.1 h1:/EeEo2EtN3umhbbgCveyjifoMYg0pS+nMMEemaYw634= -github.com/containerd/continuity v0.2.1/go.mod h1:wCYX+dRqZdImhGucXOqTQn05AhX6EUDaGEMUzTFFpLg= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -221,23 +270,23 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= +github.com/cosmos/cosmos-sdk v0.45.1 h1:PY79YxPea5qlRLExRnzg8/rT1Scc8GGgRs22p7DX99Q= github.com/cosmos/cosmos-sdk v0.45.1/go.mod h1:XXS/asyCqWNWkx2rW6pSuen+EVcpAFxq6khrhnZgHaQ= -github.com/cosmos/cosmos-sdk v0.45.4 h1:eStDAhJdMY8n5arbBRe+OwpNeBSunxSBHp1g55ulfdA= -github.com/cosmos/cosmos-sdk v0.45.4/go.mod h1:WOqtDxN3eCCmnYLVla10xG7lEXkFjpTaqm2a2WasgCc= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.17.3 h1:s2N819a2olOmiauVa0WAhoIJq9EhSXE9HDBAoR9k+8Y= github.com/cosmos/iavl v0.17.3/go.mod h1:prJoErZFABYZGDHka1R6Oay4z9PrNeFFiMKHDAMOi4w= -github.com/cosmos/ibc-go/v3 v3.0.0 h1:XUNplHVS51Q2gMnTFsFsH9QJ7flsovMamnltKbEgPQ4= -github.com/cosmos/ibc-go/v3 v3.0.0/go.mod h1:Mb+1NXiPOLd+CPFlOC6BKeAUaxXlhuWenMmRiUiSmwY= +github.com/cosmos/iavl v0.19.4 h1:t82sN+Y0WeqxDLJRSpNd8YFX5URIrT+p8n6oJbJ2Dok= +github.com/cosmos/iavl v0.19.4/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= github.com/cosmos/interchain-accounts v0.1.0 h1:QmuwNsf1Hxl3P5GSGt7Z+JeuHPiZw4Z34R/038P5T6s= github.com/cosmos/interchain-accounts v0.1.0/go.mod h1:Fv6LXDs+0ng4mIDVWwEJMXbAIMxY4kiq+A7Bw1Fb9AY= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 h1:DdzS1m6o/pCqeZ8VOAit/gyATedRgjvkVI+UCrLpyuU= @@ -250,25 +299,33 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/daixiang0/gci v0.3.3/go.mod h1:1Xr2bxnQbDxCqqulUOv8qpGqkgRw9RSCGGjEC2LjF8o= github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= @@ -276,7 +333,11 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUn github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= @@ -295,9 +356,12 @@ github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= @@ -312,8 +376,10 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/firefart/nonamedreturns v1.0.1/go.mod h1:D3dpIBojGGNh5UfElmwPu73SwDCm+VKhHYqwlNOk2uQ= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -322,16 +388,24 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/fzipp/gocyclo v0.5.1/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/go-critic/go-critic v0.6.3/go.mod h1:c6b3ZP1MQ7o6lPR7Rv3lEf7pYQUmAcx8ABHgdZCQt/k= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -341,14 +415,16 @@ github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgO github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -356,12 +432,25 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= @@ -371,12 +460,16 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -393,6 +486,7 @@ github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71 github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -415,11 +509,24 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.46.2/go.mod h1:3DkdHnxn9eoTTrpT2gB0TEv8KSziuoqe9FitgQLHvAY= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -432,8 +539,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +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/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -451,28 +559,38 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= @@ -481,14 +599,26 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= +github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= @@ -498,6 +628,7 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= @@ -529,6 +660,7 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= @@ -538,11 +670,14 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -556,10 +691,16 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 h1:uUjLpLt6bVvZ72SQc/B4dXcPBw4Vgd7soowdRl52qEM= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= +github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU= +github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE= +github.com/herumi/bls-eth-go-binary v0.0.0-20220509081320-2d8ab06de53c h1:ppGSVyhAFh8VAGyDuNeLEGMYRJR5iDI92QgDNrMIqK0= +github.com/herumi/bls-eth-go-binary v0.0.0-20220509081320-2d8ab06de53c/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= @@ -567,25 +708,47 @@ github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3 github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/improbable-eng/grpc-web v0.14.1 h1:NrN4PY71A6tAz2sKDvC5JCauENWp0ykG8Oq1H3cpFvw= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/improbable-eng/grpc-web v0.14.1/go.mod h1:zEjGHa8DAlkoOXmswrNvhUGEYQA9UI7DhrGeHR1DMGU= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jhump/protoreflect v1.9.0 h1:npqHz788dryJiR/l6K/RUQAyh2SwV91+d1dnh4RjO9w= +github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f/go.mod h1:qr2b5kx4HbFS7/g4uYO5qv9ei8303JMsC7ESbYiqr2Q= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= github.com/jhump/protoreflect v1.9.0/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= +github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98= +github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -599,50 +762,92 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.6.2/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= +github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= +github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= +github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +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.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +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/line/gorocksdb v0.0.0-20210406043732-d4bea34b6d55/go.mod h1:DHRJroSL7NaRkpvocRx3OtRsleXVsYSxBI9SfHFlTQ0= +github.com/line/lbm-sdk v0.46.1-0.20230106043757-1ece23d83a0b h1:1+GG69CVRO1tXeywJrY6jGeW4+SPXrmGRwB9ARmYP5w= +github.com/line/lbm-sdk v0.46.1-0.20230106043757-1ece23d83a0b/go.mod h1:rSDmksVcmPZfREb7+fPjxsMYF3WN1PQgSU/ZLbN8szE= +github.com/line/ostracon v1.0.7 h1:8vh/gsM6Sf6z2s38og8YufIhrWN2TwXpm4I3DqKEVyI= +github.com/line/ostracon v1.0.7/go.mod h1:gmEKYdaMaDAl5xJ8sJJo0s6OvzBSZwM01nWRCGA5oDY= +github.com/line/tm-db/v2 v2.0.0-init.1.0.20220121012851-61d2bc1d9486 h1:uvXQdcWaUyNsgkXBz375FpQ285WEJaLXhQ5HtoNK/GU= +github.com/line/tm-db/v2 v2.0.0-init.1.0.20220121012851-61d2bc1d9486/go.mod h1:wmkyPabXjtVZ1dvRofmurjaceghywtCSYGqFuFS+TbI= +github.com/line/wasmvm v1.0.0-0.10.0 h1:lxKdyNrRug/Sk7h2pb0aBsbTMNTesQU+TM/edSS9cg0= +github.com/line/wasmvm v1.0.0-0.10.0/go.mod h1:86gNsXbobrNQccER5XbU5j6qN0P/C1JML0iSKIgLYho= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= +github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -650,6 +855,8 @@ github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/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= @@ -659,18 +866,30 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/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= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.2.1/go.mod h1:+Ro3wqY4vakcYNtkBWdZC7dBg1xSB6sp054wWwmeFm0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= @@ -678,8 +897,10 @@ github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= @@ -688,9 +909,15 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -699,13 +926,20 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= +github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= @@ -721,32 +955,43 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/neilotoole/errgroup v0.1.5/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/exhaustive v0.7.11/go.mod h1:gX+MP7DWMKJmNa1HfMozK+u04hQd3na9i0hyqf3/dOI= +github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -756,10 +1001,12 @@ github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrB github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.0.3 h1:1hbqejyQWCJBvtKAfdO0b1FmaEf2z/bxnjqbARass5k= -github.com/opencontainers/runc v1.0.3/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= +github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -772,44 +1019,60 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= +github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.0/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.2/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/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.0.0/go.mod h1:KZy4xxPJyy88/gldCe5OdW6OQRtNO3EZE7hXzmnebgA= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -819,15 +1082,19 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= 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= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -840,8 +1107,10 @@ github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= +github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -851,10 +1120,25 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/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/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= +github.com/quasilyte/go-ruleguard v0.3.16-0.20220213074421-6aa060fab41a/go.mod h1:VMX+OnnSw4LicdiEGtRSD/1X8kW7GuEscjYNr4cOIT4= +github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.16/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.19/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/r2ishiguro/vrf v0.0.0-20180716233122-192de52975eb h1:3kW8n+FfBaUoqlHxCa6e90PXWpGCWWkdyTZ6F7c9m2I= +github.com/r2ishiguro/vrf v0.0.0-20180716233122-192de52975eb/go.mod h1:2NzHJUkr/ERaPNQ2IUuNbB2jMTWYp2DxhcraWbzZj00= 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= @@ -864,10 +1148,16 @@ github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzy github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= +github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= +github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= @@ -875,23 +1165,37 @@ github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.23.0/go.mod h1:6c7hFfxPOy7TacJc4Fcdi24/J0NKYGzjG8FWRI916Qo= -github.com/rs/zerolog v1.26.0 h1:ORM4ibhEZeTeQlCojCK2kPz1ogAY4bGs4tD+SaAdGaE= -github.com/rs/zerolog v1.26.0/go.mod h1:yBiM87lvSqX8h0Ww4sdzNSkVYZ8dL2xjZJG1lAuGZEo= +github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= +github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= +github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= -github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= github.com/sagikazarmark/crypt v0.5.0/go.mod h1:l+nzl7KWh51rpzp2h7t4MZWyiEWdhNpOAnclKvg+mdA= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa h1:0U2s5loxrTy6/VgfVoLuVLFJcURKLH49ie0zSch7gh4= +github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= 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/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.22.4/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -900,32 +1204,39 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= +github.com/sivchari/tenv v1.5.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= -github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -934,15 +1245,17 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= -github.com/spf13/viper v1.11.0 h1:7OX/1FS6n7jHD1zGrZTM7WtY13ZELRyosK4k93oPr44= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU= +github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -952,21 +1265,34 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/subosito/gotenv v1.4.0/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/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= @@ -975,64 +1301,102 @@ github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tendermint/tendermint v0.34.14/go.mod h1:FrwVm3TvsVicI9Z7FlucHV6Znfd5KBc/Lpp69cCwtk0= -github.com/tendermint/tendermint v0.34.19 h1:y0P1qI5wSa9IRuhKnTDA6IUcOrLi1hXJuALR+R7HFEk= -github.com/tendermint/tendermint v0.34.19/go.mod h1:R5+wgIwSxMdKQcmOaeudL0Cjkr3HDkhpcdum6VeU3R4= +github.com/tendermint/tendermint v0.34.20 h1:/pmvJhO3IqOxhbi8iRXudTjA2YKpaMqrLwFNkyxDSzw= +github.com/tendermint/tendermint v0.34.20/go.mod h1:KtOwCLYJcsS1ymtAfnjjAtXfXClbqcqjdqzFt2Em1Ac= github.com/tendermint/tm-db v0.6.4/go.mod h1:dptYhIpJ2M5kUuenLr+Yyf3zQOv1SgBZcl8/BmWlMBw= github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= github.com/tidwall/gjson v1.6.7/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/sjson v1.1.4/go.mod h1:wXpKXu8CtDjKAZ+3DrKY5ROCorDFahq8l0tey/Lx1fg= +github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomarrell/wrapcheck/v2 v2.6.1/go.mod h1:Eo+Opt6pyMW1b6cNllOcDSSoHO0aTJ+iF6BfCUbHltA= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd/v2 v2.5.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= +github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vmihailenco/msgpack/v5 v5.1.4/go.mod h1:C5gboKD0TJPqWDTVTtrQNfRbiBwHZGo8UTqP/9/XvLI= github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= +github.com/yahoo/coname v0.0.0-20170609175141-84592ddf8673 h1:PSg2cEFd+9Ae/r5x5iO8cJ3VmTbZNQp6X8tHDmVJAbA= github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= +github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +gitlab.com/bosi/decorder v0.2.1/go.mod h1:6C/nhLSbF6qZbYD8bRmISBwc6vcWdNsiIBkRvjJFrH0= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= go.etcd.io/etcd/client/v2 v2.305.2/go.mod h1:2D7ZejHVMIfog1221iLSYlQRzrtECw3kz4I4VAQm3qI= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1049,16 +1413,21 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1080,14 +1449,20 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220313003712-b769efc7c000/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1103,6 +1478,9 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1131,6 +1509,9 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1146,7 +1527,6 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1154,6 +1534,7 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1184,6 +1565,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1191,13 +1573,17 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1223,6 +1609,7 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1230,6 +1617,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1254,6 +1642,7 @@ golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1263,7 +1652,6 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1288,6 +1676,7 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1295,6 +1684,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1315,6 +1705,7 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1322,26 +1713,47 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= +golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1350,8 +1762,9 @@ 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= +golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1362,33 +1775,45 @@ golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190228203856-589c23e65e65/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1398,41 +1823,70 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-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-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11-0.20220316014157-77aa08bb151a/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= @@ -1440,6 +1894,7 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= @@ -1474,15 +1929,21 @@ google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQ google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1491,6 +1952,7 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -1512,6 +1974,8 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1554,7 +2018,6 @@ google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= @@ -1562,8 +2025,15 @@ google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac h1:qSNTkEN+L2mvWcLgJOR+8bdHX9rN/IdU3A1Ghpfb1Rg= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e h1:S9GbmC1iCgvbLyAokVCwiO6tVIrU9Y7c5oMx1V/ki/Y= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -1580,25 +2050,30 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +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= @@ -1612,14 +2087,19 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1627,6 +2107,11 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.3.1/go.mod h1:vlRD9XErLMGT+mDuofSr0mMMquscM/1nQqtRSsh6m70= +mvdan.cc/gofumpt v0.3.1/go.mod h1:w3ymliuxvzVx8DAutBnVyDqYb1Niy/yCJt/lk821YCE= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20211214103731-d0ef000c54e5/go.mod h1:b8RRCBm0eeiWR8cfN88xeq2G5SG3VKGO+5UPWi5FSOY= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/proto/cosmwasm/wasm/v1/genesis.proto b/proto/cosmwasm/wasm/v1/genesis.proto index f02f330750..cd709d0700 100644 --- a/proto/cosmwasm/wasm/v1/genesis.proto +++ b/proto/cosmwasm/wasm/v1/genesis.proto @@ -5,7 +5,7 @@ import "gogoproto/gogo.proto"; import "cosmwasm/wasm/v1/types.proto"; import "cosmwasm/wasm/v1/tx.proto"; -option go_package = "github.com/CosmWasm/wasmd/x/wasm/types"; +option go_package = "github.com/line/wasmd/x/wasm/types"; // GenesisState - genesis state of x/wasm message GenesisState { @@ -25,6 +25,9 @@ message GenesisState { (gogoproto.jsontag) = "gen_msgs,omitempty" ]; + // InactiveContractAddresses is a list of contract address that set inactive + repeated string inactive_contract_addresses = 6 [(gogoproto.jsontag) = "inactive_contract_address, omitempty"]; + // GenMsgs define the messages that can be executed during genesis phase in // order. The intention is to have more human readable data that is auditable. message GenMsgs { diff --git a/proto/cosmwasm/wasm/v1/ibc.proto b/proto/cosmwasm/wasm/v1/ibc.proto index d880a7078f..fe013f14f2 100644 --- a/proto/cosmwasm/wasm/v1/ibc.proto +++ b/proto/cosmwasm/wasm/v1/ibc.proto @@ -3,7 +3,7 @@ package cosmwasm.wasm.v1; import "gogoproto/gogo.proto"; -option go_package = "github.com/CosmWasm/wasmd/x/wasm/types"; +option go_package = "github.com/line/wasmd/x/wasm/types"; option (gogoproto.goproto_getters_all) = false; // MsgIBCSend diff --git a/proto/cosmwasm/wasm/v1/proposal.proto b/proto/cosmwasm/wasm/v1/proposal.proto index 68eae73a12..94a4420d9f 100644 --- a/proto/cosmwasm/wasm/v1/proposal.proto +++ b/proto/cosmwasm/wasm/v1/proposal.proto @@ -5,7 +5,7 @@ import "gogoproto/gogo.proto"; import "cosmos/base/v1beta1/coin.proto"; import "cosmwasm/wasm/v1/types.proto"; -option go_package = "github.com/CosmWasm/wasmd/x/wasm/types"; +option go_package = "github.com/line/wasmd/x/wasm/types"; option (gogoproto.goproto_stringer_all) = false; option (gogoproto.goproto_getters_all) = false; option (gogoproto.equal_all) = true; @@ -46,7 +46,7 @@ message InstantiateContractProposal { // Funds coins that are transferred to the contract on instantiation repeated cosmos.base.v1beta1.Coin funds = 8 [ (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins" + (gogoproto.castrepeated) = "github.com/line/lbm-sdk/types.Coins" ]; } @@ -94,7 +94,7 @@ message ExecuteContractProposal { // Funds coins that are transferred to the contract on instantiation repeated cosmos.base.v1beta1.Coin funds = 6 [ (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins" + (gogoproto.castrepeated) = "github.com/line/lbm-sdk/types.Coins" ]; } diff --git a/proto/cosmwasm/wasm/v1/query.proto b/proto/cosmwasm/wasm/v1/query.proto index b7f7a0627f..0382d9a599 100644 --- a/proto/cosmwasm/wasm/v1/query.proto +++ b/proto/cosmwasm/wasm/v1/query.proto @@ -6,7 +6,7 @@ import "cosmwasm/wasm/v1/types.proto"; import "google/api/annotations.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; -option go_package = "github.com/CosmWasm/wasmd/x/wasm/types"; +option go_package = "github.com/line/wasmd/x/wasm/types"; option (gogoproto.goproto_getters_all) = false; option (gogoproto.equal_all) = false; @@ -180,7 +180,7 @@ message CodeInfoResponse { string creator = 2; bytes data_hash = 3 [ (gogoproto.casttype) = - "github.com/tendermint/tendermint/libs/bytes.HexBytes" ]; + "github.com/line/ostracon/libs/bytes.HexBytes" ]; // Used in v1beta1 reserved 4, 5; AccessConfig instantiate_permission = 6 [ (gogoproto.nullable) = false ]; diff --git a/proto/cosmwasm/wasm/v1/tx.proto b/proto/cosmwasm/wasm/v1/tx.proto index 8295907eb8..c97086325c 100644 --- a/proto/cosmwasm/wasm/v1/tx.proto +++ b/proto/cosmwasm/wasm/v1/tx.proto @@ -5,7 +5,7 @@ import "cosmos/base/v1beta1/coin.proto"; import "gogoproto/gogo.proto"; import "cosmwasm/wasm/v1/types.proto"; -option go_package = "github.com/CosmWasm/wasmd/x/wasm/types"; +option go_package = "github.com/line/wasmd/x/wasm/types"; option (gogoproto.goproto_getters_all) = false; // Msg defines the wasm Msg service. @@ -59,7 +59,7 @@ message MsgInstantiateContract { // Funds coins that are transferred to the contract on instantiation repeated cosmos.base.v1beta1.Coin funds = 6 [ (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins" + (gogoproto.castrepeated) = "github.com/line/lbm-sdk/types.Coins" ]; } // MsgInstantiateContractResponse return instantiation result data @@ -81,7 +81,7 @@ message MsgExecuteContract { // Funds coins that are transferred to the contract on execution repeated cosmos.base.v1beta1.Coin funds = 5 [ (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins" + (gogoproto.castrepeated) = "github.com/line/lbm-sdk/types.Coins" ]; } diff --git a/proto/cosmwasm/wasm/v1/types.proto b/proto/cosmwasm/wasm/v1/types.proto index 739aed2af7..6b4388d8f5 100644 --- a/proto/cosmwasm/wasm/v1/types.proto +++ b/proto/cosmwasm/wasm/v1/types.proto @@ -5,7 +5,7 @@ import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; -option go_package = "github.com/CosmWasm/wasmd/x/wasm/types"; +option go_package = "github.com/line/wasmd/x/wasm/types"; option (gogoproto.goproto_getters_all) = false; option (gogoproto.equal_all) = true; @@ -49,6 +49,9 @@ message Params { ]; AccessType instantiate_default_permission = 2 [ (gogoproto.moretags) = "yaml:\"instantiate_default_permission\"" ]; + uint64 gas_multiplier = 3 [(gogoproto.moretags) = "yaml:\"gas_multiplier\""]; + uint64 instance_cost = 4 [(gogoproto.moretags) = "yaml:\"instance_cost\""]; + uint64 compile_cost = 5 [(gogoproto.moretags) = "yaml:\"compile_cost\""]; } // CodeInfo is data for the uploaded contract WASM code @@ -132,7 +135,7 @@ message AbsoluteTxPosition { message Model { // hex-encode key to read it better (this is often ascii) bytes key = 1 [ (gogoproto.casttype) = - "github.com/tendermint/tendermint/libs/bytes.HexBytes" ]; + "github.com/line/ostracon/libs/bytes.HexBytes" ]; // base64-encode raw value bytes value = 2; } diff --git a/proto/lbm/wasm/v1/event.proto b/proto/lbm/wasm/v1/event.proto new file mode 100644 index 0000000000..0fcc09dec5 --- /dev/null +++ b/proto/lbm/wasm/v1/event.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; +package lbm.wasm.v1; + +option go_package = "github.com/line/wasmd/x/wasm/lbmtypes"; + +// EventDeactivateContractProposal is the event that is emitted when the contract is deactivate. +message EventDeactivateContractProposal { + // contract is the smart contract's address + string contract = 1; +} + +// EventActivateContractProposal is the event that is emitted when the contract is activates. +message EventActivateContractProposal { + // contract is the smart contract's address + string contract = 1; +} diff --git a/proto/lbm/wasm/v1/proposal.proto b/proto/lbm/wasm/v1/proposal.proto new file mode 100644 index 0000000000..59bfd0125c --- /dev/null +++ b/proto/lbm/wasm/v1/proposal.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; +package lbm.wasm.v1; + +import "gogoproto/gogo.proto"; + +option go_package = "github.com/line/wasmd/x/wasm/lbmtypes"; +option (gogoproto.goproto_stringer_all) = false; +option (gogoproto.goproto_getters_all) = false; +option (gogoproto.equal_all) = true; + +// DeactivateContractProposal gov proposal content type adds a contract to inactive list. +message DeactivateContractProposal { + // Title is a short summary + string title = 1 [(gogoproto.moretags) = "yaml:\"title\""]; + // Description is a human readable text + string description = 2 [(gogoproto.moretags) = "yaml:\"description\""]; + // Contract is the smart contract address to deactivate + string contract = 3 [(gogoproto.moretags) = "yaml:\"contract\""]; +} + +// ActivateContractProposal gov proposal content type deletes a contract from inactive list. +message ActivateContractProposal { + // Title is a short summary + string title = 1 [(gogoproto.moretags) = "yaml:\"title\""]; + // Description is a human readable text + string description = 2 [(gogoproto.moretags) = "yaml:\"description\""]; + // Contract is the smart contract address to activate + string contract = 3 [(gogoproto.moretags) = "yaml:\"contract\""]; +} diff --git a/proto/lbm/wasm/v1/query.proto b/proto/lbm/wasm/v1/query.proto new file mode 100644 index 0000000000..ebe47a572c --- /dev/null +++ b/proto/lbm/wasm/v1/query.proto @@ -0,0 +1,49 @@ +syntax = "proto3"; +package lbm.wasm.v1; + +import "gogoproto/gogo.proto"; +import "google/api/annotations.proto"; +import "cosmos/base/query/v1beta1/pagination.proto"; + +option go_package = "github.com/line/wasmd/x/wasm/lbmtypes"; +option (gogoproto.goproto_getters_all) = false; +option (gogoproto.equal_all) = false; + +// Query defines the gRPC querier service. +service Query { + // InactiveContracts queries all inactive contracts + rpc InactiveContracts(QueryInactiveContractsRequest) returns (QueryInactiveContractsResponse) { + option (google.api.http).get = "/lbm/wasm/v1/inactive_contracts"; + }; + + rpc InactiveContract(QueryInactiveContractRequest) returns (QueryInactiveContractResponse) { + option (google.api.http).get = "/lbm/wasm/v1/inactive_contracts/{address}"; + } +} + +// QueryInactiveContractsRequest is the request type for Query/InactiveContract RPC method. +message QueryInactiveContractsRequest { + // pagination defines an optional pagination for the request + cosmos.base.query.v1beta1.PageRequest pagination = 1; +} + +// QueryInactiveContractsResponse is the response type for the Query/InactiveContract RPC method. +message QueryInactiveContractsResponse { + // addresses is the inactive address list + repeated string addresses = 1; + + // pagination defines the pagination in the response + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +// QueryIsInactiveContractRequest is the request type for Query/IsInactiveContract RPC method. +message QueryInactiveContractRequest { + // address is the address of the contract + string address = 1; +} + +// QueryInactiveContractsResponse is the response type for the Query/IsInactiveContract RPC method. +message QueryInactiveContractResponse { + // inactivated is the result if the contract is inactive contract or not + bool inactivated = 1; +} diff --git a/proto/lbm/wasm/v1/tx.proto b/proto/lbm/wasm/v1/tx.proto new file mode 100644 index 0000000000..286ba44887 --- /dev/null +++ b/proto/lbm/wasm/v1/tx.proto @@ -0,0 +1,46 @@ +syntax = "proto3"; +package lbm.wasm.v1; + +import "gogoproto/gogo.proto"; +import "cosmos/base/v1beta1/coin.proto"; +import "cosmwasm/wasm/v1/types.proto"; + +option go_package = "github.com/line/wasmd/x/wasm/lbmtypes"; +option (gogoproto.goproto_getters_all) = false; + +// Msg defines the wasm Msg service for lbm-sdk. +service Msg { + // StoreCodeAndInstantiateContract upload code and instantiate a contract using it + rpc StoreCodeAndInstantiateContract(MsgStoreCodeAndInstantiateContract) + returns (MsgStoreCodeAndInstantiateContractResponse); +} + +// MsgStoreCodeAndInstantiateContract submit Wasm code to the system and instantiate a contract using it. +message MsgStoreCodeAndInstantiateContract { + // Sender is the that actor that signed the messages + string sender = 1; + // WASMByteCode can be raw or gzip compressed + bytes wasm_byte_code = 2 [(gogoproto.customname) = "WASMByteCode"]; + // Used in v1beta1 + reserved 3, 4; + cosmwasm.wasm.v1.AccessConfig instantiate_permission = 5; + // Admin is an optional address that can execute migrations + string admin = 6; + // Label is optional metadata to be stored with a contract instance. + string label = 7; + // Msg json encoded message to be passed to the contract on instantiation + bytes msg = 8 [(gogoproto.casttype) = "github.com/line/wasmd/x/wasm/types.RawContractMessage"]; + // Funds coins that are transferred to the contract on instantiation + repeated cosmos.base.v1beta1.Coin funds = 9 + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/line/lbm-sdk/types.Coins"]; +} + +// MsgStoreCodeAndInstantiateContractResponse returns store and instantiate result data. +message MsgStoreCodeAndInstantiateContractResponse { + // CodeID is the reference to the stored WASM code + uint64 code_id = 1 [(gogoproto.customname) = "CodeID"]; + // Address is the bech32 address of the new contract instance + string address = 2; + // Data contains base64-encoded bytes to returned from the contract + bytes data = 3; +} diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index f9d5572f1e..0ebdd5c11f 100755 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -19,7 +19,7 @@ for dir in $proto_dirs; do -I "proto" \ -I "third_party/proto" \ --gocosmos_out=plugins=interfacetype+grpc,\ -Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types:. \ +Mgoogle/protobuf/any.proto=github.com/line/lbm-sdk/codec/types:. \ --grpc-gateway_out=logtostderr=true:. \ $(find "${dir}" -maxdepth 1 -name '*.proto') @@ -34,5 +34,5 @@ buf protoc \ $(find "$(pwd)/proto" -maxdepth 5 -name '*.proto') # move proto files to the right places -cp -r github.com/CosmWasm/wasmd/* ./ +cp -r github.com/line/wasmd/* ./ rm -rf github.com diff --git a/third_party/proto/cosmos/base/query/v1beta1/pagination.proto b/third_party/proto/cosmos/base/query/v1beta1/pagination.proto index cd5eb066d3..31999a746d 100644 --- a/third_party/proto/cosmos/base/query/v1beta1/pagination.proto +++ b/third_party/proto/cosmos/base/query/v1beta1/pagination.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package cosmos.base.query.v1beta1; -option go_package = "github.com/cosmos/cosmos-sdk/types/query"; +option go_package = "github.com/line/lbm-sdk/types/query"; // PageRequest is to be embedded in gRPC request messages for efficient // pagination. Ex: diff --git a/third_party/proto/cosmos/base/v1beta1/coin.proto b/third_party/proto/cosmos/base/v1beta1/coin.proto index fab75284b7..43474c05a9 100644 --- a/third_party/proto/cosmos/base/v1beta1/coin.proto +++ b/third_party/proto/cosmos/base/v1beta1/coin.proto @@ -3,7 +3,7 @@ package cosmos.base.v1beta1; import "gogoproto/gogo.proto"; -option go_package = "github.com/cosmos/cosmos-sdk/types"; +option go_package = "github.com/line/lbm-sdk/types"; option (gogoproto.goproto_stringer_all) = false; option (gogoproto.stringer_all) = false; diff --git a/third_party/proto/ostracon/abci/types.proto b/third_party/proto/ostracon/abci/types.proto new file mode 100644 index 0000000000..44e815a0a6 --- /dev/null +++ b/third_party/proto/ostracon/abci/types.proto @@ -0,0 +1,410 @@ +syntax = "proto3"; +package ostracon.abci; + +option go_package = "github.com/line/ostracon/abci/types"; + +// For more information on gogo.proto, see: +// https://github.com/gogo/protobuf/blob/master/extensions.md +import "ostracon/crypto/proof.proto"; +import "ostracon/types/types.proto"; +import "ostracon/crypto/keys.proto"; +import "ostracon/types/params.proto"; +import "google/protobuf/timestamp.proto"; +import "gogoproto/gogo.proto"; + +// This file is copied from http://github.com/ostracon/abci +// NOTE: When using custom types, mind the warnings. +// https://github.com/gogo/protobuf/blob/master/custom_types.md#warnings-and-issues + +//---------------------------------------- +// Request types + +message Request { + oneof value { + RequestEcho echo = 1; + RequestFlush flush = 2; + RequestInfo info = 3; + RequestSetOption set_option = 4; + RequestInitChain init_chain = 5; + RequestQuery query = 6; + RequestBeginBlock begin_block = 7; + RequestCheckTx check_tx = 8; + RequestDeliverTx deliver_tx = 9; + RequestEndBlock end_block = 10; + RequestCommit commit = 11; + RequestListSnapshots list_snapshots = 12; + RequestOfferSnapshot offer_snapshot = 13; + RequestLoadSnapshotChunk load_snapshot_chunk = 14; + RequestApplySnapshotChunk apply_snapshot_chunk = 15; + } +} + +message RequestEcho { + string message = 1; +} + +message RequestFlush {} + +message RequestInfo { + string version = 1; + uint64 block_version = 2; + uint64 p2p_version = 3; +} + +// nondeterministic +message RequestSetOption { + string key = 1; + string value = 2; +} + +message RequestInitChain { + google.protobuf.Timestamp time = 1 + [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + string chain_id = 2; + ConsensusParams consensus_params = 3; + repeated ValidatorUpdate validators = 4 [(gogoproto.nullable) = false]; + bytes app_state_bytes = 5; + int64 initial_height = 6; +} + +message RequestQuery { + bytes data = 1; + string path = 2; + int64 height = 3; + bool prove = 4; +} + +message RequestBeginBlock { + bytes hash = 1; + ostracon.types.Header header = 2 [(gogoproto.nullable) = false]; + LastCommitInfo last_commit_info = 3 [(gogoproto.nullable) = false]; + repeated Evidence byzantine_validators = 4 [(gogoproto.nullable) = false]; +} + +enum CheckTxType { + NEW = 0 [(gogoproto.enumvalue_customname) = "New"]; + RECHECK = 1 [(gogoproto.enumvalue_customname) = "Recheck"]; +} + +message RequestCheckTx { + bytes tx = 1; + CheckTxType type = 2; +} + +message RequestDeliverTx { + bytes tx = 1; +} + +message RequestEndBlock { + int64 height = 1; +} + +message RequestCommit {} + +// lists available snapshots +message RequestListSnapshots { +} + +// offers a snapshot to the application +message RequestOfferSnapshot { + Snapshot snapshot = 1; // snapshot offered by peers + bytes app_hash = 2; // light client-verified app hash for snapshot height +} + +// loads a snapshot chunk +message RequestLoadSnapshotChunk { + uint64 height = 1; + uint32 format = 2; + uint32 chunk = 3; +} + +// Applies a snapshot chunk +message RequestApplySnapshotChunk { + uint32 index = 1; + bytes chunk = 2; + string sender = 3; +} + +//---------------------------------------- +// Response types + +message Response { + oneof value { + ResponseException exception = 1; + ResponseEcho echo = 2; + ResponseFlush flush = 3; + ResponseInfo info = 4; + ResponseSetOption set_option = 5; + ResponseInitChain init_chain = 6; + ResponseQuery query = 7; + ResponseBeginBlock begin_block = 8; + ResponseCheckTx check_tx = 9; + ResponseDeliverTx deliver_tx = 10; + ResponseEndBlock end_block = 11; + ResponseCommit commit = 12; + ResponseListSnapshots list_snapshots = 13; + ResponseOfferSnapshot offer_snapshot = 14; + ResponseLoadSnapshotChunk load_snapshot_chunk = 15; + ResponseApplySnapshotChunk apply_snapshot_chunk = 16; + } +} + +// nondeterministic +message ResponseException { + string error = 1; +} + +message ResponseEcho { + string message = 1; +} + +message ResponseFlush {} + +message ResponseInfo { + string data = 1; + + string version = 2; + uint64 app_version = 3; + + int64 last_block_height = 4; + bytes last_block_app_hash = 5; +} + +// nondeterministic +message ResponseSetOption { + uint32 code = 1; + // bytes data = 2; + string log = 3; + string info = 4; +} + +message ResponseInitChain { + ConsensusParams consensus_params = 1; + repeated ValidatorUpdate validators = 2 [(gogoproto.nullable) = false]; + bytes app_hash = 3; +} + +message ResponseQuery { + uint32 code = 1; + // bytes data = 2; // use "value" instead. + string log = 3; // nondeterministic + string info = 4; // nondeterministic + int64 index = 5; + bytes key = 6; + bytes value = 7; + ostracon.crypto.ProofOps proof_ops = 8; + int64 height = 9; + string codespace = 10; +} + +message ResponseBeginBlock { + repeated Event events = 1 + [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; +} + +message ResponseCheckTx { + uint32 code = 1; + bytes data = 2; + string log = 3; // nondeterministic + string info = 4; // nondeterministic + int64 gas_wanted = 5 [json_name = "gas_wanted"]; + int64 gas_used = 6 [json_name = "gas_used"]; + repeated Event events = 7 + [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; + string codespace = 8; +} + +message ResponseDeliverTx { + uint32 code = 1; + bytes data = 2; + string log = 3; // nondeterministic + string info = 4; // nondeterministic + int64 gas_wanted = 5 [json_name = "gas_wanted"]; + int64 gas_used = 6 [json_name = "gas_used"]; + repeated Event events = 7 + [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; + string codespace = 8; +} + +message ResponseEndBlock { + repeated ValidatorUpdate validator_updates = 1 + [(gogoproto.nullable) = false]; + ConsensusParams consensus_param_updates = 2; + repeated Event events = 3 + [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; +} + +message ResponseCommit { + // reserve 1 + bytes data = 2; + int64 retain_height = 3; +} + +message ResponseListSnapshots { + repeated Snapshot snapshots = 1; +} + +message ResponseOfferSnapshot { + Result result = 1; + + enum Result { + UNKNOWN = 0; // Unknown result, abort all snapshot restoration + ACCEPT = 1; // Snapshot accepted, apply chunks + ABORT = 2; // Abort all snapshot restoration + REJECT = 3; // Reject this specific snapshot, try others + REJECT_FORMAT = 4; // Reject all snapshots of this format, try others + REJECT_SENDER = 5; // Reject all snapshots from the sender(s), try others + } +} + +message ResponseLoadSnapshotChunk { + bytes chunk = 1; +} + +message ResponseApplySnapshotChunk { + Result result = 1; + repeated uint32 refetch_chunks = 2; // Chunks to refetch and reapply + repeated string reject_senders = 3; // Chunk senders to reject and ban + + enum Result { + UNKNOWN = 0; // Unknown result, abort all snapshot restoration + ACCEPT = 1; // Chunk successfully accepted + ABORT = 2; // Abort all snapshot restoration + RETRY = 3; // Retry chunk (combine with refetch and reject) + RETRY_SNAPSHOT = 4; // Retry snapshot (combine with refetch and reject) + REJECT_SNAPSHOT = 5; // Reject this snapshot, try others + } +} + +//---------------------------------------- +// Misc. + +// ConsensusParams contains all consensus-relevant parameters +// that can be adjusted by the abci app +message ConsensusParams { + BlockParams block = 1; + ostracon.types.EvidenceParams evidence = 2; + ostracon.types.ValidatorParams validator = 3; + ostracon.types.VersionParams version = 4; +} + +// BlockParams contains limits on the block size. +message BlockParams { + // Note: must be greater than 0 + int64 max_bytes = 1; + // Note: must be greater or equal to -1 + int64 max_gas = 2; +} + +message LastCommitInfo { + int32 round = 1; + repeated VoteInfo votes = 2 [(gogoproto.nullable) = false]; +} + +// Event allows application developers to attach additional information to +// ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx. +// Later, transactions may be queried using these events. +message Event { + string type = 1; + repeated EventAttribute attributes = 2 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "attributes,omitempty" + ]; +} + +// EventAttribute is a single key-value pair, associated with an event. +message EventAttribute { + bytes key = 1; + bytes value = 2; + bool index = 3; // nondeterministic +} + +// TxResult contains results of executing the transaction. +// +// One usage is indexing transaction results. +message TxResult { + int64 height = 1; + uint32 index = 2; + bytes tx = 3; + ResponseDeliverTx result = 4 [(gogoproto.nullable) = false]; +} + +//---------------------------------------- +// Blockchain Types + +// Validator +message Validator { + bytes address = 1; // The first 20 bytes of SHA256(public key) + // PubKey pub_key = 2 [(gogoproto.nullable)=false]; + int64 power = 3; // The voting power + + // *** Ostracon Extended Fields *** + int64 voting_weight = 1000; // The voting weight +} + +// ValidatorUpdate +message ValidatorUpdate { + ostracon.crypto.PublicKey pub_key = 1 [(gogoproto.nullable) = false]; + int64 power = 2; +} + +// VoteInfo +message VoteInfo { + Validator validator = 1 [(gogoproto.nullable) = false]; + bool signed_last_block = 2; +} + +enum EvidenceType { + UNKNOWN = 0; + DUPLICATE_VOTE = 1; + LIGHT_CLIENT_ATTACK = 2; +} + +message Evidence { + EvidenceType type = 1; + // The offending validator + Validator validator = 2 [(gogoproto.nullable) = false]; + // The height when the offense occurred + int64 height = 3; + // The corresponding time where the offense occurred + google.protobuf.Timestamp time = 4 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true + ]; + // Total voting power of the validator set in case the ABCI application does + // not store historical validators. + // https://github.com/tendermint/tendermint/issues/4581 + int64 total_voting_power = 5; +} + +//---------------------------------------- +// State Sync Types + +message Snapshot { + uint64 height = 1; // The height at which the snapshot was taken + uint32 format = 2; // The application-specific snapshot format + uint32 chunks = 3; // Number of chunks in the snapshot + bytes hash = 4; // Arbitrary snapshot hash, equal only if identical + bytes metadata = 5; // Arbitrary application metadata +} + +//---------------------------------------- +// Service Definition + +service ABCIApplication { + rpc Echo(RequestEcho) returns (ResponseEcho); + rpc Flush(RequestFlush) returns (ResponseFlush); + rpc Info(RequestInfo) returns (ResponseInfo); + rpc SetOption(RequestSetOption) returns (ResponseSetOption); + rpc DeliverTx(RequestDeliverTx) returns (ResponseDeliverTx); + rpc CheckTx(RequestCheckTx) returns (ResponseCheckTx); + rpc Query(RequestQuery) returns (ResponseQuery); + rpc Commit(RequestCommit) returns (ResponseCommit); + rpc InitChain(RequestInitChain) returns (ResponseInitChain); + rpc BeginBlock(RequestBeginBlock) returns (ResponseBeginBlock); + rpc EndBlock(RequestEndBlock) returns (ResponseEndBlock); + rpc ListSnapshots(RequestListSnapshots) returns (ResponseListSnapshots); + rpc OfferSnapshot(RequestOfferSnapshot) returns (ResponseOfferSnapshot); + rpc LoadSnapshotChunk(RequestLoadSnapshotChunk) returns (ResponseLoadSnapshotChunk); + rpc ApplySnapshotChunk(RequestApplySnapshotChunk) returns (ResponseApplySnapshotChunk); +} \ No newline at end of file diff --git a/third_party/proto/ostracon/crypto/keys.proto b/third_party/proto/ostracon/crypto/keys.proto new file mode 100644 index 0000000000..c375549cb2 --- /dev/null +++ b/third_party/proto/ostracon/crypto/keys.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; +package ostracon.crypto; + +option go_package = "github.com/line/ostracon/proto/ostracon/crypto"; + +import "gogoproto/gogo.proto"; + +// PublicKey defines the keys available for use with Ostracon Validators +message PublicKey { + option (gogoproto.compare) = true; + option (gogoproto.equal) = true; + + oneof sum { + bytes ed25519 = 1; + bytes secp256k1 = 2; + } +} diff --git a/third_party/proto/ostracon/crypto/proof.proto b/third_party/proto/ostracon/crypto/proof.proto new file mode 100644 index 0000000000..7ea7b277f7 --- /dev/null +++ b/third_party/proto/ostracon/crypto/proof.proto @@ -0,0 +1,41 @@ +syntax = "proto3"; +package ostracon.crypto; + +option go_package = "github.com/line/ostracon/proto/ostracon/crypto"; + +import "gogoproto/gogo.proto"; + +message Proof { + int64 total = 1; + int64 index = 2; + bytes leaf_hash = 3; + repeated bytes aunts = 4; +} + +message ValueOp { + // Encoded in ProofOp.Key. + bytes key = 1; + + // To encode in ProofOp.Data + Proof proof = 2; +} + +message DominoOp { + string key = 1; + string input = 2; + string output = 3; +} + +// ProofOp defines an operation used for calculating Merkle root +// The data could be arbitrary format, providing nessecary data +// for example neighbouring node hash +message ProofOp { + string type = 1; + bytes key = 2; + bytes data = 3; +} + +// ProofOps is Merkle proof defined by the list of ProofOps +message ProofOps { + repeated ProofOp ops = 1 [(gogoproto.nullable) = false]; +} diff --git a/third_party/proto/ostracon/libs/bits/types.proto b/third_party/proto/ostracon/libs/bits/types.proto new file mode 100644 index 0000000000..bead2db26f --- /dev/null +++ b/third_party/proto/ostracon/libs/bits/types.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; +package ostracon.libs.bits; + +option go_package = "github.com/line/ostracon/proto/ostracon/libs/bits"; + +message BitArray { + int64 bits = 1; + repeated uint64 elems = 2; +} diff --git a/third_party/proto/ostracon/p2p/types.proto b/third_party/proto/ostracon/p2p/types.proto new file mode 100644 index 0000000000..4db1912637 --- /dev/null +++ b/third_party/proto/ostracon/p2p/types.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; +package ostracon.p2p; + +option go_package = "github.com/line/ostracon/proto/ostracon/p2p"; + +import "gogoproto/gogo.proto"; + +message NetAddress { + string id = 1 [(gogoproto.customname) = "ID"]; + string ip = 2 [(gogoproto.customname) = "IP"]; + uint32 port = 3; +} + +message ProtocolVersion { + uint64 p2p = 1 [(gogoproto.customname) = "P2P"]; + uint64 block = 2; + uint64 app = 3; +} + +message DefaultNodeInfo { + ProtocolVersion protocol_version = 1 [(gogoproto.nullable) = false]; + string default_node_id = 2 [(gogoproto.customname) = "DefaultNodeID"]; + string listen_addr = 3; + string network = 4; + string version = 5; + bytes channels = 6; + string moniker = 7; + DefaultNodeInfoOther other = 8 [(gogoproto.nullable) = false]; +} + +message DefaultNodeInfoOther { + string tx_index = 1; + string rpc_address = 2 [(gogoproto.customname) = "RPCAddress"]; +} diff --git a/third_party/proto/ostracon/types/block.proto b/third_party/proto/ostracon/types/block.proto new file mode 100644 index 0000000000..96c19fd8b3 --- /dev/null +++ b/third_party/proto/ostracon/types/block.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; +package ostracon.types; + +option go_package = "github.com/line/ostracon/proto/ostracon/types"; + +import "gogoproto/gogo.proto"; +import "ostracon/types/types.proto"; +import "ostracon/types/evidence.proto"; + +message Block { + Header header = 1 [(gogoproto.nullable) = false]; + Data data = 2 [(gogoproto.nullable) = false]; + ostracon.types.EvidenceList evidence = 3 [(gogoproto.nullable) = false]; + Commit last_commit = 4; +} diff --git a/third_party/proto/ostracon/types/evidence.proto b/third_party/proto/ostracon/types/evidence.proto new file mode 100644 index 0000000000..e88f969bfa --- /dev/null +++ b/third_party/proto/ostracon/types/evidence.proto @@ -0,0 +1,41 @@ +syntax = "proto3"; +package ostracon.types; + +option go_package = "github.com/line/ostracon/proto/ostracon/types"; + +import "gogoproto/gogo.proto"; +import "google/protobuf/timestamp.proto"; +import "ostracon/types/types.proto"; +import "ostracon/types/validator.proto"; + +message Evidence { + oneof sum { + DuplicateVoteEvidence duplicate_vote_evidence = 1; + LightClientAttackEvidence light_client_attack_evidence = 2; + } +} + +// DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes. +message DuplicateVoteEvidence { + ostracon.types.Vote vote_a = 1; + ostracon.types.Vote vote_b = 2; + int64 total_voting_power = 3; // total voting weight + int64 validator_power = 4; // voting power + google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + + // *** Ostracon Extended Fields *** + int64 voting_weight = 1000; +} + +// LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client. +message LightClientAttackEvidence { + ostracon.types.LightBlock conflicting_block = 1; + int64 common_height = 2; + repeated ostracon.types.Validator byzantine_validators = 3; + int64 total_voting_power = 4; // total voting weight + google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; +} + +message EvidenceList { + repeated Evidence evidence = 1 [(gogoproto.nullable) = false]; +} diff --git a/third_party/proto/ostracon/types/params.proto b/third_party/proto/ostracon/types/params.proto new file mode 100644 index 0000000000..37f39b47b1 --- /dev/null +++ b/third_party/proto/ostracon/types/params.proto @@ -0,0 +1,80 @@ +syntax = "proto3"; +package ostracon.types; + +option go_package = "github.com/line/ostracon/proto/ostracon/types"; + +import "gogoproto/gogo.proto"; +import "google/protobuf/duration.proto"; + +option (gogoproto.equal_all) = true; + +// ConsensusParams contains consensus critical parameters that determine the +// validity of blocks. +message ConsensusParams { + BlockParams block = 1 [(gogoproto.nullable) = false]; + EvidenceParams evidence = 2 [(gogoproto.nullable) = false]; + ValidatorParams validator = 3 [(gogoproto.nullable) = false]; + VersionParams version = 4 [(gogoproto.nullable) = false]; +} + +// BlockParams contains limits on the block size. +message BlockParams { + // Max block size, in bytes. + // Note: must be greater than 0 + int64 max_bytes = 1; + // Max gas per block. + // Note: must be greater or equal to -1 + int64 max_gas = 2; + // Minimum time increment between consecutive blocks (in milliseconds) If the + // block header timestamp is ahead of the system clock, decrease this value. + // + // Not exposed to the application. + int64 time_iota_ms = 3; +} + +// EvidenceParams determine how we handle evidence of malfeasance. +message EvidenceParams { + // Max age of evidence, in blocks. + // + // The basic formula for calculating this is: MaxAgeDuration / {average block + // time}. + int64 max_age_num_blocks = 1; + + // Max age of evidence, in time. + // + // It should correspond with an app's "unbonding period" or other similar + // mechanism for handling [Nothing-At-Stake + // attacks](https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed). + google.protobuf.Duration max_age_duration = 2 + [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; + + // This sets the maximum size of total evidence in bytes that can be committed in a single block. + // and should fall comfortably under the max block bytes. + // Default is 1048576 or 1MB + int64 max_bytes = 3; +} + +// ValidatorParams restrict the public key types validators can use. +// NOTE: uses ABCI pubkey naming, not Amino names. +message ValidatorParams { + option (gogoproto.populate) = true; + option (gogoproto.equal) = true; + + repeated string pub_key_types = 1; +} + +// VersionParams contains the ABCI application version. +message VersionParams { + option (gogoproto.populate) = true; + option (gogoproto.equal) = true; + + uint64 app_version = 1; +} + +// HashedParams is a subset of ConsensusParams. +// +// It is hashed into the Header.ConsensusHash. +message HashedParams { + int64 block_max_bytes = 1; + int64 block_max_gas = 2; +} diff --git a/third_party/proto/ostracon/types/types.proto b/third_party/proto/ostracon/types/types.proto new file mode 100644 index 0000000000..d3310f66b3 --- /dev/null +++ b/third_party/proto/ostracon/types/types.proto @@ -0,0 +1,157 @@ +syntax = "proto3"; +package ostracon.types; + +option go_package = "github.com/line/ostracon/proto/ostracon/types"; + +import "gogoproto/gogo.proto"; +import "google/protobuf/timestamp.proto"; +import "ostracon/crypto/proof.proto"; +import "ostracon/version/types.proto"; +import "ostracon/types/validator.proto"; + +// BlockIdFlag indicates which BlcokID the signature is for +enum BlockIDFlag { + option (gogoproto.goproto_enum_stringer) = true; + option (gogoproto.goproto_enum_prefix) = false; + + BLOCK_ID_FLAG_UNKNOWN = 0 [(gogoproto.enumvalue_customname) = "BlockIDFlagUnknown"]; + BLOCK_ID_FLAG_ABSENT = 1 [(gogoproto.enumvalue_customname) = "BlockIDFlagAbsent"]; + BLOCK_ID_FLAG_COMMIT = 2 [(gogoproto.enumvalue_customname) = "BlockIDFlagCommit"]; + BLOCK_ID_FLAG_NIL = 3 [(gogoproto.enumvalue_customname) = "BlockIDFlagNil"]; +} + +// SignedMsgType is a type of signed message in the consensus. +enum SignedMsgType { + option (gogoproto.goproto_enum_stringer) = true; + option (gogoproto.goproto_enum_prefix) = false; + + SIGNED_MSG_TYPE_UNKNOWN = 0 [(gogoproto.enumvalue_customname) = "UnknownType"]; + // Votes + SIGNED_MSG_TYPE_PREVOTE = 1 [(gogoproto.enumvalue_customname) = "PrevoteType"]; + SIGNED_MSG_TYPE_PRECOMMIT = 2 [(gogoproto.enumvalue_customname) = "PrecommitType"]; + + // Proposals + SIGNED_MSG_TYPE_PROPOSAL = 32 [(gogoproto.enumvalue_customname) = "ProposalType"]; +} + +// PartsetHeader +message PartSetHeader { + uint32 total = 1; + bytes hash = 2; +} + +message Part { + uint32 index = 1; + bytes bytes = 2; + ostracon.crypto.Proof proof = 3 [(gogoproto.nullable) = false]; +} + +// BlockID +message BlockID { + bytes hash = 1; + PartSetHeader part_set_header = 2 [(gogoproto.nullable) = false]; +} + +// -------------------------------- + +// Header defines the structure of a Tendermint block header. +message Header { + // basic block info + ostracon.version.Consensus version = 1 [(gogoproto.nullable) = false]; + string chain_id = 2 [(gogoproto.customname) = "ChainID"]; + int64 height = 3; + google.protobuf.Timestamp time = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + + // prev block info + BlockID last_block_id = 5 [(gogoproto.nullable) = false]; + + // hashes of block data + bytes last_commit_hash = 6; // commit from validators from the last block + bytes data_hash = 7; // transactions + + // hashes from the app output from the prev block + bytes validators_hash = 8; // validators for the current block + bytes next_validators_hash = 9; // validators for the next block + bytes consensus_hash = 10; // consensus params for current block + bytes app_hash = 11; // state after txs from the previous block + bytes last_results_hash = 12; // root hash of all results from the txs from the previous block + + // consensus info + bytes evidence_hash = 13; // evidence included in the block + bytes proposer_address = 14; // original proposer of the block +} + +// Data contains the set of transactions included in the block +message Data { + // Txs that will be applied by state @ block.Height+1. + // NOTE: not all txs here are valid. We're just agreeing on the order first. + // This means that block.AppHash does not include these txs. + repeated bytes txs = 1; +} + +// Vote represents a prevote, precommit, or commit vote from validators for +// consensus. +message Vote { + SignedMsgType type = 1; + int64 height = 2; + int32 round = 3; + BlockID block_id = 4 + [(gogoproto.nullable) = false, (gogoproto.customname) = "BlockID"]; // zero if vote is nil. + google.protobuf.Timestamp timestamp = 5 + [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + bytes validator_address = 6; + int32 validator_index = 7; + bytes signature = 8; +} + +// Commit contains the evidence that a block was committed by a set of validators. +message Commit { + int64 height = 1; + int32 round = 2; + BlockID block_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "BlockID"]; + repeated CommitSig signatures = 4 [(gogoproto.nullable) = false]; +} + +// CommitSig is a part of the Vote included in a Commit. +message CommitSig { + BlockIDFlag block_id_flag = 1; + bytes validator_address = 2; + google.protobuf.Timestamp timestamp = 3 + [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + bytes signature = 4; +} + +message Proposal { + SignedMsgType type = 1; + int64 height = 2; + int32 round = 3; + int32 pol_round = 4; + BlockID block_id = 5 [(gogoproto.customname) = "BlockID", (gogoproto.nullable) = false]; + google.protobuf.Timestamp timestamp = 6 + [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; + bytes signature = 7; +} + +message SignedHeader { + Header header = 1; + Commit commit = 2; +} + +message LightBlock { + SignedHeader signed_header = 1; + ostracon.types.ValidatorSet validator_set = 2; +} + +message BlockMeta { + BlockID block_id = 1 [(gogoproto.customname) = "BlockID", (gogoproto.nullable) = false]; + int64 block_size = 2; + Header header = 3 [(gogoproto.nullable) = false]; + int64 num_txs = 4; +} + +// TxProof represents a Merkle proof of the presence of a transaction in the Merkle tree. +message TxProof { + bytes root_hash = 1; + bytes data = 2; + ostracon.crypto.Proof proof = 3; +} diff --git a/third_party/proto/ostracon/types/validator.proto b/third_party/proto/ostracon/types/validator.proto new file mode 100644 index 0000000000..378bde5ce8 --- /dev/null +++ b/third_party/proto/ostracon/types/validator.proto @@ -0,0 +1,28 @@ +syntax = "proto3"; +package ostracon.types; + +option go_package = "github.com/line/ostracon/proto/ostracon/types"; + +import "gogoproto/gogo.proto"; +import "ostracon/crypto/keys.proto"; + +message ValidatorSet { + repeated Validator validators = 1; + Validator proposer = 2; + int64 total_voting_power = 3; +} + +message Validator { + bytes address = 1; + ostracon.crypto.PublicKey pub_key = 2 [(gogoproto.nullable) = false]; + int64 voting_power = 3; + int64 proposer_priority = 4; + + // *** Ostracon Extended Fields *** + int64 voting_weight = 1000; +} + +message SimpleValidator { + ostracon.crypto.PublicKey pub_key = 1; + int64 voting_power = 2; +} diff --git a/third_party/proto/ostracon/types/voter.proto b/third_party/proto/ostracon/types/voter.proto new file mode 100644 index 0000000000..648ceca414 --- /dev/null +++ b/third_party/proto/ostracon/types/voter.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; +package ostracon.types; + +option go_package = "github.com/line/ostracon/proto/ostracon/types"; + +import "ostracon/types/validator.proto"; + +message VoterSet { + repeated ostracon.types.Validator voters = 1; + int64 total_voting_weight = 2; +} diff --git a/third_party/proto/ostracon/version/types.proto b/third_party/proto/ostracon/version/types.proto new file mode 100644 index 0000000000..135dbd49ee --- /dev/null +++ b/third_party/proto/ostracon/version/types.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; +package ostracon.version; + +option go_package = "github.com/line/ostracon/proto/ostracon/version"; + +import "gogoproto/gogo.proto"; + +// App includes the protocol and software version for the application. +// This information is included in ResponseInfo. The App.Protocol can be +// updated in ResponseEndBlock. +message App { + uint64 protocol = 1; + string software = 2; +} + +// Consensus captures the consensus rules for processing a block in the blockchain, +// including all blockchain data structures and the rules of the application's +// state transition machine. +message Consensus { + option (gogoproto.equal) = true; + + uint64 block = 1; + uint64 app = 2; +} diff --git a/third_party/proto/tendermint/blockchain/types.pb.go b/third_party/proto/tendermint/blockchain/types.pb.go index 45db6e95ed..a06ee8a155 100644 --- a/third_party/proto/tendermint/blockchain/types.pb.go +++ b/third_party/proto/tendermint/blockchain/types.pb.go @@ -10,7 +10,8 @@ import ( math_bits "math/bits" proto "github.com/gogo/protobuf/proto" - types "github.com/tendermint/tendermint/proto/tendermint/types" + + types "github.com/line/ostracon/proto/ostracon/types" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/third_party/proto/tendermint/consensus/types.pb.go b/third_party/proto/tendermint/consensus/types.pb.go index c6c96e0433..6f642c5626 100644 --- a/third_party/proto/tendermint/consensus/types.pb.go +++ b/third_party/proto/tendermint/consensus/types.pb.go @@ -11,8 +11,9 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" - bits "github.com/tendermint/tendermint/proto/tendermint/libs/bits" - types "github.com/tendermint/tendermint/proto/tendermint/types" + + bits "github.com/line/ostracon/proto/ostracon/libs/bits" + types "github.com/line/ostracon/proto/ostracon/types" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/third_party/proto/tendermint/consensus/wal.pb.go b/third_party/proto/tendermint/consensus/wal.pb.go index b1e313b4e8..cac9b7bdd6 100644 --- a/third_party/proto/tendermint/consensus/wal.pb.go +++ b/third_party/proto/tendermint/consensus/wal.pb.go @@ -15,7 +15,8 @@ import ( _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "github.com/golang/protobuf/ptypes/duration" - types "github.com/tendermint/tendermint/proto/tendermint/types" + + types "github.com/line/ostracon/proto/ostracon/types" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/third_party/proto/tendermint/p2p/conn.pb.go b/third_party/proto/tendermint/p2p/conn.pb.go index 3638173020..f6149d821a 100644 --- a/third_party/proto/tendermint/p2p/conn.pb.go +++ b/third_party/proto/tendermint/p2p/conn.pb.go @@ -11,7 +11,8 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" + + crypto "github.com/line/ostracon/proto/ostracon/crypto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/third_party/proto/tendermint/privval/types.pb.go b/third_party/proto/tendermint/privval/types.pb.go index 2310ada9cd..ab7ae8e2e1 100644 --- a/third_party/proto/tendermint/privval/types.pb.go +++ b/third_party/proto/tendermint/privval/types.pb.go @@ -11,8 +11,9 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - types "github.com/tendermint/tendermint/proto/tendermint/types" + + crypto "github.com/line/ostracon/proto/ostracon/crypto" + types "github.com/line/ostracon/proto/ostracon/types" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/third_party/proto/tendermint/state/types.pb.go b/third_party/proto/tendermint/state/types.pb.go index b9e4b6d127..fd412ec1dd 100644 --- a/third_party/proto/tendermint/state/types.pb.go +++ b/third_party/proto/tendermint/state/types.pb.go @@ -14,9 +14,10 @@ import ( proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - types "github.com/tendermint/tendermint/abci/types" - types1 "github.com/tendermint/tendermint/proto/tendermint/types" - version "github.com/tendermint/tendermint/proto/tendermint/version" + + types "github.com/line/ostracon/abci/types" + types1 "github.com/line/ostracon/proto/ostracon/types" + version "github.com/line/ostracon/proto/ostracon/version" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/third_party/proto/tendermint/types/types.pb.go b/third_party/proto/tendermint/types/types.pb.go index 10a6a7e435..2754dabab6 100644 --- a/third_party/proto/tendermint/types/types.pb.go +++ b/third_party/proto/tendermint/types/types.pb.go @@ -14,8 +14,9 @@ import ( proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - version "github.com/tendermint/tendermint/proto/tendermint/version" + + crypto "github.com/line/ostracon/proto/ostracon/crypto" + version "github.com/line/ostracon/proto/ostracon/version" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/third_party/proto/tendermint/types/validator.pb.go b/third_party/proto/tendermint/types/validator.pb.go index ab332cf5d0..61c38cb831 100644 --- a/third_party/proto/tendermint/types/validator.pb.go +++ b/third_party/proto/tendermint/types/validator.pb.go @@ -11,7 +11,8 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" + + crypto "github.com/line/ostracon/proto/ostracon/crypto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/wasm/Governance.md b/x/wasm/Governance.md deleted file mode 100644 index cd7d0ae2cb..0000000000 --- a/x/wasm/Governance.md +++ /dev/null @@ -1,204 +0,0 @@ -# Governance - -This document gives an overview of how the various governance -proposals interact with the CosmWasm contract lifecycle. It is -a high-level, technical introduction meant to provide context before -looking into the code, or constructing proposals. - -## Proposal Types -We have added 9 new wasm specific proposal types that cover the contract's live cycle and authorization: - -* `StoreCodeProposal` - upload a wasm binary -* `InstantiateContractProposal` - instantiate a wasm contract -* `MigrateContractProposal` - migrate a wasm contract to a new code version -* `SudoContractProposal` - call into the protected `sudo` entry point of a contract -* `ExecuteContractProposal` - execute a wasm contract as an arbitrary user -* `UpdateAdminProposal` - set a new admin for a contract -* `ClearAdminProposal` - clear admin for a contract to prevent further migrations -* `PinCodes` - pin the given code ids in cache. This trades memory for reduced startup time and lowers gas cost -* `UnpinCodes` - unpin the given code ids from the cache. This frees up memory and returns to standard speed and gas cost -* `UpdateInstantiateConfigProposal` - update instantiate permissions to a list of given code ids. - -For details see the proposal type [implementation](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/types/proposal.go) - -### Unit tests -[Proposal type validations](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/types/proposal_test.go) - -## Proposal Handler -The [wasmd proposal_handler](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/keeper/proposal_handler.go) implements the `gov.Handler` function -and executes the wasmd proposal types after a successful tally. - -The proposal handler uses a [`GovAuthorizationPolicy`](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/keeper/authz_policy.go#L29) to bypass the existing contract's authorization policy. - -### Tests -* [Integration: Submit and execute proposal](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/keeper/proposal_integration_test.go) - -## Gov Integration -The wasmd proposal handler can be added to the gov router in the [abci app](https://github.com/CosmWasm/wasmd/blob/master/app/app.go#L306) -to receive proposal execution calls. -```go -govRouter.AddRoute(wasm.RouterKey, wasm.NewWasmProposalHandler(app.wasmKeeper, enabledProposals)) -``` - -## Wasmd Authorization Settings - -Settings via sdk `params` module: -- `code_upload_access` - who can upload a wasm binary: `Nobody`, `Everybody`, `OnlyAddress` -- `instantiate_default_permission` - platform default, who can instantiate a wasm binary when the code owner has not set it - -See [params.go](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/types/params.go) - -### Init Params Via Genesis - -```json - "wasm": { - "params": { - "code_upload_access": { - "permission": "Everybody" - }, - "instantiate_default_permission": "Everybody" - } - }, -``` - -The values can be updated via gov proposal implemented in the `params` module. - -### Update Params Via [ParamChangeProposal](https://github.com/cosmos/cosmos-sdk/blob/v0.45.3/proto/cosmos/params/v1beta1/params.proto#L10) -Example to submit a parameter change gov proposal: -```sh -wasmd tx gov submit-proposal param-change --from validator --chain-id=testing -b block -``` -#### Content examples -* Disable wasm code uploads -```json -{ - "title": "Foo", - "description": "Bar", - "changes": [ - { - "subspace": "wasm", - "key": "uploadAccess", - "value": { - "permission": "Nobody" - } - } - ], - "deposit": "" -} -``` -* Allow wasm code uploads for everybody -```json -{ - "title": "Foo", - "description": "Bar", - "changes": [ - { - "subspace": "wasm", - "key": "uploadAccess", - "value": { - "permission": "Everybody" - } - } - ], - "deposit": "" -} -``` - -* Restrict code uploads to a single address -```json -{ - "title": "Foo", - "description": "Bar", - "changes": [ - { - "subspace": "wasm", - "key": "uploadAccess", - "value": { - "permission": "OnlyAddress", - "address": "cosmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq0fr2sh" - } - } - ], - "deposit": "" -} -``` -* Set chain **default** instantiation settings to nobody -```json -{ - "title": "Foo", - "description": "Bar", - "changes": [ - { - "subspace": "wasm", - "key": "instantiateAccess", - "value": "Nobody" - } - ], - "deposit": "" -} -``` -* Set chain **default** instantiation settings to everybody -```json -{ - "title": "Foo", - "description": "Bar", - "changes": [ - { - "subspace": "wasm", - "key": "instantiateAccess", - "value": "Everybody" - } - ], - "deposit": "" -} -``` - -### Enable gov proposals at **compile time**. -As gov proposals bypass the existing authorization policy they are disabled and require to be enabled at compile time. -``` --X github.com/CosmWasm/wasmd/app.ProposalsEnabled=true - enable all x/wasm governance proposals (default false) --X github.com/CosmWasm/wasmd/app.EnableSpecificProposals=MigrateContract,UpdateAdmin,ClearAdmin - enable a subset of the x/wasm governance proposal types (overrides ProposalsEnabled) -``` - -The `ParamChangeProposal` is always enabled. - -### Tests -* [params validation unit tests](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/types/params_test.go) -* [genesis validation tests](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/types/genesis_test.go) -* [policy integration tests](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/keeper/keeper_test.go) - -## CLI - -```shell script - wasmd tx gov submit-proposal [command] - -Available Commands: - wasm-store Submit a wasm binary proposal - instantiate-contract Submit an instantiate wasm contract proposal - migrate-contract Submit a migrate wasm contract to a new code version proposal - set-contract-admin Submit a new admin for a contract proposal - clear-contract-admin Submit a clear admin for a contract to prevent further migrations proposal -... -``` -## Rest -New [`ProposalHandlers`](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/client/proposal_handler.go) - -* Integration -```shell script -gov.NewAppModuleBasic(append(wasmclient.ProposalHandlers, paramsclient.ProposalHandler, distr.ProposalHandler, upgradeclient.ProposalHandler)...), -``` -In [abci app](https://github.com/CosmWasm/wasmd/blob/master/app/app.go#L109) - -### Tests -* [Rest Unit tests](https://github.com/CosmWasm/wasmd/blob/master/x/wasm/client/proposal_handler_test.go) -* [Rest smoke LCD test](https://github.com/CosmWasm/wasmd/blob/master/lcd_test/wasm_test.go) - - - -## Pull requests -* https://github.com/CosmWasm/wasmd/pull/190 -* https://github.com/CosmWasm/wasmd/pull/186 -* https://github.com/CosmWasm/wasmd/pull/183 -* https://github.com/CosmWasm/wasmd/pull/180 -* https://github.com/CosmWasm/wasmd/pull/179 -* https://github.com/CosmWasm/wasmd/pull/173 diff --git a/x/wasm/IBC.md b/x/wasm/IBC.md deleted file mode 100644 index c3cd0a0023..0000000000 --- a/x/wasm/IBC.md +++ /dev/null @@ -1,137 +0,0 @@ -# IBC specification - -This documents how CosmWasm contracts are expected to interact with IBC. - -## General Concepts - -**IBC Enabled** - when instantiating a contract, we detect if it supports IBC messages. - We require "feature flags" in the contract/vm handshake to ensure compatibility - for features like staking or chain-specific extensions. IBC functionality will require - another "feature flag", and the list of "enabled features" can be returned to the `x/wasm` - module to control conditional IBC behavior. - - If this feature is enabled, it is considered "IBC Enabled", and that info will - be stored in the ContractInfo. (For mock, we assume all contracts are IBC enabled) - -Also, please read the [IBC Docs](https://docs.cosmos.network/master/ibc/overview.html) -for detailed descriptions of the terms *Port*, *Client*, *Connection*, -and *Channel* - -## Overview - -We use "One Port per Contract", which is the most straight-forward mapping, treating each contract -like a module. It does lead to very long portIDs however. Pay special attention to both the Channel establishment -(which should be compatible with standard ICS20 modules without changes on their part), as well -as how contracts can properly identify their counterparty. - -(We considered on port for the `x/wasm` module and multiplexing on it, but [dismissed that idea](#rejected-ideas)) - -* Upon `Instantiate`, if a contract is *IBC Enabled*, we dynamically - bind a port for this contract. The port name is `wasm.`, - eg. `wasm.cosmos1hmdudppzceg27qsuq707tjg8rkgj7g5hnvnw29` -* If a *Channel* is being established with a registered `wasm.xyz` port, - the `x/wasm.Keeper` will handle this and call into the appropriate - contract to determine supported protocol versions during the - [`ChanOpenTry` and `ChanOpenAck` phases](https://docs.cosmos.network/master/ibc/overview.html#channels). - (See [Channel Handshake Version Negotiation](https://docs.cosmos.network/master/ibc/custom.html#channel-handshake-version-negotiation)) -* Both the *Port* and the *Channel* are fully owned by one contract. -* `x/wasm` will allow both *ORDERED* and *UNORDERED* channels and pass that mode - down to the contract in `OnChanOpenTry`, so the contract can decide if it accepts - the mode. We will recommend the contract developers stick with *ORDERED* channels - for custom protocols unless they can reason about async packet timing. -* When sending a packet, the CosmWasm contract must specify the local *ChannelID*. - As there is a unique *PortID* per contract, that is filled in by `x/wasm` - to produce the globally unique `(PortID, ChannelID)` -* When receiving a Packet (or Ack or Timeout), the contracts receives the local - *ChannelID* it came from, as well as the packet that was sent by the counterparty. -* When receiving an Ack or Timeout packet, the contract also receives the - original packet that it sent earlier. -* We do not support multihop packets in this model (they are rejected by `x/wasm`). - They are currently not fully specified nor implemented in IBC 1.0, so let us - simplify our model until this is well established - -## Workflow - -Establishing *Clients* and *Connections* is out of the scope of this -module and must be created by the same means as for `ibc-transfer` -(via the [go cli](https://github.com/cosmos/relayer) or better [ts-relayer](https://github.com/confio/ts-relayer)). -`x/wasm` will bind a unique *Port* for each "IBC Enabled" contract. - -For mocks, all the Packet Handling and Channel Lifecycle Hooks are routed -to some Golang stub handler, but containing the contract address, so we -can perform contract-specific actions for each packet. In a real setting, -we route to the contract that owns the port/channel and call one of it's various -entry points. - -Please refer to the CosmWasm repo for all -[details on the IBC API from the point of view of a CosmWasm contract](https://github.com/CosmWasm/cosmwasm/blob/main/IBC.md). - -## Future Ideas - -Here are some ideas we may add in the future - -### Dynamic Ports and Channels - -* multiple ports per contract -* elastic ports that can be assigned to different contracts -* transfer of channels to another contract - -This is inspired by the Agoric design, but also adds considerable complexity to both the `x/wasm` -implementation as well as the correctness reasoning of any given contract. This will not be -available in the first version of our "IBC Enabled contracts", but we can consider it for later, -if there are concrete user cases that would significantly benefit from this added complexity. - -### Add multihop support - -Once the ICS and IBC specs fully establish how multihop packets work, we should add support for that. -Both on setting up the routes with OpenChannel, as well as acting as an intermediate relayer (if that is possible) - -## Rejected Ideas - -### One Port per Module - -We decided on "one port per contract", especially after the IBC team raised -the max length on port names to allow `wasm-` to be a valid port. -Here are the arguments for "one port for x/wasm" vs "one port per contract". Here -was an alternate proposal: - -In this approach, the `x/wasm` module just binds one port to handle all -modules. This can be well defined name like `wasm`. Since we always -have `(ChannelID, PortID)` for routing messages, we can reuse one port -for all contracts as long as we have a clear way to map the `ChannelID` -to a specific contract when it is being established. - - -* On genesis we bind the port `wasm` for all communication with the `x/wasm` - module. -* The *Port* is fully owned by `x/wasm` -* Each *Channel* is fully owned by one contract. -* `x/wasm` only accepts *ORDERED Channels* for simplicity of contract - correctness. - -To clarify: - -* When a *Channel* is being established with port `wasm`, the - `x/wasm.Keeper` must be able to identify for which contract this - is destined. **how to do so**?? - * One idea: the channel name must be the contract address. This means - (`wasm`, `cosmos13d...`) will map to the given contract in the wasm module. - The problem with this is that if two contracts from chainA want to - connect to the same contracts on chainB, they will want to claim the - same *ChannelID* and *PortID*. Not sure how to differentiate multiple - parties in this way. - * Other ideas: have a special field we send on `OnChanOpenInit` that - specifies the destination contract, and allow any *ChannelID*. - However, looking at [`OnChanOpenInit` function signature](https://docs.cosmos.network/master/ibc/custom.html#implement-ibcmodule-interface-and-callbacks), - I don't see a place to put this extra info, without abusing the version field, - which is a [specified field](https://docs.cosmos.network/master/ibc/custom.html#channel-handshake-version-negotiation): - ``` - Versions must be strings but can implement any versioning structure. - If your application plans to have linear releases then semantic versioning is recommended. - ... - Valid version selection includes selecting a compatible version identifier with a subset - of features supported by your application for that version. - ... - ICS20 currently implements basic string matching with a - single supported version. - ``` \ No newline at end of file diff --git a/x/wasm/README.md b/x/wasm/README.md deleted file mode 100644 index cba9c5cf41..0000000000 --- a/x/wasm/README.md +++ /dev/null @@ -1,219 +0,0 @@ -# Wasm Module - -This should be a brief overview of the functionality - -## Configuration - -You can add the following section to `config/app.toml`: - -```toml -[wasm] -# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries -query_gas_limit = 300000 -# This defines the memory size for Wasm modules that we can keep cached to speed-up instantiation -# The value is in MiB not bytes -memory_cache_size = 300 -``` - -The values can also be set via CLI flags on with the `start` command: -```shell script ---wasm.memory_cache_size uint32 Sets the size in MiB (NOT bytes) of an in-memory cache for wasm modules. Set to 0 to disable. (default 100) ---wasm.query_gas_limit uint Set the max gas that can be spent on executing a query with a Wasm contract (default 3000000) -``` - -## Events - -A number of events are returned to allow good indexing of the transactions from smart contracts. - -Every call to Instantiate or Execute will be tagged with the info on the contract that was executed and who executed it. -It should look something like this (with different addresses). The module is always `wasm`, and `code_id` is only present -when Instantiating a contract, so you can subscribe to new instances, it is omitted on Execute. There is also an `action` tag -which is auto-added by the Cosmos SDK and has a value of either `store-code`, `instantiate` or `execute` depending on which message -was sent: - -```json -{ - "Type": "message", - "Attr": [ - { - "key": "module", - "value": "wasm" - }, - { - "key": "action", - "value": "instantiate" - }, - { - "key": "signer", - "value": "cosmos1vx8knpllrj7n963p9ttd80w47kpacrhuts497x" - }, - { - "key": "code_id", - "value": "1" - }, - { - "key": "_contract_address", - "value": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" - } - ] -} -``` - -If any funds were transferred to the contract as part of the message, or if the contract released funds as part of it's executions, -it will receive the typical events associated with sending tokens from bank. In this case, we instantiate the contract and -provide a initial balance in the same `MsgInstantiateContract`. We see the following events in addition to the above one: - -```json -[ - { - "Type": "transfer", - "Attr": [ - { - "key": "recipient", - "value": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" - }, - { - "key": "sender", - "value": "cosmos1ffnqn02ft2psvyv4dyr56nnv6plllf9pm2kpmv" - }, - { - "key": "amount", - "value": "100000denom" - } - ] - } -] -``` - -Finally, the contract itself can emit a "custom event" on Execute only (not on Init). -There is one event per contract, so if one contract calls a second contract, you may receive -one event for the original contract and one for the re-invoked contract. All attributes from the contract are passed through verbatim, -and we add a `_contract_address` attribute that contains the actual contract that emitted that event. -Here is an example from the escrow contract successfully releasing funds to the destination address: - -```json -{ - "Type": "wasm", - "Attr": [ - { - "key": "_contract_address", - "value": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" - }, - { - "key": "action", - "value": "release" - }, - { - "key": "destination", - "value": "cosmos14k7v7ms4jxkk2etmg9gljxjm4ru3qjdugfsflq" - } - ] -} -``` - -### Pulling this all together - -We will invoke an escrow contract to release to the designated beneficiary. -The escrow was previously loaded with `100000denom` (from the above example). -In this transaction, we send `5000denom` along with the `MsgExecuteContract` -and the contract releases the entire funds (`105000denom`) to the beneficiary. - -We will see all the following events, where you should be able to reconstruct the actions -(remember there are two events for each transfer). We see (1) the initial transfer of funds -to the contract, (2) the contract custom event that it released funds (3) the transfer of funds -from the contract to the beneficiary and (4) the generic x/wasm event stating that the contract -was executed (which always appears, while 2 is optional and has information as reliable as the contract): - -```json -[ - { - "Type": "transfer", - "Attr": [ - { - "key": "recipient", - "value": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" - }, - { - "key": "sender", - "value": "cosmos1zm074khx32hqy20hlshlsd423n07pwlu9cpt37" - }, - { - "key": "amount", - "value": "5000denom" - } - ] - }, - { - "Type": "wasm", - "Attr": [ - { - "key": "_contract_address", - "value": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" - }, - { - "key": "action", - "value": "release" - }, - { - "key": "destination", - "value": "cosmos14k7v7ms4jxkk2etmg9gljxjm4ru3qjdugfsflq" - } - ] - }, - { - "Type": "transfer", - "Attr": [ - { - "key": "recipient", - "value": "cosmos14k7v7ms4jxkk2etmg9gljxjm4ru3qjdugfsflq" - }, - { - "key": "sender", - "value": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" - }, - { - "key": "amount", - "value": "105000denom" - } - ] - }, - { - "Type": "message", - "Attr": [ - { - "key": "module", - "value": "wasm" - }, - { - "key": "action", - "value": "execute" - }, - { - "key": "signer", - "value": "cosmos1zm074khx32hqy20hlshlsd423n07pwlu9cpt37" - }, - { - "key": "_contract_address", - "value": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" - } - ] - } -] -``` - -A note on this format. This is what we return from our module. However, it seems to me that many events with the same `Type` -get merged together somewhere along the stack, so in this case, you *may* end up with one "transfer" event with the info for -both transfers. Double check when evaluating the event logs, I will document better with more experience, especially when I -find out the entire path for the events. - -## Messages - -TODO - -## CLI - -TODO - working, but not the nicest interface (json + bash = bleh). Use to upload, but I suggest to focus on frontend / js tooling - -## Rest - -TODO - main supported interface, under rapid change diff --git a/x/wasm/alias.go b/x/wasm/alias.go index 67a79ac541..01f6a74518 100644 --- a/x/wasm/alias.go +++ b/x/wasm/alias.go @@ -1,13 +1,10 @@ // nolint -// autogenerated code using github.com/rigelrozanski/multitool -// aliases generated for the following subdirectories: -// ALIASGEN: github.com/Cosmwasm/wasmd/x/wasm/types -// ALIASGEN: github.com/CosmWasm/wasmd/x/wasm/keeper package wasm import ( - "github.com/CosmWasm/wasmd/x/wasm/keeper" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) const ( @@ -55,14 +52,12 @@ var ( NewMessageHandler = keeper.NewDefaultMessageHandler DefaultEncoders = keeper.DefaultEncoders EncodeBankMsg = keeper.EncodeBankMsg - NoCustomMsg = keeper.NoCustomMsg EncodeStakingMsg = keeper.EncodeStakingMsg EncodeWasmMsg = keeper.EncodeWasmMsg NewKeeper = keeper.NewKeeper NewLegacyQuerier = keeper.NewLegacyQuerier DefaultQueryPlugins = keeper.DefaultQueryPlugins BankQuerier = keeper.BankQuerier - NoCustomQuerier = keeper.NoCustomQuerier StakingQuerier = keeper.StakingQuerier WasmQuerier = keeper.WasmQuerier CreateTestInput = keeper.CreateTestInput @@ -74,7 +69,6 @@ var ( NewCountTXDecorator = keeper.NewCountTXDecorator // variable aliases - ModuleCdc = types.ModuleCdc DefaultCodespace = types.DefaultCodespace ErrCreateFailed = types.ErrCreateFailed ErrAccountExists = types.ErrAccountExists @@ -95,39 +89,41 @@ var ( ) type ( - ProposalType = types.ProposalType - GenesisState = types.GenesisState - Code = types.Code - Contract = types.Contract - MsgStoreCode = types.MsgStoreCode - MsgStoreCodeResponse = types.MsgStoreCodeResponse - MsgInstantiateContract = types.MsgInstantiateContract - MsgInstantiateContractResponse = types.MsgInstantiateContractResponse - MsgExecuteContract = types.MsgExecuteContract - MsgExecuteContractResponse = types.MsgExecuteContractResponse - MsgMigrateContract = types.MsgMigrateContract - MsgMigrateContractResponse = types.MsgMigrateContractResponse - MsgUpdateAdmin = types.MsgUpdateAdmin - MsgUpdateAdminResponse = types.MsgUpdateAdminResponse - MsgClearAdmin = types.MsgClearAdmin - MsgWasmIBCCall = types.MsgIBCSend - MsgClearAdminResponse = types.MsgClearAdminResponse - MsgServer = types.MsgServer - Model = types.Model - CodeInfo = types.CodeInfo - ContractInfo = types.ContractInfo - CreatedAt = types.AbsoluteTxPosition - Config = types.WasmConfig - CodeInfoResponse = types.CodeInfoResponse - MessageHandler = keeper.SDKMessageHandler - BankEncoder = keeper.BankEncoder - CustomEncoder = keeper.CustomEncoder - StakingEncoder = keeper.StakingEncoder - WasmEncoder = keeper.WasmEncoder - MessageEncoders = keeper.MessageEncoders - Keeper = keeper.Keeper - QueryHandler = keeper.QueryHandler - CustomQuerier = keeper.CustomQuerier - QueryPlugins = keeper.QueryPlugins - Option = keeper.Option + ProposalType = types.ProposalType + GenesisState = types.GenesisState + Code = types.Code + Contract = types.Contract + MsgStoreCode = types.MsgStoreCode + MsgStoreCodeResponse = types.MsgStoreCodeResponse + MsgInstantiateContract = types.MsgInstantiateContract + MsgInstantiateContractResponse = types.MsgInstantiateContractResponse + MsgStoreCodeAndInstantiateContract = lbmtypes.MsgStoreCodeAndInstantiateContract + MsgStoreCodeAndInstantiateContractResponse = lbmtypes.MsgStoreCodeAndInstantiateContractResponse + MsgExecuteContract = types.MsgExecuteContract + MsgExecuteContractResponse = types.MsgExecuteContractResponse + MsgMigrateContract = types.MsgMigrateContract + MsgMigrateContractResponse = types.MsgMigrateContractResponse + MsgUpdateAdmin = types.MsgUpdateAdmin + MsgUpdateAdminResponse = types.MsgUpdateAdminResponse + MsgClearAdmin = types.MsgClearAdmin + MsgWasmIBCCall = types.MsgIBCSend + MsgClearAdminResponse = types.MsgClearAdminResponse + MsgServer = types.MsgServer + Model = types.Model + CodeInfo = types.CodeInfo + ContractInfo = types.ContractInfo + CreatedAt = types.AbsoluteTxPosition + Config = types.WasmConfig + CodeInfoResponse = types.CodeInfoResponse + MessageHandler = keeper.SDKMessageHandler + BankEncoder = keeper.BankEncoder + CustomEncoder = keeper.CustomEncoder + StakingEncoder = keeper.StakingEncoder + WasmEncoder = keeper.WasmEncoder + MessageEncoders = keeper.MessageEncoders + Keeper = keeper.Keeper + QueryHandler = keeper.QueryHandler + CustomQuerier = keeper.CustomQuerier + QueryPlugins = keeper.QueryPlugins + Option = keeper.Option ) diff --git a/x/wasm/client/cli/genesis_msg.go b/x/wasm/client/cli/genesis_msg.go index c77ab3519c..3656a22757 100644 --- a/x/wasm/client/cli/genesis_msg.go +++ b/x/wasm/client/cli/genesis_msg.go @@ -8,21 +8,21 @@ import ( "errors" "fmt" - "github.com/CosmWasm/wasmd/x/wasm/keeper" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/spf13/cobra" - tmtypes "github.com/tendermint/tendermint/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/client/flags" + "github.com/line/lbm-sdk/crypto/keyring" + "github.com/line/lbm-sdk/server" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + banktypes "github.com/line/lbm-sdk/x/bank/types" + "github.com/line/lbm-sdk/x/genutil" + genutiltypes "github.com/line/lbm-sdk/x/genutil/types" + octypes "github.com/line/ostracon/types" + + "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/types" ) // GenesisReader reads genesis data. Extension point for custom genesis state readers. @@ -111,7 +111,7 @@ func GenesisInstantiateContractCmd(defaultNodeHome string, genesisMutator Genesi } // does code id exists? - codeInfos, err := GetAllCodes(state) + codeInfos, err := getAllCodes(state) if err != nil { return err } @@ -127,7 +127,7 @@ func GenesisInstantiateContractCmd(defaultNodeHome string, genesisMutator Genesi } // permissions correct? if !codeInfo.Info.InstantiateConfig.Allowed(senderAddr) { - return fmt.Errorf("permissions were not granted for %state", senderAddr) + return fmt.Errorf("permissions were not granted for %s", senderAddr) } state.GenMsgs = append(state.GenMsgs, types.GenesisState_GenMsgs{ Sum: &types.GenesisState_GenMsgs_InstantiateContract{InstantiateContract: &msg}, @@ -180,7 +180,7 @@ func GenesisExecuteContractCmd(defaultNodeHome string, genesisMutator GenesisMut // - does contract address exists? if !hasContract(state, msg.Contract) { - return fmt.Errorf("unknown contract: %state", msg.Contract) + return fmt.Errorf("unknown contract: %s", msg.Contract) } state.GenMsgs = append(state.GenMsgs, types.GenesisState_GenMsgs{ Sum: &types.GenesisState_GenMsgs_ExecuteContract{ExecuteContract: &msg}, @@ -210,7 +210,7 @@ func GenesisListCodesCmd(defaultNodeHome string, genReader GenesisReader) *cobra if err != nil { return err } - all, err := GetAllCodes(g.WasmModuleState) + all, err := getAllCodes(g.WasmModuleState) if err != nil { return err } @@ -235,7 +235,7 @@ func GenesisListContractsCmd(defaultNodeHome string, genReader GenesisReader) *c return err } state := g.WasmModuleState - all := GetAllContracts(state) + all := getAllContracts(state) return printJSONOutput(cmd, all) }, } @@ -259,7 +259,7 @@ type CodeMeta struct { Info types.CodeInfo `json:"info"` } -func GetAllCodes(state *types.GenesisState) ([]CodeMeta, error) { +func getAllCodes(state *types.GenesisState) ([]CodeMeta, error) { all := make([]CodeMeta, len(state.Codes)) for i, c := range state.Codes { all[i] = CodeMeta{ @@ -302,7 +302,7 @@ type ContractMeta struct { Info types.ContractInfo `json:"info"` } -func GetAllContracts(state *types.GenesisState) []ContractMeta { +func getAllContracts(state *types.GenesisState) []ContractMeta { all := make([]ContractMeta, len(state.Contracts)) for i, c := range state.Contracts { all[i] = ContractMeta{ @@ -368,12 +368,12 @@ func hasContract(state *types.GenesisState, contractAddr string) bool { // GenesisData contains raw and unmarshalled data from the genesis file type GenesisData struct { GenesisFile string - GenDoc *tmtypes.GenesisDoc + GenDoc *octypes.GenesisDoc AppState map[string]json.RawMessage WasmModuleState *types.GenesisState } -func NewGenesisData(genesisFile string, genDoc *tmtypes.GenesisDoc, appState map[string]json.RawMessage, wasmModuleState *types.GenesisState) *GenesisData { +func NewGenesisData(genesisFile string, genDoc *octypes.GenesisDoc, appState map[string]json.RawMessage, wasmModuleState *types.GenesisState) *GenesisData { return &GenesisData{GenesisFile: genesisFile, GenDoc: genDoc, AppState: appState, WasmModuleState: wasmModuleState} } @@ -404,10 +404,8 @@ func (d DefaultGenesisReader) ReadWasmGenesis(cmd *cobra.Command) (*GenesisData, ), nil } -var ( - _ GenesisReader = DefaultGenesisIO{} - _ GenesisMutator = DefaultGenesisIO{} -) +var _ GenesisReader = DefaultGenesisIO{} +var _ GenesisMutator = DefaultGenesisIO{} // DefaultGenesisIO implements both interfaces to read and modify the genesis state for this module. // This implementation uses the default data structure that is used by the module.go genesis import/ export. diff --git a/x/wasm/client/cli/genesis_msg_test.go b/x/wasm/client/cli/genesis_msg_test.go index 4de9e7e3d5..94cd9d2110 100644 --- a/x/wasm/client/cli/genesis_msg_test.go +++ b/x/wasm/client/cli/genesis_msg_test.go @@ -3,33 +3,34 @@ package cli import ( "context" "encoding/json" - "io/ioutil" + "fmt" "os" "path" "testing" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/hd" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - tmtypes "github.com/tendermint/tendermint/types" - "github.com/CosmWasm/wasmd/x/wasm/keeper" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/client/flags" + "github.com/line/lbm-sdk/crypto/hd" + "github.com/line/lbm-sdk/crypto/keyring" + "github.com/line/lbm-sdk/server" + "github.com/line/lbm-sdk/testutil" + "github.com/line/lbm-sdk/testutil/testdata" + sdk "github.com/line/lbm-sdk/types" + banktypes "github.com/line/lbm-sdk/x/bank/types" + "github.com/line/lbm-sdk/x/genutil" + genutiltypes "github.com/line/lbm-sdk/x/genutil/types" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + ostcfg "github.com/line/ostracon/config" + "github.com/line/ostracon/libs/log" + octypes "github.com/line/ostracon/types" + + "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/types" ) var wasmIdent = []byte("\x00\x61\x73\x6D") @@ -42,7 +43,7 @@ func TestGenesisStoreCodeCmd(t *testing.T) { minimalWasmGenesis := types.GenesisState{ Params: types.DefaultParams(), } - anyValidWasmFile, err := ioutil.TempFile(t.TempDir(), "wasm") + anyValidWasmFile, err := os.CreateTemp(t.TempDir(), "wasm") require.NoError(t, err) anyValidWasmFile.Write(wasmIdent) require.NoError(t, anyValidWasmFile.Close()) @@ -109,7 +110,7 @@ func TestInstantiateContractCmd(t *testing.T) { minimalWasmGenesis := types.GenesisState{ Params: types.DefaultParams(), } - anyValidWasmFile, err := ioutil.TempFile(t.TempDir(), "wasm") + anyValidWasmFile, err := os.CreateTemp(t.TempDir(), "wasm") require.NoError(t, err) anyValidWasmFile.Write(wasmIdent) require.NoError(t, anyValidWasmFile.Close()) @@ -364,11 +365,11 @@ func TestInstantiateContractCmd(t *testing.T) { } func TestExecuteContractCmd(t *testing.T) { - const firstContractAddress = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" + const firstContractAddress = "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8" minimalWasmGenesis := types.GenesisState{ Params: types.DefaultParams(), } - anyValidWasmFile, err := ioutil.TempFile(t.TempDir(), "wasm") + anyValidWasmFile, err := os.CreateTemp(t.TempDir(), "wasm") require.NoError(t, err) anyValidWasmFile.Write(wasmIdent) require.NoError(t, anyValidWasmFile.Close()) @@ -446,7 +447,7 @@ func TestExecuteContractCmd(t *testing.T) { }, mutator: func(cmd *cobra.Command) { // See TestBuildContractAddress in keeper_test.go - cmd.SetArgs([]string{"cosmos1mujpjkwhut9yjw4xueyugc02evfv46y0dtmnz4lh8xxkkdapym9stu5qm8", `{}`}) + cmd.SetArgs([]string{"link1mujpjkwhut9yjw4xueyugc02evfv46y0dtmnz4lh8xxkkdapym9skz93hr", `{}`}) flagSet := cmd.Flags() flagSet.Set("run-as", myWellFundedAccount) }, @@ -564,7 +565,6 @@ func TestExecuteContractCmd(t *testing.T) { }) } } - func TestGetAllContracts(t *testing.T) { specs := map[string]struct { src types.GenesisState @@ -657,17 +657,18 @@ func TestGetAllContracts(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - got := GetAllContracts(&spec.src) + got := getAllContracts(&spec.src) assert.Equal(t, spec.exp, got) }) } + } func setupGenesis(t *testing.T, wasmGenesis types.GenesisState) string { appCodec := keeper.MakeEncodingConfig(t).Marshaler homeDir := t.TempDir() - require.NoError(t, os.Mkdir(path.Join(homeDir, "config"), 0o700)) + require.NoError(t, os.Mkdir(path.Join(homeDir, "config"), 0700)) genFilename := path.Join(homeDir, "config", "genesis.json") appState := make(map[string]json.RawMessage) appState[types.ModuleName] = appCodec.MustMarshalJSON(&wasmGenesis) @@ -683,7 +684,7 @@ func setupGenesis(t *testing.T, wasmGenesis types.GenesisState) string { appStateBz, err := json.Marshal(appState) require.NoError(t, err) - genDoc := tmtypes.GenesisDoc{ + genDoc := octypes.GenesisDoc{ ChainID: "testing", AppState: appStateBz, } @@ -693,13 +694,25 @@ func setupGenesis(t *testing.T, wasmGenesis types.GenesisState) string { return homeDir } +func createDefaultOstraconConfig(rootDir string) (*ostcfg.Config, error) { + conf := ostcfg.DefaultConfig() + conf.SetRoot(rootDir) + ostcfg.EnsureRoot(rootDir) + + if err := conf.ValidateBasic(); err != nil { + return nil, fmt.Errorf("error in config file: %v", err) + } + + return conf, nil +} + func executeCmdWithContext(t *testing.T, homeDir string, cmd *cobra.Command) error { logger := log.NewNopLogger() - cfg, err := genutiltest.CreateDefaultTendermintConfig(homeDir) + cfg, err := createDefaultOstraconConfig(homeDir) require.NoError(t, err) appCodec := keeper.MakeEncodingConfig(t).Marshaler serverCtx := server.NewContext(viper.New(), cfg, logger) - clientCtx := client.Context{}.WithCodec(appCodec).WithHomeDir(homeDir) + clientCtx := client.Context{}.WithJSONCodec(appCodec).WithHomeDir(homeDir) ctx := context.Background() ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) diff --git a/x/wasm/client/cli/gov_tx.go b/x/wasm/client/cli/gov_tx.go index 15a3ae6f25..43d7990ca9 100644 --- a/x/wasm/client/cli/gov_tx.go +++ b/x/wasm/client/cli/gov_tx.go @@ -5,16 +5,18 @@ import ( "strconv" "strings" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/version" - "github.com/cosmos/cosmos-sdk/x/gov/client/cli" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/pkg/errors" "github.com/spf13/cobra" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/client/tx" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/version" + "github.com/line/lbm-sdk/x/gov/client/cli" + govtypes "github.com/line/lbm-sdk/x/gov/types" + + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) func ProposalStoreCodeCmd() *cobra.Command { @@ -723,3 +725,109 @@ $ %s tx gov submit-proposal update-instantiate-config 1,nobody 2,everybody 3,%s1 cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") return cmd } + +func ProposalDeactivateContractCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "deactivate-contract [contract_addr_bech32]", + Short: "Deactivate the contract. This contract will not be executed after that.", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle) + if err != nil { + return fmt.Errorf("proposal title: %s", err) + } + proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription) + if err != nil { + return fmt.Errorf("proposal description: %s", err) + } + depositArg, err := cmd.Flags().GetString(cli.FlagDeposit) + if err != nil { + return fmt.Errorf("deposit: %s", err) + } + deposit, err := sdk.ParseCoinsNormalized(depositArg) + if err != nil { + return err + } + + content := lbmtypes.DeactivateContractProposal{ + Title: proposalTitle, + Description: proposalDescr, + Contract: args[0], + } + + msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress()) + if err != nil { + return err + } + if err = msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") + cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") + cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") + + return cmd +} + +func ProposalActivateContractCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "activate-contract [contract_addr_bech32]", + Short: "Activate the inactive contract. This contract will be executed after that.", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle) + if err != nil { + return fmt.Errorf("proposal title: %s", err) + } + proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription) + if err != nil { + return fmt.Errorf("proposal description: %s", err) + } + depositArg, err := cmd.Flags().GetString(cli.FlagDeposit) + if err != nil { + return fmt.Errorf("deposit: %s", err) + } + deposit, err := sdk.ParseCoinsNormalized(depositArg) + if err != nil { + return err + } + + content := lbmtypes.ActivateContractProposal{ + Title: proposalTitle, + Description: proposalDescr, + Contract: args[0], + } + + msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress()) + if err != nil { + return err + } + if err = msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") + cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") + cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") + + return cmd +} diff --git a/x/wasm/client/cli/new_tx.go b/x/wasm/client/cli/new_tx.go index e3b47792e6..118bb9a44c 100644 --- a/x/wasm/client/cli/new_tx.go +++ b/x/wasm/client/cli/new_tx.go @@ -3,13 +3,14 @@ package cli import ( "strconv" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/tx" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/spf13/cobra" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/client/flags" + "github.com/line/lbm-sdk/client/tx" + sdkerrors "github.com/line/lbm-sdk/types/errors" + + "github.com/line/wasmd/x/wasm/types" ) // MigrateContractCmd will migrate a contract to a new code version @@ -20,10 +21,8 @@ func MigrateContractCmd() *cobra.Command { Aliases: []string{"update", "mig", "m"}, Args: cobra.ExactArgs(3), RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } + //nolint:errcheck + clientCtx, _ := client.GetClientTxContext(cmd) msg, err := parseMigrateContractArgs(args, clientCtx) if err != nil { @@ -84,6 +83,7 @@ func UpdateContractAdminCmd() *cobra.Command { return cmd } +//nolint:unparam func parseUpdateContractAdminArgs(args []string, cliCtx client.Context) (types.MsgUpdateAdmin, error) { msg := types.MsgUpdateAdmin{ Sender: cliCtx.GetFromAddress().String(), diff --git a/x/wasm/client/cli/os/file.go b/x/wasm/client/cli/os/file.go new file mode 100644 index 0000000000..f4d7eb6770 --- /dev/null +++ b/x/wasm/client/cli/os/file.go @@ -0,0 +1,62 @@ +package os + +// This is same file with https://github.com/line/lbm-sdk/blob/main/internal/os/file.go +// If the file.go of line/lbm-sdk move to other directory not internal, please use lbm-sdk's file.go + +import ( + "fmt" + "io" + "os" +) + +// ReadFileWithSizeLimit expanded os.ReadFile for checking the file size before reading it +func ReadFileWithSizeLimit(name string, sizeLimit int64) ([]byte, error) { + f, err := os.Open(name) + if err != nil { + return nil, err + } + defer func() { + err := f.Close() + if err != nil { + fmt.Printf("Cannot close the file: %s\n", name) + } + }() + + var size int + if info, err := f.Stat(); err == nil { + size64 := info.Size() + // Check the file size + if size64 > sizeLimit { + return nil, fmt.Errorf("the file is too large: %s, size limit over > %d", name, sizeLimit) + } + if int64(int(size64)) == size64 { + size = int(size64) + } + } + size++ // one byte for final read at EOF + + // If a file claims a small size, read at least 512 bytes. + // In particular, files in Linux's /proc claim size 0 but + // then do not work right if read in small pieces, + // so an initial read of 1 byte would not work correctly. + if size < 512 { + size = 512 + } + + data := make([]byte, 0, size) + for { + if len(data) >= cap(data) { + d := data[:cap(data)] + d = append(d, 0) + data = d[:len(data)] + } + n, err := f.Read(data[len(data):cap(data)]) + data = data[:len(data)+n] + if err != nil { + if err == io.EOF { + err = nil + } + return data, err + } + } +} diff --git a/x/wasm/client/cli/os/file_test.go b/x/wasm/client/cli/os/file_test.go new file mode 100644 index 0000000000..cafe8fd8a4 --- /dev/null +++ b/x/wasm/client/cli/os/file_test.go @@ -0,0 +1,42 @@ +package os + +import ( + "os" + "reflect" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestReadFileWithSizeLimit(t *testing.T) { + filename := "file.go" + file, err := os.ReadFile(filename) + require.NoError(t, err) + + type args struct { + name string + sizeLimit int64 + } + tests := []struct { + name string + args args + want []byte + wantErr bool + }{ + {"cannot open error", args{"", 0}, nil, true}, + {"size limit over error", args{filename, 0}, nil, true}, + {"simple reading file success", args{filename, 100000}, file, false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := ReadFileWithSizeLimit(tt.args.name, tt.args.sizeLimit) + if (err != nil) != tt.wantErr { + t.Errorf("ReadFileWithSizeLimit() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("ReadFileWithSizeLimit() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/x/wasm/client/cli/query.go b/x/wasm/client/cli/query.go index 49cea64ea4..05ade84a7c 100644 --- a/x/wasm/client/cli/query.go +++ b/x/wasm/client/cli/query.go @@ -7,17 +7,19 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "os" "strconv" - wasmvm "github.com/CosmWasm/wasmvm" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cobra" flag "github.com/spf13/pflag" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/client/flags" + sdk "github.com/line/lbm-sdk/types" + wasmvm "github.com/line/wasmvm" + + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) func GetQueryCmd() *cobra.Command { @@ -38,6 +40,8 @@ func GetQueryCmd() *cobra.Command { GetCmdGetContractState(), GetCmdListPinnedCode(), GetCmdLibVersion(), + GetCmdListInactiveContracts(), + GetCmdIsInactiveContract(), ) return queryCmd } @@ -143,11 +147,11 @@ func GetCmdListContractByCode() *cobra.Command { // GetCmdQueryCode returns the bytecode for a given contract func GetCmdQueryCode() *cobra.Command { cmd := &cobra.Command{ - Use: "code [code_id] [output filename]", - Short: "Downloads wasm bytecode for given code id", - Long: "Downloads wasm bytecode for given code id", + Use: "code [code_id]", + Short: "Downloads wasm bytecode for given code id to the current directory", + Long: "Downloads wasm bytecode for given code id to the current directory as `contract-[code_id].wasm`", Aliases: []string{"source-code", "source"}, - Args: cobra.ExactArgs(2), + Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { clientCtx, err := client.GetClientQueryContext(cmd) if err != nil { @@ -173,8 +177,9 @@ func GetCmdQueryCode() *cobra.Command { return fmt.Errorf("contract not found") } - fmt.Printf("Downloading wasm code to %s\n", args[1]) - return ioutil.WriteFile(args[1], res.Data, 0o600) + fileName := "contract-" + strconv.FormatUint(codeID, 10) + ".wasm" + fmt.Printf("Downloading wasm code to %s\n", fileName) + return os.WriteFile(fileName, res.Data, 0600) }, } flags.AddQueryFlagsToCmd(cmd) @@ -534,9 +539,69 @@ func withPageKeyDecoded(flagSet *flag.FlagSet) *flag.FlagSet { if err != nil { panic(err.Error()) } - err = flagSet.Set(flags.FlagPageKey, string(raw)) - if err != nil { + if err = flagSet.Set(flags.FlagPageKey, string(raw)); err != nil { panic(err.Error()) } return flagSet } + +func GetCmdListInactiveContracts() *cobra.Command { + cmd := &cobra.Command{ + Use: "inactive-contracts", + Long: "List all inactive contracts", + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + pageReq, err := client.ReadPageRequest(withPageKeyDecoded(cmd.Flags())) + if err != nil { + return err + } + queryClient := lbmtypes.NewQueryClient(clientCtx) + res, err := queryClient.InactiveContracts( + context.Background(), + &lbmtypes.QueryInactiveContractsRequest{ + Pagination: pageReq, + }, + ) + if err != nil { + return err + } + return clientCtx.PrintProto(res) + }, + } + flags.AddQueryFlagsToCmd(cmd) + flags.AddPaginationFlagsToCmd(cmd, "list of inactive contracts") + return cmd +} + +func GetCmdIsInactiveContract() *cobra.Command { + cmd := &cobra.Command{ + Use: "is-inactive [bech32_address]", + Long: "Check if inactive contract or not", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := lbmtypes.NewQueryClient(clientCtx) + res, err := queryClient.InactiveContract( + context.Background(), + &lbmtypes.QueryInactiveContractRequest{ + Address: args[0], + }, + ) + if err != nil { + return err + } + return clientCtx.PrintProto(res) + }, + } + flags.AddQueryFlagsToCmd(cmd) + return cmd +} diff --git a/x/wasm/client/cli/query_test.go b/x/wasm/client/cli/query_test.go new file mode 100644 index 0000000000..625c00976d --- /dev/null +++ b/x/wasm/client/cli/query_test.go @@ -0,0 +1,450 @@ +package cli + +import ( + "context" + "encoding/hex" + "errors" + sdkerrors "github.com/line/lbm-sdk/types/errors" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "net/url" + "os" + "strconv" + "testing" + + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/codec" + ocabcitypes "github.com/line/ostracon/abci/types" + ocrpcmocks "github.com/line/ostracon/rpc/client/mocks" + ocrpctypes "github.com/line/ostracon/rpc/core/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" +) + +var ( + codeID = "1" + accAddress = "link1yxfu3fldlgux939t0gwaqs82l4x77v2kasa7jf" + queryJson = `{"a":"b"}` + queryJsonHex = hex.EncodeToString([]byte(queryJson)) + argsWithCodeID = []string{codeID} + argsWithAddr = []string{accAddress} + badStatusError = status.Error(codes.Unknown, "") + invalidRequestFlags = []string{"--page=2", "--offset=1"} + invalidRequestError = sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, + "page and offset cannot be used together") + invalidNodeFlags = []string{"--node=" + string(rune(0))} + invalidControlChar = &url.Error{Op: "parse", URL: string(rune(0)), + Err: errors.New("net/url: invalid control character in URL")} + invalidSyntaxError = &strconv.NumError{Func: "ParseUint", Num: "", Err: strconv.ErrSyntax} + invalidAddrError = errors.New("empty address string is not allowed") + invalidQueryError = errors.New("query data must be json") +) + +type testcase []struct { + name string + want error + ctx context.Context + flags []string + args []string +} + +func TestGetQueryCmd(t *testing.T) { + tests := []struct { + name string + }{ + {"execute success"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetQueryCmd() + assert.NotNilf(t, cmd, "GetQueryCmd()") + }) + } +} + +func TestGetCmdLibVersion(t *testing.T) { + tests := []struct { + name string + want error + }{ + {"execute success", nil}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdLibVersion() + assert.Equalf(t, tt.want, cmd.RunE(cmd, nil), "GetCmdLibVersion()") + }) + } +} + +func TestGetCmdListCode(t *testing.T) { + res := types.QueryCodesResponse{} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + tests := testcase{ + {"execute success", nil, ctx, nil, nil}, + {"bad status", badStatusError, ctx, nil, nil}, + {"invalid request", invalidRequestError, ctx, invalidRequestFlags, nil}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, nil}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdListCode() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdListCode()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdListCode()") + } + }) + } +} + +func TestGetCmdListContractByCode(t *testing.T) { + res := types.QueryContractsByCodeResponse{} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + tests := testcase{ + {"execute success", nil, ctx, nil, argsWithCodeID}, + {"bad status", badStatusError, ctx, nil, argsWithCodeID}, + {"invalid request", invalidRequestError, ctx, invalidRequestFlags, argsWithCodeID}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, argsWithCodeID}, + {"invalid codeID", invalidSyntaxError, ctx, nil, []string{""}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdListContractByCode() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdListContractByCode()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdListContractByCode()") + } + }) + } +} + +func TestGetCmdQueryCode(t *testing.T) { + res := types.QueryCodeResponse{Data: []byte{0}} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + tests := testcase{ + {"execute success", nil, ctx, nil, argsWithCodeID}, + {"bad status", badStatusError, ctx, nil, argsWithCodeID}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, argsWithCodeID}, + {"invalid codeID", invalidSyntaxError, ctx, nil, []string{""}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdQueryCode() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdQueryCode()") + downloaded := "contract-" + codeID + ".wasm" + assert.FileExists(t, downloaded) + assert.NoError(t, os.Remove(downloaded)) + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdQueryCode()") + } + }) + } +} + +func TestGetCmdQueryCodeInfo(t *testing.T) { + res := types.QueryCodeResponse{CodeInfoResponse: &types.CodeInfoResponse{}} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + tests := testcase{ + {"execute success", nil, ctx, nil, argsWithCodeID}, + {"bad status", badStatusError, ctx, nil, argsWithCodeID}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, argsWithCodeID}, + {"invalid codeID", invalidSyntaxError, ctx, nil, []string{""}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdQueryCodeInfo() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdQueryCodeInfo()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdQueryCodeInfo()") + } + }) + } +} + +func TestGetCmdGetContractInfo(t *testing.T) { + res := types.QueryContractInfoResponse{} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + tests := testcase{ + {"execute success", nil, ctx, nil, argsWithAddr}, + {"bad status", badStatusError, ctx, nil, argsWithAddr}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, argsWithAddr}, + {"invalid address", invalidAddrError, ctx, nil, []string{""}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdGetContractInfo() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdGetContractInfo()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdGetContractInfo()") + } + }) + } +} + +func TestGetCmdGetContractState(t *testing.T) { + tests := []struct { + name string + want error + }{ + {"execute success", nil}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdGetContractState() + assert.Equalf(t, tt.want, cmd.RunE(cmd, nil), "GetCmdGetContractState()") + }) + } +} + +func TestGetCmdGetContractStateAll(t *testing.T) { + res := types.QueryAllContractStateResponse{} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + tests := testcase{ + {"execute success", nil, ctx, nil, argsWithAddr}, + {"bad status", badStatusError, ctx, nil, argsWithAddr}, + {"invalid request", invalidRequestError, ctx, invalidRequestFlags, argsWithAddr}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, argsWithAddr}, + {"invalid address", invalidAddrError, ctx, nil, []string{""}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdGetContractStateAll() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdGetContractStateAll()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdGetContractStateAll()") + } + }) + } +} + +func TestGetCmdGetContractStateRaw(t *testing.T) { + res := types.QueryRawContractStateResponse{} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + args := []string{accAddress, queryJsonHex} + tests := testcase{ + {"execute success", nil, ctx, nil, args}, + {"bad status", badStatusError, ctx, nil, args}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, args}, + {"invalid address", invalidAddrError, ctx, nil, []string{"", "a"}}, + {"invalid key", hex.ErrLength, ctx, nil, []string{accAddress, "a"}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdGetContractStateRaw() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdGetContractStateRaw()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdGetContractStateRaw()") + } + }) + } +} + +func TestGetCmdGetContractStateSmart(t *testing.T) { + res := types.QueryRawContractStateResponse{} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + args := []string{accAddress, queryJson} + tests := testcase{ + {"execute success", nil, ctx, nil, args}, + {"bad status", badStatusError, ctx, nil, args}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, args}, + {"invalid address", invalidAddrError, ctx, nil, []string{"", "a"}}, + {"invalid query", invalidQueryError, ctx, nil, []string{accAddress, "a"}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdGetContractStateSmart() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdGetContractStateSmart()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdGetContractStateSmart()") + } + }) + } +} + +func TestGetCmdGetContractHistory(t *testing.T) { + res := types.QueryContractHistoryResponse{} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + tests := testcase{ + {"execute success", nil, ctx, nil, argsWithAddr}, + {"bad status", badStatusError, ctx, nil, argsWithAddr}, + {"invalid request", invalidRequestError, ctx, invalidRequestFlags, argsWithAddr}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, argsWithAddr}, + {"invalid address", invalidAddrError, ctx, nil, []string{""}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdGetContractHistory() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdGetContractHistory()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdGetContractHistory()") + } + }) + } +} + +func TestGetCmdListPinnedCode(t *testing.T) { + res := types.QueryPinnedCodesResponse{} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + tests := testcase{ + {"execute success", nil, ctx, nil, nil}, + {"bad status", badStatusError, ctx, nil, nil}, + {"invalid request", invalidRequestError, ctx, invalidRequestFlags, nil}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, nil}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdListPinnedCode() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdListPinnedCode()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdListPinnedCode()") + } + }) + } +} + +func TestGetCmdListInactiveContracts(t *testing.T) { + res := lbmtypes.QueryInactiveContractsResponse{} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + tests := testcase{ + {"execute success", nil, ctx, nil, nil}, + {"bad status", badStatusError, ctx, nil, nil}, + {"invalid request", invalidRequestError, ctx, invalidRequestFlags, nil}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, nil}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdListInactiveContracts() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdListInactiveContracts()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdListInactiveContracts()") + } + }) + } +} + +func TestGetCmdIsInactiveContract(t *testing.T) { + res := lbmtypes.QueryInactiveContractResponse{} + bz, err := res.Marshal() + require.NoError(t, err) + ctx := makeContext(bz) + tests := testcase{ + {"execute success", nil, ctx, nil, argsWithAddr}, + {"bad status", badStatusError, ctx, nil, argsWithAddr}, + {"invalid url", invalidControlChar, context.Background(), invalidNodeFlags, argsWithAddr}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := GetCmdIsInactiveContract() + err := cmd.ParseFlags(tt.flags) + require.NoError(t, err) + cmd.SetContext(tt.ctx) + actual := cmd.RunE(cmd, tt.args) + if tt.want == nil { + assert.Nilf(t, actual, "GetCmdIsInactiveContract()") + } else { + assert.Equalf(t, tt.want.Error(), actual.Error(), "GetCmdIsInactiveContract()") + } + }) + } +} +func makeContext(bz []byte) context.Context { + result := ocrpctypes.ResultABCIQuery{Response: ocabcitypes.ResponseQuery{Value: bz}} + mockClient := ocrpcmocks.RemoteClient{} + { + // #1 + mockClient.On("ABCIQueryWithOptions", + mock.Anything, mock.Anything, mock.Anything, mock.Anything, + ).Once().Return(&result, nil) + } + { + // #2 + failure := result + failure.Response.Code = 1 + mockClient.On("ABCIQueryWithOptions", + mock.Anything, mock.Anything, mock.Anything, mock.Anything, + ).Once().Return(&failure, nil) + } + cli := client.Context{}.WithClient(&mockClient).WithCodec(codec.NewProtoCodec(nil)) + return context.WithValue(context.Background(), client.ClientContextKey, &cli) +} diff --git a/x/wasm/client/cli/tx.go b/x/wasm/client/cli/tx.go index 8f3203ea68..b2f9eb7f1d 100644 --- a/x/wasm/client/cli/tx.go +++ b/x/wasm/client/cli/tx.go @@ -3,19 +3,21 @@ package cli import ( "errors" "fmt" - "io/ioutil" "strconv" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/spf13/cobra" flag "github.com/spf13/pflag" - "github.com/CosmWasm/wasmd/x/wasm/ioutils" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/client/flags" + "github.com/line/lbm-sdk/client/tx" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + + "github.com/line/wasmd/x/wasm/client/cli/os" + "github.com/line/wasmd/x/wasm/ioutils" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) const ( @@ -42,6 +44,7 @@ func GetTxCmd() *cobra.Command { txCmd.AddCommand( StoreCodeCmd(), InstantiateContractCmd(), + StoreCodeAndInstantiateContractCmd(), ExecuteContractCmd(), MigrateContractCmd(), UpdateContractAdminCmd(), @@ -81,7 +84,7 @@ func StoreCodeCmd() *cobra.Command { } func parseStoreCodeArgs(file string, sender sdk.AccAddress, flags *flag.FlagSet) (types.MsgStoreCode, error) { - wasm, err := ioutil.ReadFile(file) + wasm, err := os.ReadFileWithSizeLimit(file, int64(types.MaxWasmSize)) if err != nil { return types.MsgStoreCode{}, err } @@ -219,7 +222,7 @@ func parseInstantiateArgs(rawCodeID, initMsg string, sender sdk.AccAddress, flag return types.MsgInstantiateContract{}, fmt.Errorf("you set an admin and passed --no-admin, those cannot both be true") } - // build and sign the transaction, then broadcast to Tendermint + // build and sign the transaction, then broadcast to Ostracon msg := types.MsgInstantiateContract{ Sender: sender.String(), CodeID: codeID, @@ -231,6 +234,114 @@ func parseInstantiateArgs(rawCodeID, initMsg string, sender sdk.AccAddress, flag return msg, nil } +// StoreCodeAndInstantiateContractCmd will upload code and instantiate a contract using it +func StoreCodeAndInstantiateContractCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "store-instantiate [wasm file] [json_encoded_init_args] --label [text] --admin [address,optional] --amount [coins,optional]", + Short: "Upload a wasm binary and instantiate a wasm contract from the code", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + msg, err := parseStoreCodeAndInstantiateContractArgs(args[0], args[1], clientCtx.GetFromAddress(), cmd.Flags()) + if err != nil { + return err + } + if err = msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) + }, + } + + cmd.Flags().String(flagInstantiateByEverybody, "", "Everybody can instantiate a contract from the code, optional") + cmd.Flags().String(flagInstantiateByAddress, "", "Only this address can instantiate a contract instance from the code, optional") + cmd.Flags().String(flagAmount, "", "Coins to send to the contract during instantiation") + cmd.Flags().String(flagLabel, "", "A human-readable name for this contract in lists") + cmd.Flags().String(flagAdmin, "", "Address of an admin") + flags.AddTxFlagsToCmd(cmd) + return cmd +} + +func parseStoreCodeAndInstantiateContractArgs(file string, initMsg string, sender sdk.AccAddress, flags *flag.FlagSet) (lbmtypes.MsgStoreCodeAndInstantiateContract, error) { + wasm, err := os.ReadFileWithSizeLimit(file, int64(types.MaxWasmSize)) + if err != nil { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, err + } + + // gzip the wasm file + if ioutils.IsWasm(wasm) { + wasm, err = ioutils.GzipIt(wasm) + + if err != nil { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, err + } + } else if !ioutils.IsGzip(wasm) { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, fmt.Errorf("invalid input file. Use wasm binary or gzip") + } + + var perm *types.AccessConfig + onlyAddrStr, err := flags.GetString(flagInstantiateByAddress) + if err != nil { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, fmt.Errorf("instantiate by address: %s", err) + } + if onlyAddrStr != "" { + addr, err := sdk.AccAddressFromBech32(onlyAddrStr) + if err != nil { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, sdkerrors.Wrap(err, flagInstantiateByAddress) + } + x := types.AccessTypeOnlyAddress.With(addr) + perm = &x + } else { + everybodyStr, err := flags.GetString(flagInstantiateByEverybody) + if err != nil { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, fmt.Errorf("instantiate by everybody: %s", err) + } + if everybodyStr != "" { + ok, err := strconv.ParseBool(everybodyStr) + if err != nil { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, fmt.Errorf("boolean value expected for instantiate by everybody: %s", err) + } + if ok { + perm = &types.AllowEverybody + } + } + } + + amountStr, err := flags.GetString(flagAmount) + if err != nil { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, fmt.Errorf("amount: %s", err) + } + amount, err := sdk.ParseCoinsNormalized(amountStr) + if err != nil { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, fmt.Errorf("amount: %s", err) + } + label, err := flags.GetString(flagLabel) + if err != nil { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, fmt.Errorf("label: %s", err) + } + if label == "" { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, errors.New("label is required on all contracts") + } + adminStr, err := flags.GetString(flagAdmin) + if err != nil { + return lbmtypes.MsgStoreCodeAndInstantiateContract{}, fmt.Errorf("admin: %s", err) + } + + msg := lbmtypes.MsgStoreCodeAndInstantiateContract{ + Sender: sender.String(), + WASMByteCode: wasm, + InstantiatePermission: perm, + Label: label, + Funds: amount, + Msg: []byte(initMsg), + Admin: adminStr, + } + return msg, nil +} + // ExecuteContractCmd will instantiate a contract from previously uploaded code. func ExecuteContractCmd() *cobra.Command { cmd := &cobra.Command{ diff --git a/x/wasm/client/proposal_handler.go b/x/wasm/client/proposal_handler.go index 6d4735180e..db1ad1139a 100644 --- a/x/wasm/client/proposal_handler.go +++ b/x/wasm/client/proposal_handler.go @@ -1,22 +1,23 @@ package client import ( - govclient "github.com/cosmos/cosmos-sdk/x/gov/client" + govclient "github.com/line/lbm-sdk/x/gov/client" - "github.com/CosmWasm/wasmd/x/wasm/client/cli" - "github.com/CosmWasm/wasmd/x/wasm/client/rest" + "github.com/line/wasmd/x/wasm/client/cli" ) // ProposalHandlers define the wasm cli proposal types and rest handler. var ProposalHandlers = []govclient.ProposalHandler{ - govclient.NewProposalHandler(cli.ProposalStoreCodeCmd, rest.StoreCodeProposalHandler), - govclient.NewProposalHandler(cli.ProposalInstantiateContractCmd, rest.InstantiateProposalHandler), - govclient.NewProposalHandler(cli.ProposalMigrateContractCmd, rest.MigrateProposalHandler), - govclient.NewProposalHandler(cli.ProposalExecuteContractCmd, rest.ExecuteProposalHandler), - govclient.NewProposalHandler(cli.ProposalSudoContractCmd, rest.SudoProposalHandler), - govclient.NewProposalHandler(cli.ProposalUpdateContractAdminCmd, rest.UpdateContractAdminProposalHandler), - govclient.NewProposalHandler(cli.ProposalClearContractAdminCmd, rest.ClearContractAdminProposalHandler), - govclient.NewProposalHandler(cli.ProposalPinCodesCmd, rest.PinCodeProposalHandler), - govclient.NewProposalHandler(cli.ProposalUnpinCodesCmd, rest.UnpinCodeProposalHandler), - govclient.NewProposalHandler(cli.ProposalUpdateInstantiateConfigCmd, rest.UpdateInstantiateConfigProposalHandler), + govclient.NewProposalHandler(cli.ProposalStoreCodeCmd), + govclient.NewProposalHandler(cli.ProposalInstantiateContractCmd), + govclient.NewProposalHandler(cli.ProposalMigrateContractCmd), + govclient.NewProposalHandler(cli.ProposalExecuteContractCmd), + govclient.NewProposalHandler(cli.ProposalSudoContractCmd), + govclient.NewProposalHandler(cli.ProposalUpdateContractAdminCmd), + govclient.NewProposalHandler(cli.ProposalClearContractAdminCmd), + govclient.NewProposalHandler(cli.ProposalPinCodesCmd), + govclient.NewProposalHandler(cli.ProposalUnpinCodesCmd), + govclient.NewProposalHandler(cli.ProposalUpdateInstantiateConfigCmd), + govclient.NewProposalHandler(cli.ProposalDeactivateContractCmd), + govclient.NewProposalHandler(cli.ProposalActivateContractCmd), } diff --git a/x/wasm/client/proposal_handler_test.go b/x/wasm/client/proposal_handler_test.go deleted file mode 100644 index 3e82c62e07..0000000000 --- a/x/wasm/client/proposal_handler_test.go +++ /dev/null @@ -1,298 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "fmt" - "net/http" - "net/http/httptest" - "os" - "testing" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/gorilla/mux" - "github.com/stretchr/testify/require" - - "github.com/CosmWasm/wasmd/x/wasm/keeper" -) - -func TestGovRestHandlers(t *testing.T) { - type dict map[string]interface{} - var ( - anyAddress = "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz" - aBaseReq = dict{ - "from": anyAddress, - "memo": "rest test", - "chain_id": "testing", - "account_number": "1", - "sequence": "1", - "fees": []dict{{"denom": "ustake", "amount": "1000000"}}, - } - ) - encodingConfig := keeper.MakeEncodingConfig(t) - clientCtx := client.Context{}. - WithCodec(encodingConfig.Marshaler). - WithTxConfig(encodingConfig.TxConfig). - WithLegacyAmino(encodingConfig.Amino). - WithInput(os.Stdin). - WithAccountRetriever(authtypes.AccountRetriever{}). - WithBroadcastMode(flags.BroadcastBlock). - WithChainID("testing") - - // router setup as in gov/client/rest/tx.go - propSubRtr := mux.NewRouter().PathPrefix("/gov/proposals").Subrouter() - for _, ph := range ProposalHandlers { - r := ph.RESTHandler(clientCtx) - propSubRtr.HandleFunc(fmt.Sprintf("/%s", r.SubRoute), r.Handler).Methods("POST") - } - - specs := map[string]struct { - srcBody dict - srcPath string - expCode int - }{ - "store-code": { - srcPath: "/gov/proposals/wasm_store_code", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "store-code", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "wasm_byte_code": []byte("valid wasm byte code"), - "source": "https://example.com/", - "builder": "my/builder:tag", - "instantiate_permission": dict{ - "permission": "OnlyAddress", - "address": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - }, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "store-code without permission": { - srcPath: "/gov/proposals/wasm_store_code", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "store-code", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "wasm_byte_code": []byte("valid wasm byte code"), - "source": "https://example.com/", - "builder": "my/builder:tag", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "store-code invalid permission": { - srcPath: "/gov/proposals/wasm_store_code", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "store-code", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "wasm_byte_code": []byte("valid wasm byte code"), - "source": "https://example.com/", - "builder": "my/builder:tag", - "instantiate_permission": dict{ - "permission": "Nobody", - "address": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - }, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusBadRequest, - }, - "store-code with incomplete proposal data: blank title": { - srcPath: "/gov/proposals/wasm_store_code", - srcBody: dict{ - "title": "", - "description": "My proposal", - "type": "store-code", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "wasm_byte_code": []byte("valid wasm byte code"), - "source": "https://example.com/", - "builder": "my/builder:tag", - "instantiate_permission": dict{ - "permission": "OnlyAddress", - "address": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - }, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusBadRequest, - }, - "store-code with incomplete content data: no wasm_byte_code": { - srcPath: "/gov/proposals/wasm_store_code", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "store-code", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "wasm_byte_code": "", - "source": "https://example.com/", - "builder": "my/builder:tag", - "instantiate_permission": dict{ - "permission": "OnlyAddress", - "address": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - }, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusBadRequest, - }, - "instantiate contract": { - srcPath: "/gov/proposals/wasm_instantiate", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "instantiate", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "admin": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "code_id": "1", - "label": "https://example.com/", - "msg": dict{"recipient": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz"}, - "funds": []dict{{"denom": "ustake", "amount": "100"}}, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "migrate contract": { - srcPath: "/gov/proposals/wasm_migrate", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", - "code_id": "1", - "msg": dict{"foo": "bar"}, - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "execute contract": { - srcPath: "/gov/proposals/wasm_execute", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", - "msg": dict{"foo": "bar"}, - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "execute contract fails with no run_as": { - srcPath: "/gov/proposals/wasm_execute", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", - "msg": dict{"foo": "bar"}, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusBadRequest, - }, - "execute contract fails with no message": { - srcPath: "/gov/proposals/wasm_execute", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusBadRequest, - }, - "sudo contract": { - srcPath: "/gov/proposals/wasm_sudo", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", - "msg": dict{"foo": "bar"}, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "sudo contract fails with no message": { - srcPath: "/gov/proposals/wasm_sudo", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusBadRequest, - }, - "update contract admin": { - srcPath: "/gov/proposals/wasm_update_admin", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", - "new_admin": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "clear contract admin": { - srcPath: "/gov/proposals/wasm_clear_admin", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - } - for msg, spec := range specs { - t.Run(msg, func(t *testing.T) { - src, err := json.Marshal(spec.srcBody) - require.NoError(t, err) - - // when - r := httptest.NewRequest("POST", spec.srcPath, bytes.NewReader(src)) - w := httptest.NewRecorder() - propSubRtr.ServeHTTP(w, r) - - // then - require.Equal(t, spec.expCode, w.Code, w.Body.String()) - }) - } -} diff --git a/x/wasm/client/rest/gov.go b/x/wasm/client/rest/gov.go deleted file mode 100644 index 3ba2b8f088..0000000000 --- a/x/wasm/client/rest/gov.go +++ /dev/null @@ -1,523 +0,0 @@ -package rest - -import ( - "encoding/json" - "net/http" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - govrest "github.com/cosmos/cosmos-sdk/x/gov/client/rest" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - - "github.com/CosmWasm/wasmd/x/wasm/types" -) - -type StoreCodeProposalJSONReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - Proposer string `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - RunAs string `json:"run_as" yaml:"run_as"` - // WASMByteCode can be raw or gzip compressed - WASMByteCode []byte `json:"wasm_byte_code" yaml:"wasm_byte_code"` - // InstantiatePermission to apply on contract creation, optional - InstantiatePermission *types.AccessConfig `json:"instantiate_permission" yaml:"instantiate_permission"` -} - -func (s StoreCodeProposalJSONReq) Content() govtypes.Content { - return &types.StoreCodeProposal{ - Title: s.Title, - Description: s.Description, - RunAs: s.RunAs, - WASMByteCode: s.WASMByteCode, - InstantiatePermission: s.InstantiatePermission, - } -} - -func (s StoreCodeProposalJSONReq) GetProposer() string { - return s.Proposer -} - -func (s StoreCodeProposalJSONReq) GetDeposit() sdk.Coins { - return s.Deposit -} - -func (s StoreCodeProposalJSONReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func StoreCodeProposalHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_store_code", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req StoreCodeProposalJSONReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type InstantiateProposalJSONReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer string `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - RunAs string `json:"run_as" yaml:"run_as"` - // Admin is an optional address that can execute migrations - Admin string `json:"admin,omitempty" yaml:"admin"` - Code uint64 `json:"code_id" yaml:"code_id"` - Label string `json:"label" yaml:"label"` - Msg json.RawMessage `json:"msg" yaml:"msg"` - Funds sdk.Coins `json:"funds" yaml:"funds"` -} - -func (s InstantiateProposalJSONReq) Content() govtypes.Content { - return &types.InstantiateContractProposal{ - Title: s.Title, - Description: s.Description, - RunAs: s.RunAs, - Admin: s.Admin, - CodeID: s.Code, - Label: s.Label, - Msg: types.RawContractMessage(s.Msg), - Funds: s.Funds, - } -} - -func (s InstantiateProposalJSONReq) GetProposer() string { - return s.Proposer -} - -func (s InstantiateProposalJSONReq) GetDeposit() sdk.Coins { - return s.Deposit -} - -func (s InstantiateProposalJSONReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func InstantiateProposalHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_instantiate", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req InstantiateProposalJSONReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type MigrateProposalJSONReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer string `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - Contract string `json:"contract" yaml:"contract"` - Code uint64 `json:"code_id" yaml:"code_id"` - Msg json.RawMessage `json:"msg" yaml:"msg"` -} - -func (s MigrateProposalJSONReq) Content() govtypes.Content { - return &types.MigrateContractProposal{ - Title: s.Title, - Description: s.Description, - Contract: s.Contract, - CodeID: s.Code, - Msg: types.RawContractMessage(s.Msg), - } -} - -func (s MigrateProposalJSONReq) GetProposer() string { - return s.Proposer -} - -func (s MigrateProposalJSONReq) GetDeposit() sdk.Coins { - return s.Deposit -} - -func (s MigrateProposalJSONReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func MigrateProposalHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_migrate", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req MigrateProposalJSONReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type ExecuteProposalJSONReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer string `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - Contract string `json:"contract" yaml:"contract"` - Msg json.RawMessage `json:"msg" yaml:"msg"` - // RunAs is the role that is passed to the contract's environment - RunAs string `json:"run_as" yaml:"run_as"` - Funds sdk.Coins `json:"funds" yaml:"funds"` -} - -func (s ExecuteProposalJSONReq) Content() govtypes.Content { - return &types.ExecuteContractProposal{ - Title: s.Title, - Description: s.Description, - Contract: s.Contract, - Msg: types.RawContractMessage(s.Msg), - RunAs: s.RunAs, - Funds: s.Funds, - } -} - -func (s ExecuteProposalJSONReq) GetProposer() string { - return s.Proposer -} - -func (s ExecuteProposalJSONReq) GetDeposit() sdk.Coins { - return s.Deposit -} - -func (s ExecuteProposalJSONReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func ExecuteProposalHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_execute", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req ExecuteProposalJSONReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type SudoProposalJSONReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer string `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - Contract string `json:"contract" yaml:"contract"` - Msg json.RawMessage `json:"msg" yaml:"msg"` -} - -func (s SudoProposalJSONReq) Content() govtypes.Content { - return &types.SudoContractProposal{ - Title: s.Title, - Description: s.Description, - Contract: s.Contract, - Msg: types.RawContractMessage(s.Msg), - } -} - -func (s SudoProposalJSONReq) GetProposer() string { - return s.Proposer -} - -func (s SudoProposalJSONReq) GetDeposit() sdk.Coins { - return s.Deposit -} - -func (s SudoProposalJSONReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func SudoProposalHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_sudo", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req SudoProposalJSONReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type UpdateAdminJSONReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer string `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - NewAdmin string `json:"new_admin" yaml:"new_admin"` - Contract string `json:"contract" yaml:"contract"` -} - -func (s UpdateAdminJSONReq) Content() govtypes.Content { - return &types.UpdateAdminProposal{ - Title: s.Title, - Description: s.Description, - Contract: s.Contract, - NewAdmin: s.NewAdmin, - } -} - -func (s UpdateAdminJSONReq) GetProposer() string { - return s.Proposer -} - -func (s UpdateAdminJSONReq) GetDeposit() sdk.Coins { - return s.Deposit -} - -func (s UpdateAdminJSONReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func UpdateContractAdminProposalHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_update_admin", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req UpdateAdminJSONReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type ClearAdminJSONReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer string `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - Contract string `json:"contract" yaml:"contract"` -} - -func (s ClearAdminJSONReq) Content() govtypes.Content { - return &types.ClearAdminProposal{ - Title: s.Title, - Description: s.Description, - Contract: s.Contract, - } -} - -func (s ClearAdminJSONReq) GetProposer() string { - return s.Proposer -} - -func (s ClearAdminJSONReq) GetDeposit() sdk.Coins { - return s.Deposit -} - -func (s ClearAdminJSONReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func ClearContractAdminProposalHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_clear_admin", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req ClearAdminJSONReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type PinCodeJSONReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer string `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - CodeIDs []uint64 `json:"code_ids" yaml:"code_ids"` -} - -func (s PinCodeJSONReq) Content() govtypes.Content { - return &types.PinCodesProposal{ - Title: s.Title, - Description: s.Description, - CodeIDs: s.CodeIDs, - } -} - -func (s PinCodeJSONReq) GetProposer() string { - return s.Proposer -} - -func (s PinCodeJSONReq) GetDeposit() sdk.Coins { - return s.Deposit -} - -func (s PinCodeJSONReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func PinCodeProposalHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "pin_code", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req PinCodeJSONReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type UnpinCodeJSONReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer string `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - CodeIDs []uint64 `json:"code_ids" yaml:"code_ids"` -} - -func (s UnpinCodeJSONReq) Content() govtypes.Content { - return &types.UnpinCodesProposal{ - Title: s.Title, - Description: s.Description, - CodeIDs: s.CodeIDs, - } -} - -func (s UnpinCodeJSONReq) GetProposer() string { - return s.Proposer -} - -func (s UnpinCodeJSONReq) GetDeposit() sdk.Coins { - return s.Deposit -} - -func (s UnpinCodeJSONReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func UnpinCodeProposalHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "unpin_code", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req UnpinCodeJSONReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type UpdateInstantiateConfigProposalJSONReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - Proposer string `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - AccessConfigUpdates []types.AccessConfigUpdate `json:"access_config_updates" yaml:"access_config_updates"` -} - -func (s UpdateInstantiateConfigProposalJSONReq) Content() govtypes.Content { - return &types.UpdateInstantiateConfigProposal{ - Title: s.Title, - Description: s.Description, - AccessConfigUpdates: s.AccessConfigUpdates, - } -} - -func (s UpdateInstantiateConfigProposalJSONReq) GetProposer() string { - return s.Proposer -} - -func (s UpdateInstantiateConfigProposalJSONReq) GetDeposit() sdk.Coins { - return s.Deposit -} - -func (s UpdateInstantiateConfigProposalJSONReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func UpdateInstantiateConfigProposalHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "update_instantiate_config", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req UpdateInstantiateConfigProposalJSONReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type wasmProposalData interface { - Content() govtypes.Content - GetProposer() string - GetDeposit() sdk.Coins - GetBaseReq() rest.BaseReq -} - -func toStdTxResponse(cliCtx client.Context, w http.ResponseWriter, data wasmProposalData) { - proposerAddr, err := sdk.AccAddressFromBech32(data.GetProposer()) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } - msg, err := govtypes.NewMsgSubmitProposal(data.Content(), data.GetDeposit(), proposerAddr) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } - if err := msg.ValidateBasic(); err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } - baseReq := data.GetBaseReq().Sanitize() - if !baseReq.ValidateBasic(w) { - return - } - tx.WriteGeneratedTxResponse(cliCtx, w, baseReq, msg) -} diff --git a/x/wasm/client/rest/new_tx.go b/x/wasm/client/rest/new_tx.go deleted file mode 100644 index b261fd7fb7..0000000000 --- a/x/wasm/client/rest/new_tx.go +++ /dev/null @@ -1,86 +0,0 @@ -package rest - -import ( - "net/http" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/tx" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/gorilla/mux" - - "github.com/CosmWasm/wasmd/x/wasm/types" -) - -func registerNewTxRoutes(cliCtx client.Context, r *mux.Router) { - r.HandleFunc("/wasm/contract/{contractAddr}/admin", setContractAdminHandlerFn(cliCtx)).Methods("PUT") - r.HandleFunc("/wasm/contract/{contractAddr}/code", migrateContractHandlerFn(cliCtx)).Methods("PUT") -} - -type migrateContractReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - Admin string `json:"admin,omitempty" yaml:"admin"` - CodeID uint64 `json:"code_id" yaml:"code_id"` - Msg []byte `json:"msg,omitempty" yaml:"msg"` -} - -type updateContractAdministrateReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - Admin string `json:"admin,omitempty" yaml:"admin"` -} - -func setContractAdminHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req updateContractAdministrateReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - vars := mux.Vars(r) - contractAddr := vars["contractAddr"] - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - msg := &types.MsgUpdateAdmin{ - Sender: req.BaseReq.From, - NewAdmin: req.Admin, - Contract: contractAddr, - } - if err := msg.ValidateBasic(); err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } - - tx.WriteGeneratedTxResponse(cliCtx, w, req.BaseReq, msg) - } -} - -func migrateContractHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req migrateContractReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - vars := mux.Vars(r) - contractAddr := vars["contractAddr"] - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - msg := &types.MsgMigrateContract{ - Sender: req.BaseReq.From, - Contract: contractAddr, - CodeID: req.CodeID, - Msg: req.Msg, - } - if err := msg.ValidateBasic(); err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } - - tx.WriteGeneratedTxResponse(cliCtx, w, req.BaseReq, msg) - } -} diff --git a/x/wasm/client/rest/query.go b/x/wasm/client/rest/query.go deleted file mode 100644 index d497d23900..0000000000 --- a/x/wasm/client/rest/query.go +++ /dev/null @@ -1,270 +0,0 @@ -package rest - -import ( - "encoding/base64" - "encoding/hex" - "encoding/json" - "fmt" - "net/http" - "strconv" - - "github.com/cosmos/cosmos-sdk/client" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/gorilla/mux" - - "github.com/CosmWasm/wasmd/x/wasm/keeper" - "github.com/CosmWasm/wasmd/x/wasm/types" -) - -func registerQueryRoutes(cliCtx client.Context, r *mux.Router) { - r.HandleFunc("/wasm/code", listCodesHandlerFn(cliCtx)).Methods("GET") - r.HandleFunc("/wasm/code/{codeID}", queryCodeHandlerFn(cliCtx)).Methods("GET") - r.HandleFunc("/wasm/code/{codeID}/contracts", listContractsByCodeHandlerFn(cliCtx)).Methods("GET") - r.HandleFunc("/wasm/contract/{contractAddr}", queryContractHandlerFn(cliCtx)).Methods("GET") - r.HandleFunc("/wasm/contract/{contractAddr}/state", queryContractStateAllHandlerFn(cliCtx)).Methods("GET") - r.HandleFunc("/wasm/contract/{contractAddr}/history", queryContractHistoryFn(cliCtx)).Methods("GET") - r.HandleFunc("/wasm/contract/{contractAddr}/smart/{query}", queryContractStateSmartHandlerFn(cliCtx)).Queries("encoding", "{encoding}").Methods("GET") - r.HandleFunc("/wasm/contract/{contractAddr}/raw/{key}", queryContractStateRawHandlerFn(cliCtx)).Queries("encoding", "{encoding}").Methods("GET") -} - -func listCodesHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, keeper.QueryListCode) - res, height, err := cliCtx.Query(route) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - cliCtx = cliCtx.WithHeight(height) - rest.PostProcessResponse(w, cliCtx, json.RawMessage(res)) - } -} - -func queryCodeHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - codeID, err := strconv.ParseUint(mux.Vars(r)["codeID"], 10, 64) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - - cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/%s/%d", types.QuerierRoute, keeper.QueryGetCode, codeID) - res, height, err := cliCtx.Query(route) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - if len(res) == 0 { - rest.WriteErrorResponse(w, http.StatusNotFound, "contract not found") - return - } - - cliCtx = cliCtx.WithHeight(height) - rest.PostProcessResponse(w, cliCtx, json.RawMessage(res)) - } -} - -func listContractsByCodeHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - codeID, err := strconv.ParseUint(mux.Vars(r)["codeID"], 10, 64) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/%s/%d", types.QuerierRoute, keeper.QueryListContractByCode, codeID) - res, height, err := cliCtx.Query(route) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - - cliCtx = cliCtx.WithHeight(height) - rest.PostProcessResponse(w, cliCtx, json.RawMessage(res)) - } -} - -func queryContractHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - addr, err := sdk.AccAddressFromBech32(mux.Vars(r)["contractAddr"]) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/%s/%s", types.QuerierRoute, keeper.QueryGetContract, addr.String()) - res, height, err := cliCtx.Query(route) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - - cliCtx = cliCtx.WithHeight(height) - rest.PostProcessResponse(w, cliCtx, json.RawMessage(res)) - } -} - -func queryContractStateAllHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - addr, err := sdk.AccAddressFromBech32(mux.Vars(r)["contractAddr"]) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/%s/%s/%s", types.QuerierRoute, keeper.QueryGetContractState, addr.String(), keeper.QueryMethodContractStateAll) - res, height, err := cliCtx.Query(route) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - - // parse res - var resultData []types.Model - err = json.Unmarshal(res, &resultData) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - - cliCtx = cliCtx.WithHeight(height) - rest.PostProcessResponse(w, cliCtx, resultData) - } -} - -func queryContractStateRawHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - decoder := newArgDecoder(hex.DecodeString) - addr, err := sdk.AccAddressFromBech32(mux.Vars(r)["contractAddr"]) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - decoder.encoding = mux.Vars(r)["encoding"] - queryData, err := decoder.DecodeString(mux.Vars(r)["key"]) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/%s/%s/%s", types.QuerierRoute, keeper.QueryGetContractState, addr.String(), keeper.QueryMethodContractStateRaw) - res, height, err := cliCtx.QueryWithData(route, queryData) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - cliCtx = cliCtx.WithHeight(height) - // ensure this is base64 encoded - encoded := base64.StdEncoding.EncodeToString(res) - rest.PostProcessResponse(w, cliCtx, encoded) - } -} - -type smartResponse struct { - Smart []byte `json:"smart"` -} - -func queryContractStateSmartHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - decoder := newArgDecoder(hex.DecodeString) - addr, err := sdk.AccAddressFromBech32(mux.Vars(r)["contractAddr"]) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - decoder.encoding = mux.Vars(r)["encoding"] - cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/%s/%s/%s", types.QuerierRoute, keeper.QueryGetContractState, addr.String(), keeper.QueryMethodContractStateSmart) - - queryData, err := decoder.DecodeString(mux.Vars(r)["query"]) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - res, height, err := cliCtx.QueryWithData(route, queryData) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - // return as raw bytes (to be base64-encoded) - responseData := smartResponse{Smart: res} - - cliCtx = cliCtx.WithHeight(height) - rest.PostProcessResponse(w, cliCtx, responseData) - } -} - -func queryContractHistoryFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - addr, err := sdk.AccAddressFromBech32(mux.Vars(r)["contractAddr"]) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/%s/%s", types.QuerierRoute, keeper.QueryContractHistory, addr.String()) - res, height, err := cliCtx.Query(route) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - cliCtx = cliCtx.WithHeight(height) - rest.PostProcessResponse(w, cliCtx, json.RawMessage(res)) - } -} - -type argumentDecoder struct { - // dec is the default decoder - dec func(string) ([]byte, error) - encoding string -} - -func newArgDecoder(def func(string) ([]byte, error)) *argumentDecoder { - return &argumentDecoder{dec: def} -} - -func (a *argumentDecoder) DecodeString(s string) ([]byte, error) { - switch a.encoding { - case "hex": - return hex.DecodeString(s) - case "base64": - return base64.StdEncoding.DecodeString(s) - default: - return a.dec(s) - } -} diff --git a/x/wasm/client/rest/rest.go b/x/wasm/client/rest/rest.go deleted file mode 100644 index 2e697a6b50..0000000000 --- a/x/wasm/client/rest/rest.go +++ /dev/null @@ -1,13 +0,0 @@ -package rest - -import ( - "github.com/cosmos/cosmos-sdk/client" - "github.com/gorilla/mux" -) - -// RegisterRoutes registers staking-related REST handlers to a router -func RegisterRoutes(cliCtx client.Context, r *mux.Router) { - registerQueryRoutes(cliCtx, r) - registerTxRoutes(cliCtx, r) - registerNewTxRoutes(cliCtx, r) -} diff --git a/x/wasm/client/rest/tx.go b/x/wasm/client/rest/tx.go deleted file mode 100644 index 17407c4b6a..0000000000 --- a/x/wasm/client/rest/tx.go +++ /dev/null @@ -1,149 +0,0 @@ -package rest - -import ( - "net/http" - "strconv" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/gorilla/mux" - - "github.com/CosmWasm/wasmd/x/wasm/ioutils" - "github.com/CosmWasm/wasmd/x/wasm/types" -) - -func registerTxRoutes(cliCtx client.Context, r *mux.Router) { - r.HandleFunc("/wasm/code", storeCodeHandlerFn(cliCtx)).Methods("POST") - r.HandleFunc("/wasm/code/{codeId}", instantiateContractHandlerFn(cliCtx)).Methods("POST") - r.HandleFunc("/wasm/contract/{contractAddr}", executeContractHandlerFn(cliCtx)).Methods("POST") -} - -type storeCodeReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - WasmBytes []byte `json:"wasm_bytes"` -} - -type instantiateContractReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - Label string `json:"label" yaml:"label"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - Admin string `json:"admin,omitempty" yaml:"admin"` - Msg []byte `json:"msg" yaml:"msg"` -} - -type executeContractReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - ExecMsg []byte `json:"exec_msg" yaml:"exec_msg"` - Amount sdk.Coins `json:"coins" yaml:"coins"` -} - -func storeCodeHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req storeCodeReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - var err error - wasm := req.WasmBytes - - // gzip the wasm file - if ioutils.IsWasm(wasm) { - wasm, err = ioutils.GzipIt(wasm) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } - } else if !ioutils.IsGzip(wasm) { - rest.WriteErrorResponse(w, http.StatusBadRequest, "Invalid input file, use wasm binary or zip") - return - } - - // build and sign the transaction, then broadcast to Tendermint - msg := types.MsgStoreCode{ - Sender: req.BaseReq.From, - WASMByteCode: wasm, - } - - if err := msg.ValidateBasic(); err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } - - tx.WriteGeneratedTxResponse(cliCtx, w, req.BaseReq, &msg) - } -} - -func instantiateContractHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req instantiateContractReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - vars := mux.Vars(r) - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - // get the id of the code to instantiate - codeID, err := strconv.ParseUint(vars["codeId"], 10, 64) - if err != nil { - return - } - - msg := types.MsgInstantiateContract{ - Sender: req.BaseReq.From, - CodeID: codeID, - Label: req.Label, - Funds: req.Deposit, - Msg: req.Msg, - Admin: req.Admin, - } - - if err := msg.ValidateBasic(); err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } - - tx.WriteGeneratedTxResponse(cliCtx, w, req.BaseReq, &msg) - } -} - -func executeContractHandlerFn(cliCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req executeContractReq - if !rest.ReadRESTReq(w, r, cliCtx.LegacyAmino, &req) { - return - } - vars := mux.Vars(r) - contractAddr := vars["contractAddr"] - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - msg := types.MsgExecuteContract{ - Sender: req.BaseReq.From, - Contract: contractAddr, - Msg: req.ExecMsg, - Funds: req.Amount, - } - - if err := msg.ValidateBasic(); err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } - - tx.WriteGeneratedTxResponse(cliCtx, w, req.BaseReq, &msg) - } -} diff --git a/x/wasm/client/testutil/cli_test.go b/x/wasm/client/testutil/cli_test.go new file mode 100644 index 0000000000..f979202abe --- /dev/null +++ b/x/wasm/client/testutil/cli_test.go @@ -0,0 +1,18 @@ +//go:build norace +// +build norace + +package testutil + +import ( + "testing" + + "github.com/stretchr/testify/suite" + + "github.com/line/lbm-sdk/testutil/network" +) + +func TestIntegrationTestSuite(t *testing.T) { + cfg := network.DefaultConfig() + cfg.NumValidators = 1 + suite.Run(t, NewIntegrationTestSuite(cfg)) +} diff --git a/x/wasm/client/testutil/gov.go b/x/wasm/client/testutil/gov.go new file mode 100644 index 0000000000..ae2e960d8f --- /dev/null +++ b/x/wasm/client/testutil/gov.go @@ -0,0 +1,131 @@ +package testutil + +import ( + "fmt" + + "github.com/line/lbm-sdk/client/flags" + clitestutil "github.com/line/lbm-sdk/testutil/cli" + sdk "github.com/line/lbm-sdk/types" + govcli "github.com/line/lbm-sdk/x/gov/client/cli" + "github.com/line/lbm-sdk/x/gov/types" + + "github.com/line/wasmd/x/wasm/client/cli" +) + +func (s *IntegrationTestSuite) TestProposalDeactivateContractCmd() { + val := s.network.Validators[0] + initialDeposit := sdk.NewCoin(s.cfg.BondDenom, types.DefaultMinDepositTokens.Sub(sdk.NewInt(20))).String() + + testCases := map[string]struct { + args []string + valid bool + }{ + "valid deactivateContract proposal": { + []string{ + s.contractAddress, + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=%s", govcli.FlagTitle, "My Proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDescription, "Test proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDeposit, initialDeposit), + }, + true, + }, + "no proposer": { + []string{ + s.contractAddress, + fmt.Sprintf("--%s=%s", govcli.FlagTitle, "My Proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDescription, "Test proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDeposit, initialDeposit), + }, + false, + }, + "wrong deposit": { + []string{ + s.contractAddress, + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=%s", govcli.FlagTitle, "My Proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDescription, "Test proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDeposit, "20"), + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.ProposalDeactivateContractCmd() + flags.AddTxFlagsToCmd(cmd) + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, commonArgs...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var res sdk.TxResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &res), out.String()) + s.Require().EqualValues(0, res.Code, out.String()) + }) + } +} + +func (s *IntegrationTestSuite) TestProposalActivateContractCmd() { + val := s.network.Validators[0] + initialDeposit := sdk.NewCoin(s.cfg.BondDenom, types.DefaultMinDepositTokens.Sub(sdk.NewInt(20))).String() + + testCases := map[string]struct { + args []string + valid bool + }{ + "valid activateContract proposal": { + []string{ + s.inactiveContractAddress, + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=%s", govcli.FlagTitle, "My Proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDescription, "Test proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDeposit, initialDeposit), + }, + true, + }, + "no proposer": { + []string{ + s.contractAddress, + fmt.Sprintf("--%s=%s", govcli.FlagTitle, "My Proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDescription, "Test proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDeposit, initialDeposit), + }, + false, + }, + "wrong deposit": { + []string{ + s.contractAddress, + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=%s", govcli.FlagTitle, "My Proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDescription, "Test proposal"), + fmt.Sprintf("--%s=%s", govcli.FlagDeposit, "20"), + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.ProposalActivateContractCmd() + flags.AddTxFlagsToCmd(cmd) + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, commonArgs...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var res sdk.TxResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &res), out.String()) + s.Require().EqualValues(0, res.Code, out.String()) + }) + } +} diff --git a/x/wasm/client/testutil/query.go b/x/wasm/client/testutil/query.go new file mode 100644 index 0000000000..32190e289b --- /dev/null +++ b/x/wasm/client/testutil/query.go @@ -0,0 +1,537 @@ +package testutil + +import ( + "encoding/hex" + "fmt" + "strconv" + + "github.com/gogo/protobuf/proto" + + clitestutil "github.com/line/lbm-sdk/testutil/cli" + "github.com/line/lbm-sdk/types/query" + + "github.com/line/wasmd/x/wasm/client/cli" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" +) + +func (s *IntegrationTestSuite) TestGetCmdListCode() { + val := s.network.Validators[0] + + var args []string + cmd := cli.GetCmdListCode() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(args, s.queryCommonArgs()...)) + s.Require().NoError(err) + + codeID, err := strconv.ParseUint(s.codeID, 10, 64) + s.Require().NoError(err) + + var codes types.QueryCodesResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &codes), out.String()) + s.Require().GreaterOrEqual(2, len(codes.CodeInfos)) + s.Require().Equal(codes.CodeInfos[1].CodeID, codeID) +} + +func (s *IntegrationTestSuite) TestGetCmdListContractByCode() { + val := s.network.Validators[0] + + testCases := map[string]struct { + args []string + valid bool + expected proto.Message + }{ + "valid query": { + []string{ + s.codeID, + }, + true, + &types.QueryContractsByCodeResponse{ + Contracts: []string{s.contractAddress}, + Pagination: &query.PageResponse{}, + }, + }, + "no codeID": { + []string{}, + false, + nil, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.GetCmdListContractByCode() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, s.queryCommonArgs()...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var contracts types.QueryContractsByCodeResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &contracts), out.String()) + s.Require().Equal(tc.expected, &contracts) + }) + } +} + +func (s *IntegrationTestSuite) TestGetCmdQueryCodeInfo() { + val := s.network.Validators[0] + + codeID, err := strconv.ParseUint(s.codeID, 10, 64) + s.Require().NoError(err) + expectedDataHash, err := hex.DecodeString("470C5B703A682F778B8B088D48169B8D6E43F7F44AC70316692CDBE69E6605E3") + s.Require().NoError(err) + + testCases := map[string]struct { + args []string + valid bool + expected proto.Message + }{ + "valid query": { + []string{ + s.codeID, + }, + true, + &types.CodeInfoResponse{ + CodeID: codeID, + Creator: val.Address.String(), + DataHash: expectedDataHash, + InstantiatePermission: types.AllowEverybody, + }, + }, + "no codeID": { + []string{}, + false, + nil, + }, + "no exist codeID": { + []string{"100"}, + false, + nil, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.GetCmdQueryCodeInfo() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, s.queryCommonArgs()...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var codeInfo types.CodeInfoResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &codeInfo), out.String()) + s.Require().Equal(tc.expected, &codeInfo) + }) + } +} + +func (s *IntegrationTestSuite) TestGetCmdGetContractInfo() { + val := s.network.Validators[0] + + codeID, err := strconv.ParseUint(s.codeID, 10, 64) + s.Require().NoError(err) + + testCases := map[string]struct { + args []string + valid bool + expected proto.Message + }{ + "valid query": { + []string{ + s.contractAddress, + }, + true, + &types.QueryContractInfoResponse{ + Address: s.contractAddress, + ContractInfo: types.ContractInfo{ + CodeID: codeID, + Creator: val.Address.String(), + Admin: val.Address.String(), + Label: "TestContract", + Created: nil, + IBCPortID: "", + Extension: nil, + }, + }, + }, + "no contractAddress": { + []string{}, + false, + nil, + }, + "wrong contactAddress": { + []string{ + "abc", + }, + false, + nil, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.GetCmdGetContractInfo() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, s.queryCommonArgs()...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var contractInfo types.QueryContractInfoResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &contractInfo), out.String()) + s.Require().Equal(tc.expected, &contractInfo) + }) + } +} + +func (s *IntegrationTestSuite) TestGetCmdGetContractStateAll() { + val := s.network.Validators[0] + + testCases := map[string]struct { + args []string + valid bool + expected proto.Message + }{ + "valid query": { + []string{ + s.contractAddress, + }, + true, + &types.QueryAllContractStateResponse{ + Models: []types.Model{ + { + Key: []byte("config"), + Value: []byte(fmt.Sprintf("{\"verifier\":\"%s\",\"beneficiary\":\"%s\",\"funder\":\"%s\"}", s.verifier, s.beneficiary, s.verifier)), + }, + }, + Pagination: &query.PageResponse{}, + }, + }, + "wrong bech32_address": { + []string{ + "xxx", + }, + false, + nil, + }, + "no exist bech32_address": { + []string{ + s.nonExistValidAddress, + }, + false, + nil, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.GetCmdGetContractStateAll() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, s.queryCommonArgs()...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var contractInfo types.QueryAllContractStateResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &contractInfo), out.String()) + s.Require().Equal(tc.expected, &contractInfo) + }) + } +} + +func (s *IntegrationTestSuite) TestGetCmdGetContractStateRaw() { + val := s.network.Validators[0] + + testCases := map[string]struct { + args []string + valid bool + expected proto.Message + }{ + "valid query": { + []string{ + s.contractAddress, + hex.EncodeToString([]byte("config")), // "636F6E666967" + }, + true, + &types.QueryRawContractStateResponse{ + Data: []byte(fmt.Sprintf("{\"verifier\":\"%s\",\"beneficiary\":\"%s\",\"funder\":\"%s\"}", s.verifier, s.beneficiary, s.verifier)), + }, + }, + "no exist key": { + []string{ + s.contractAddress, + hex.EncodeToString([]byte("verifier")), // "7665726966696572", + }, + true, + &types.QueryRawContractStateResponse{Data: nil}, + }, + "wrong bech32_address": { + []string{ + "xxx", + hex.EncodeToString([]byte("config")), // "636F6E666967" + }, + false, + nil, + }, + "no exist bech32_address": { + []string{ + s.nonExistValidAddress, + hex.EncodeToString([]byte("config")), // "636F6E666967" + }, + false, + nil, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.GetCmdGetContractStateRaw() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, s.queryCommonArgs()...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var contractInfo types.QueryRawContractStateResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &contractInfo), out.String()) + s.Require().Equal(tc.expected, &contractInfo) + }) + } +} + +func (s *IntegrationTestSuite) TestGetCmdGetContractStateSmart() { + val := s.network.Validators[0] + + testCases := map[string]struct { + args []string + valid bool + expected proto.Message + }{ + "valid query": { + []string{ + s.contractAddress, + "{\"verifier\":{}}", + }, + true, + &types.QuerySmartContractStateResponse{ + Data: []byte(fmt.Sprintf("{\"verifier\":\"%s\"}", s.verifier)), + }, + }, + "invalid request": { + []string{ + s.contractAddress, + "{\"raw\":{\"key\":\"config\"}}", + }, + false, + nil, + }, + "invalid json key": { + []string{ + s.contractAddress, + "not json", + }, + false, + nil, + }, + "wrong bech32_address": { + []string{ + "xxx", + "{\"verifier\":{}}", + }, + false, + nil, + }, + "no exist bech32_address": { + []string{ + s.nonExistValidAddress, + "{\"verifier\":{}}", + }, + false, + nil, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.GetCmdGetContractStateSmart() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, s.queryCommonArgs()...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var contractInfo types.QuerySmartContractStateResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &contractInfo), out.String()) + s.Require().Equal(tc.expected, &contractInfo) + }) + } +} + +func (s *IntegrationTestSuite) TestGetCmdGetContractHistory() { + val := s.network.Validators[0] + + codeID, err := strconv.ParseUint(s.codeID, 10, 64) + s.Require().NoError(err) + + testCases := map[string]struct { + args []string + valid bool + expected proto.Message + }{ + "valid query": { + []string{ + s.contractAddress, + }, + true, + &types.QueryContractHistoryResponse{ + Entries: []types.ContractCodeHistoryEntry{ + { + Operation: types.ContractCodeHistoryOperationTypeInit, + CodeID: codeID, + Updated: nil, + Msg: []byte(fmt.Sprintf("{\"verifier\":\"%s\",\"beneficiary\":\"%s\"}", s.verifier, s.beneficiary)), + }, + }, + Pagination: &query.PageResponse{}, + }, + }, + "wrong bech32_address": { + []string{ + "xxx", + }, + false, + nil, + }, + "no exist bech32_address": { + []string{ + "link1hmayw7vv0p3gzeh3jzwmw9xj8fy8a3kmpqgjrysljdnecqkps02qrq5rvm", + }, + true, + &types.QueryContractHistoryResponse{ + Entries: []types.ContractCodeHistoryEntry{}, + Pagination: &query.PageResponse{}, + }, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.GetCmdGetContractHistory() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, s.queryCommonArgs()...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var contractInfo types.QueryContractHistoryResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &contractInfo), out.String()) + s.Require().Equal(tc.expected, &contractInfo) + }) + } +} + +func (s *IntegrationTestSuite) TestGetCmdListPinnedCode() { + val := s.network.Validators[0] + + cmd := cli.GetCmdListPinnedCode() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, s.queryCommonArgs()) + s.Require().NoError(err) + + expcted := &types.QueryPinnedCodesResponse{ + CodeIDs: []uint64{}, + Pagination: &query.PageResponse{}, + } + var contractInfo types.QueryPinnedCodesResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &contractInfo), out.String()) + s.Require().Equal(expcted, &contractInfo) +} + +func (s *IntegrationTestSuite) TestGetCmdListInactiveContracts() { + val := s.network.Validators[0] + + cmd := cli.GetCmdListInactiveContracts() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, s.queryCommonArgs()) + s.Require().NoError(err) + + expected := &lbmtypes.QueryInactiveContractsResponse{ + Addresses: []string{s.inactiveContractAddress}, + Pagination: &query.PageResponse{}, + } + var resInfo lbmtypes.QueryInactiveContractsResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &resInfo), out.String()) + s.Require().Equal(expected, &resInfo) +} + +func (s *IntegrationTestSuite) TestGetCmdIsInactiveContract() { + val := s.network.Validators[0] + + testCases := map[string]struct { + args []string + valid bool + expected proto.Message + }{ + "valid query(inactivate)": { + []string{ + s.inactiveContractAddress, + }, + true, + &lbmtypes.QueryInactiveContractResponse{ + Inactivated: true, + }, + }, + "valid query(activate)": { + []string{ + "link1hmayw7vv0p3gzeh3jzwmw9xj8fy8a3kmpqgjrysljdnecqkps02qrq5rvm", + }, + false, + nil, + }, + "wrong bech32_address": { + []string{ + "xxx", + }, + false, + nil, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.GetCmdIsInactiveContract() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, s.queryCommonArgs()...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var resInfo lbmtypes.QueryInactiveContractResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &resInfo), out.String()) + s.Require().Equal(tc.expected, &resInfo) + }) + } +} diff --git a/x/wasm/client/testutil/suite.go b/x/wasm/client/testutil/suite.go new file mode 100644 index 0000000000..596270f844 --- /dev/null +++ b/x/wasm/client/testutil/suite.go @@ -0,0 +1,156 @@ +package testutil + +import ( + "fmt" + "os" + "testing" + + "github.com/line/lbm-sdk/client/flags" + clitestutil "github.com/line/lbm-sdk/testutil/cli" + "github.com/line/lbm-sdk/testutil/network" + sdk "github.com/line/lbm-sdk/types" + ostcli "github.com/line/ostracon/libs/cli" + "github.com/stretchr/testify/suite" + + "github.com/line/wasmd/x/wasm/client/cli" + "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/types" +) + +type IntegrationTestSuite struct { + suite.Suite + + cfg network.Config + network *network.Network + + setupHeight int64 + + codeID string + contractAddress string + nonExistValidAddress string + inactiveContractAddress string + + // for hackatom contract + verifier string + beneficiary sdk.AccAddress +} + +var commonArgs = []string{ + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))).String()), +} + +func NewIntegrationTestSuite(cfg network.Config) *IntegrationTestSuite { + return &IntegrationTestSuite{cfg: cfg} +} + +func (s *IntegrationTestSuite) SetupSuite() { + s.T().Log("Setting up integration test suite.") + + if testing.Short() { + s.T().Skip("skipping test in unit-tests mode.") + } + + s.inactiveContractAddress = "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8" + + // add inactive contract to genesis + var wasmData types.GenesisState + genesisState := s.cfg.GenesisState + genesisData, err := os.ReadFile("./testdata/wasm_genesis.json") + s.Require().NoError(err) + s.Require().NoError(s.cfg.Codec.UnmarshalJSON(genesisData, &wasmData)) + wasmDataBz, err := s.cfg.Codec.MarshalJSON(&wasmData) + s.Require().NoError(err) + genesisState[types.ModuleName] = wasmDataBz + s.cfg.GenesisState = genesisState + + s.network = network.New(s.T(), s.cfg) + _, err = s.network.WaitForHeight(1) + s.Require().NoError(err) + + // deploy contract + s.codeID = s.deployContract() + + s.verifier = s.network.Validators[0].Address.String() + s.beneficiary = keeper.RandomAccountAddress(s.T()) + params := fmt.Sprintf("{\"verifier\": \"%s\", \"beneficiary\": \"%s\"}", s.verifier, s.beneficiary) + s.contractAddress = s.instantiate(s.codeID, params) + + s.nonExistValidAddress = keeper.RandomAccountAddress(s.T()).String() + + s.setupHeight, err = s.network.LatestHeight() + s.Require().NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) +} + +func (s *IntegrationTestSuite) TearDownSuite() { + s.T().Log("tearing down integration test suite") + s.network.Cleanup() +} + +func (s *IntegrationTestSuite) queryCommonArgs() []string { + return []string{ + fmt.Sprintf("--%s=%d", flags.FlagHeight, s.setupHeight), + fmt.Sprintf("--%s=json", ostcli.OutputFlag), + } +} + +func (s *IntegrationTestSuite) deployContract() string { + val := s.network.Validators[0] + + wasmPath := "../../keeper/testdata/hackatom.wasm" + _, err := os.ReadFile(wasmPath) + s.Require().NoError(err) + + args := append([]string{ + wasmPath, + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=%d", flags.FlagGas, 1500000), + }, commonArgs...) + + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cli.StoreCodeCmd(), args) + s.Require().NoError(err) + + var res sdk.TxResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &res), out.String()) + s.Require().EqualValues(0, res.Code, out.String()) + + // parse codeID + for _, v := range res.Events { + if v.Type == types.EventTypeStoreCode { + return string(v.Attributes[0].Value) + } + } + + return "" +} + +func (s *IntegrationTestSuite) instantiate(codeID, params string) string { + val := s.network.Validators[0] + owner := val.Address.String() + + args := append([]string{ + codeID, + params, + fmt.Sprintf("--label=%s", "TestContract"), + fmt.Sprintf("--admin=%s", owner), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + }, commonArgs...) + + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cli.InstantiateContractCmd(), args) + s.Require().NoError(err) + + var res sdk.TxResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &res), out.String()) + s.Require().EqualValues(0, res.Code, out.String()) + + // parse contractAddress + for _, v := range res.Events { + if v.Type == types.EventTypeInstantiate { + return string(v.Attributes[0].Value) + } + } + + return "" +} diff --git a/x/wasm/client/testutil/testdata/wasm_genesis.json b/x/wasm/client/testutil/testdata/wasm_genesis.json new file mode 100644 index 0000000000..dabc0aa2db --- /dev/null +++ b/x/wasm/client/testutil/testdata/wasm_genesis.json @@ -0,0 +1,71 @@ +{ + "codes": + [ + { + "code_bytes": "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BzYCACAAQSBqIA02AgAgAEEcaiAENgIAIABBGGogEzYCACAAQRRqIAw2AgAgAEEQaiAKNgIAIABBDGogBjYCACAAQQhqIAs2AgAgACAJNgIEQQAhEAwNC0EBCyEOQQAhCUEBIQYgBA0IDAkLQQAhCkEBIQYgBA0HDAgLIAEhDAwBCyADQdgAaiAIEMEBAkAgAygCWCICQRVHBEAgESASKQIANwIAIBFBCGogEkEIaigCADYCAAwBCyADQcgAaiAIEBggAygCSCICQRVGDQELIANB1ABqKAIAIQUgA0HQAGooAgAhByADKAJMIQEMAwsgA0EIaiAIEMMBQQAhAiADLQAJIQEgAy0ACEEBcQ0ACwtBAiECQQEhBiAEDQIMAwtBASEGIAQNAQwCC0EEIQJBASEGIARFDQELIA1FDQAgBBDrAQsgDEUgCkUgDkVyckUEQCAKEOsBCyAJQQBHIAZxRSALRXINACAJEOsBCyADQeQAaiAFNgIAIANB4ABqIAc2AgAgAyABNgJcIAMgAjYCWCAAQQhqQbWKwABBFiADQdgAahAcCyAAIBA2AgAgA0HwAGokAAumLwISfwJ+IwBBoAFrIgIkACACEMgBIAACfwJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCAEEBRwRAIAIoAggiAyACKAIERgRAIAIgA0EBEA8gAigCCCEDCyACKAIAIANqQfsAOgAAIAIgA0EBajYCCCACQZABaiACQaGFwABBAhDLAQJAIAIoApABQQFHBEAgAigCCCIDIAIoAgRGBEAgAiADQQEQDyACKAIIIQMLIAIoAgAgA2pBOjoAACACIANBAWo2AgggAkGQAWogAhDPASACKAKQAUEBRg0BIAIgAigClAEiAzYCMCACQZgBai0AAARAIANBCGooAgAhBAwECyADKAIIIgUgA0EEaigCAEYEQCADIAVBARAPIAMoAgghBQsgAyAFQQFqIgQ2AgggAygCACAFakEsOgAADAMLIAJBHGogAkGcAWooAgA2AgAgAiACKQKUATcCFAwMCyACQSxqIAJBkAFqQQRyIgFBCGooAgA2AgAgAiABKQIANwIkDAoLIAJBEGogAiABQQRqECEgAigCEEEBRw0BDAoLIAJBADoANCADQQRqIgYoAgAgBEYEQCADIARBARAPIANBCGooAgAhBAsgAygCACAEakEiOgAAIANBCGoiBSAEQQFqIgQ2AgAgBigCACAEa0EHTQRAIAMgBEEIEA8gBSgCACEECyADKAIAIARqQu3KzZuX7Nmy8wA3AAAgBSAEQQhqIgQ2AgAgA0EEaigCACAEa0EBTQRAIAMgBEECEA8gA0EIaigCACEECyADKAIAIARqQaL0ADsAACADQQhqIARBAmo2AgAgASgCBCEEIAJBkAFqIAMgAUEMaigCACIDEM4BIAIoApABQQFGDQUgAkGYAWotAAAhBQJAAkAgAkE4aiACKAKUASILIAMEfyAEIANB6ABsaiEQIAJBkAFqQQRyIQwgAkGAAWpBBHIhCSAEQSxqIQYgBUUhAyALQQRqIREDQCADQQFxBEAgCygCCCIDIBEoAgBGBEAgCyADQQEQDyALKAIIIQMLIAsgA0EBajYCCCALKAIAIANqQSw6AAALIAJBkAFqIAsQzwECQCACKAKQAUEBRwRAIAIoApQBIQUgBkEsayINKQMAIRQgAi0AmAEEQCAFQQhqKAIAIQMMAgsgBSgCCCIEIAVBBGooAgBGBEAgBSAEQQEQDyAFKAIIIQQLIAUgBEEBaiIDNgIIIAUoAgAgBGpBLDoAAAwBCyACQdQAaiAMQQhqKAIANgIAIAIgDCkCADcCTAwLCyAFQQRqIggoAgAgA0YEQCAFIANBARAPIAVBCGooAgAhAwsgBSgCACADakEiOgAAIAVBCGoiBCADQQFqIgM2AgAgCCgCACADa0EBTQRAIAUgA0ECEA8gBCgCACEDCyAFKAIAIANqQenIATsAACAEIANBAmoiAzYCACAIKAIAIANrQQFNBEAgBSADQQIQDyAEKAIAIQMLIAUoAgAgA2pBovQAOwAAIAQgA0ECajYCACACQZABaiAFIBQQygECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoApABQQFHBEAgBCgCACIDIAgoAgBGBEAgBSADQQEQDyAEKAIAIQMLIAUoAgAgA2pBLDoAACAEIANBAWoiAzYCACAIKAIAIANGBEAgBSADQQEQDyAEKAIAIQMLIAUoAgAgA2pBIjoAACAEIANBAWoiAzYCACAIKAIAIANrQQJNBEAgBSADQQMQDyAEKAIAIQMLIAUoAgAgA2oiB0H0gcAALwAAOwAAIAdBAmpB9oHAAC0AADoAACAEIANBA2oiAzYCACAIKAIAIANrQQFNBEAgBSADQQIQDyAEKAIAIQMLIAUoAgAgA2pBovQAOwAAIAQgA0ECaiIDNgIAAkACQAJAAkACQCANQQhqKAIAQQFrDgICAQALIAgoAgAgA0YEQCAFIANBARAPIAQoAgAhAwsgBCADQQFqNgIAIAUoAgAgA2pB+wA6AAAgAkGQAWogBUGNgcAAQQQQywEgAigCkAFBAUYNAiAEKAIAIgMgCCgCAEYEQCAFIANBARAPIAQoAgAhAwsgBCADQQFqNgIAIAUoAgAgA2pBOjoAAAJAIAZBIGsoAgBBAUcEQCACQZABaiAFQZOEwABBBBDQASACKAKQAUEBRg0KIAIgAi0AmAE6AGwgAiACKAKUATYCaCACQZABaiACQegAakGXhMAAQQogBkEcaxATIAIoApABQQFGDQogAkGQAWogAkHoAGpB/YDAAEEGIAZBEGsQECACKAKQAUEBRg0BIAJBgAFqIAIoAmggAi0AbBDHAQwLCyACQZABaiAFQY+EwABBBBDQASACKAKQAUEBRg0JIAIgAi0AmAE6AGwgAiACKAKUATYCaCACQZABaiACQegAakH9gMAAQQYgBkEcaxAQIAIoApABQQFHBEAgAkGAAWogAigCaCACLQBsEMcBDAsLDAkLDAgLIAgoAgAgA0YEQCAFIANBARAPIAQoAgAhAwsgBCADQQFqNgIAIAUoAgAgA2pB+wA6AAAgAkGQAWogBUGDgcAAQQQQywEgAigCkAFBAUYNAiAEKAIAIgMgCCgCAEYEQCAFIANBARAPIAQoAgAhAwsgBCADQQFqNgIAIAUoAgAgA2pBOjoAAAJAAkACQAJAAkAgBkEcaygCAEEBaw4EAwIBAAQLIAJBkAFqIAVBqITAAEELENABIAIoApABQQFGDQkgAiACLQCYAToAbCACIAIoApQBNgJoIAJBkAFqIAJB6ABqQdyBwABBDSAGQRhrEBMgAigCkAFBAUcEQCACQYABaiACKAJoIAItAGwQxwEMCwsMCQsgAkGQAWogBUGzhMAAQQwQ0AEgAigCkAFBAUYNCCACIAItAJgBOgBsIAIgAigClAE2AmggAkGQAWogAkHoAGpB3IHAAEENIAZBGGsQEyACKAKQAUEBRg0IIAJBkAFqIAJB6ABqQb+EwABBBSAGQQxrEBMgAigCkAFBAUcEQCACQYABaiACKAJoIAItAGwQxwEMCgsMCAsgAkGQAWogBUHEhMAAQQcQ0AEgAigCkAFBAUYNByACIAItAJgBOgBsIAIgAigClAE2AmggAkGQAWogAkHoAGpB3IHAAEENIAZBGGsQEyACKAKQAUEBRg0HIAJBkAFqIAJB6ABqQcuEwABBCyAGQQRqKQMAEA4gAigCkAFBAUYNByACQZABaiACQegAakH0gcAAIAZBDGsQEiACKAKQAUEBRwRAIAJBgAFqIAIoAmggAi0AbBDHAQwJCwwHCyACQZABaiAFQdaEwABBCxDQASACKAKQAUEBRwRAIAIgAigClAEiAzYCaCAGQRBrKAIAIRIgBkEYaygCACEOIAItAJgBBEAgA0EIaigCACEHDAcLIAMoAggiCiADQQRqKAIARgRAIAMgCkEBEA8gAygCCCEKCyADIApBAWoiBzYCCCADKAIAIApqQSw6AAAMBgsMBgsgAkGQAWogBUHthMAAQQcQ0AEgAigCkAFBAUYNBSACIAItAJgBOgBsIAIgAigClAE2AmggAkGQAWogAkHoAGpB3IHAAEENIAZBGGsQEyACKAKQAUEBRg0FIAJBkAFqIAJB6ABqQfSBwAAgBkEMaxASIAIoApABQQFGDQUgAkGQAWogAkHoAGpBp4LAAEEFIAYQECACKAKQAUEBRwRAIAJBgAFqIAIoAmggAi0AbBDHAQwHCwwFCyACQfAAaiAFECIgAigCcEEBRg0LIAQoAgAhAwwKCyACQfwAaiACQZwBaigCADYCACACIAIpApQBNwJ0DAoLIAJB/ABqIAJBnAFqKAIANgIAIAIgAikClAE3AnQMCQsgAkHUAGogAkGcAWooAgA2AgAgAiACKQKUATcCTAwYCyACQQA6AGwgA0EEaiIPKAIAIAdGBEAgAyAHQQEQDyADQQhqKAIAIQcLIAMoAgAgB2pBIjoAACADQQhqIgogB0EBaiIHNgIAIA8oAgAgB2tBBE0EQCADIAdBBRAPIAooAgAhBwsgAygCACAHaiITQb+EwAAoAAA2AAAgE0EEakHDhMAALQAAOgAAIAogB0EFaiIHNgIAIA8oAgAgB2tBAU0EQCADIAdBAhAPIAooAgAhBwsgAygCACAHakGi9AA7AAAgCiAHQQJqNgIAAkAgDkUEQCACQZABaiADEMwBDAELIAJBkAFqIAMgDiASEMsBCyACKAKQAUEBRwRAAkAgAkGQAWogAkHoAGpB4YTAAEEHIAZBHGopAwAQDiACKAKQAUEBRg0AIAJBkAFqIAJB6ABqQfSBwAAgBkEMaxASIAIoApABQQFGDQAgAkGQAWogAkHoAGpBp4LAAEEFIAYQECACKAKQAUEBRg0AIAJBkAFqIAJB6ABqQeiEwABBBSAGQQxqEBMgAigCkAFBAUYNACACQYABaiACKAJoIAItAGwQxwEMAwsLCyAJIAwpAgA3AgAgCUEIaiAMQQhqKAIANgIAIAJBATYCgAELIAIoAoABQQFHBEAgBCgCACIDIAgoAgBHDQQMAwsgAkH8AGogCUEIaigCADYCACACIAkpAgA3AnQMBQsgCSAMKQIANwIAIAlBCGogDEEIaigCADYCACACQQE2AoABCyACKAKAAUEBRwRAIAQoAgAiAyAIKAIARg0BDAILIAJB/ABqIAlBCGooAgA2AgAgAiAJKQIANwJ0DAMLIAUgA0EBEA8gBCgCACEDCyAFKAIAIANqQf0AOgAAIAQgA0EBaiIDNgIACyANQdgAaikDACEUIA1B0ABqKQMAIRUgCCgCACADRgRAIAUgA0EBEA8gBCgCACEDCyAFKAIAIANqQSw6AAAgBCADQQFqIgM2AgAgCCgCACADRgRAIAUgA0EBEA8gBCgCACEDCyAFKAIAIANqQSI6AAAgBCADQQFqIgM2AgAgCCgCACADa0EITQRAIAUgA0EJEA8gBCgCACEDCyAFKAIAIANqIgdB+oTAACkAADcAACAHQQhqQYKFwAAtAAA6AAAgBCADQQlqIgM2AgAgCCgCACADa0EBTQRAIAUgA0ECEA8gBCgCACEDCyAFKAIAIANqQaL0ADsAACAEIANBAmo2AgACQCAVQgFSBEAgAkGQAWogBRDMAQwBCyACQZABaiAFIBQQygELIAIoApABQQFGDQggDUHgAGotAAAgBCgCACIDIAgoAgBGBEAgBSADQQEQDyAEKAIAIQMLIAUoAgAgA2pBLDoAACAEIANBAWoiAzYCACAIKAIAIANGBEAgBSADQQEQDyAEKAIAIQMLIAUoAgAgA2pBIjoAACAEIANBAWoiAzYCACAIKAIAIANrQQdNBEAgBSADQQgQDyAEKAIAIQMLIAUoAgAgA2pC8srB45bv17fuADcAACAEIANBCGoiAzYCACAIKAIAIANrQQFNBEAgBSADQQIQDyAEKAIAIQMLIAUoAgAgA2pBovQAOwAAIAQgA0ECajYCAEEBaw4DAgMEAQsgAkHUAGogAkH8AGooAgA2AgAgAiACKQJ0NwJMDA8LIAJBkAFqIAVBm4XAAEEGEM0BDAMLIAJBkAFqIAVBloXAAEEFEM0BDAILIAJBkAFqIAVBj4XAAEEHEM0BDAELIAJBkAFqIAVBioXAAEEFEM0BCyACKAKQAUEBRgRAIAJB1ABqIAJBnAFqKAIANgIAIAIgAikClAE3AkwMCwsgAkHIAGogBUEAEMYBIAIoAkhBAUYNCiAGQegAaiEGQQEhAyAQIA1B6ABqRw0AC0EABSAFC0H/AXFBAEcQxQEgAigCOEEBRg0JIAJBkAFqIAJBMGogAUEQahAjIAIoApABQQFGBEAgAkEsaiACQZwBaigCADYCACACIAIpApQBNwIkDAsLIAIoAjAhAyACLQA0BEAgA0EIaigCACEEDAILIAMoAggiBSADQQRqKAIARgRAIAMgBUEBEA8gAygCCCEFCyADIAVBAWoiBDYCCCADKAIAIAVqQSw6AAAMAQsgAkHUAGogAkGcAWooAgA2AgAgAiACKQKUATcCTAwHCyACQQA6ADQgA0EEaiIGKAIAIARGBEAgAyAEQQEQDyADQQhqKAIAIQQLIAMoAgAgBGpBIjoAACADQQhqIgUgBEEBaiIENgIAIAYoAgAgBGtBBU0EQCADIARBBhAPIAUoAgAhBAsgAygCACAEaiIGQdGFwAAoAAA2AAAgBkEEakHVhcAALwAAOwAAIAUgBEEGaiIENgIAIANBBGooAgAgBGtBAU0EQCADIARBAhAPIANBCGooAgAhBAsgAygCACAEakGi9AA7AAAgA0EIaiAEQQJqNgIAIAEoAhwhBCACQZABaiADIAFBJGooAgAiBhDOASACKAKQAUEBRg0CIAJBmAFqLQAAIQgCQAJAAkAgAkHwAGogAigClAEiBSAGBH8gBCAGQRhsaiEJIAJBkAFqQQRyIQcgCEUhBiAFQQRqIQgDQCAGQQFxBEAgBSgCCCIGIAgoAgBGBEAgBSAGQQEQDyAFKAIIIQYLIAUgBkEBajYCCCAFKAIAIAZqQSw6AAALIAJBkAFqIAUQzwEgAigCkAFBAUYNAiACIAItAJgBOgBMIAIgAigClAE2AkggAkGQAWogAkHIAGpBrYXAAEEEIAQQEyACKAKQAUEBRg0GIAJBkAFqIAJByABqIARBDGoiBBAjIAIoApABQQFGBEAgAkGMAWogAkGcAWooAgA2AgAgAiACKQKUATcChAEMCQsgAkGAAWogAigCSCACLQBMEMYBIAIoAoABQQFGDQhBASEGIARBDGoiBCAJRw0AC0EABSAIC0H/AXFBAEcQxQEgAigCcEEBRg0HIANBCGoiBSgCACIEIANBBGoiBigCAEYEQCADIARBARAPIAUoAgAhBAsgAygCACAEakEsOgAAIAUgBEEBaiIENgIAIAJBADoANCAGKAIAIARGBEAgAyAEQQEQDyADQQhqKAIAIQQLIAMoAgAgBGpBIjoAACADQQhqIgUgBEEBaiIENgIAIAFBKGohASADQQRqIgYoAgAgBGtBA00EQCADIARBBBAPIAUoAgAhBAsgAygCACAEakHkwtGLBjYAACAFIARBBGoiBDYCACAGKAIAIARrQQFNBEAgAyAEQQIQDyADQQhqKAIAIQQLIAMoAgAgBGpBovQAOwAAIANBCGogBEECajYCACABKAIADQEgAkGQAWogAxDMAQwCCyACQYwBaiAHQQhqKAIANgIAIAIgBykCADcChAEMBQsgAkGAAWogARCeASACQZABaiADIAIoAoABIgEgAigCiAEQywEgAigChAFFIAFFcg0AIAEQ6wELIAIoApABQQFGBEAgAkEsaiACQZwBaigCADYCACACIAIpApQBNwIkDAkLIAJBIGogA0EAEMYBIAIoAiBBAUYNCCACKAIIIgMgAigCBEYEQCACIANBARAPIAIoAgghAwsgAigCACADakH9ADoAACACIANBAWo2AggLIAJBiAFqIAJBCGooAgAiATYCACACIAIpAwAiFDcDgAEgAEEMaiABNgIAIAAgFDcCBEEADAkLIAJBjAFqIAJBnAFqKAIANgIAIAIgAikClAE3AoQBDAELIAJB/ABqIAJBkAFqQQRyIgFBCGooAgA2AgAgAiABKQIANwJ0DAELIAJB/ABqIAJBjAFqKAIANgIAIAIgAikChAE3AnQLIAJBLGogAkH8AGooAgA2AgAgAiACKQJ0NwIkDAMLIAJBxABqIAJBkAFqQQRyIgFBCGooAgA2AgAgAiABKQIANwI8DAELIAJBxABqIAJB1ABqKAIANgIAIAIgAikCTDcCPAsgAkEsaiACQcQAaigCADYCACACIAIpAjw3AiQLIAJBHGogAkEsaigCADYCACACIAIpAiQ3AhQLIAJBiAFqIgEgAkEcaigCADYCACACIAIpAhQ3A4ABAkAgAigCBEUNACACKAIAIgNFDQAgAxDrAQsgAkGYAWogASgCADYCACACIAIpA4ABNwOQASAAQQhqQYSHwABB4QAgAkGQAWoQJEEBCzYCACACQaABaiQAC/0CAgJ/AX4jAEEgayIEJAAgASgCCCIDIAFBBGooAgBGBEAgASADQQEQDyABKAIIIQMLIAEgA0EBajYCCCABKAIAIANqQfsAOgAAIARBEGogAUGWhcAAQQUQywECQAJAIAQoAhBBAUcEQCABKAIIIgMgAUEEaigCAEYEQCABIANBARAPIAEoAgghAwsgASADQQFqNgIIIAEoAgAgA2pBOjoAACAEQRBqIAEgAigCACACQQhqKAIAEMsBIAQoAhBBAUYNASABKAIIIgMgAUEEaigCAEYEQCABIANBARAPIAEoAgghAwsgAEEANgIAIAEgA0EBajYCCCABKAIAIANqQf0AOgAADAILIARBCGogBEEcaigCACIBNgIAIAQgBCkCFCIFNwMAIABBDGogATYCACAAIAU3AgQgAEEBNgIADAELIARBCGogBEEcaigCACIBNgIAIAQgBCkCFCIFNwMAIABBDGogATYCACAAIAU3AgQgAEEBNgIACyAEQSBqJAALuQMCAn8BfiMAQTBrIgIkACABKAIIIgMgAUEEaigCAEYEQCABIANBARAPIAEoAgghAwsgASADQQFqNgIIIAEoAgAgA2pB+wA6AAAgAkEgaiABQYeBwABBBhDLAQJAAkACQAJAIAIoAiBBAUcEQCABKAIIIgMgAUEEaigCAEYEQCABIANBARAPIAEoAgghAwsgASADQQFqNgIIIAEoAgAgA2pBOjoAACACQSBqIAEQzwEgAigCIEEBRw0BIAJBHGogAkEgakEEciIBQQhqKAIANgIAIAIgASkCADcCFAwCCyACQRhqIAJBLGooAgAiATYCACACIAIpAiQiBDcDECAAQQxqIAE2AgAgACAENwIEIABBATYCAAwDCyACQRBqIAIoAiQgAkEoai0AABDGASACKAIQQQFHDQELIAJBCGogAkEcaigCACIBNgIAIAIgAikCFCIENwMAIABBDGogATYCACAAIAQ3AgQgAEEBNgIADAELIAEoAggiAyABQQRqKAIARgRAIAEgA0EBEA8gASgCCCEDCyAAQQA2AgAgASADQQFqNgIIIAEoAgAgA2pB/QA6AAALIAJBMGokAAuABwIFfwF+IwBB0ABrIgMkACABKAIAIQUCQCABLQAEBEAgBUEIaigCACEEDAELIAUoAggiBiAFQQRqKAIARgRAIAUgBkEBEA8gBSgCCCEGCyAFIAZBAWoiBDYCCCAFKAIAIAZqQSw6AAALIAFBADoABCAFQQRqIgYoAgAgBEYEQCAFIARBARAPIAVBCGooAgAhBAsgBSgCACAEakEiOgAAIAVBCGoiASAEQQFqIgQ2AgAgBigCACAEa0EJTQRAIAUgBEEKEA8gASgCACEECyAFKAIAIARqIgZBsYXAACkAADcAACAGQQhqQbmFwAAvAAA7AAAgASAEQQpqIgQ2AgAgBUEEaigCACAEa0EBTQRAIAUgBEECEA8gBUEIaigCACEECyAFKAIAIARqQaL0ADsAACAFQQhqIARBAmo2AgAgAigCACEEIANBQGsgBSACKAIIIgEQzgECQAJAAkAgAygCQEEBRwRAIANByABqLQAAIQYgAygCRCECAkACQCABBEAgBCABQRhsaiEHIANBQGtBBHIhBSAGQf8BcUUhASACQQRqIQYDQCABQQFxBEAgAigCCCIBIAYoAgBGBEAgAiABQQEQDyACKAIIIQELIAIgAUEBajYCCCACKAIAIAFqQSw6AAALIANBQGsgAhDPASADKAJAQQFGDQIgAyADLQBIOgA8IAMgAygCRDYCOCADQUBrIANBOGpB7IHAAEEDIAQQEyADKAJAQQFGDQMgA0FAayADQThqQcSFwABBBSAEQQxqIgQQEyADKAJAQQFGBEAgA0E0aiADQcwAaigCADYCACADIAMpAkQ3AiwMBgsgA0EoaiADKAI4IAMtADwQxgEgAygCKEEBRg0FQQEhASAEQQxqIgQgB0cNAAtBACEGC0EAIQQgA0EYaiACIAZB/wFxQQBHEMUBIAMoAhhBAUYNBAwFCyADQTRqIAVBCGooAgA2AgAgAyAFKQIANwIsDAILIANBNGogA0HMAGooAgA2AgAgAyADKQJENwIsDAELIANBJGogA0FAa0EEciIBQQhqKAIANgIAIAMgASkCADcCHAwBCyADQSRqIANBNGooAgA2AgAgAyADKQIsNwIcCyADQRBqIANBJGooAgAiATYCACADIAMpAhwiCDcDCCAAQQxqIAE2AgAgACAINwIEQQEhBAsgACAENgIAIANB0ABqJAALkAMBA38jAEFAaiIEJAACQAJAAkAgAkEATgRAIAINAUEBIQUMAgsQkwIACyACQQEQSyIFRQ0BCyAFIAEgAhDdAiEGIARCADcCBCAEQZSNwAAoAgA2AgAgBEEQaiIFIARB2IXAABDAAiMAQTBrIgEkAAJ/IAMoAgBFBEAgAUEcakEANgIAIAFBsNvAADYCGCABQgE3AgwgAUHw5MAANgIIIAUgAUEIahDDAgwBCyABIAM2AgQgAUEcakEBNgIAIAFCATcCDCABQcDbwAA2AgggAUHlADYCJCABIAFBIGo2AhggASABQSxqNgIgIAEgAUEEajYCLCAFIAFBCGoQwwILIAFBMGokAEUEQCAAQQxqIAI2AgAgAEEIaiACNgIAIAAgBjYCBCAAQRBqIAQpAwA3AgAgAEEJNgIAIABBGGogBEEIaigCADYCAAJAIAMoAgAiAEUNACADQQRqKAIARQ0AIAAQ6wELIARBQGskAA8LQfCFwABBNyAEQThqQbiMwABB9IbAABCvAgALIAJBARCSAgALnQ8CAn8BfiMAQeAAayICJAAgAkEIahDIASAAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAQQFrDgICAQALIAIoAhAiAyACKAIMRgRAIAJBCGogA0EBEA8gAigCECEDCyACKAIIIANqQfsAOgAAIAIgA0EBajYCECACQdAAaiACQQhqQY2BwABBBBDLASACKAJQQQFGDQMgAigCECIDIAIoAgxGBEAgAkEIaiADQQEQDyACKAIQIQMLIAIoAgggA2pBOjoAACACIANBAWo2AhACQAJAAkAgASgCBEEBRwRAIAJB0ABqIAJBCGpBrYHAAEEHENABIAIoAlBBAUYNASACIAIoAlQ2AkggAiACQdgAai0AADoATCACQdAAaiACQcgAakGmgcAAQQcgAUEIahATIAIoAlBBAUYNAiACQdAAaiACQcgAakH4gMAAQQUgAUEUahATIAIoAlBBAUYNAyACQThqIAIoAkggAi0ATBDH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CyACQSxqIAJBMGpBBHIiAUEIaigCADYCACACIAEpAgA3AiQMAwsgAkEsaiACQTxqKAIANgIAIAIgAikCNDcCJAwCCyACQSxqIAJBPGooAgA2AgAgAiACKQI0NwIkDAELIAJBCGogAkEYaigCACIBNgIAIAIgAikDECIENwMAIABBDGogATYCACAAIAQ3AgRBAAwBCyACQQhqIgEgAkEsaigCADYCACACIAIpAiQ3AwACQCACKAIURQ0AIAIoAhAiA0UNACADEOsBCyACQThqIAEoAgA2AgAgAiACKQMANwMwIABBCGpBtYrAAEEWIAJBMGoQJEEBCzYCACACQUBrJAALwBIBDX8jAEHQAWsiAyQAIANBOGogAhAlAkACQCAAAn8CQAJAAkACQAJAAkACQAJAIAMoAjhBAUcEQCADQUBrKAIAIQ8gA0E4aiABKAIAIAMoAjwiDSADQcQAaiIEKAIAIAEoAgQoAgwRBgAgAygCOEEBRg0BIAMoAjxBAUYNAyADQegAaiADQcgAaigCADYCACADIANBQGspAwA3A2AgA0EwaiADQeAAahCfASADQagBaiIBIAMoAjAgAygCNBC8ASADQShqIAEQwwEgAy0AKEEBcQ0CQQQhAQwICyADQYgBaiADQdgAaikDADcDACADQYABaiADQdAAaikDADcDACADQfgAaiADQcgAaikDADcDACADIANBQGspAwA3A3AgA0GkAWpBATYCACADQgE3ApQBIANBjIPAADYCkAEgA0EDNgKsASADIANBqAFqNgKgASADIANB8ABqIgE2AqgBIANBwAFqIANBkAFqEJQCIAEQKCADKALAASEBIABBEGogAykCxAE3AgAgAEEMaiABNgIAIABBCGpBAzYCACAAQQE2AgAMCgsgA0GIAWogA0HUAGooAgA2AgAgA0GAAWogA0HMAGopAgA3AwAgA0H4AGogBCkCADcDACADIAMpAjw3A3AgA0GkAWpBATYCACADQgE3ApQBIANByILAADYCkAEgA0EENgKsASADIANBqAFqNgKgASADIANB8ABqNgKoASADQcABaiADQZABahCUAiAAQQhqQQM2AgAgAEEMaiADKQPAATcCACAAQRRqIANByAFqKAIANgIAIABBATYCAAJAAkACQAJAIAMoAnAOBAECAwwACyADQfgAaigCAEUNCyAD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CyAAQRhqKAIARQ0BIABBFGooAgAiAEUNAQwCCyACDQAgARDrAQsPCyAAEOsBCw4AIAAoAgAgARA0GkEAC9QCAQN/IwBBEGsiAiQAAkAgAUH/AE0EQCAAKAIIIgMgAEEEaigCAEYEQCAAIANBARAPIAAoAgghAwsgACADQQFqNgIIIAAoAgAgA2ogAToAAAwBCyACQQA2AgwCfyABQYAQTwRAIAFBgIAESQRAIAIgAUE/cUGAAXI6AA4gAiABQQx2QeABcjoADCACIAFBBnZBP3FBgAFyOgANQQMMAgsgAiABQT9xQYABcjoADyACIAFBEnZB8AFyOgAMIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADUEEDAELIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADEECCyEBIAEgAEEEaigCACAAQQhqIgQoAgAiA2tLBEAgACADIAEQDyAEKAIAIQMLIAAoAgAgA2ogAkEMaiABEN0CGiAEIAEgA2o2AgALIAJBEGokAEEAC1oBAX8jAEEgayICJAAgAiAAKAIANgIEIAJBGGogAUEQaikCADcDACACQRBqIAFBCGopAgA3AwAgAiABKQIANwMIIAJBBGpB0IvAACACQQhqEKICIAJBIGokAAtPAQJ/IAIgACgCACIDQQRqKAIAIANBCGoiBCgCACIAa0sEQCADIAAgAhAPIAQoAgAhAAsgAygCACAAaiABIAIQ3QIaIAQgACACajYCAEEAC+QEAQF/IwBBsAFrIgIkACACQQhqIAFBDGopAgA3AwAgAkEQaiABQRRqKQIANwMAIAJBGGogAUEcaikCADcDACACQSBqIAFBJGopAgA3AwAgAkEoaiABQSxqKQIANwMAIAIgASkCBDcDAAJAAkAgASgCAEEBRwRAIABBADYCACAAIAFBBGoiASkCADcCBCAAQSxqIAFBKGopAgA3AgAgAEEkaiABQSBqKQIANwIAIABBHGogAUEYaikCADcCACAAQRRqIAFBEGopAgA3AgAgAEEMaiABQQhqKQIANwIADAELIAJByABqIAJBHGopAgA3AwAgAkFAayACQRRqKQIANwMAIAJBOGogAkEMaikCADcDACACIAIpAgQ3AzAgAkIANwJUIAJBlI3AACgCADYCUCACQeAAaiACQdAAakHYhcAAEMACAkAg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AEEGEOACDQggAEEBOgABDAoLIAFBlZTAAEEMEOACRQ0BIAFB/pPAAEEMEOACDQcgAEEFOgABDAkLIAEpAABC4+DV+8Xt27fwAFINBiAAQQI6AAEMCAsgAEEDOgABDAcLIAFBipTAAEELEOACDQQgAEEEOgABDAYLIAFB5JPAAEEVEOACDQMgAEEGOgABDAULIAFB35PAAEEFEOACDQIgAEEHOgABDAQLIAFB/47AAEEHEOACRQ0CDAELIAFBx5PAAEEYEOACDQAgAEEIOgABDAILIABBBGogASACQcCUwABBCRA8IABBAToAAA8LIABBADoAASAAQQA6AAAPCyAAQQA6AAALqgIBBH8jAEEgayICJAAgAiABEMMBAkACQAJAIAItAABBAXEEQCACLQABQSJHDQEgARC9ASACQQhqIAEQwgEgAkEYaigCACEEIAJBFGooAgAhAyACQRBqKAIAIQEgAigCDCEFIAIoAghBAUYNAiAFRQRAAkAgA0ELRgRAIAFBn5PAAEELEOACRQ0BCyAAIAEgA0Gsk8AAQQEQPAwFCyAAQRU2AgAMBAsCQAJAIARBC0YEQCABQZ+TwABBCxDgAkUNAQsgACABIARBrJPAAEEBEDwMAQsgAEEVNgIACyADRSABRXINAyABEOsBDAMLIABBBDYCAAwCCyAAQQ42AgAMAQsgACABNgIEIAAgBTYCACAAQQxqIAQ2AgAgAEEIaiADNgIACyACQSBqJAAL2SUCGX8EfiMAQcADayIDJAAQ8AEgA0HoAGogABCzASADQfgAaiABELMBIANBiAFqIAIQswEgA0G4AmogAygCaCIPIAMoAnAQFQJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKQO4AkIBUgRAIANBsAFqIANByAJqIgApAwA3AwAgA0GgAWogA0HgAmopAwA3AwAgAyADKQPAAjcDqAEgAyADQdgCaiICKQMANwOYASADQdACaiIBKAIAIQ0gA0HUAmooAgAhEyADQegCaigCACELIANB7AJqKAIAIRQgA0HwAmopAwAhHCADQbgCaiADKAJ4IhUgAygCgAEQHSADKAK4AkEBRg0CIAEoAgAhDiADQcwCaigCACEQIAAoAgAhESADQcQCaigCACEZIAMoAsACIRYgAygCvAIhEiADQdABaiIAIAMoAogBIhcgAygCkAEQvAEgA0EoaiAAEMMBIAMtAChBAXENAUEEIQIMCAsgA0HoAWogA0HYAmopAwA3AwAgA0HgAWogA0HQAmopAwA3AwAgA0HYAWogA0HIAmopAwA3AwAgAyADKQPAAjcD0AEgA0IANwK8ASADQZSNwAAoAgA2ArgBIANBgAJqIgAgA0G4AWpB2IXAABDAAiADQdABaiAAELEBDQsgA0E8aiADQcABaigCADYCACADIAMpA7gBNwI0IANBATYCMCADQdABahAoDAkLIAMtAClB+wBHBEBBDiECDAcLIANB0AFqIgAQvQEgA0EgaiAAELsBIAMtACQhASADQRhqIAMoAiAiABDDASADLQAYQQFxRQRAQQIhAgwECyADQTBqQQRyIQogA0GAAmpBBHIhGCADQYgCaiEMIAMtABkhAiABQQFxIQEDQAJAAkACQAJAAkACQAJAAkACQAJAIAJB/wFxIgRBLEcEQCAEQf0ARg0CIAFB/wFxDQFBCSECDA8LIAFB/wFxBEBBECECDA8LIAAQvQEgA0EQaiAAEMMBIAMtABBBAXFFDQ0gAy0AESECCyACQf8BcSIBQSJHBEBBE0EQIAFB/QBGGyECDA4LIANBCGogABDDASADLQAIQQFxRQ0MIAMtAAlBIkcEQEEOIQIMDgsgABC9ASADQYACaiAAEMIBIAMoApACIQYgAygCjAIhBCADKAKIAiEBIAMoAoQCIQIgAygCgAJBAUYNDSACRQRAIARBCGsOBAIICAQIC0ECIQICQAJAAkAgBkEIaw4EAAICAQILQQBBfiABKQAAQvbKycvmrNqy8gBRGyECDAELQX5BASABQZSTwABBCxDgAhshAgsgBEUgAUVyRQRAIAEQ6wELIAJBHnRBHnVBAEgNByACQQNxQQFrDQIMBAsgBQRAIAcNBiADQYACakEEckGUk8AAQQsQFiADQZACaigCACEGIANBjAJqKAIAIQQgA0GIAmooAgAhASADKAKEAiECIAhFDRAgBRDrAQwQCyADQYACakEEckGMk8AAQQgQFiADQZACaigCACEGIANBjAJqKAIAIQQgA0GIAmooAgAhASADKAKEAiECDAoLIAEpAABC9srJy+as2rLyAFINBQsgBUUNAiADQYACakGMk8AAQQgQFyADQYwCaigCACEGIANBiAJqKAIAIQQgAygChAIhASADKAKAAiECDAoLIAFBlJPAAEELEOACDQMLIAcEQCADQYACakGUk8AAQQsQFyADQYwCaigCACEGIANBiAJqKAIAIQQgAygChAIhASADKAKAAiECIAkNCgwLCyADQTBqIAAQwQECQCADKAIwIgJBFUcEQCAMIAopAgA3AgAgDEEIaiAKQQhqKAIANgIADAELIANBgAJqIAAQGSADKAKAAkEBRwRAIAMoAowCIRogAygCiAIhCSADKAKEAiEHDAULIAMoAoQCIQILIANBkAJqKAIAIQYgAygCjAIhBCADKAKIAiEBDAoLIANBMGogABDBAQJAIAMoAjAiAkEVRwRAIAwgCikCADcCACAMQQhqIApBCGooAgA2AgAMAQsgA0GAAmogABAZIAMoAoACQQFHBEAgAygCjAIhGyADKAKIAiEIIAMoAoQCIQUMBAsgAygChAIhAgsgA0GQAmooAgAhBiADKAKMAiEEIAMoAogCIQEMBQsgA0GAAmogA0HQAWoQwAEgAygCgAIiAkEVRwRAIANBjAJqKAIAIQYgA0GIAmooAgAhBCADKAKEAiEBIAgEQCAFEOsBCyAJRQ0KIAcQ6wEMCgsgA0GAAmogA0HQAWoQvgEgAygCgAIiAkEVRwRAIANBjAJqKAIAIQYgA0GIAmooAgAhBCADKAKEAiEBIAgEQCAFEOsBCyAJRQ0KIAcQ6wEMCgsgA0HIAmogBzYCACADQcQCaiIBIBs2AgAgA0HQAmoiAiAaNgIAIANBzAJqIgAgCTYCACADQcABaiIEIAEpAgA3AwAgA0HIAWoiASAAKQIANwMAIAMgCDYCwAIgAyAFNgK8AiADIAMpArwCNwO4ASADQYQDakHkgMAANgIAIANB/AJqQbSAwAA2AgAgA0H0AmpBnIDAADYCACADQcACaiADQbABaikDADcDACAAIBM2AgAgAiADKQOYATcDACADQdgCaiADQaABaikDADcDACADQZwDaiAONgIAIANBmANqIBA2AgAgA0GUA2ogETYCACADQZADaiAZNgIAIANBjANqIBY2AgAgA0HoAmogHDcDACADQeQCaiAUNgIAIANBgANqIANBuANqIgA2AgAgA0H4AmogADYCACADIAMpA6gBNwO4AiADIA02AsgCIAMgEjYCiAMgAyALNgLgAiADIAA2AvACIANBsANqIAEpAwA3AwAgA0Go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AwAgA0HgAWogASkDADcDACADQdgBaiAAKQMANwMAIAMgAykDwAI3A9ABIANCADcCvAEgA0GUjcAAKAIANgK4ASADQYACaiIAIANBuAFqQdiFwAAQwAIgA0HQAWogABCxAUUEQCADQTxqIANBwAFqKAIANgIAIAMgAykDuAE3AjQgA0EBNgIwIANB0AFqECgMBwsMCQtBACEFDAELQQQhAgsgB0UgCUVyDQELIAcQ6wELIAVFIAhFcg0AIAUQ6wELIANBjAJqIAY2AgAgA0GIAmogBDYCACADIAE2AoQCIAMgAjYCgAIgA0HAAmpBkYvAAEEdIANBgAJqIgAQHCADQegBaiADQdgCaikDADcDACADQeABaiADQdACaikDADcDACADQdgBaiADQcgCaikDADcDACADIAMpA8ACNwPQASADQgA3AvQBIANBlI3AACgCADYC8AEgACADQfABakHYhcAAEMACIANB0AFqIAAQsQENAyADQTxqIANB+AFqKAIANgIAIAMgAykD8AE3AjQgA0EBNgIwIANB0AFqECggFkUgEkVyRQRAIBIQ6wELIA4EQCAOQQV0IQEgEUEUaiECA0ACQCACKAIARQ0AIAJBBGsoAgAiAEUNACAAEOsBCyACQSBqIQIgAUEgayIBDQALCyAQRSAQQQV0RXINACAREOsBCyATRSANRXJFBEAgDRDrAQsgFEUgC0VyDQAgCxDrAQsCQCADKAKMAUUNACADKAKIASIARQ0AIAAQ6wELAkAgAygCfEUNACADKAJ4IgBFDQAgABDrAQsgAygCbEUgD0VyDQAgDxDrAQsgA0G4AmogA0EwahAgIAMoArgCQQFHBEAgA0GIAmogA0HEAmooAgAiADYCACADIAMpArwCIhw3A4ACIANBwAJqIAA2AgAgAyAcNwO4AiADQbgCahCyAQJAIAMoAjBFBEAgA0EwakEEchAxDAELIANBOGooAgBFDQAgAygCNCIBRQ0AIAEQ6wELIANBwANqJAAPCyADQZgCaiADQdgCaikDADcDACADQZACaiADQdACaikDADcDACADQYgCaiADQcgCaikDADcDACADIANBwAJqKQMANwOAAkHIjMAAQSsgA0GAAmpB9IzAAEHYg8AAEK8CAAtB8IXAAEE3IANBuANqQbiMwABB9IbAABCvAgAL+RwCFH8EfiMAQZADayICJAAQ8AEgAkHwAGogABCzASACQYABaiABELMBIAJBqAJqIAIoAnAiDSACKAJ4EBUCQAJAAkACQAJAAkACQAJAAkAgAikDqAJCAVIEQCACQagBaiACQbgCaiISKQMANwMAIAJBmAFqIAJB0AJqKQMANwMAIAIgAikDsAI3A6ABIAIgAkHIAmoiEykDADcDkAEgAkHAAmoiFCgCACEKIAJBxAJqKAIAIQ8gAkHYAmooAgAhDiACQdwCaigCACEQIAJB4AJqKQMAIRYgAkGYAmoiASACKAKAASIAIAIoAogBELwBIAJBMGogARDDASACLQAwQQFxRQRAQQQhAQwHCyACLQAxQfsARwRAQQ4hAQwHCyACQZgCaiIBEL0BIAJBKGogARC7ASACLQAsIQUgAkEgaiACKAIoIgQQwwFBAiEBIAItACBBAXFFDQIgAkHgAWpBBHIhCyACQegBaiERIAJBwAFqQQRyIQwgAi0AISEGIAVBAXEhBQNAAkACQAJAAkACQAJAAkAgBkH/AXEiB0EsRwRAIAdB/QBGDQIgBUH/AXENAUEJIQEMCwsgBUH/AXEEQEEQIQEMCwsgBBC9ASACQRhqIAQQwwEgAi0AGEEBcUUNCSACLQAZIQYLIAZB/wFxIgZBIkcEQEEQIQEgBkH9AEcNCkETIQEMCgsgAkEQaiAEEMMBIAItABBBAXFFDQggAi0AEUEiRwRAQQ4hAQwKCyAEEL0BIAJB4AFqIAQQwgEgAigC8AEhByACKALsASEGIAIoAugBIQUgAigC5AEhAyACKALgAUEBRgRAIAMhAQwKCwJAIANFBEAgBkEIRw0DIAUpAABC9srJy+as2rLyAFIhAwwBC0EBIQMgB0EIRgRAIAUpAABC9srJy+as2rLyAFIhAwsgBkUgBUVyDQAgBRDrAQsgAw0BIAlFDQIgAkE4akEEckGMk8AAQQgQFyAIRQ0MDAsLIAkNAiACQeABakEEckGMk8AAQQgQFiACQcQAaiACQewBaikCADcCACACIAIpAuQBNwI8DAsLIAJB4AFqIAQQwQECQCACKALgASIDQRVHBEAgDCALKQIANwIAIAxBCGogC0EIaigCADYCACACIAM2AsABDAELIAJBwAFqIAQQGCACKALAAUEVRg0ECyACQcQAaiACQcgBaikDADcCACACIAIpA8ABNwI8DAgLIAJBwAFqIAQQwQECQCACKALAASIDQRVHBEAgESAMKQIANwIAIBFBCGogDEEIaigCADYCACACIAM2AuQBDAELIAJB4AFqIAQQGSACKALgAUEBRw0CCyACQcQAaiALQQhqKQIANwIAIAIgCykCADcCPAwJCyACQeABaiACQZgCahDAASACKALgASIBQRVHBEAgAkHsAWooAgAhBiACQegBaigCACEFIAIoAuQBIQcgCEUNCiAJEOsBDAoLIAJB4AFqIAJBmAJqEL4BIAIoAuABIgFBFUcEQCACQewBaigCACEGIAJB6AFqKAIAIQUgAigC5AEhByAIRQ0KIAkQ6wEMCgsgAkG4AWoiAyAVNgIAIAIgCDYCsAIgAiAJNgKsAiACIAIpAqwCNwOwASACQfQCakHkgMAANgIAIAJB7AJqQbSAwAA2AgAgAkHkAmpBnIDAADYCACACQbACaiACQagBaikDADcDACACQbwCaiAPNgIAIAJBwAJqIAIpA5ABNwMAIAJByAJqIAJBmAFqKQMANwMAIAJB2AJqIBY3AwAgAkHUAmogEDYCACACQfACaiACQYgDaiIBNgIAIAJB6AJqIAE2AgAgAiACKQOgATcDqAIgAiAKNgK4AiACIA42AtACIAIgATYC4AIgAkGAA2ogAygCADYCACACIAIpA7ABNwP4AiACQeABaiEDIAJBqAJqIQUgAkH4AmohBiMAQYABayIBJAAgAUHYAGogAkHgAmoiBCgCACILQfOOwABBBiAEKAIEIgwoAgwRBgACQAJAAkACQAJAIAEoAlgiB0UEQEEFQQEQSyIERQ0BIARBBGpBmI/AAC0AADoAACAEQZSPwAAoAAA2AAAgA0EQakKFgICA0AA3AwAgA0EMaiAENgIAIANBCGpBBzYCACADQQE2AgAMBAsgASgCXCEJIAFB2ABqIAcgAUHgAGoiCCgCABAfAkACQCABKAJYQQFHBEAgAUHQAGogAUH8AGooAgAiCDYCACABQRBqIAFB5ABqIgopAgA3AwAgAUEYaiABQewAaikCADcDACABQSBqIAFB9ABqKQIANwMAIAFBKGogCDYCACABIAEpAlw3AwggAUHYAGogBCgCCCAGKAIAIgggBkEIaigCACAEQQxqKAIAKAIMEQYAIAEoAlhBAUYNASABQThqIgQgCigCADYCACABIAEpAlw3AzACQCABKAIMRQ0AIAEoAggiCkUNACAKEOsBCyABQRBqIAQoAgA2AgAgASABKQMwNwMIIAFB2ABqIAFBCGoQJiABKAJYQQFGDQIgAUHgAGooAgAgC0HzjsAAQQYgASgCXCIEIAFB5ABqKAIAIAwoAhARBwBFIARFckUEQCAEEOsBCyADQQA2AgAgA0EoakEANgIAIANBIGpCADcCACADQRxqQYSNwAAoAgAiBDYCACADQRRqQgA3AgAgA0EQaiAENgIAIANBCGpCADcCACADQYyNwAAoAgA2AgQCQCABKAIMRQ0AIAEoAggiBEUNACAEEOsBCwJAIAFBGGooAgBFDQAgASgCFCIERQ0AIAQQ6wELAkAgAUEkaigCAEUNACABKAIgIgRFDQAgBBDrAQsgCQRAIAcQ6wELIAZBBGooAgBFIAhFckUEQCAIEOsBCwJAIAVBFGooAgBFDQAgBUEQaigCACIGRQ0AIAYQ6wELIAVBLGooAgBFDQcgBUEoaigCACIFRQ0HIAUQ6wEMBwsgAUHMAGogAUH4AGopAwAiFjcCACABQcQAaiABQfAAaikDACIXNwIAIAFBPGogAUHoAGopAwAiGDcCACABIAgpAwAiGTcCNCADQSBqIBY3AgAgA0EYaiAXNwIAIANBEGogGDcCACADQQhqIBk3AgAgA0EBNgIADAQLIAFBzABqIAFB+ABqKQMAIhY3AgAgAUHEAGogAUHwAGopAwAiFzcCACABQTxqIAFB6ABqKQMAIhg3AgAgASABQeAAaikDACIZNwI0IANBIGogFjcCACADQRhqIBc3AgAgA0EQaiAYNwIAIANBCGogGTcCAAwCCyABQThqIAFB8ABqKQMAIhY3AwAgAUFAayABQfgAaikDACIXNwMAIAEgAUHoAGopAwAiGDcDMCABQeAAaikDACEZIANBIGogFzcCACADQRhqIBY3AgAgA0EQaiAYNwIAIANBCGogGTcDAAwBC0EFQQEQkgIACyADQQE2AgACQCABKAIMRQ0AIAEoAggiBEUNACAEEOsBCwJAIAFBGGooAgBFDQAgASgCFCIERQ0AIAQQ6wELIAFBJGooAgBFDQAgASgCICIERQ0AIAQQ6wELIAlFDQAgBxDrAQsCQCAGQQRqKAIARQ0AIAYoAgAiBkUNACAGEOsBCwJAIAVBFGooAgBFDQAgBUEQaigCACIGRQ0AIAYQ6wELIAVBLGooAgBFDQAgBUEoaigCACIFRQ0AIAUQ6wELIAFBgAFqJAAgAkE4aiADEDcgAigChAFFIABFckUEQCAAEOsBCyACKAJ0RSANRXINCyANEOsBDAsLIAIoAuwBIRUgAigC6AEhCCACKALkASEJCyACQQhqIAQQwwFBACEFIAItAAkhBiACLQAIQQFxDQALDAILIAJB2AFqIAJByAJqKQMANwMAIAJB0AFqIAJBwAJqKQMANwMAIAJByAFqIAJBuAJqKQMANwMAIAIgAikDsAI3A8ABIAJCADcCnAIgAkGUjcAAKAIANgKYAiACQeABaiIAIAJBmAJqQdiFwAAQwAIgAkHAAWogABCxAUUEQCACQcQAaiACQaACaigCADYCACACIAIpA5gCNwI8IAJBATYCOCACQcABahAoIAIoAoABIQAMBwsMCAtBBCEBCyACQcgAaiAHNgIAIAJBxABqIAY2AgAgAkFAayAFNgIAIAIgATYCPAsgCUUgCEVyDQELIAkQ6wELIAJByABqKAIAIQYgAkHEAGooAgAhBSACQUBrKAIAIQcgAigCPCEBCyACQewBaiAGNgIAIAJB6AFqIAU2AgAgAiAHNgLkASACIAE2AuABIAJBsAJqQZyKwABBGSACQeABaiIBEBwgAkHYAWogEykDADcDACACQdABaiAUKQMANwMAIAJByAFqIBIpAwA3AwAgAiACKQOwAjcDwAEgAkIANwKcAiACQZSNwAAoAgA2ApgCIAEgAkGYAmpB2IXAABDAAiACQcABaiABELEBDQIgAkHEAGogAkGgAmooAgA2AgAgAiACKQOYAjcCPCACQQE2AjggAkHAAWoQKCAPRSAKRXJFBEAgChDrAQsgEEUgDkVyDQAgDhDrAQsgAigChAFFIABFckUEQCAAEOsBCyACKAJ0RSANRXINACANEOsBCyACQagCaiACQThqECAgAigCqAJBAUcEQCACQegBaiACQbQCaigCACIANgIAIAIgAikCrAIiFjcD4AEgAkGwAmogADYCACACIBY3A6gCIAJBqAJqELIBAkAgAigCOEUEQCACQThqQQRyEDEMAQsgAkFAaygCAEUNACACKAI8IgFFDQAgARDrAQsgAkGQA2okAA8LIAJB+AFqIAJByAJqKQMANwMAIAJB8AFqIAJBwAJq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AWopAwA3A6ACQciMwABBKyACQaACakH0jMAAQeiDwAAQrwIAC0HwhcAAQTcgAkHIAmpBuIzAAEH0hsAAEK8CAAvqwQECHX8EfiMAQZAHayIDJAAQ8AEgA0G4BGogABCzASADQcgEaiABELMBIANB2ARqIAIQswEgA0GYBmogAygCuAQiGiADKALABBAVAkACQAJAAkAgA0HEBWoCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKQOYBkIBUgRAIANBgAVqIANBqAZqIgApAwA3AwAgA0HwBGogA0HABmopAwA3AwAgAyADKQOgBjcD+AQgAyADQbgGaiICKQMANwPoBCADQbAGaiIBKAIAIQkgA0G0BmooAgAhFSADQcgGaigCACEMIANBzAZqKAIAIREgA0HQBmopAwAhICADQZgGaiADKALIBCIdIAMoAtAEEB0gAygCmAZBAUYNAiABKAIAIQ4gA0GsBmooAgAhDyAAKAIAIRAgA0GkBmooAgAhFCADKAKgBiESIAMoApwGIRMgA0HwBWoiACADKALYBCIeIAMoAuAEELwBIANB+ANqIAAQwwFBACECIAMtAPgDQQFxDQFBBCEADBULIANBsAVqIANBuAZqKQMANwMAIANBqAVqIANBsAZqKQMANwMAIANBoAVqIANBqAZqKQMANwMAIAMgAykDoAY3A5gFIANCADcChAYgA0GUjcAAKAIANgKABiADQbgFaiIAIANBgAZqQdiFwAAQwAIgA0GYBWogABCxAQ0ZIANBjARqIANBiAZqKAIANgIAIAMgAykDgAY3AoQEIANBATYCgAQgA0GYBWoQKAwXCyADLQD5AyIAQfsARwRAIABBIkcEQEEKIQAMFQsgA0G4BWogA0HwBWoQQyADLQC4BUEBRg0CQQ4hAAwUCyADQfAFaiIEEL0BIANBuAVqIAQQQwJAAn8gAy0AuAVBAUcEQCADLQC5BSEBIANBuAVqIAQQwQEgAygCuAUiAEEVRwRAIANBwAVqKQMAISAgAygCvAUMAgsgAUEBaw4IDAsKCQgHBgUCCyADKAK8BSIAQQh2IQIgA0HEBWopAgAhICADQcAFaigCAAshASADICA3AoQGIAMgATYCgAYMFAsgA0EwaiAEEMMBIAMtADBBAXFFDREgAy0AMUH7AEcNECAEEL0BIANBKGogBBC7ASADLQAsIQggA0EgaiADKAIoIgEQwwEgAy0AIEEBcUUNDyADQYAEakEEciEHIANBuAVqQQRyIQsgAy0AISEAIAhBAXEhCANAAkACQAJAIABB/wFxIgZBLEcEQCAGQf0ARg0CIAhB/wFxDQFBCSEADBcLIAhB/wFxBEBBECEADBcLIAEQvQEgA0EYaiABEMMBIAMtABhBAXFFDRUgAy0AGSEACyAAQf8BcSINQSJHBEBBECEAIA1B/QBHDRZBEyEADBYLIANBCGogARDDASADLQAIQQFxRQ0UIAMtAAlBIkcNEyABEL0BIANBuAVqIAEQwgEgAygCxAUhCCADKALABSEGIAMoArwFIQAgAygCuAVBAUcEQCAGRSAARSAIRXJyDQIgBhDrAQwCCyAAQRVGDQEgAygCyAUhAgwVCyADQbgFaiAEEMABIAMoArgFIgBBFUcEQCADQcQFaigCACECIANBwAVqKAIAIQggAygCvAUhBgwVCyADQRBqIAQQwwEgAy0AEEEBcUUEQEEEIQAMFgtBCyEAIAMtABFB/QBHDRUgBBC9AUEAIQAMDAsgA0G4BWogARDBASADKAK4BSIAQRVHBEAgByALKQIANwIAIAdBCGogC0EIaigCADYCAAwQCyADQYAEaiABEBggAygCgAQiAEEVRw0PIAMgARDDAUEAIQggAy0AASEAIAMtAABBAXENAAsMDwsgA0GwBWogAikDADcDACADQagFaiABKQMANwMAIANBoAVqIAApAwA3AwAgAyADKQOgBjcDmAUgA0IANwKEBiADQZSNwAAoAgA2AoAGIANBuAVqIgAgA0GABmpB2IXAABDAAiADQZgFaiAAELEBRQRAIANBjARqIANBiAZqKAIANgIAIAMgAykDgAY3AoQEIANBATYCgAQgA0GYBWoQKAwVCwwXCyADIANBxAVqKQIANwKEBiADIANBwAVqKAIANgKABiADLwC9BSADLQC/BUEQdHIhAiADLQC8BSEADBELIANB8ANqIAQQwwECQAJAIAMtAPADQQFxRQ0AAkAgAy0A8QNB+wBHDQAgBBC9ASADQegDaiAEELsBIAMtAOwDIQggA0HgA2ogAygC6AMiARDDAQJAIAMtAOADQQFxRQ0AIANBgARqQQRyIQcgA0G4BWpBBHIhCyADLQDhAyEA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IAMoArgFQQFGDQIgAygCvAUhCkEBIQUMBQsgBQ0DIANBuAVqQQRyQfmTwABBBRAWIANBjARqIANBxAVqKQIANwIAIAMgAykCvAU3AoQEDAgLIANBuAVqIAsQwQECQCADKAK4BSIAQRVHBEAgDSAWKQIANwIAIA1BCGogFkEIaigCADYCACADIAA2ApgFDAELIANBmAVqIAsQGCADKAKYBUEVRg0ECyADQYwEaiADQaAFaikDADcCACADIAMpA5gFNwKEBAwHCyADQYwEaiADQcQFaikCADcCACADIAMpArwFNwKEBAwGCyADQYAEakEEckH5k8AAQQUQFwwFCyADQbgFaiAEEMABIAMoArgFIgBBFUcEQCADQcQFaigCACECIAMpArwFISAMBgsgA0HgAmogBBDDAUEAIQIgAy0A4AJBAXFFBEBBBCEADBULQQshACADLQDhAkH9AEcNFCAEEL0BIAMgCjYCgAZBBiEADAsLIANB0AJqIAsQwwFBACEBIAMtANECIQAgAy0A0AJBAXENAAsMAQtBBCECCyADQZAEaiAINgIAIANBjARqIAA2AgAgA0GIBGogATYCACADIAI2AoQECyADQYgEaikDACEgIANBkARqKAIAIQIgAygChAQhAAsgAyACNgKIBiADICA3A4AGIABBCHYhAgwOCyADQcgCaiAEEMMBAkAgAy0AyAJBAXFFBEBBBCEADAELAkAgAy0AyQJB+wBHDQAgBBC9ASADQcACaiAEELsBIAMtAMQCIQggA0G4AmogAygCwAIiARDDAQJAIAMtALgCQQFxRQ0AIANBgARqQQRyIQcgA0G4BWpBBHIhCyADLQC5AiEAIAhBAXEhCAJAA0ACQAJAAkAgAEH/AXEiBkEsRwRAIAZB/QBGDQIgCEH/AXENAUEJIQAMCAsgCEH/AXEEQEEQIQAMCAsgARC9ASADQbACaiABEMMBIAMtALACQQFxRQ0EIAMtALECIQALIABB/wFxIg1BIkcEQEEQIQAgDUH9AEcNB0ETIQAMBwsgA0GgAmogARDDASADLQCgAkEBcUUNAyADLQChAkEiRw0FIAEQvQEgA0G4BWogARDCASADKALEBSEIIAMoAsAFIQYgAygCvAUhACADKAK4BUEBRwRAIAZFIABFIAhFcnINAiAGEOsBDAILIABBFUYNASADKALIBSEC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AkH/AXEiGEEiRwRAQRAhACAYQf0ARw0TQRMhAAwTCyADQUBrIAEQwwEgAy0AQEEBcUUNECADLQBBQSJHBEBBDiEADBMLIAEQvQEgA0G4BWogARDCASADKALIBSEGIAMoAsQFIQggAygCwAUhAiADKAK8BSEAIAMoArgFQQFGDRIgAEUEQCAIQQhrDgICBA0LQQIhAAJAAkACQCAGQQhrDgIAAQILQQBBfiACKQAAQu3Ktfu17Nu59ABRGyEADAELQX5BASACQbeUwABBCRDgAhshAAsgCEUgAkVyRQRAIAIQ6wELIABBHnRBHnVBAEgNDCAAQQNxQQFrDQIMBAsgBUUNByAKQQFGDQYgA0G4BWpBBHJBt5TAAEEJEBYgA0HIBWooAgAhBiADQcQFaigCACEIIANBwAVqKAIADAgLIAIpAABC7cq1+7Xs27n0AFINCgsgBQ0CIANBuAVqIANBmAVqEBsgAygCvAUhCyADKAK4BUEBRg0DQQEhBQwKCyACQbeUwABBCRDgAg0ICwJAIApBAUcEQCADQbgFaiADQZgFahAbIAMoArwFIQ0gAygCuAVBAUYNAUEBIQoMCgsgA0G4BWpBt5TAAEEJEBcMBwsgA0HIBWooAgAhBiADQcQFaigCACEIIANBwAVqKAIAIQIgDSEADA0LIANBuAVqQa+UwABBCBAXDAULIANByAVqKAIAIQYgA0HEBWooAgAhCCADQcAFaigCACECIAshAAwLCyADQbgFaiAEEMABIAMoArgFIgBBFUcEQCADQcQFaigCACEGIANBwAVqKAIAIQggAygCvAUhAgwLCyADQcgAaiAEEMMBQQAhAiADLQBIQQFxDQJBBCEADBALIANBuAVqQQRyQa+UwABBCBAWIANByAVqKAIAIQYgA0HEBWooAgAhCCADQcAFaigCAAshAiADKAK8BSEADAgLQQshACADLQBJQf0ARw0NIAQQvQEgAyANNgKEBiADIAs2AoAGQQEhAAwECyADQcQFaigCACEGIANBwAVqKAIAIQggAygCvAUhAiADKAK4BSEADAYLIANBuAVqIAEQwQECQCADKAK4BSIAQRVHBEAgFiAXKQIANwIAIBZBCGogF0EIaigCADYCAAwBCyADQYAEaiABEBggAygCgAQiAEEVRg0BCyADQYwEaigCACEGIANBiARqKAIAIQggAygChAQhAgwFCyADQThqIAEQwwFBACEAIAMtADkhAiADLQA4QQFxDQALDAILIAM1AoQGISEgAzUCgAYhIiADQbgFaiADQfAFahC+ASADKAK4BSICQRVHBEAgAykCvAUhICADQcQFaigCAAwKCyADICFCIIYgIoQ3A6AGIANBkAVqIgEgA0GkBmooAgA2AgAgAyAANgKcBiADIAMpApwGNwOIBSADQeQGakHkgMAANgIAIANB3AZqQbSAwAA2AgAgA0HUBmpBnIDAADYCACADQaAGaiADQYAFaikDADcDACADQawGaiAVNgIAIANBsAZqIAMpA+gENwMAIANBuAZqIANB8ARqKQMANwMAIANB/AZqIA42AgAgA0H4BmogDzYCACADQfQGaiAQNgIAIANB8AZqIBQ2AgAgA0HsBmogEjYCACADQcgGaiAgNwMAIANBxAZqIBE2AgAgA0HgBmogA0HwBWoiADYCACADQdgGaiAANgIAIAMgAykD+AQ3A5gGIAMgCTYCqAYgAyATNgLoBiADIAw2AsAGIAMgADYC0AYgA0GIB2ogASgCADYCACADIAMpA4gFNwOAByADQbgFaiEKIANB0AZqIQAgA0GYBmohECADQegGaiETIwBBwAJrIgQkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADQYAHaiIBKAIAQQFrDggBAgMEBQYHCAALIARBGGogAEEQaikCADcDACAEQRBqIABBCGopAgA3AwAgBCAAKQIAIiA3AwggEEEUaigCACEJIBBBLGooAgAhFSAQQTBqKQMAISEgE0EQaigCACECIBNBFGooAgAhBiAQKAIQIQcgECgCKCEFIBMoAgAhASATKAIEIQ4gEygCCCEAIBMoAgwhDSAEQdABaiAgp0HzjsAAQQYgBCgCDCgCDBEGACAEKALQASIPRQRAQQVBARBLIgBFDRkgAEEEakGYj8AALQAAOgAAIABBlI/AACgAADYAACAKQRBqQoWAgIDQADcDACAKQQxqIAA2AgAgCkEIakEHNgIAIApBATYCACAORSABRXJFBEAgARDrAQsgBgRAIAZBBXQhDyANQRRqIQADQAJAIAAoAgBFDQAgAEEEaygCACIBRQ0AIAEQ6wELIABB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QQFqNgIAIAJBAEgNCSABQQRqEG0hAUEkQQQQSyIGRQ0IIAYgCDYCICAGIAA2AhxBACEOIAZBADYCGCAGIBE2AhQgBkEANgIQIAYgCzYCDCAGIAk2AgggBiABNgIEIAYgBzYCACAFQbgBaikDACEgIAUoArQBIQACfyAFQcABaigCAARAIAVBxAFqKAIADAELAn9BsLPBACgCAEUEQEGws8EAQYEgNgIAQYAgDAELQQALCxogAARAIAUgIDcCLCAFIAA2AiggBUGYAWoiByAFQShqIgMQnAFBACEBQQAhCyMAQSBrIg0kACAHKAIAIQICQCAHQQhqKAIAIgBBCE8EQCANQQhqQQAgAiAAELECIA0oAgwhACANKAIIIQsMAQsgAEUEQEEAIQAMAQsCQCACLQAARQ0AQQEhASAAQQFGDQEgAi0AAUUNAEECIQEgAEECRg0BIAItAAJFDQBBAyEBIABBA0YNASACLQADRQ0AQQQhASAAQQRGDQEgAi0ABEUNAEEFIQEgAEEFRg0BIAItAAVFDQBBBiEBIABBBkYNASACLQAGDQELQQEhCyABIQALIAMCfyALRQRAIA1BGGogB0EIaigCADYCACANIAcpAgA3AxAjAEEgayICJAACQAJAAkACQAJAAkAgDUEQaiIBQQRqKAIAIgcgASgCCCIARgRAIABBAWoiByAASQ0EAkAgAARAIAJBGGpBATYCACACIAA2AhQgAiABKAIANgIQDAELIAJBADYCEAsgAiAHQQEgAkEQahA5IAIoAgBBAUYNASACKAIEIQsgAUEEaiACQQhqKAIAIgc2AgAgASALNgIACyAAIAdGBEAgASAAQQEQDyABQQRqKAIAIQcgASgCCCEACyABIABBAWoiCzYCCCABKAIAIgEgAGpBADoAACAHIAtLDQEgASEADAILIAJBCGooAgAiAEUNAiACKAIEIAAQkgIACyALRQRAQQEhACABEOsBDAELIAEgB0EBIAsQTCIARQ0CCyANIAs2AgQgDSAANgIAIAJBIGokAAwCCxCTAgALIAtBARCSAgALIAMgDSkDADcCBEEADAELIAMgADYCBCADQQhqIAcpAgA3AgAgA0EQaiAHQQhqKAIANgIAQQELNgIAIA1BIGokACAFKAIoQQFGDQggBSgCLCEOIAVBMGooAgAhBwsCfyMAQSBrIgAkAEGo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FEEEEJICAAsgBUGgAWogBUE0aikCADcDACAFIAUpAiw3A5gBQYybwABBLyAFQZgBakGcnMAAQbybwAAQrwIAC0EkQQQQkgIACwALQQxBBBCSAgALQRhBBBCSAgALIAcgACABajYCAAsgBSgCmAEhAiAFKAKcASEMIAUoAqABDAILIAcgACABajYCAAsgDSECQQALIQACQCAXDQBBxLPBACgCAEH/////B3FFDQAQ4AENACASQQE6AAELIBJBADoAAAJAAkAgAARAQQxBBBBLIgZFDQEgBiAANgIIIAYgDDYCBCAGIAI2AgAMAgtBACEGIAxBA3RFIAxFIAJFcnINASACEOsBDAELQQxBBBCSAgALIAUoApABIgAgACgCACIAQQFrNgIAIABBAUYEQCAFQZABahBVCyARQQFqIREgBgRAIAYoAgAhASAGKAIIIgAEQCABIABBA3RqIQADQCABKAIAIAFBBGoiAigCACgCABEEACACKAIAIgIoAgQEQCACKAIIGiABKAIAEOsBCyABQQhqIgEgAEcNAAsgBigCACEBCyAGQQRqKAIAIgBFIAFFciAAQQN0RXJFBEAgARDrAQsgBhDrAQsgEUEERw0ACyILIBtHDQALDAQLIAAgAkH0ocAAEJkCAAsgACACQeShwAAQmQIAC0GwncAAQSFB5KHAABCdAgALIAkoAhwiBkUgAEVyDQBBACEBA0BBACECA0AgBUIANwO4ASAFIAE2ArABIAUgAjYCtAEgCSAFQbABaiAFQRhqEFQgACACQQFqIgJHDQALQQAhAgNAIAVCATcDuAEgBSABNgKwASAFIAI2ArQBIAkgBUGwAWogBUEYahBUIAAgAkEBaiICRw0AC0EAIQIDQCAFQgI3A7gBIAUgATYCsAEgBSACNgK0ASAJIAVBsAFqIAVBGGoQVCAAIAJBAWoiAkcNAAtBACECA0AgBUIDNwO4ASAFIAE2ArABIAUgAjYCtAEgCSAFQbABaiAFQRhqEFQgACACQQFqIgJHDQALIAFBAWoiASAGRw0ACwsgCUEkaigCACIBQQFrIgIgAUsNBiACIAUoAiQiB08NAyAJQQxqKAIAIQ0gCUEIaigCACEAIAVBsAFqIAUoAiAiBiACQQp0akGACBDdAhogDUECTwRAIAFBCnQhCCABQQt0IAZqQYAIayEGIAGtISBBASEOA0AgDq0gIH4iIUIgiKcNBiAhpyILIAJqIgEgC0kNBCABIAdPDQcgDkEBaiEOQQAhDANAIAVBsAFqIAxqIgEgASkDACAGIAxqIgspAwCFNwMAIAFBCGoiESARKQMAIAtBCGopAwCFNwMAIAFBEGoiESARKQMAIAtBEGopAwCFNwMAIAFBGGoiASABKQMAIAtBGGopAwCFNwMAIAxBIGoiDEGACEcNAAsgBiAIaiEGIA0gDkcNAAsLIABBAEgNACAADQFBASEBDAcLEJMCAAsgABBNIgENBSAAQQEQkgIAC0GQlsAAQRxBtKHAABCdAgALIAIgB0GkocAAEJkCAAtBsJ3AAEEhQbShwAAQnQIACyABIAdBxKHAABCZAgALQeCdwABBIUGUocAAEJ0CAAsgFiAANgIIIBYgADYCBCAWIAE2AgAgASAAIAVBsAFqQYAIEGcgBSgCJEEKdARAIAUoAiAQ6wELIAVBsAlqJAAMAgsgAiAAEJICAAsgASAAEJICAAsgCSgCQCEAIAkoAkghASAJQbABaiICIAkoAjQgGCgCABBgIAlBwAFqIgYgACABEGAgCUGsAWpBIzYCACAJQaQBakEjNgIAIAlBnAFqQSQ2AgAgCUGUAWpBJDYCACAJQYwBakEkNgIAIAlBhAFqQSU2AgAgCUH0AGpBBzYCACAJIAlBDGo2ApgBIAkgCUEcajYCkAEgCSAJQRBqNgKIASAJIAlBImo2AoABIAlBJjYCfCAJIAlBIWo2AnggCUIHNwJkIAlB5KXAADYCYCAJIAY2AqgBIAkgAjYCoAEgCSAJQfgAajYCcCAJQdAAaiAJQeAAahCUAgJAIAkoAsQBRQ0AIAkoAsABIgFFDQAgARDrAQsCQCAJKAK0AUUNACAJKAKwASIBRQ0AIAEQ6wELIBVBBGogCSkDUDcCACAVQQA6AAAgFUEMaiAJQdgAaigCADYCACAJKAJERSAARXINAiAAEOsBDAILQbCdwABBIUGsoMAAEJ0CAAsgFUEBOgAAIBUgBzoAAQsgCUHQAWokAEEBIQECQCAELQCoAUEBRwRAIAQpAqwBISAgBCAEQbQBaigCADYCUCAEICA3A0ggBEGoAWogBEHIAGoQnAEgBCkDqAEhICAKQTBqIARBsAFqKAIANgIAIApBKGogIDcCACAKQSBqQgA3AgAgCkEcakGEjcAAKAIAIgA2AgAgCkEUakIANwIAIApBEGogADYCACAKQQhqQQA2AgAgCkGMjcAAKAIANgIEQQAhAQwBCyAEIAQtAKkBOgAgIARB3ABqQQE2AgAgBEIBNwJMIARBwI/AADYCSCAEQQg2ArQCIAQgBEGwAmo2AlggBCAEQSBqNgKwAiAEQfgAaiAEQcgAahCUAiAEKAJ4IQ8gCkEQaiAEKQJ8NwIAIApBCGpBAzYCAAsgCiABNgIAIApBDGogDzYCAEEBIQEMGgsDQAwACwALIARB4AFqIABBEGopAgA3AwAgBEHYAWogAEEIaikCADcDACAEIAApAgA3A9ABIwBB0ABrIgAkACAAQgA3AwggBEHQAWoiASgCBCECIAEoAgAhASAAQgA3AhQgAEGUjcAAKAIAIgY2AhAgAEEgaiIHIABBEGpB2IXAABDAAgJAIABBCGogBxDUAkUEQCACKAIQIQIDQCABQdePwABBCCAAKAIQIAAoAhggAhEHAAJAIAAoAhRFDQAgACgCECIHRQ0AIAcQ6wELIAApAwgiIEIBfCIhICBUDQIgACAhNwMIIABCADcCFCAAIAY2AhAgAEEgaiIHIABBEGpB2IXAABDAAiAAQQhqIAcQ1AJFDQALC0HwhcAAQTcgAEHIAGpBuIzAAEH0hsAAEK8CAAtBgIDAAEEcQeCPwAAQnQIACyMAQRBrIgIkAEEEQQQQSyIGBEAgBkEBNgIAIAJCgYCAgBA3AgQgAiAGNgIAQQEhAAJAA0AgAEECdCAGakEEaygCACIBQQFqIgcgAUkNASACKAIEIABHBH8gAAUgAiAAEDogAigCACEGIAIoAggLIgFBAnQgBmogBzYCACACIAFBAWoiADYCCCAAIAFPDQALQfCPwABBEUGEkMAAEKgCAAtBgIDAAEEcQZSQwAAQnQIAC0EEQQQQkgIACyAEQZABaiAQQSBqKQMANwMAIARBmAFqIgAgEEEoaikDADcDACAEQaABaiIGIBBBMGooAgA2AgAgBCAQQRhqKQMANwOIASAQQRRqKAIAIQIgECgCECEBIARB7AFqQgA3AgAgBEHgAWpCADcDACAEQQA2AvQBIARBhI3AACgCACIHNgLoASAEIAc2AtwBIARCADcC1AEgBEGMjcAAKAIAIgc2AtABIARB0ABqIAYoAgA2AgAgBCAAKQMANwNIIARBkAJqIARByABqEJwBIARBoAJqIgAQyAEgBEEIaiAAQf6TwABBDBDQAQJAAkACQAJAIAQoAghBAUYEQCAEQbwCaiAEQQhqQQRyIgBBCGooAgA2AgAgBCAAKQIANwK0AgwBCyAEQbACaiAEKAIMIARBEGotAAAQxwEgBCgCsAJBAUcNAQsgBEGAAWoiACAEQbwCaigCADYCACAEIAQpArQCNwN4AkAgBCgCpAJFDQAgBCgCoAIiBkUNACAGEOsBCyAEQRBqIAAoAgA2AgAgBCAEKQN4NwMIIARB0ABqIgBB7YnAAEEZIARBCGoQJCAEQSxqIARB2ABqKQMAIiE3AgAgBEE0aiAEQeAAaikDACIiNwIAIARBPGogBEHoAGopAwAiIzcCACAEIAApAwAiIDcCrAEgBCAgNwIkIApBIGogIzcCACAKQRhqICI3AgAgCkEQaiAhNwIAIApBCGogIDcCACAKQQE2AgACQCAEKAKUAkUNACAEKAKQAiIARQ0AIAAQ6wELIARB0AFqEDEgAkUNAiABDQEMAgsgBEEoaiILIARBqAJqKAIANgIAIARBiAJqIg0gBEGYAmooAgA2AgAgBCAEKQOgAjcDICAEIAQpA5ACNwOAAiAEQdABakEAEDsgBEHYAWoiBiAGKAIAIgBBAWo2AgAgBCgC0AEgAEHoAGxqIgBBAjYCCCAAQgA3AwAgAEEDOgBgIABCADcDUCAAQRBqQQA2AgAgAEEUaiAEKQOAAjcCACAAQRxqIA0oAgA2AgAgAEEoaiALKAIANgIAIABBIGogBCkDIDcCACAAQTBqQgA3AgAgAEEsaiAHNgIAIAogBCkD0AE3AgQgCkEMaiAGKQMANwIAIApBFGogBEHgAWopAwA3AgAgCkEcaiAEQegBaikDADcCACAKQSRqIARB8AFqKQMANwIAIApBLGogBEH4AWopAwA3AgAgCkEANgIAIAJFIAFFcg0BCyABEOsBC0EAIQEMFgsgASgCBEAAIgBBf0cEQEEBIQFBBEEBEEsiAkUNCSAKQYyNwAAoAgA2AgQgCkEANgIAIApBLGpChICAgMAANwIAIApBKGogAjYCACAKQSBqQgA3AgAgCkEcakGEjcAAKAIAIgY2AgAgCkEUakIANwIAIApBEGogBjYCACAKQQhqQgA3AgAgAiAAQQh0QYCA/AdxIABBGHRyIABBCHZBgP4DcSAAQRh2cnI2AAAMFgtBASEBQRJBARBLIgBFDQkgCkEBNgIAIABBEGpBtJDAAC8AADsAACAAQQhqQayQwAApAAA3AAAgAEGkkMAAKQAANwAAIApBEGpCkoCAgKACNwMAIApBDGogADYCACAKQQhqQQM2AgAMFQsjAEEgayIAJAAgAEEcakEANgIAIABBhI3AADYCGCAAQgE3AgwgAEHYkMAANgIIIABBCGpB4JDAABChAgALIARB0AFqIAAoAggiAUGEjcAAQQAgAEEMaigCACIAKAIQIgIRBgAgBCgC0AFBAUcNCCAEQeAAaiIGIARB8AFqKQMANwMAIARB2ABqIgcgBEHoAWoiCykDADcDACAEQdAAaiINIARB4AFqIggpAwA3AwAgBCAEQdgBaiIFKQMAIiA3A0ggIKdBA0YEQCAEQcgAahAoIARB0AFqIAFBvJHAAEHQACACEQYAIAQoAtABQQFHDQogBEHgAGoiAiAEQfABaikDADcDACAEQdgAaiIGIARB6AFqIgcpAwA3AwAgBEHQAGoiCyAEQeABaiINKQMANwMAIAQgBEHYAWoiCCkDACIgNwNIICCnQQNHDQwgBEHIAGoQKCAEQgA3AtQBIARBlI3AACgCADYC0AEgBEEIaiICIARB0AFqIgYQnAEgBiABIAIgACgCFCICEQMAIAQoAtABQQFHDQsgBEHgAGoiACAEQfABaikDADcDACAEQdgAaiIGIARB6AFqIgcpAwA3AwAgBEHQAGoiCyAEQeABaiINKQMANwMAIAQgBEHYAWoiCCkDACIgNwNIAkAgIKdBA0YEQCAEQcgAahAoQQNBARBLIgBFDQ8gAEHMAToAAiAAQar3AjsAACAEQoOAgIAwNwLUASAEIAA2AtABIARBiAFqIgAgBEHQAWoiBhCcASAGIAEgACACEQMAIAQoAtABQQFHDRAgBEHgAGoiACAEQfABaikDADcDACAEQdgAaiIGIARB6AFqIgcpAwA3AwAgBEHQAGoiCyAEQeABaiINKQMANwMAIAQgBEHYAWoiCCkDACIgNwNIICCnQQNGDQEgByAAKQMANwMAIA0gBikDADcDACAIIAspAwA3AwAgBCAEKQNINwPQASAEQbwBakEBNgIAIARCATcCrAEgBEG0kcAANgKoASAEQQk2AiQgBCAEQSBqNgK4ASAEIARB0AFqIgA2AiAgBEGAAmogBEGoAWoQlAIgCkEIakEDNgIAIApBDGogBCkDgAI3AgAgCkEUaiAEQYgCaigCADYCACAKQQE2AgAgABAoDBQLIAcgACkDADcDACANIAYpAwA3AwAgCCALKQMANwMAIAQgBCkDSDcD0AEgBEG8AWpBATYCACAEQgE3AqwBIARBtJHAADYCqAEgBEEJNgKMASAEIARBiAFqNgK4ASAEIARB0AFqIgA2AogBIARBIGogBEGoAWoQlAIgCkEIakEDNgIAIApBDGogBCkDIDcCACAKQRRqIARBKGooAgA2AgAgCkEBNgIAIAAQKAwUCyAEQcgAahAoQRFBARBLIgBFDQ8gAEKmzZq16tSp06Z/NwAAIABBEGpBpgE6AAAgAEEIakKmzZq16tSp06Z/NwAAIARCkYCAgJACNwLUASAEIAA2AtABIARBIGoiACAEQdABaiIGEJwBIAYgASAAIAIRAwAgBCgC0AFBAUcNECAEQeAAaiIAIARB8AFqKQMANwMAIARB2ABqIARB6AFqIgEpAwA3AwAgBEHQAGogBEHgAWopAwA3AwAgBCAEQdgBaikDACIgNwNIICCnQQNGBEAgBEHIAGoQKCAKQShqQQA2AgAgCkEgakIANwIAIApBHGpBhI3AACgCACIANgIAIApBFGpCADcCACAKQRBqIAA2AgAgCkEIakIANwIAIApBjI3AACgCADYCBCAKQQA2AgACQCAEKAIkRQ0AIAQoAiAiAEUNACAAEOsBCwJAIAQoAowBRQ0AIAQoAogBIgBFDQAgABDrAQsCQCAEKAIMRQ0AIAQoAggiAEUNACAAEOsBC0EBIQEMFQsgASAAKQMANwMAIARB4AFqIARB2ABqKQMANwMAIARB2AFqIARB0ABqKQMANwMAIAQgBCkDSDcD0AEgBEG8AWpBATYCACAEQgE3AqwBIARBtJHAADYCqAEgBEEJNgK0AiAEIARBsAJqNgK4ASAEIARB0AFqIgA2ArACIARB+ABqIARBqAFqEJQCIApBCGpBAzYCACAKQQxqIAQpA3g3AgAgCkEUaiAEQYABaigCADYCACAKQQE2AgAgABAoIAQoAiRFDRIgBCgCICIARQ0SIAAQ6wEMEgsgCyAGKQMANwMAIAggBykDADcDACAFIA0pAwA3AwAgBCAEKQNINwPQAUEBIQEgBEG8AWpBATYCACAEQgE3AqwBIARBtJHAADYCqAEgBEEJNgKMASAEIARBiAFqNgK4ASAEIARB0AFqIgA2AogBIARBIGogBEGoAWoQlAIgCkEIakEDNgIAIApBDGogBCkDIDcCACAKQRRqIARBKGooAgA2AgAgCkEBNgIAIAAQKAwTC0ELQQEQkgIAC0EIQQEQkgIAC0HwAUEEEJICAAtBBkEBEJICAAtBB0EBEJICAAtBA0EBEJICAAtBBEEBEJICAAtBEkEBEJICAAsgBEGwAWogBEHcAWooAgA2AgAgBCAEKQLUATcDqAFB6IvAAEEuIARBqAFqQaiMwABB8JDAABCvAgALIARBsAFqIARB3AFqKAIANgIAIAQgBCkC1AE3A6gBQeiLwABBLiAEQagBakGojMAAQYySwAAQrwIACyAEQbABaiAEQdwBaigCADYCACAEIAQpAtQBNwOoAUHoi8AAQS4gBEGoAWpBmIzAAEGcksAAEK8CAAsgByACKQMANwMAIA0gBikDADcDACAIIAspAwA3AwAgBCAEKQNINwPQAUEBIQEgBEG8AWpBATYCACAEQgE3AqwBIARBtJHAADYCqAEgBEEJNgKMASAEIARBiAFqNgK4ASAEIARB0AFqIgA2AogBIARBIGogBEGoAWoQlAIgCkEIakEDNgIAIApBDGogBCkDIDcCACAKQRRqIARBKGooAgA2AgAgCkEBNgIAIAAQKAwHC0EDQQEQkgIACyAEQbABaiAEQdwBaigCADYCACAEIAQpAtQBNwOoAUHoi8AAQS4gBEGoAWpBmIzAAEGsksAAEK8CAAtBEUEBEJICAAsgBEGwAWogBEHcAWooAgA2AgAgBCAEKQLUATcDqAFB6IvAAEEuIARBqAFqQZiMwABBvJLAABCvAgALQQVBARCSAgALIAQoAowBRQ0AIAQoAogBIgBFDQAgABDrAQsCQCAEKAIMRQ0AIAQoAggiAEUNACAAEOsBC0EBIQELAkAgE0EEaigCAEUNACATKAIAIgBFDQAgABDrAQsgEygCDCECIBNBFGooAgAiAARAIABBBXQhDyACQRRqIQADQAJAIAAoAgBFDQAgAEEEaygCACIGRQ0AIAYQ6wELIABBIGohACAPQSBrIg8NAAsLIBNBEGooAgAiAEUgAEEFdEVyRQRAIAIQ6wELIAFFDQMCQCAQQRRqKAIARQ0AIBBBEGooAgAiAEUNACAAEOsBCyAQQSxqKAIARQ0DIBBBKGooAgAiAEUNAyAAEOsBDAMLIBAEQCAPEOsBCyAORSABRXJFBEAgARDrAQsgBgRAIAZBBXQhDyANQRRqIQADQAJAIAAoAgBFDQAgAEEEaygCACIBRQ0AIAEQ6wELIABBIGohACAPQSBrIg8NAAsLIAJFIAJBBXRFckUEQCANEOsBCyAJRSAHRXJFBEAgBxDrAQsgC0UNAgsgFUUgBUVyDQEgBRDrAQwBCyAXRSALRXJFBEAgCxDrAQsgAEUEQCAWRSARRXJFBEAgERDrAQsgE0UgCEVyRQRAIAgQ6wELIBAEQCAPEOsBCyAORSABRXJFBEAgARDrAQsgBgRAIAZBBXQhDyANQRRqIQADQAJAIAAoAgBFDQAgAEEEaygCACIBRQ0AIAEQ6wELIABBIGohACAPQSBrIg8NAAsLIAJFIAJBBXRFckUEQCANEOsBCyAJRSAHRXJFBEAgBxDrAQsgFUUgBUVyDQEgBRDrAQwBCyATRSAIRXJFBEAgCBDrAQsgEARAIA8Q6wELIA5FIAFFckUEQCABEOsBCyAGBEAgBkEFdCEPIA1BFGohAANAAkAgACgCAEUNACAAQQRrKAIAIgFFDQAgARDrAQsgAEEgaiEAIA9BIGsiDw0ACwsgAkUgAkEFdEVyRQRAIA0Q6wELIAlFIAdFcg0AIAcQ6wELIARBwAJqJAAgA0GABGogChA3IAMoAtwERSAeRXJFBEAgHhDrAQsgAygCzARFIB1FckUEQCAdEOsBCyADKAK8BEUgGkVyDQwgGhDrAQwMC0EEIQAMAQtBAiEACyADIAY2AogGIAMgCDYChAYgAyACNgKABiAAQQh2IQIMBQsgA0GMBGooAgAhAiADQYgEaigCACEIIAMoAoQEIQYMAwtBAiEADAILQQ4hAAwBC0EEIQALIAMgAjYCiAYgAyAINgKEBiADIAY2AoAGIABBCHYhAgsgAEH/AXEgAkEIdHIhAiADKQOABiEgIAMoAogGCzYCACADICA3ArwFIAMgAjYCuAUgA0GgBmpB7YnAAEEZIANBuAVqIgAQHCADQbAFaiADQbgGaikDADcDACADQagFaiADQbAGaikDADcDACADQaAFaiADQagGaikDADcDACADIAMpA6AGNwOYBSADQgA3AoQGIANBlI3AACgCADYCgAYgACADQYAGakHYhcAAEMACIANBmAVqIAAQsQENAyADQYwEaiADQYgGaigCADYCACADIAMpA4AGNwKEBCADQQE2AoAEIANBmAVqECggEkUgE0VyRQRAIBMQ6wELIA4EQCAOQQV0IQEgEEEUaiECA0ACQCACKAIARQ0AIAJBBGsoAgAiAEUNACAAEOsBCyACQSBqIQIgAUEgayIBDQALCyAPRSAPQQV0RXINACAQEOsBCyAVRSAJRXJFBEAgCRDrAQsgEUUgDEVyDQAgDBDrAQsCQCADKALcBEUNACADKALYBCIARQ0AIAAQ6wELAkAgAygCzARFDQAgAygCyAQiAEUNACAAEOsBCyADKAK8BEUgGkVyDQAgGhDrAQsgA0GYBmogA0GABGoQICADKAKYBkEBRwRAIANBwAVqIANBpAZqKAIAIgA2AgAgAyADKQKcBiIgNwO4BSADQaAGaiAANgIAIAMgIDcDmAYgA0GYBmoQsgECQCADKAKABEUEQCADQYAEakEEchAxDAELIANBiARqKAIARQ0AIAMoAoQEIgFFDQAgARDrAQsgA0GQB2okAA8LIANB0AVqIANBuAZqKQMANwMAIANByAVqIANBsAZqKQMANwMAIANBwAVqIANBqAZqKQMANwMAIAMgA0GgBmopAwA3A7gFQciMwABBKyADQbgFakH0jMAAQbiDwAAQrwIAC0HwhcAAQTcgA0HwBWpBuIzAAEH0hsAAEK8CAAvTdwIYfwR+IwBBsARrIgMkABDwASADQfgBaiAAELMBIANBiAJqIAEQswEgA0HwAmogAygC+AEiFCADKAKAAhAVAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKQPwAkIBUgRAIANBsAJqIANBgANqKQMANwMAIANBoAJqIANBmANqKQMANwMAIAMgAykD+AI3A6gCIAMgA0GQA2opAwA3A5gCIANBiANqKAIAIREgA0GMA2ooAgAhDyADQaADaigCACEKIANBpANqKAIAIRIgA0GoA2opAwAhGiADQegBaiIBIAMoAogCIgAgAygCkAIQvAEgA0HgAWogARDDASADLQDgAUEBcUUNEiADLQDhASIBQfsARwRAIAFBIkcEQEEKIQEMFQsgA0HIAmog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QdQAaigCACIKQRh0IApBCHRBgID8B3FyIApBCHZBgP4DcSAKQRh2cnI2AAggByABQdAAaigCACIBQRh0IAFBCHRBgID8B3FyIAFBCHZBgP4DcSABQRh2cnI2AARBIEEBEEsiAUUNByABIAIpA+ABNwAAIAFBGGogDSkDADcAACABQRBqIAkpAwA3AAAgAUEIaiAMKQMANwAAIAVFIAtFckUEQCALEOsBC0EgIQdBICEFIARBAWsiBA0ACyACIAE2AqgCCyACIAU2AqwCIAIgBzYCsAIgEUUEQCACQcADaiACQbACaigCADYCACACIAIpA6gCNwO4AyACQcgCaiACQbgDahCcASACQcQBaiACQdACaigCADYCACACQQA2ArgBIAIgAikDyAI3ArwBIBNFIBJFcg0oIBIQ6wEMKAsgAiAXNgLAAyACIBM2ArwDIAIgEjYCuAMgAkG4AmogAkG4A2oQnAEgAkHABGoiARDIASACQYgCaiABQZeVwABBBxDQASACKAKIAkEBRg0GIAIgAigCjAI2ArgEIAIgAkGQAmotAAA6ALwEIAJBiAJqIAJBuARqQZ6VwABBBSARQQFrEBQgAigCiAJBAUYNByACQYgCaiACQbgEakGjlcAAQQQgBhAUIAIoAogCQQFGBEAgAkH0AGogAkGUAmooAgA2AgAgAiACKQKMAjcCbAwnCyACQegAaiACKAK4BCACLQC8BBDHASACKAJoQQFGDSYgAkHoAWogAkHIBGooAgAiATYCACACQcgAaiACKQO4AjcDACACQdAAaiACQcACaigCADYCACACQdQAaiACKQPABCIaNwIAIAJB3ABqIAE2AgAgAiAaNwPgASACQQA2AkQgAkECNgJAIAJBuANqIAJBQGsQJSACKAK4A0EBRwRAIAJBwANqKAIAIRMgAkG4A2ogFiACKAK8AyIPIAJBxANqIgQoAgAgFSgCDBEGAAJAAkAgAigCuANBAUcEQCACKAK8A0EBRg0CIAJByARqIAJByANqKAIANgIAIAIgAkHAA2opAwA3A8AEIAJBOGogAkHABGoQnwEgAkHoAGoiASACKAI4IAIoAjwQvAEgAkEwaiABEMMBIAItADBBAXENAUEEIQcMJgsgAkHgAmogAkHUA2ooAgA2AgAgAkHYAmogAkHMA2opAgA3AwAgAkHQAmoiASAEKQIANwMAIAIgAikCvAM3A8gCIAJB9AFqQQE2AgAgAkIBNwLkASACQciCwAA2AuABIAJBBDYCbCACIAJB6ABqNgLwASACIAJByAJqNgJoIAJBiAJqIAJB4AFqEJQCIAJBwAFqQQM2AgAgAkHEAWogAikDiAI3AgAgAkHMAWogAkGQAmooAgA2AgAgAkEBNgK4AQJAAkACQAJAIAIoAsgCDgQBAgMrAAsgASgCAEUNKiACKALMAiIBRQ0qIAEQ6wEMKgsCQCABKAIARQ0AIAIoAswCIgFFDQAgARDrAQsgAkHcAmooAgBFDSkgAkHYAmooAgAiAUUNKSABEOsBDCkLAkAgASgCAEUNACACKALMAiIBRQ0AIAEQ6wELIAJB3AJqKAIARQ0oIAJB2AJqKAIAIgFFDSggARDrAQwoCyABKAIARQ0nIAIoAswCIgFFDScgARDrAQwnCyACLQAxQfsARwRAQQ4hBwwlCyACQegAaiIBEL0BIAJBKGogARC7ASACLQAsIQkgAkEgaiACKAIoIgsQwwFBAiEBIAItACBBAXFFBEBBACEEDCELIAJB4AFqQQRyIQcgAkHoAWohECACQcgCakEEciEKIAItACEhDSAJQQFxIQlBACEEAkADQAJAAkACQAJAAkACQCANQf8BcSIMQSxHBEAgDEH9AEYNAiAJQf8BcQ0BQQkhAQwpCyAJQf8BcQRAQRAhAQwpCyALEL0BIAJBGGogCxDDASACLQAYQQFxRQ0nIAItABkhDQsgDUH/AXEiDUEiRwRAQRAhASANQf0ARw0oQRMhAQwoCyACQRBqIAsQwwEgAi0AEEEBcUUNJiACLQARQSJHBEBBDiEBDCgLIAsQvQEgAkHIAmogCxDCASACKALYAiEMIAIoAtQCIQ0gAigC0AIhCSACKALMAiEGIAIoAsgCQQFGBEAgBiEBDCgLAkAgBkUEQCANQQZHDQMgCUHzlcAAQQYQ4AJBAEchBgwBC0EBIQYgDEEGRgRAIAlB85XAAEEGEOACQQBHIQYLIA1FIAlFcg0AIAkQ6wELIAYNASAERQ0CIAJBiAJqQQRyQfOVwABBBhAXIBFFDSoMKQsgBA0FIAJByAJqQQRyQfOVwABBBhAWIAJBlAJqIAJB1AJqKQIANwIAIAIgAikCzAI3AowCDCkLIAJByAJqIAsQwQECQCACKALIAiIGQRVHBEAgByAKKQIANwIAIAdBCGogCkEIaigCADYCACACIAY2AuABDAELIAJB4AFqIAsQGCACKALgAUEVRg0CCyACQZQCaiACQegBaikDADcCACACIAIpA+ABNwKMAgwmCyACQcgCaiALEMEBIAIoAsgCIgRBFUcNECACQQhqIAsQwwEgAi0ACEEBcUUNASACLQAJQSJHDQ4gCxC9ASACQcgCaiALEMIBIAIoAtgCIQkgAigC1AIhBiACKALQAiEEIAIoAswCIQwgAigCyAJBAUYNDwJAIAxFBEAgAkHgAWogBCAGED8MAQsgAkHgAWogBCAJED8gBkUgBEVyDQAgBBDrAQsgAigC4AFBAUYNIiACKALsASESIAIoAugBIREgAigC5AEhBAsgAiALEMMBQQAhCSACLQABIQ0gAi0AAEEBcQ0BDCMLCyACQQQ2AuQBDB8LIAJByAJqIAJB6ABqEMABIAIoAsgCIgdBFUcEQCACQdQCaigCACENIAJB0AJqKAIAIQkgAigCzAIhDCARRQ0lIAQQ6wEMJQsgAkHIAmogAkHoAGoQvgEgAigCyAIiB0EVRg0NIAJB1AJqKAIAIQ0gAkHQAmooAgAhCSACKALMAiEMIBFFDSQgBBDrAQwkCyACQegBaiACQcgDaigCADYCACACIAJBwANqKQMANwPgASACQdwCakEBNgIAIAJCATcCzAIgAkHogsAANgLIAiACQQU2AmwgAiACQegAajYC2AIgAiACQeABajYCaCACQYgCaiACQcgCahCUAiACQcABakEDNgIAIAJBxAFqIAIpA4gCNwIAIAJBzAFqIAJBkAJqKAIANgIAIAJBATYCuAEgAigC5AFFDSUgAigC4AEiAUUNJSABEOsBDCULIAJB4AJqIAJB2ANqKQMANwMAIAJB2AJqIAJB0ANqKQMANwMAIAJB0AJqIAJByANqKQMANwMAIAIgAkHAA2opAwA3A8gCIAJB9AFqQQE2AgAgAkIBNwLkASACQYyDwAA2AuABIAJBAzYCjAIgAiACQYgCajYC8AEgAiACQcgCaiIBNgKIAiACQagEaiACQeABahCUAiABECggAkHAAWpBAzYCACACQcgBaiACKQKsBDcDACACQcQBaiACKAKoBDYCACACQQE2ArgBDCULIAJBuAFqIgEQyAEgAkG4A2ogARDPASACKAK4A0EBRwRAIAIoArwDIQEgAkHAA2otAAAEQCABQQhqKAIAIQUMGAsgASgCCCIEIAFBBGooAgBGBEAgASAEQQEQDyABKAIIIQQLIAEgBEEBaiIFNgIIIAEoAgAgBGpBLDoAAAwXCyACQdQCaiACQbgDakEEciIBQQhqKAIANgIAIAIgASkCADcCzAIMFwsgAkH4AGoiBCABQRBqKQIANwMAIAJB8ABqIAFBCGopAgA3AwAgAiABKQIANwNoIAJBkAJqIAspAgQ3AwAgAkGYAmogC0EMaigCADYCACACQoCAgIAQNwOIAiACQbgDaiAEIAJBiAJqECcgAigCuANBAUYNEiACQegBaiIBIAJBxANqKAIANgIAIAIgAikCvAM3A+ABIAJBiAJqEDIgAkGYAWogASgCACIBNgIAIAJByABqIAE2AgAgAkHIBGogATYCACACIAIpA+ABIho3A0AgAiAaNwPABCACQbgBaiIBEMgBIAJBuANqIAEQzwEgAigCuANBAUcEQCACKAK8AyEBIAJBwANqLQAABEAgAUEIaigCACEFDBALIAEoAggiBCABQQRqKAIARgRAIAEgBEEBEA8gASgCCCEECyABIARBAWoiBTYCCCABKAIAIARqQSw6AAAMDwsgAkHUAmogAkG4A2pBBHIiAUEIaigCADYCACACIAEpAgA3AswCDA8LIAJByAJqIAIoApABIAItAJQBEMYBIAIoAsgCQQFHDQoMCwsgAUEEakGYj8AALQAAOgAAIAFBlI/AACgAADYAAEEHIRFBBSEGCyAIQQE2AgAgCEEkaiANNgIAIAhBIGogCTYCACAIQRxqIAw2AgAgCEEYaiAENgIAIAhBFGogBzYCACAIQRBqIAY2AgAgCEEMaiABNgIAIAhBCGogETYCAAwQC0EgQQEQkgIACyACQfQAaiACQZQCaigCADYCACACIAIpAowCNwJsDB8LIAJB9ABqIAJBlAJqKAIANgIAIAIgAikCjAI3AmwMHgsgAkEONgLkAQwTCyACIAk2AvABIAIgBjYC7AEgAiAENgLoASACIAw2AuQBDBILIBAgCikCADcCACAQQQhqIApBCGooAgA2AgAgAiAENgLkAQwRCyACQcQBaiASNgIAIAJBwAFqIBE2AgAgAiAENgK8AUEADBcLIAJB1AJqIAJBuANqQQRyIgRBCGooAgA2AgAg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AEUNACAOQRBqKAIAIgFFDQAgARDrAQsgDkEsaigCAEUNDCAOQShqKAIAIgFFDQwgARDrAQwMCyACQZQCaiAHQQhqKQIANwIAIAIgBykCADcCjAIMBAtBBCEBCyACQZgCaiAMNgIAIAJBlAJqIA02AgAgAkGQAmogCTYCACACIAE2AowCCyAERSARRXINAQsgBBDrAQsgAkGYAmooAgAhDSACQZQCaigCACEJIAJBkAJqKAIAIQwgAigCjAIhBwsgAkHUAmogDTYCACACQdACaiAJNgIAIAIgDDYCzAIgAiAHNgLIAiACQcABakGSiMAAQR4gAkHIAmoQHEEBCzYCuAEgAigCxARFDQAgAigCwAQiAUUNACABEOsBCyATRSAPRXINACAPEOsBCyACQUBrEDIgBUUNASACKAKoAiIBRQ0BIAEQ6wEMAQsgAkGwBGoiASACQfQAaigCADYCACACIAIpAmw3A6gEAkAgAigCxARFDQAgAigCwAQiBEUNACAEEOsBCyACQZACaiABKAIANgIAIAIgAikDqAQ3A4gCIAJBwANqIgFBsIjAAEEXIAJBiAJqECQgAkHsAWogAkHIA2opAwAiGzcCACACQfQBaiACQdADaikDACIcNwIAIAJB/AFqIAJB2ANqKQMAIh03AgAgAkHAAWogASkDACIaNwMAIAJByAFqIBs3AwAgAkHQAWogHDcDACACQdgBaiAdNwMAIAIgGjcCzAIgAiAaNwLkASACQQE2ArgBAkAgAigCvAJFDQAgAigCuAIiAUUNACABEOsBCyAFRQ0AIAIoAqgCIgFFDQAgARDrAQsgAigCuAFBAUYEQCACQawBaiACQdgBaikDACIaNwIAIAJBpAFqIAJB0AFqKQMAIhs3AgAgAkGcAWogAkHIAWopAwAiHDcCACACIAJBwAFqKQMAIh03ApQBIAhBIGogGjcCACAIQRhqIBs3AgAgCEEQaiAcNwIAIAhBCGogHTcCACAIQQE2AgAgDkEUaigCAEUNASAOQRBqKAIAIgFFDQEgARDrAQwBCyACQZgBaiACQcQBaigCACIBNgIAIAJBiAFqIAE2AgAgAiACKQK8ASIaNwOQASACIBo3A4ABIAJB4AFqIgEQyAEgAkG4A2ogARDPAQJAAkACQAJAIAIoArgDQQFHBEAgAigCvAMhASACQcADai0AAARAIAFBCGooAgAhBQwCCyABKAIIIgQgAUEEaigCAEYEQCABIARBARAPIAEoAgghBAsgASAEQQFqIgU2AgggASgCACAEakEsOgAADAELIAJB1AJqIAJBuANqQQRyIgFBCGooAgA2AgAgAiABKQIANwLMAgwBCyABQQRqIgYoAgAgBUYEQCABIAVBARAPIAFBCGooAgAhBQsgASgCACAFakEiOgAAIAFBCGoiBCAFQQFqIgU2AgAgBigCACAFa0EFTQRAIAEgBUEGEA8gBCgCACEFCyABKAIAIAVqIgZB85XAACgAADYAACAGQQRqQfeVwAAvAAA7AAAgBCAFQQZqIgU2AgAgAUEEaigCACAFa0EBTQRAIAEgBUECEA8gAUEIaigCACEFCyABKAIAIAVqQaL0ADsAACABQQhqIAVBAmo2AgAgAkG4AWogAkGAAWoQngEgAkG4A2ogASACKAK4ASIEIAIoAsABEMsBIAIoArwBRSAERXJFBEAgBBDrAQsgAigCuANBAUYEQCACQdQCaiACQcQDaigCADYCACACIAIpArwDNwLMAgwBC0EAIQUgAkHIAmogAUEAEMYBIAIoAsgCQQFHDQELIAJBkAJqIgEgAkHUAmooAgA2AgAgAiACKQLMAjcDiAICQCACKALkAUUNACACKALgASIERQ0AIAQQ6wELIAJB0AJqIAEoAgA2AgAgAiACKQOIAjcDyAIgAkHAA2oiAUGSiMAAQR4gAkHIAmoQJCAIQSBqIAJB2ANqKQMANwMAIAhBGGogAkHQA2opAwA3AwAgCEEQaiACQcgDaikDADcDACAIQQhqIAEpAwA3AwBBASEFDAELIAJBxANqIAJB6AFqKAIAIgE2AgAgAiACKQPgASIaNwK8AyAIQQxqIAE2AgAgCCAaNwIECyAIIAU2AgACQCACKAKEAUUNACACKAKAASIBRQ0AIAEQ6wELIA5BFGooAgBFDQAgDkEQaigCACIBRQ0AIAEQ6wELIAJB0ARqJAAgA0HYA2ogA0HUAmopAgA3AwAgA0HgA2ogA0HcAmopAgA3AwAgA0HoA2ogA0HkAmopAgA3AwAgA0HwA2ogA0HsAmooAgA2AgAgAyADKQLMAjcD0AMCQAJ/IAMoAsgCQQFHBEAgA0H0AWogA0HIAmpBBHIiAUEIaigCADYCACADQQA2AugBIAMgASkCADcC7AFBAAwBCyADQZAEaiADQewDaikCADcDACADQYgEaiADQeQDaikCADcDACADQYAEaiADQdwDaikCADcDACADIAMpAtQDNwP4AyADQgA3ApwEIANBlI3AACgCADYCmAQgA0HwAmoiASADQZgEakHYhcAAEMACIANB+ANqIAEQsQENASADQfQBaiADQaAEaigCADYCACADIAMpA5gENwLsASADQQE2AugBIANB+ANqEChBAQshASADKAKMAkUgAEVyRQRAIAAQ6wELIAMoAvwBRSAURXINESAUEOsBDBELDBELQQQhBAsgA0HgA2ogBzYCACADQdwDaiABNgIAIANB2ANqIAY2AgAgAyAENgLUAwsgC0UgAkVyDQELIAsQ6wELIANB4ANqKAIAIQggA0HcA2ooAgAhByADQdgDaigCACEGIAMoAtQDIQELIAFBCHYhCSAHrSAIrUIghoQhGgwHC0ELIQEMBgsgA0HcA2ooAgAhCCADQdgDaigCACEFIAMoAtQDIQYMAwtBAiEBDAILQQ4hAQwBC0EEIQELIAFBCHYhCSAFrSAIrUIghoQhGgwBC0EEIQELIAFB/wFxIAlBCHRyIQkLIANB0AJqIBo3AwAgAyAGNgLMAiADIAk2AsgCIANB+AJqQbCIwABBFyADQcgCaiIBEBwgA0HoA2ogA0GQA2opAwA3AwAgA0HgA2ogA0GIA2opAwA3AwAgA0HYA2ogA0GAA2opAwA3AwAgAyADKQP4AjcD0AMgA0IANwL8AyADQZSNwAAoAgA2AvgDIAEgA0H4A2pB2IXAABDAAiADQdADaiABELEBDQIgA0H0AWogA0GABGooAgA2AgAgAyADKQP4AzcC7AEgA0EBNgLoASADQdADahAoIA9FIBFFckUEQCAREOsBCyASRSAKRXINACAKEOsBCyADKAKMAkUgAEVyRQRAIAAQ6wELIAMoAvwBRSAURXJFBEAgFBDrAQtBASEBCyADQfgDahDIASADQegBakEEciEEAkACQAJAIAFFBEAgAygCgAQiACADKAL8A0YEQCADQfgDaiAAQQEQDyADKAKABCEACyADKAL4AyAAakH7ADoAACADIABBAWo2AoAEIANB8AJqIANB+ANqQaGFwABBAhDLASADKALwAkEBRg0BIAMoAoAEIgAgAygC/ANGBEAgA0H4A2ogAEEBEA8gAygCgAQhAAsgAygC+AMgAGpBOjoAACADIABBAWo2AoAEIANB0ANqIAQQngEgA0HwAmogA0H4A2ogAygC0AMiACADKALYAxDLASADKALUA0UgAEVyRQRAIAAQ6wELIAMoAvACQQFHBEAgAygCgAQiASADKAL8A0YEQCADQfgDaiABQQEQDyADKAKABCEBCyADKAL4AyABakH9ADoAACADIAFBAWo2AoAEDAQLIANB1AJqIANB/AJqKAIANgIAIAMgAykC9AI3AswCDAILIANByAJqIANB+ANqIAQQISADKALIAkEBRw0CDAELIANB1AJqIANB/AJqKAIANgIAIAMgAykC9AI3AswCCyADQcACaiIAIANB1AJqKAIANgIAIAMgAykCzAI3A7gCAkAgAygC/ANFDQAgAygC+AMiAUUNACABEOsBCyADQdACaiIBIAAoAgA2AgAgAyADKQO4AjcDyAIgA0H4AmoiAEHhiMAAQdQAIANByAJqIgQQJCADQeACaiADQZADaikDADcDACADQdgCaiADQYgDaikDADcDACABIANBgANqKQMANwMAIAMgACkDADcDyAJByIzAAEErIARB9IzAAEH4g8AAEK8CAAsgA0HYA2ogA0GABGooAgAiADYCACADIAMpA/gDIho3A9ADIANB+AJqIAA2AgAgAyAaNwPwAiADQfACahCyAQJAIANB8AFqKAIARQ0AIAMoAuwBIgFFDQAgARDrAQsgA0GwBGokAA8LQfCFwABBNyADQagEakG4jMAAQfSGwAAQrwIACwkAIAAgARDlAQuKBwEGfwJ/AkACQAJAIAJBCU8EQCADIAIQ5QEiBw0BQQAMBAtBgIB8QQhBCBD5AUEUQQgQ+QFqQRBBCBD5AWprQXdxQQNrIgFBAEEQQQgQ+QFBAnRrIgIgASACSRsgA00NAUEQIANBBGpBEEEIEPkBQQVrIANLG0EIEPkBIQIgABCJAiIBIAEQ/QEiBRCGAiEEAkACQAJAAkACQAJAAkAgARCAAkUEQCACIAVNDQEgBEHstsEAKAIARg0CIARB6LbBACgCAEYNAyAEEP4BDQcgBBD9ASIGIAVqIgggAkkNByAIIAJrIQUgBkGAAkkNBCAEEOgBDAULIAEQ/QEhBCACQYACSQ0GIAQgAmtBgYAISSACQQRqIARNcQ0FIAEoAgAiBSAEakEQaiEGIAJBH2pBgIAEEPkBIQRBACICRQ0GIAIgBWoiASAEIAVrIgBBEGsiAzYCBCABIAMQhgJBBzYCBCABIABBDGsQhgJBADYCBEHwtsEAQfC2wQAoAgAgBCAGa2oiADYCAEGMt8EAQYy3wQAoAgAiAyACIAIgA0sbNgIAQfS2wQBB9LbBACgCACICIAAgACACSRs2AgAMCQtBEEEIEPkBIAUgAmsiBEsNBCABIAIQhgIhBSABIAIQgQIgBSAEEIECIAUgBBDnAQwEC0HktsEAKAIAIAVqIgUgAk0NBCABIAIQhgIhBCABIAIQgQIgBCAFIAJrIgJBAXI2AgRB5LbBACACNgIAQey2wQAgBDYCAAwDC0HgtsEAKAIAIAVqIgUgAkkNAwJAQRBBCBD5ASAFIAJrIgRLBEAgASAFEIECQQAhBEEAIQUMAQsgASACEIYCIgUgBBCGAiEGIAEgAhCBAiAFIAQQhAIgBiAGKAIEQX5xNgIEC0HotsEAIAU2AgBB4LbBACAENgIADAILIARBDGooAgAiCSAEQQhqKAIAIgRHBEAgBCAJNgIMIAkgBDYCCAwBC0HQs8EAQdCzwQAoAgBBfiAGQQN2d3E2AgALQRBBCBD5ASAFTQRAIAEgAhCGAiEEIAEgAhCBAiAEIAUQgQIgBCAFEOcBDAELIAEgCBCBAgsgAQ0DCyADEOYBIgJFDQEgAiAAIAMgARD9AUF4QXwgARCAAhtqIgEgASADSxsQ3QIgABDrAQwDCyAHIAAgAyABIAEgA0sbEN0CGiAAEOsBCyAHDAELIAEQgAIaIAEQiAILCykBAX8CQCAAQQEQ5QEiAUUNACABEIkCEIACDQAgAUEAIAAQ3wIaCyABC/0CAQV/IwBBMGsiAyQAAkACQAJAAkAgASgCCCICIAFBDGooAgBGDQADQCABIAJBBGo2AgggAigCACICRQ0BIAMgAjYCECACLQAIIQQgAkEBOgAIIAMgBEEBcSIEOgAXIAQNAiACQQhqIQRBACEFQcSzwQAoAgBB/////wdxBEAQ4AFBAXMhBQsgBC0AAQ0DIAIoAgwgAkEANgIMAkAgBQ0AQcSzwQAoAgBB/////wdxRQ0AEOABDQAgBEEBOgABCyACQQA6AAggAiACKAIAIgJBAWs2AgAgAkEBRgRAIANBEGoQTwsNBCABKAIIIgIgASgCDEcNAAsLIABBADYCACADQTBqJAAPCyADQSxqQQA2AgAgA0EoakGsmcAANgIAIANCATcCHCADQaSZwAA2AhggA0EXaiADQRhqEFAACyADIAU6ABwgAyAENgIYQbycwABBKyADQRhqQYidwABB8JjAABCvAgALIwBBEGskAEHgm8AAQStB7JrAABCdAgALgAEBAn8CQCAAKAIAIgIoAgwiAUUNACABIAEoAgAiAUEBazYCACABQQFGBEAgAigCDBBdCyACKAIQIgEgASgCACIBQQFrNgIAIAFBAUcNACACKAIQEFkLAkAgACgCACIAQX9GDQAgACAAKAIEIgJBAWs2AgQgAkEBRw0AIAAQ6wELC2cBAX8jAEEgayICJAAgAkGAmcAANgIEIAIgADYCACACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCACQZidwAAgAkEEakGYncAAIAJBCGpBjJrAABCsAgALDQBC9Pme5u6jqvn+AAsrAAJ/IAAoAgAtAABFBEAgAUGfmMEAQQUQnAIMAQsgAUGbmMEAQQQQnAILC+IDAgV/AX4jAEEwayIBJAAgASAAKAIENgIMIAEgACgCACIFNgIIIAFBKGoiAyAAQRhqKQIANwMAIAFBIGogAEEQaikCADcDACABIAApAggiBjcDGCAGpyABQRhqQQRyIAEoAiwQVCAAKAIgIgItAAghBCACQQE6AAggASAEQQFxIgQ6ABcCQCAERQRAIAJBCGohAkEAIQMCQAJ/AkBBxLPBACgCAEH/////B3EEQBDgASEDIAItAAFFDQEgA0EBcyEDDAULIAItAAENBCACQQE6AAIgAkEBagwBCyACQQE6AAIgA0UNASACQQFqC0HEs8EAKAIAQf////8HcUUNABDgAQ0AQQE6AAALIAJBADoAACAFIAUoAgAiAkEBazYCACACQQFGBEAgAUEIahBVCyABQQhqQQRyEGwgASgCDCICIAIoAgAiAkEBazYCACACQQFGBEAgASgCDBBWCyAAKAIgIgIgAigCACICQQFrNgIAIAJBAUYEQCAAKAIgEFYLIAFBMGokAA8LIAFBLGpBADYCACADQayZwAA2AgAgAUIBNwIcIAFBpJnAADYCGCABQRdqIAFBGGoQUAALIAEgAzoAHCABIAI2AhhBvJzAAEErIAFBGGpB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AgwgBCAHIApqNgIICyADIARBCGoQcCAEQRBqJAAMAgsgByAGQdixwAAQmwIAC0HwrsAAQSFByLHAABCdAgALIAkgAkEIaiICRw0ACwsgBUHoAWohAiMAQUBqIgMkACADQThqIAVBEGoiBEE4aikDADcDACADQTBqIARBMGopAwA3AwAgA0EoaiAEQShqKQMANwMAIANBIGogBEEgaikDADcDACADQRhqIARBGGopAwA3AwAgA0EQaiAEQRBqKQMANwMAIANBCGogBEEIaikDADcDACADIAQpAwA3AwAgBC0A0AEiBkGBAU8EQCAGQYABQeixwAAQmwIACyAEQdAAaiAGIAMgBCkDQCAEQcgAaikDACAELQDRAUEAEG4gAiAELQDSAToAQCACIAMpAzg3ADggAiADKQMwNwAwIAIgAykDKDcAKCACIAMpAyA3ACAgAiADKQMYNwAYIAIgAykDEDcAECACIAMpAwg3AAggAiADKQMANwAAIANBQGskACAFQQhqIQMgAi0AQCIEQcEATwRAIARBwABB+LHAABCbAgALIAMgBDYCBCADIAI2AgAgBSgCDCICIAFHDQEgACAFKAIIIAEQ3QIaIAVBsANqJAAPCyAFQSRqQQE2AgAgBUIBNwIUIAVBwJbAADYCECAFQSQ2AqwDIAUgBUGoA2o2AiAgBSAFQaQDajYCqAMgBUEQakGgl8AAEKECAAsgASACQdShwAAQzgIAC9sFAQ5/IwBBoAFrIgQkAAJAAkACQAJAIAFBwQBPBEAgBEFAayIJQgA3AwAgBEE4aiIKQgA3AwAgBEEwaiILQgA3AwBBICEFIARBKGpCADcDACAEQSBqIgZCADcDACAEQRhqIgdCADcDACAEQRBqIghCADcDACAEQgA3AwggBEGAAWoiDEIANwMAIARB+ABqIg1CADcDACAEQfAAaiIOQgA3AwAgBEHoAGpCADcDACAEQeAAaiIPQgA3AwAgBEHYAGoiEEIANwMAIARB0ABqIhFCADcDACAEQgA3A0ggBEGUAWogAzYCACAEIAI2ApABIARBBDYCjAEgBCAEQZwBajYCiAEgBCABNgKcASAEQQhqQcAAIARBiAFqQQIQZiAAQRhqIAYpAwA3AAAgAEEQaiAHKQMANwAAIABBCGogCCkDADcAACAAIAQpAwg3AAAgAUEgayIDQcEATwRAQSAhAgNAIAwgCSkDADcDACANIAopAwA3AwAgDiALKQMANwMAIARB6ABqIARBKGopAwA3AwAgDyAGKQMANwMAIBAgBykDADcDACARIAgpAwA3AwAgBCAEKQMINwNIIARBwAA2AowBIAQgBEHIAGo2AogBIARBCGpBwAAgBEGIAWpBARBmIAJBIGoiBSACSQ0EIAEgBUkNBiAAIAJqIgIgBCkDCDcAACACQRhqIAYpAwA3AAAgAkEQaiAHKQMANwAAIAJBCGogCCkDADcAACAFIQIgA0EgayIDQcAASw0ACwsgASAFSQ0DIARBwAA2AowBIAQgBEEIajYCiAEgACAFaiABIAVrIARBiAFqQQEQZgwBCyAEQdQAaiADNgIAIAQgAjYCUCAEQQQ2AkwgBCABNgIIIAQgBEEIajYCSCAAIAEgBEHIAGpBAhBmCyAEQaABaiQADwtBkJbAAEEcQfyjwAAQnQIACyAFIAFBnKTAABCeAgALIAUgAUGMpMAAEJsCAAvsGQIUfg5/IwBBgBBrIhkkACAZIAFBgAgQ3QIhGUEAIQEDQCABIBlqIhggGCkDACAAIAFqIhopAwCFNwMAIBhBCGoiGyAbKQMAIBpBCGopAwCFNwMAIBhBEGoiGyAbKQMAIBpBEGopAwCFNwMAIBhBGGoiGCAYKQMAIBpBGGopAwCFNwMAIAFBIGoiAUGACEcNAAsgGUGACGogGUGACBDdAhogAwRAQQAhAQNAIBlBgAhqIAFqIgAgACkDACABIAJqIgMpAwCFNwMAIABBCGoiGCAYKQMAIANBCGopAwCFNwMAIABBEGoiGCAYKQMAIANBEGopAwCFNwMAIABBGGoiACAAKQMAIANBGGopAwCFNwMAIAFBIGoiAUGACEcNAAsLQQAhAQNAIAEgGWoiAEEYaiIDIABBOGoiGCkDACIHIAMpAwAiBHwgB0L/////D4MgBEIBhkL+////H4N+fCIEIABB+ABqIgMpAwCFQiCJIgwgAEHYAGoiGikDACIIfCAMQv////8PgyAIQgGGQv7///8fg358IgggB4VCKIkiByAEfCAHQv////8PgyAEQgGGQv7///8fg358IgQgAEEgaiIbKQMAIgogACkDACIFfCAKQv////8PgyAFQgGGQv7///8fg358IgUgAEHgAGoiHCkDAIVCIIkiDSAAQUBrIh0pAwAiC3wgDUL/////D4MgC0IBhkL+////H4N+fCILIAqFQiiJIgogBXwgCkL/////D4MgBUIBhkL+////H4N+fCIFIA2FQjCJIg0gC3wgDUL/////D4MgC0IBhkL+////H4N+fCILIAqFQgGJIgp8IARCAYZC/v///x+DIApC/////w+DfnwiDiAAQTBqIh4pAwAiBiAAQRBqIh8pAwAiCXwgBkL/////D4MgCUIBhkL+////H4N+fCIJIABB8ABqIiApAwCFQiCJIg8gAEHQAGoiISkDACITfCAPQv////8PgyATQgGGQv7///8fg358IhMgBoVCKIkiBiAJfCAGQv////8PgyAJQgGGQv7///8fg358IgkgD4VCMIkiD4VCIIkiFSAAQShqIiIpAwAiFCAAQQhqIiMpAwAiEHwgFEL/////D4MgEEIBhkL+////H4N+fCIQIABB6ABqIiQpAwCFQiCJIhEgAEHIAGoiJSkDACISfCARQv////8PgyASQgGGQv7///8fg358IhIgFIVCKIkiFCAQfCAUQv////8PgyAQQgGGQv7///8fg358IhAgEYVCMIkiESASfCARQv////8PgyASQgGGQv7///8fg358IhJ8IBVC/////w+DIBJCAYZC/v///x+DfnwiFiAKhUIoiSIKIA58IApC/////w+DIA5CAYZC/v///x+DfnwiFzcDACAfIAcgBCAMhUIwiSIHIAh8IAdC/////w+DIAhCAYZC/v///x+DfnwiBIVCAYkiDCAJfCAMQv////8PgyAJQgGGQv7///8fg358IgggEYVCIIkiDiALfCAOQv////8PgyALQgGGQv7///8fg358IgsgDIVCKIkiDCAIfCAMQv////8PgyAIQgGGQv7///8fg358IhE3AwAgIyANIA8gE3wgD0L/////D4MgE0IBhkL+////H4N+fCIIIAaFQgGJIg0gEHwgDUL/////D4MgEEIBhkL+////H4N+fCIGhUIgiSIJIAR8IAlC/////w+DIARCAYZC/v///x+DfnwiBCANhUIoiSINIAZ8IA1C/////w+DIAZCAYZC/v///x+DfnwiDzcDACAAIAcgEiAUhUIBiSIGIAV8IAZC/////w+DIAVCAYZC/v///x+DfnwiBYVCIIkiByAIfCAIQgGGQv7///8fgyAHQv////8Pg358IgggBoVCKIkiBiAFfCAGQv////8PgyAFQgGGQv7///8fg358IhM3AwAgICAVIBeFQjCJIgU3AwAgAyAHIBOFQjCJIgc3AwAgJCAOIBGFQjCJIg43AwAgHCAJIA+FQjCJIgk3AwAgJSAFIBZ8IAVC/////w+DIBZCAYZC/v///x+DfnwiBTcDACAaIAQgCXwgCUL/////D4MgBEIBhkL+////H4N+fCIENwMAICEgByAIfCAHQv////8PgyAIQgGGQv7///8fg358Igc3AwAgHSALIA58IA5C/////w+DIAtCAYZC/v///x+DfnwiCDcDACAbIAUgCoVCAYk3AwAgGCAIIAyFQgGJNwMAIB4gBCANhUIBiTcDACAiIAYgB4VCAYk3AwAgAUGAAWoiAUGACEcNAAtBACEBA0AgASAZaiIAQYgBaiIDIABBgAJqIhgpAwAiByAAKQMAIgR8IAdC/////w+DIARCAYZC/v///x+DfnwiBCAAQYAGaiIaKQMAhUIgiSIMIABBgARqIhspAwAiCHwgDEL/////D4MgCEIBhkL+////H4N+fCIIIAeFQiiJIgcgBHwgB0L/////D4MgBEIBhkL+////H4N+fCIEIAyFQjCJIgwgCHwgDEL/////D4MgCEIBhkL+////H4N+fCIIIAeFQgGJIgcgAEGIA2oiHCkDACIKIAMpAwAiBXwgCkL/////D4MgBUIBhkL+////H4N+fCIFIABBiAdqIgMpAwCFQiCJIg0gAEGIBWoiHSkDACILfCANQv////8PgyALQgGGQv7///8fg358IgsgCoVCKIkiCiAFfCAKQv////8PgyAFQgGGQv7///8fg358IgV8IAdC/////w+DIAVCAYZC/v///x+DfnwiDiAAQYADaiIeKQMAIgYgAEGAAWoiHykDACIJfCAGQv////8PgyAJQgGGQv7///8fg358IgkgAEGAB2oiICkDAIVCIIkiDyAAQYAFaiIhKQMAIhN8IA9C/////w+DIBNCAYZC/v///x+DfnwiEyAGhUIoiSIGIAl8IAZC/////w+DIAlCAYZC/v///x+DfnwiCSAPhUIwiSIPhUIgiSIVIABBiAJqIiIpAwAiFCAAQQhqIiMpAwAiEHwgFEL/////D4MgEEIBhkL+////H4N+fCIQIABBiAZqIiQpAwCFQiCJIhEgAEGIBGoiJSkDACISfCARQv////8PgyASQgGGQv7///8fg358IhIgFIVCKIkiFCAQfCAUQv////8PgyAQQgGGQv7///8fg358IhAgEYVCMIkiESASfCARQv////8PgyASQgGGQv7///8fg358IhJ8IBVC/////w+DIBJCAYZC/v///x+DfnwiFiAHhUIoiSIHIA58IAdC/////w+DIA5CAYZC/v///x+DfnwiFzcDACAfIAogBSANhUIwiSIKIAt8IApC/////w+DIAtCAYZC/v///x+DfnwiBYVCAYkiDSAJfCANQv////8PgyAJQgGGQv7///8fg358IgsgEYVCIIkiDiAIfCAOQv////8PgyAIQgGGQv7///8fg358IgggDYVCKIkiDSALfCANQv////8PgyALQgGGQv7///8fg358IhE3AwAgIyAMIA8gE3wgD0L/////D4MgE0IBhkL+////H4N+fCIMIAaFQgGJIgsgEHwgC0L/////D4MgEEIBhkL+////H4N+fCIGhUIgiSIJIAV8IAlC/////w+DIAVCAYZC/v///x+DfnwiBSALhUIoiSILIAZ8IAtC/////w+DIAZCAYZC/v///x+DfnwiDzcDACAAIAogEiAUhUIBiSIKIAR8IApC/////w+DIARCAYZC/v///x+DfnwiBIVCIIkiBiAMfCAGQv////8PgyAMQgGGQv7///8fg358IgwgCoVCKIkiCiAEfCAKQv////8PgyAEQgGGQv7///8fg358IhM3AwAgICAVIBeFQjCJIgQ3AwAgAyAGIBOFQjCJIgY3AwAgJCAOIBGFQjCJIg43AwAgGiAJIA+FQjCJIgk3AwAgJSAEIBZ8IARC/////w+DIBZCAYZC/v///x+DfnwiBDcDACAdIAUgCXwgCUL/////D4MgBUIBhkL+////H4N+fCIFNwMAICEgBiAMfCAGQv////8PgyAMQgGGQv7///8fg358Igw3AwAgGyAIIA58IA5C/////w+DIAhCAYZC/v///x+DfnwiCDcDACAYIAQgB4VCAYk3AwAgHCAIIA2FQgGJNwMAIB4gBSALhUIBiTcDACAiIAogDIVCAYk3AwAgAUEQaiIBQYABRw0ACyACIBlBgAhqQYAIEN0CIQNBACEBA0AgASADaiIAIAApAwAgASAZaiICKQMAhTcDACAAQQhqIhggGCkDACACQQhqKQMAhTcDACAAQRBqIhggGCkDACACQRBqKQMAhTcDACAAQRhqIgAgACkDACACQRhqKQMAhTcDACABQSBqIgFBgAhHDQALIBlBgBBqJAALpwMBA38jAEEwayIEJABBm6nAACECQRMhAwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAtAABBAWsOEgABAgMEBQYHCAkKCwwNDg8QERILQYmpwAAhAkESIQMMEQtB9KjAACECQRUhAwwQC0HgqMAAIQJBFCEDDA8LQc+owAAhAkERIQMMDgtBv6jAACECQRAhAwwNC0GjqMAAIQJBHCEDDAwLQYiowAAhAkEbIQMMCwtB9afAACECDAoLQeOnwAAhAkESIQMMCQtBzafAACECQRYhAwwIC0G3p8AAIQJBFiEDDAcLQZ+nwAAhAkEYIQMMBgtBh6fAACECQRghAwwFC0H6psAAIQJBDSEDDAQLQeymwAAhAkEOIQMMAwtBzabAACECQR8hAwwCC0GrpsAAIQJBIiEDDAELQZymwAAhAkEPIQMLIARBHGpBATYCACAEIAM2AiwgBCACNgIoIARBJzYCJCAEQgE3AgwgBEHMpcAANgIIIAQgBEEoajYCICAEIARBIGo2AhggASAEQQhqEMMCIARBMGokAAtnAQF/IwBBIGsiAiQAIAJBrqrAADYCBCACIAA2AgAgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkGorMAAIAJBBGpBqKzAACACQQhqQbirwAAQrAIACysAIwBBEGsiACQAIAAgAUG4rMAAQQsQxgI3AwggAEEIahCzAiAAQRBqJAALmQIBBX8jAEEgayIBJAAgACgCACIALQAIIQIgAEEBOgAIIAEgAkEBcSICOgAHAkACQCACRQRAIABBCGohAkHEs8EAKAIAQf////8HcQRAEOABQQFzIQMLIAItAAENASAAKAIMIgRBAWsiBSAESw0CIAAgBTYCDAJAIAMNAEHEs8EAKAIAQf////8HcUUNABDgAQ0AIAJBAToAAQsgAkEAOgAAIAFBIGokAA8LIAFBHGpBADYCACABQRhqQcSuwAA2AgAgAUIBNwIMIAFB0KrAADYCCCABQQdqIAFBCGoQagALIAEgAzoA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ACAAQeC3wAA2AhggAEIBNwIMIABB1NDAADYCCCABIABBCGoQwwIMAwsgAEEcakEANgIAIABB4LfAADYCGCAAQgE3AgwgAEG42sAANgIIIAEgAEEIahDDAgwCCyAAQRxqQQA2AgAgAEHgt8AANgIYIABCATcCDCAAQbTQwAA2AgggASAAQQhqEMMCDAELIABBHGpBATYCACAAQgE3AgwgAEHkzsAANgIIIABBPzYCJCAAIAJBBGo2AiwgACAAQSBqNgIYIAAgAEEsajYCICABIABBCGoQwwILIABBMGokAAveAQEBfyMAQTBrIgIkAAJ/AkACQAJAIAAoAgAiACgCAEEBaw4CAQIACyACQRxqQQA2AgAgAkHgt8AANgIYIAJCATcCDCACQbTPwAA2AgggASACQQhqEMMCDAILIAJBHGpBADYCACACQeC3wAA2AhggAkIBNwIMIAJBjM/AADYCCCABIAJBCGoQwwIMAQsgAkEcakEBNgIAIAJCATcCDCACQeTOwAA2AgggAkE/NgIkIAIgAEEEajYCLCACIAJBIGo2AhggAiACQSxqNgIgIAEgAkEIahDDAgsgAkEwaiQACwwAIAAoAgAgARCgAgueAQEBfyMAQUBqIgIkACAAKAIAIQAgAkEUakEDNgIAIAJBLGpBwAA2AgAgAkEkakHAADYCACACIABBGGo2AjQgAiAANgI4IAJCAzcCBCACQdTXwAA2AgAgAkHBADYCHCACIABBDGo2AjwgAiACQRhqNgIQIAIgAkE8ajYCKCACIAJBOGo2AiAgAiACQTRqNgIYIAEgAhDDAiACQUBrJAALlQIBAX8gACgCACECIwBBMGsiACQAAn8CQAJAAkACQCACKAIAQQFrDgMBAgMACyAAQRxqQQA2AgAgAEHgt8AANgIYIABCATcCDCAAQfDQwAA2AgggASAAQQhqEMMCDAMLIABBHGpBADYCACAAQeC3wAA2AhggAEIBNwIMIABB1NDAADYCCCABIABBCGoQwwIMAgsgAEEcakEANgIAIABB4LfAADYCGCAAQgE3AgwgAEG00MAANgIIIAEgAEEIahDDAgwBCyAAQRxqQQE2AgAgAEIBNwIMIABB5M7AADYCCCAAQT82AiQgACACQQRqNgIsIAAgAEEgajYCGCAAIABBLGo2AiAgASAAQQhqEMMCCyAAQTBqJAAL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AyENIAsgFUsNAyASIAs2AjgMAwtBgLPAAEEcQcC/wAAQnQIACyACIBVB0L/AABCZAgALIANCCIghBCADpyENCyASKAI0IQIgEigCMCEBIAACfwJAIA1B/wFxQQNHBEAgEiANOgAgIBIgBD4AISASIARCMIg8ACcgEiAEQiCIPQAlIAJFIAFFckUEQCABEOsBCyASKAIgIQEgEiAEQhiIPgIsIBIgATYCKCASQgA3AjQgEkHgt8AAKAIANgIwIBJBQGsiCyASQTBqQdizwAAQwAIjAEEwayIBJAACfwJAAkACQCASQShqIgItAABBAWsOAgECAAsgASACQQRqKAIANgIAIAEgAi0AAToAByABQRxqQQI2AgAgAUEsakEkNgIAIAFCAzcCDCABQezrwAA2AgggAUHrADYCJCABIAFBIGo2AhggASABNgIoIAEgAUEHajYCICALIAFBCGoQwwIMAgsgAUEcakEANgIAIAFB3OvAADYCGCABQgE3AgwgAUHU68AANgIIIAsgAUEIahDDAgwBCyABIAJBBGooAgA2AgAgASACLQABOgAHIAFBHGpBAjYCACABQSxqQSQ2AgAgAUIDNwIMIAFBkOvAADYCCCABQesANgIkIAEgAUEgajYCGCABIAE2AiggASABQQdqNgIgIAsgAUEIahDDAgsgAUEwaiQARQ0BQfCzwABBNyASQegAakG0tsAAQfS0wAAQrwIACyASKAI4IQ0gAEEIaiACNgIAIAAgATYCBEEADAELIBJBCGogEkEYaikDACIDNwMAIBIgEikDECIENwMAIBIoAjAhDSASKQI0IQUgAEEgaiADNwIAIABBGGogBDcCACAAQRBqIAU3AwAgAEEIakEENgIAQQELNgIAIABBDGogDTYCACASQfAAaiQAC70CAQR/IwBBIGsiAiQAIAEoAgAhBCACIAFBCGooAgAiBUGAAhDSAQJAAkACQCACKAIABEAgAigCBCIBQQBIDQFBASEDIAEEQCABEE0iA0UNAwsgBCAFQYACIAMgARDRASACQQhqIAMgARDPAiACKAIIQQFGDQMgACABNgIIIAAgATYCBCAAIAM2AgAgAkEgaiQADwsjAEEQayIAJAAgAEHEwcAANgIIIABBLTYCBCAAQZTBwAA2AgAgACgCACEBIAAoAgQhAiAAKAIIIQMjAEEQayIAJAAgACACNgIMIAAgATYCCCAAQQhqQcSzwABBACADEPEBAAsQkwIACyABQQEQkgIACyACIAIpAgw3AhQgAiABNgIQIAIgATYCDCACIAM2AghB9cDAAEEMIAJBCGpBpLbAAEGEwcAAEK8CAAsZACAAIAFBCGooAgA2AgQgACABKAIANgIAC8AEAQJ/IwBBQGoiAiQAAkACQAJAAkACQAJAIAAoAgBBAWsOBAECAwQACyACIABBBGo2AgQgAkEYaiIDIABBEGooAgAgAEEYaigCABCVAiACQRRqQcMANgIAIAJBPGpBAjYCACACQcAANgIMIAJCAjcCLCACQdzDwAA2AiggAiADNgIQIAIgAkEEajYCCCACIAJBCGo2AjggASACQShqEMMCIQAgAigCGEUNBCACQSBqKAIARQ0EIAIoAhwiAUUNBCABEOsBDAQLIAIgAEEEajYCBCACQRhqIgMgAEEQaigCACAAQRhqKAIAEJUCIAJBFGpBwwA2AgAgAkE8akECNgIAIAJBwAA2AgwgAkICNwIsIAJBtMPAADYCKCACIAM2AhAgAiACQQRqNgIIIAIgAkEIajYCOCABIAJBKGoQwwIhACACKAIYRQ0DIAJBIGooAgBFDQMgAigCHCIBRQ0DIAEQ6wEMAwsgAiAAQQRqNgIIIAJBPGpBATYCACACQgE3AiwgAkGQw8AANgIoIAJBwAA2AhwgAiACQRhqNgI4IAIgAkEIajYCGCABIAJBKGoQwwIhAAwCCyACQTxqQQA2AgAgAkHgt8AANgI4IAJCATcCLCACQfTCwAA2AiggASACQShqEMMCIQAMAQsgAiAAQQRqNgIIIAJBPGpBATYCACACQgE3AiwgAkHYwsAANgIoIAJBwAA2AhwgAiACQRhqNgI4IAIgAkEIajYCGCABIAJBKGoQwwIhAAsgAkFAayQAIAALuQMBCH8CQAJAAkACQAJAAkAgAkEDdCIGRQRADAELIAFBBGohBCAGIQUDQCADIAMgBCgCAGoiA0sNAiAEQQhqIQQgBUEIayIFDQALCyACQf////8DcSACRw0BIAMgAkECdGoiBSADSQ0DAkACQCAFQQBOBEAgBQ0BQQEhAwwCCxCTAgALIAVBARBLIgNFDQMLIAAgAzYCAEEAIQQgAEEIaiIHQQA2AgAgAEEEaiIIIAU2AgAgAkUNBCABIAZqIQYDQCABQQRqKAIAIgJBCHZBgP4DcSACQRh2ciEJIAEoAgAhCiACIAUgBGtLBEAgACAEIAIQDyAHKAIAIQQgACgCACEDCyADIARqIAogAhDdAhogByACIARqIgM2AgAgCCgCACADa0EDTQRAIAAgA0EEEA8gBygCACEDCyAHIANBBGoiBDYCACADIAAoAgAiA2ogAkEIdEGAgPwHcSACQRh0ciAJcjYAACAGIAFBCGoiAUYNBSAIKAIAIQUMAAsAC0GAs8AAQRxBnLfAABCdAgALQaCzwABBIUGoxMAAEJ0CAAsgBUEBEJICAAtBgLPAAEEcQbjEwAAQnQIACwtkAQJ/AkACQAJAAkAgAEEATgRAIAANAUEBIQIMAgsQkwIACyAAQQEQSyICRQ0BC0EMQQQQSyIBRQ0BIAFBADYCCCABIAA2AgQgASACNgIAIAEPCyAAQQEQkgIAC0EMQQQQkgIAC58BAQN/IwBBIGsiASQAAkAgAARAIAAoAgAiAkUNASAAKAIEIAAQ6wEEQCACEOsBCyABQSBqJAAPCyABQRxqQQA2AgAgAUHgt8AANgIYIAFCATcCDCABQfTNwAA2AgggAUEIakH8zcAAEKECAAsgAUEcakEANgIAIAFB4LfAADYCGCABQgE3AgwgAUGszsAANgIIIAFBCGpBtM7AABChAgALtAECAX8BfiMAQSBrIgEkAAJAQQxBBBBLIgQEQCAEIAM2AgggBCADNgIEIAQgAjYCAAJAIAQQASICRQRAIABBADYCAAwBCyACKAIAIgNFDQIgAikCBCEFIAIQ6wEgACAFNwIEIAAgAzYCAAsgBBDrASABQSBqJAAPC0EMQQQQkgIACyABQRxqQQA2AgAgAUHgt8AANgIYIAFCATcCDCABQazOwAA2AgggAUEIakG0zsAAEKECAAuzAQEBfyMAQSBrIgAkAAJAAkAgBARAQQxBBBBLIgVFDQEgBSACNgIIIAUgAjYCBCAFIAE2AgBBDEEEEEsiAUUNAiABIAQ2AgggASAENgIEIAEgAzYCACAFIAEQAiABEOsBIAUQ6wEgAEEgaiQADwsgAEEcakEANgIAIABB4LfAADYCGCAAQgE3AgwgAEHMyMAANgIIIABBCGpB+MjAABChAgALQQxBBBCSAgALQQxBBBCSAgALNABBDEEEEEsiAEUEQEEMQQQQkgIACyAAIAI2AgggACACNgIEIAAgATYCACAAEAMgABDrAQuaBAICfwF+IwBBQGoiASQAAkACQAJAAkACQAJAAkACQCADQYACTQRAQQxBBBBLIgRFDQUgBCADNgIIIAQgAzYCBCAEIAI2AgAgBBAEIgUNAyADDQFBASEFDAILQSBBARBLIgJFDQUgAEEBNgIAIAJBGGpBoMnAACkAADcAACACQRBqQZjJwAApAAA3AAAgAkEIakGQycAAKQAANwAAIAJBiMnAACkAADcAACAAQRBqQqCAgICABDcDACAAQQxqIAI2AgAgAEEIakEDNgIADAMLIANBARBLIgVFDQULIAUgAiADEN0CIQIgAEEMaiADNgIAIABBCGogAzYCACAAIAI2AgQgAEEANgIAIAQQ6wEMAQsgBSgCACICRQ0EIAUpAgQhBiAFEOsBIAEgBjcCBCABIAI2AgAgAUE8akEBNgIAIAFCATcCLCABQcDJwAA2AiggAUHEADYCJCABIAFBIGo2AjggASABNgIgIAFBEGogAUEoahCUAiAAQQhqQQM2AgAgAEEMaiABKQMQNwIAIABBFGogAUEYaigCADYCACAAQQE2AgACQCABKAIERQ0AIAEoAgAiAEUNACAAEOsBCyAEEOsBCyABQUBrJAAPC0EMQQQQkgIAC0EgQQEQkgIACyADQQEQkgIACyABQTxqQQA2AgAgAUHgt8AANgI4IAFCATcCLCABQazOwAA2AiggAUEoakG0zsAAEKECAAvEBAIBfwF+IwBBQGoiASQAAkACQAJAAkACQAJAAkAgA0GAAk0EQEEMQQQQSyIERQ0DIAQgAzYCCCAEIAM2AgQgBCACNgIAQcAAQQEQSyIDRQ0EQQxBBBBLIgJFDQUgAkLAADcCBCACIAM2AgAgBCACEAUiAw0BIAIoAgAiA0UNByACKQIEIQUgAhDrASAAQQhqIAU3AgAgACADNgIEIABBADYCACAEEOsBDAILQSRBARBLIgJFDQUgAEEBNgIAIAJBIGpB6MnAACgAADYAACACQRhqQeDJwAApAAA3AAAgAkEQakHYycAAKQAANwAAIAJBCGpB0MnAACkAADcAACACQcjJwAApAAA3AAAgAEEQakKkgICAwAQ3AwAgAEEMaiACNgIAIABBCGpBAzYCAAwBCyADKAIAIgJFDQUgAykCBCEFIAMQ6wEgASAF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QThqQbS2wABB9LTAABCvAgALIARBATYC2AIgBEGwA2ogBEH4AmopAwA3AwAgBEGoA2ogBEHwAmopAwA3AwAgBEGgA2ogBEHoAmopAwA3AwAgBCADKQMANwOYAyAEQgA3ArwDIARB4LfAACgCADYCuAMgBiAEQbgDakHYs8AAEMACIARBmANqIAYQsQENASAAQQhqIAQpA7gDNwIAIABBEGogBEHAA2ooAgA2AgAgAEEcaiAVNgIAIABBGGogFDYCACAAQRRqIBM2AgAgAEKBgICAEDcCACAEQZgDahAoCyASEOsBIARB8ANqJAAPC0Hws8AAQTcgBEGAA2pBtLbAAEH0tMAAEK8CAAvZCAEBfyMAQTBrIgIkAAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4MAQIDBAUGBwgJCgsMAAsgAkEsakEBNgIAIAJCATcCHCACQdzUwAA2AhggAkHGADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMDAsgAkEsakEBNgIAIAJCATcCHCACQcDUwAA2AhggAkHHADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMCwsgAkEsakEBNgIAIAJCATcCHCACQaDUwAA2AhggAkHIADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMCgsgAkEsakEBNgIAIAJCATcCHCACQYDUwAA2AhggAkHAADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMCQsgAkEsakEBNgIAIAJCATcCHCACQejTwAA2AhggAkHAADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMCAsgAkEMakHJADYCACACQSxqQQI2AgAgAiAAQQhqNgIQIAJCAjcCHCACQcDTwAA2AhggAkHJADYCBCACIABBEGo2AhQgAiACNgIoIAIgAkEUajYCCCACIAJBEGo2AgAgASACQRhqEMMCDAcLIAJBLGpBATYCACACQgE3AhwgAkGU08AANgIYIAJBwAA2AgQgAiAAQQRqNgIUIAIgAjYCKCACIAJBFGo2AgAgASACQRhqEMMCDAYLIAJBLGpBATYCACACQgI3AhwgAkHc0sAANgIYIAJBwAA2AgQgAiAAQQRqNgIUIAIgAjYCKCACIAJBFGo2AgAgASACQRhqEMMCDAULIAJBDGpBwAA2AgAgAkEsakECNgIAIAIgAEEEajYCECACQgI3AhwgAkHA0sAANgIYIAJBwAA2AgQgAiAAQRBqNgIUIAIgAjYCKCACIAJBFGo2AgggAiACQRBqNgIAIAEgAkEYahDDAgwECyACQQxqQcAANgIAIAJBLGpBAjYCACACIABBBGo2AhAgAkICNwIcIAJBmNLAADYCGCACQcAANgIEIAIgAEEQajYCFCACIAI2AiggAiACQRRqNgIIIAIgAkEQajYCACABIAJBGGoQwwIMAwsgAkEsakEBNgIAIAJCATcCHCACQfTRwAA2AhggAkHKADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMAgsgAkEsakEBNgIAIAJCATcCHCACQeDRwAA2AhggAkHLADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMAQsgAkEsakEANgIAIAJB4LfAADYCKCACQgE3AhwgAkHI0cAANgIYIAEgAkEYahDDAgsgAkEwaiQAC0ABAn8gAEEIaigCACEBIAAoAgAhAkEMQQQQSyIARQRAQQxBBBCSAgALIAAgATYCCCAAIAE2AgQgACACNgIAIAALoQEBAn8jAEEgayICJAACQCABBEAgASgCACIDDQEgAkEcakEANgIAIAJB4LfAADYCGCACQgE3AgwgAkGszsAANgIIIAJBCGpBtM7AABChAgALIAJBHGpBADYCACACQeC3wAA2AhggAkIBNwIMIAJB9M3AADYCCCACQQhqQfzNwAAQoQIACyAAIAM2AgAgACABKQIENwIEIAEQ6wEgAkEgaiQACz4BAX8jAEEQayICJAAgAiABQcTOwABBBBDHAiACIAA2AgwgAiACQQxqQey4wAAQtQIaIAIQtgIgAkEQaiQACz4BAX8jAEEQayICJAAgAiABQcjOwABBDRDHAiACIAA2AgwgAiACQQxqQdy4wAAQtQIaIAIQtgIgAkEQaiQAC9wGAQF/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAQQFrDgwBAgMEBQYHCAkKCwwA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KAIIIQYLIANBIGogBiACEM8CIAMoAiBBAUcNBCAKRSAGRXJFBEAgBhDrAQtBDyEFDAILQQYhBQsCQCADKAIMIgJFDQAgAygCCCIKRQ0AIAoQ6wELCyAAIAU2AgQgAEEMaiACNgIAIABBCGogCjYCAEEBIQIMBwtBgOPAAEEhQeziwAAQnQIACyAAQRBqIAI2AgAgAEEMaiAKNgIAIABBCGogBjYCACAAQQE2AgRBACECDAULIAIgB0HA5MAAEJsCAAsgBCACQcDkwAAQngIACyACIAdB0OTAABCbAgALIAQgAkHQ5MAAEJ4CAAsgACABNgIEIABBCGogBDYCAAsgACACNgIAIANBMGokAA8LIAFBARCSAgALbQEGfwJAIAEoAggiAiABKAIEIgRPDQAgASgCACEFA0AgAiAFai0AACIGQQlrIgdBF01BAEEBIAd0QZOAgARxG0UEQEEBIQMMAgsgASACQQFqIgI2AgggAiAERw0ACwsgACAGOgABIAAgAzoAAAszAQN/IAAgASgCCCICIAEoAgQiA0kEfyABKAIAIAJqLQAABSAECzoAASAAIAIgA0k6AAALQwAgASgCCCICIAFBBGooAgBGBEAgASACQQEQDyABKAIIIQILIABBADYCACABIAJBAWo2AgggASgCACACakHdADoAAAtDACABKAIIIgIgAUEEaigCAEYEQCABIAJBARAPIAEoAgghAgsgAEEANgIAIAEgAkEBajYCCCABKAIAIAJqQf0AOgAAC4cBAQJ/IAEoAggiAiABQQRqIgMoAgAiBEYEQCABIAJBARAPIAMoAgAhBCABKAIIIQILIAEgAkEBaiIDNgIIIAIgASgCACICakH9ADoAACADIARGBEAgASAEQQEQDyABKAIIIQMgASgCACECCyAAQQA2AgAgASADQQFqNgIIIAIgA2pB/QA6AAALKQEBf0GACEEBEEsiAUUEQEGACEEBEJICAAsgAEKACDcCBCAAIAE2AgAL+wMBBH8jAEEQayIDJABBCCEEIANBCGoiBUEAOgAAIANCADcDACADIAIgAkEKbiIGQQpsa0EwcjoACQJ/IAJBCkkEQCADQQlqIQVBAQwBCyADIAZBCnBBMHI6AAgCQCACQeMATQ0AIAMgAkHkAG5BCnBBMHI6AAcgAkHoB0kEQEEHIQQgA0EHciEFDAELIAMgAkHoB25BCnBBMHI6AAYgAkGQzgBJBEBBBiEEIANBBnIhBQwBCyADIAJBkM4AbkEKcEEwcjoABSACQaCNBkkEQEEFIQQgA0EFciEFDAELIAMgAkGgjQZuQQpwQTByOgAEIAJBwIQ9SQRAQQQhBCADQQRyIQUMAQsgAyACQcCEPW5BCnBBMHI6AAMgAkGAreIESQRAQQMhBCADQQNyIQUMAQsgAyACQYCt4gRuQQpwQTByOgACIAJBgMLXL0kEQEECIQQgA0ECciEFDAELIAMgAkGAwtcvbkEKcEEwcjoAASACQYCU69wDSQRAQQEhBCADQQFyIQUMAQsgAyACQYCU69wDbkEwcjoAAEEAIQQgAyEFC0EKIARrCyECIAIgAUEEaigCACABQQhqIgYoAgAiBGtLBEAgASAEIAIQDyAGKAIAIQQLIAEoAgAgBGogBSACEN0CGiAAQQA2AgAgBiACIARqNgIAIANBEGokAAv8AQIEfwF+IwBBIGsiBCQAIARBF2pBADYAACAEQRBqQgA3AwAgBEIANwMIIAQgAkIKgqdBMHI6ABtBEyEDAn8gAkIKVARAIARBG2ohBkEBDAELAkADQCADIANBAWsiA08EQCAEQQhqIANqIgYgAkIKgCIHQgqCp0EwcjoAACACQuQAVCAHIQJFDQEMAgsLQYDjwABBIUHY5cAAEJ0CAAtBFCADawshAyADIAFBBGooAgAgAUEIaigCACIFa0sEQCABIAUgAxAPIAFBCGooAgAhBQsgASgCACAFaiAGIAMQ3QIaIABBADYCACABQQhqIAMgBWo2AgAgBEEgaiQAC+ENAQd/IwBBEGsiCCQAIAFBCGoiCigCACIFIAFBBGooAgBGBEAgASAFQQEQDyAKKAIAIQULIAogBUEBaiIENgIAIAEoAgAgBWpBIjoAACAIQQA2AgwCQCADRQ0AIAIgA2ohCiABQQRqIQcgAUEIaiEGA0ACfyACLAAAIgNBAE4EQCADQf8BcSEFIAJBAWoMAQsgAi0AAUE/cSEJIANBH3EhBSADQf8BcSIDQd8BTQRAIAVBBnQgCXIhBSACQQJqDAELIAItAAJBP3EgCUEGdHIhCSADQfABSQRAIAkgBUEMdHIhBSACQQNqDAELIAVBEnRBgIDwAHEgAi0AA0E/cSAJQQZ0cnIhBSACQQRqCyECIAYCfwJAAkACQAJAAkACQAJAAkAgBUEIaw4bAgMEBwUGBwcHBwcHBwcHBwcHBwcHBwcHBwcBAAsgBUHcAEcEQCAFQYCAxABHDQcMCgsgBygCACAERgRAIAEgBEEBEA8gBigCACEECyABKAIAIARqQdwAOgAAIAYgBEEBaiIENgIAIAcoAgAgBEYEQCABIARBARAPIAYoAgAhBAsgASgCACAEakHcADoAACAEQQFqDAcLIAcoAgAgBEYEQCABIARBARAPIAYoAgAhBAsgASgCACAEakHcADoAACAGIARBAWoiBDYCACAHKAIAIARGBEAgASAEQQEQDyAGKAIAIQQLIAEoAgAgBGpBIjoAACAEQQFqDAYLIAcoAgAgBEYEQCABIARBARAPIAYoAgAhBAsgASgCACAEakHcADoAACAGIARBAWoiBDYCACAHKAIAIARGBEAgASAEQQEQDyAGKAIAIQQLIAEoAgAgBGpB4gA6AAAgBEEBagwFCyAHKAIAIARGBEAgASAEQQEQDyAGKAIAIQQLIAEoAgAgBGpB3AA6AAAgBiAEQQFqIgQ2AgAgBygCACAERgRAIAEgBEEBEA8gBigCACEECyABKAIAIARqQfQAOgAAIARBAWoMBAsgBygCACAERgRAIAEgBEEBEA8gBigCACEECyABKAIAIARqQdwAOgAAIAYgBEEBaiIENgIAIAcoAgAgBEYEQCABIARBARAPIAYoAgAhBAsgASgCACAEakHuADoAACAEQQFqDAMLIAcoAgAgBEYEQCABIARBARAPIAYoAgAhBAsgASgCACAEakHcADoAACAGIARBAWoiBDYCACAHKAIAIARGBEAgASAEQQEQDyAGKAIAIQQLIAEoAgAgBGpB5gA6AAAgBEEBagwCCyAHKAIAIARGBEAgASAEQQEQDyAGKAIAIQQLIAEoAgAgBGpB3AA6AAAgBiAEQQFqIgQ2AgAgBygCACAERgRAIAEgBEEBEA8gBigCACEECyABKAIAIARqQfIAOgAAIARBAWoMAQsCfwJAAkACQCAFQSBPBEAgBUGAAUkNASAFQYAQSQ0CIAVBgIAETw0DIAggBUE/cUGAAXI6AA4gCCAFQQx2QeABcjoADCAIIAVBBnZBP3FBgAFyOgANQQMMBAsgBygCACAERgRAIAEgBEEBEA8gBigCACEECyABKAIAIARqQdwAOgAAIAYgBEEBaiIENgIAIAcoAgAgBEYEQCABIARBARAPIAYoAgAhBAsgASgCACAEakH1ADoAACAGIARBAWoiBDYCACAHKAIAIARGBEAgASAEQQEQDyAGKAIAIQQLIAEoAgAgBGpBMDoAACAGIARBAWoiBDYCACAHKAIAIARGBEAgASAEQQEQDyAGKAIAIQQLIAEoAgAgBGpBMDoAACAGIARBAWoiBDYCACAFQQ9xIglBCkkhAyAHKAIAIARGBEAgASAEQQEQDyAGKAIAIQQLIAEoAgAgBGogBUHwAXFBBHZBMHI6AAAgBiAEQQFqIgQ2AgAgBygCACAERgRAIAEgBEEBEA8gBigCACEECyABKAIAIARqIAlBMHIgCUE3aiADGzoAACAEQQFqDAQLIAcoAgAgBEYEQCABIARBARAPIAYoAgAhBAsgASgCACAEaiAFOgAAIARBAWoMAwsgCCAFQT9xQYABcjoADSAIIAVBBnZBwAFyOgAMQQIMAQsgCCAFQT9xQYABcjoADyAIIAVBEnZB8AFyOgAMIAggBUEGdkE/cUGAAXI6AA4gCCAFQQx2QT9xQYABcjoADUEECyEFIAUgBygCACAEa0sEQCABIAQgBRAPIAYoAgAhBAsgASgCACAEaiAIQQxqIAUQ3QIaIAQgBWoLIgQ2AgAgAiAKRw0ACwsgAUEEaigCACAERgRAIAEgBEEBEA8gAUEIaigCACEECyAAQQA2AgAgAUEIaiAEQQFqNgIAIAEoAgAgBGpBIjoAACAIQRBqJAALUAECfyABQQRqKAIAIAFBCGoiAygCACICa0EDTQRAIAEgAkEEEA8gAygCACECCyAAQQA2AgAgAyACQQRqNgIAIAEoAgAgAmpB7uqx4wY2AAALDQAgACABIAIgAxDLAQtUACABKAIIIgIgAUEEaigCAEYEQCABIAJBARAPIAEoAgghAgsgACABNgIEIABBADYCACABIAJBAWo2AgggAEEIakEBOgAAIAEoAgAgAmpB2wA6AAALVgEBfyABKAIIIgIgAUEEaigCAEYEQCABIAJBARAPIAEoAgghAgsgACABNgIEIABBADYCACABIAJBAWo2AgggAEEIakEBOgAAIAEoAgAgAmpB+wA6AAALqwICAn8BfiMAQSBrIgUkACABKAIIIgQgAUEEaigCAEYEQCABIARBARAPIAEoAgghBAsgASAEQQFqNgIIIAEoAgAgBGpB+wA6AAAgBUEQaiABIAIgAxDLAQJAIAUoAhBBAUcEQCABKAIIIgQgAUEEaiICKAIARgRAIAEgBEEBEA8gASgCCCEECyABKAIAIARqQTo6AAAgASAEQQFqIgQ2AgggAigCACAERgRAIAEgBEEBEA8gASgCCCEECyAAIAE2AgQgAEEANgIAIAEgBEEBajYCCCAAQQhqQQE6AAAgASgCACAEakH7ADoAAAwBCyAFQQhqIAVBHGooAgAiATYCACAFIAUpAhQiBjcDACAAQQxqIAE2AgAgACAGNwIEIABBATYCAAsgBUEgaiQAC6gRAgp/An4CfyAAIQsgAkEYdEEWdUGc/MAAaigCACEFQQAhAAJAIAFBG0kNAEEAIAFBGmsiBiABIAZJGyEIAkADQCAHQRpqIgYgB0kNASABIAZPBEACQCAAIABBIGoiBk0EQCAEIAZPDQEgBiAEQZDowAAQmwIAC0Gg5sAAQRxBgOjAABCdAgALIAAgA2oiACAFIAcgC2oiCSkAACIPQjiGIhBCOoinai0AADoAACAAQQFqIAUgECAPQiiGQoCAgICAgMD/AIOEIhBCNIinQT9xai0AADoAACAAQQJqIAUgECAPQhiGQoCAgICA4D+DIA9CCIZCgICAgPAfg4SEIhBCLoinQT9xai0AADoAACAAQQNqIAUgEEIoiKdBP3FqLQAAOgAAIABBBGogBSAQQiKIp0E/cWotAAA6AAAgAEEGaiAFIA9CCIhCgICA+A+DIA9CGIhCgID8B4OEIA9CKIhCgP4DgyAPQjiIhIQiD6ciCkEWdkE/cWotAAA6AAAgAEEHaiAFIApBEHZBP3FqLQAAOgAAIABBBWogBSAPIBCEQhyIp0E/cWotAAA6AAAgAEEIaiAFIAlBBmopAAAiD0I4hiIQQjqIp2otAAA6AAAgAEEJaiAFIBAgD0IohkKAgICAgIDA/wCDhCIQQjSIp0E/cWotAAA6AAAgAEEKaiAFIBAgD0IYhkKAgICAgOA/gyAPQgiGQoCAgIDwH4OEhCIQQi6Ip0E/cWotAAA6AAAgAEELaiAFIBBCKIinQT9xai0AADoAACAAQQxqIAUgEEIiiKdBP3FqLQAAOgAAIABBDWogBSAQIA9CCIhCgICA+A+DIA9CGIhCgID8B4OEIA9CKIhCgP4DgyAPQjiIhIQiD4RCHIinQT9xai0AADoAACAAQQ5qIAUgD6ciCkEWdkE/cWotAAA6AAAgAEEPaiAFIApBEHZBP3FqLQAAOgAAIABBEGogBSAJQQxqKQAAIg9COIYiEEI6iKdqLQAAOgAAIABBEWogBSAQIA9CKIZCgICAgICAwP8Ag4QiEEI0iKdBP3FqLQAAOgAAIABBEmogBSAQIA9CGIZCgICAgIDgP4MgD0IIhkKAgICA8B+DhIQiEEIuiKdBP3FqLQAAOgAAIABBE2ogBSAQQiiIp0E/cWotAAA6AAAgAEEUaiAFIBBCIoinQT9xai0AADoAACAAQRZqIAUgD0IIiEKAgID4D4MgD0IYiEKAgPwHg4QgD0IoiEKA/gODIA9COIiEhCIPpyIKQRZ2QT9xai0AADoAACAAQRdqIAUgCkEQdkE/cWotAAA6AAAgAEEVaiAFIA8gEIRCHIinQT9xai0AADoAACAAQRhqIAUgCUESaikAACIPQjiGIhBCOoinai0AADoAACAAQRlqIAUgECAPQiiGQoCAgICAgMD/AIOEIhBCNIinQT9xai0AADoAACAAQRpqIAUgECAPQhiGQoCAgICA4D+DIA9CCIZCgICAgPAfg4SEIhBCLoinQT9xai0AADoAACAAQRtqIAUgEEIoiKdBP3FqLQAAOgAAIABBHGogBSAQQiKIp0E/cWotAAA6AAAgAEEdaiAFIBAgD0IIiEKAgID4D4MgD0IYiEKAgPwHg4QgD0IoiEKA/gODIA9COIiEhCIPhEIciKdBP3FqLQAAOgAAIABBHmogBSAPpyIJQRZ2QT9xai0AADoAACAAQR9qIAUgCUEQdkE/cWotAAA6AAAgBiEAIAdBGGoiByAISw0DDAELCyAGIAFB8OfAABCbAgALQaDmwABBHEHg58AAEJ0CAAsCQAJAIAEgASABQQNwIgprIghPBEAgByAISQ0BIAYhAAwCC0Hw5cAAQSFBoOjAABCdAgALAkADQCAHQQNqIgkgB0kNASABIAlPBEACQCAGIAZBBGoiAE0EQCAAIARNDQEgACAEQeDowAAQmwIAC0Gg5sAAQRxB0OjAABCdAgALIAMgBmoiBiAFIAcgC2oiBy0AACIMQQJ2ai0AADoAACAGQQNqIAUgB0ECai0AACINQT9xai0AADoAACAGQQFqIAUgDEEEdCAHQQFqLQAAIgdBGHRBHHZyQT9xai0AADoAACAGQQJqIAUgB0ECdCANQRh0QR52ckE/cWotAAA6AAAgACEGIAkiByAITw0DDAELCyAJIAFBwOjAABCbAgALQaDmwABBHEGw6MAAEJ0CAAsCQAJAAkACQAJAAkACQAJAAkACQAJAIApBAWsOAgACAQsgASAITQ0CIAAgBE8NAyAAIANqIAUgCCALai0AACIHQQJ2ai0AADoAACAAQQFqIgYgBE8NBCADIAZqIAUgB0EEdEEwcWotAAA6AAAgAEECaiEACyAADAkLIAEgCE0NBCAAIARPDQUgACADaiAFIAggC2otAAAiCUECdmotAAA6AAAgCEEBaiIGIAFPDQYgAEEBaiIHIARPDQcgAyAHaiAFIAlBBHQgBiALai0AACIHQRh0QRx2ckE/cWotAAA6AAAgAEECaiIGIARPDQMgAyAGaiAFIAdBAnRBPHFqLQAAOgAAIAAgAEEDaiIGTQRAIAYMCQtBoObAAEEcQfDpwAAQnQIACyAIIAFB8OjAABCZAgALIAAgBEGA6cAAEJkCAAsgBiAEQZDpwAAQmQIACyAGIARB4OnAABCZAgALIAggAUGg6cAAEJkCAAsgACAEQbDpwAAQmQIACyAGIAFBwOnAABCZAgALIAcgBEHQ6cAAEJkCAAshBgJAAkACQAJAIAJBgAJxRQ0AIAQgBkkNASABQQNwQQNzQQNwIgBFDQAgAyAGaiEBIAAhAyAEIAZrIgQhAgNAIAJFDQMgAUE9OgAAIAJBAWshAiABQQFqIQEgA0EBayIDDQALIAAhDgsgBiAOaiAGSQ0CDwsgBiAEQZTnwAAQmgIACyAEIARB4OrAABCZAgALQaTnwABBKkHQ58AAEKgCAAvOAQEEfyMAQSBrIgMkACABQQNuIgVB/////wNxIAVHIQYgBUECdCEEAkAgASAFQQNsayIFRQ0AAkACQAJAIAJBgAJxRQRAQQIhASAFQQFrDgIDAgELIAYgBCAEQQRqIgRLciEGDAMLIANBFGpBATYCACADQgE3AgQgA0Gs6sAANgIAIANB6gA2AhwgA0HI6sAANgIYIAMgA0EYajYCECADQdDqwAAQoQIAC0EDIQELIAEgBHIhBAsgACAENgIEIAAgBkEBczYCACADQSBqJAALFgAgACgCACIAKAIAIAAoAgQgARDMAgsdACABKAIARQRAAAsgAEHg/MAANgIEIAAgATYCAAtVAQJ/IAEoAgAhAiABQQA2AgACQCACBEAgASgCBCEDQQhBBBBLIgFFDQEgASADNgIEIAEgAjYCACAAQeD8wAA2AgQgACABNgIADwsAC0EIQQQQkgIAC4oEAQN/IwBBMGsiAiQAAn8CQAJAAkACQCAAKAIEIgQOAwACAwELIwBBEGsiACQAIABBoP7AADYCCCAAQQ42AgQgAEGR/sAANgIAIAAoAgAhASAAKAIEIQIgACgCCCEDIwBBEGsiACQAIAAgAjYCDCAAIAE2AgggAEEIakHM/MAAQQAgAxDxAQALIAJBLGpBADYCACACQeD8wAA2AiggAkIBNwIcIAJB+PzAADYCGEEBIAEgAkEYahDDAg0CGiAEQQN0QQhrQQN2QQFqIQQgACgCACEAAkADQCACIAA2AhQgAwRAIAJBADYCLCACQeD8wAA2AiggAkIBNwIcIAJBhP3AADYCGCABIAJBGGoQwwINAgsgAkEBNgIsIAJCAjcCHCACQYz9wAA2AhggAkHsADYCBCACIAI2AiggAiACQRRqNgIAIAEgAkEYahDDAg0BIABBCGohACAEIANBAWoiA0cNAAtBAAwDC0EBDAILIAJBLGpBATYCACACQgI3AhwgAkGM/cAANgIYIAJB7QA2AgQgAiAAKAIANgIAIAIgAjYCKCABIAJBGGoQwwIMAQsgAkEMakHtADYCACACQSxqQQI2AgAgAkIDNwIcIAJBpP3AADYCGCACQe0ANgIEIAIgACgCACIANgIAIAIgAEEIajYCCCACIAI2AiggASACQRhqEMMCCyACQTBqJAALzj8BIn8gACgCHCEiIAAoAhghICAAKAIUIR4gACgCECEdIAAoAgwhIyAAKAIIISEgACgCBCEfIAAoAgAhBSACBEAgASACQQZ0aiEkA0AgBSABKAAAIgJBGHQgAkEIdEGAgPwHcXIgAkEIdkGA/gNxIAJBGHZyciIUICIgHUEadyAdQRV3cyAdQQd3c2ogHiAgcyAdcSAgc2pqQZjfqJQEaiIQIAUgIXEgBSAfcSICIB8gIXFzcyAFQR53IAVBE3dzIAVBCndzamoiDUEedyANQRN3cyANQQp3cyANIAUgH3NxIAJzaiAgIAFBBGooAAAiAkEYdCACQQh0QYCA/AdxciACQQh2QYD+A3EgAkEYdnJyIhhqIBAgI2oiAyAdIB5zcSAec2ogA0EadyADQRV3cyADQQd3c2pBkYndiQdqIg9qIgIgDXEiByAFIA1xcyACIAVxcyACQR53IAJBE3dzIAJBCndzaiAeIAFBCGooAAAiEEEYdCAQQQh0QYCA/AdxciAQQQh2QYD+A3EgEEEYdnJyIgRqIA8gIWoiDyADIB1zcSAdc2ogD0EadyAPQRV3cyAPQQd3c2pBsYj80QRrIglqIghBHncgCEETd3MgCEEKd3MgCCACIA1zcSAHc2ogHSABQQxqKAAAIhBBGHQgEEEIdEGAgPwHcXIgEEEIdkGA/gNxIBBBGHZyciIXaiAJIB9qIgcgAyAPc3EgA3NqIAdBGncgB0EVd3MgB0EHd3NqQdvIqLIBayIMaiIQIAhxIhMgAiAIcXMgAiAQcXMgEEEedyAQQRN3cyAQQQp3c2ogAyABQRBqKAAAIglBGHQgCUEIdEGAgPwHcXIgCUEIdkGA/gNxIAlBGHZyciIKaiAFIAxqIgMgByAPc3EgD3NqIANBGncgA0EVd3MgA0EHd3NqQduE28oDaiIMaiIJQR53IAlBE3dzIAlBCndzIAkgCCAQc3EgE3NqIAFBFGooAAAiBUEYdCAFQQh0QYCA/AdxciAFQQh2QYD+A3EgBUEYdnJyIhogD2ogDCANaiINIAMgB3NxIAdzaiANQRp3IA1BFXdzIA1BB3dzakHxo8TPBWoiDGoiBSAJcSITIAkgEHFzIAUgEHFzIAVBHncgBUETd3MgBUEKd3NqIAFBGGooAAAiD0EYdCAPQQh0QYCA/AdxciAPQQh2QYD+A3EgD0EYdnJyIg4gB2ogAiAMaiIPIAMgDXNxIANzaiAPQRp3IA9BFXdzIA9BB3dzakHc+oHuBmsiDGoiB0EedyAHQRN3cyAHQQp3cyAHIAUgCXNxIBNzaiABQRxqKAAAIgJBGHQgAkEIdEGAgPwHcXIgAkEIdkGA/gNxIAJBGHZyciIGIANqIAggDGoiAyANIA9zcSANc2ogA0EadyADQRV3cyADQQd3c2pBq8KOpwVrIghqIgIgB3EiDCAFIAdxcyACIAVxcyACQR53IAJBE3dzIAJBCndzaiANIAFBIGooAAAiDUEYdCANQQh0QYCA/AdxciANQQh2QYD+A3EgDUEYdnJyIgtqIAggEGoiDSADIA9zcSAPc2ogDUEadyANQRV3cyANQQd3c2pB6KrhvwJrIhNqIghBHncgCEETd3MgCEEKd3MgCCACIAdzcSAMc2ogAUEkaigAACIQQRh0IBBBCHRBgID8B3FyIBBBCHZBgP4DcSAQQRh2cnIiEiAPaiAJIBNqIg8gAyANc3EgA3NqIA9BGncgD0EVd3MgD0EHd3NqQYG2jZQBaiIJaiIQIAhxIgwgAiAIcXMgAiAQcXMgEEEedyAQQRN3cyAQQQp3c2ogAyABQShqKAAAIgNBGHQgA0EIdEGAgPwHcXIgA0EIdkGA/gNxIANBGHZyciIRaiAFIAlqIgMgDSAPc3EgDXNqIANBGncgA0EVd3MgA0EHd3NqQb6LxqECaiITaiIJQR53IAlBE3dzIAlBCndzIAkgCCAQc3EgDHNqIAFBLGooAAAiBUEYdCAFQQh0QYCA/AdxciAFQQh2QYD+A3EgBUEYdnJyIhUgDWogByATaiINIAMgD3NxIA9zaiANQRp3IA1BFXdzIA1BB3dzakHD+7GoBWoiB2oiBSAJcSIMIAkgEHFzIAUgEHFzIAVBHncgBUETd3MgBUEKd3NqIA8gAUEwaigAACIPQRh0IA9BCHRBgID8B3FyIA9BCHZBgP4DcSAPQRh2cnIiFmogAiAHaiIPIAMgDXNxIANzaiAPQRp3IA9BFXdzIA9BB3dzakH0uvmVB2oiE2oiB0EedyAHQRN3cyAHQQp3cyAHIAUgCXNxIAxzaiABQTRqKAAAIgJBGHQgAkEIdEGAgPwHcXIgAkEIdkGA/gNxIAJBGHZyciIbIANqIAggE2oiCCANIA9zcSANc2ogCEEadyAIQRV3cyAIQQd3c2pBgpyF+QdrIgNqIgIgB3EiGSAFIAdxcyACIAVxcyACQR53IAJBE3dzIAJBCndzaiANIAFBOGooAAAiDUEYdCANQQh0QYCA/AdxciANQQh2QYD+A3EgDUEYdnJyIg1qIAMgEGoiDCAIIA9zcSAPc2ogDEEadyAMQRV3cyAMQQd3c2pB2fKPoQZrIgNqIhNBHncgE0ETd3MgE0EKd3MgEyACIAdzcSAZc2ogAUE8aigAACIQQRh0IBBBCHRBgID8B3FyIBBBCHZBgP4DcSAQQRh2cnIiECAPaiADIAlqIgkgCCAMc3EgCHNqIAlBGncgCUEVd3MgCUEHd3NqQYydkPMDayIZaiIDIBNxIhwgAiATcXMgAiADcXMgA0EedyADQRN3cyADQQp3c2ogGEEOdyAYQRl3cyAYQQN2cyAUaiASaiANQQ93IA1BDXdzIA1BCnZzaiIPIAhqIAUgGWoiFCAJIAxzcSAMc2ogFEEadyAUQRV3cyAUQQd3c2pBv6yS2wFrIghqIhlBHncgGUETd3MgGUEKd3MgGSADIBNzcSAcc2ogBEEOdyAEQRl3cyAEQQN2cyAYaiARaiAQQQ93IBBBDXdzIBBBCnZzaiIFIAxqIAcgCGoiDCAJIBRzcSAJc2ogDEEadyAMQRV3cyAMQQd3c2pB+vCGggFrIhhqIgggGXEiHCADIBlxcyADIAhxcyAIQR53IAhBE3dzIAhBCndzaiAXQQ53IBdBGXdzIBdBA3ZzIARqIBVqIA9BD3cgD0ENd3MgD0EKdnNqIgcgCWogAiAYaiIYIAwgFHNxIBRzaiAYQRp3IBhBFXdzIBhBB3dzakHGu4b+AGoiCWoiBEEedyAEQRN3cyAEQQp3cyAEIAggGXNxIBxzaiAKQQ53IApBGXdzIApBA3ZzIBdqIBZqIAVBD3cgBUENd3MgBUEKdnNqIgIgFGogCSATaiIUIAwgGHNxIAxzaiAUQRp3IBRBFXdzIBRBB3dzakHMw7KgAmoiE2oiCSAEcSIcIAQgCHFzIAggCXFzIAlBHncgCUETd3MgCUEKd3NqIAwgGkEOdyAaQRl3cyAaQQN2cyAKaiAbaiAHQQ93IAdBDXdzIAdBCnZzaiIMaiADIBNqIhcgFCAYc3EgGHNqIBdBGncgF0EVd3MgF0EHd3NqQe/YpO8CaiITaiIKQR53IApBE3dzIApBCndzIAogBCAJc3EgHHNqIA5BDncgDkEZd3MgDkEDdnMgGmogDWogAkEPdyACQQ13cyACQQp2c2oiAyAYaiATIBlqIhggFCAXc3EgFHNqIBhBGncgGEEVd3MgGEEHd3NqQaqJ0tMEaiIZaiITIApxIhwgCSAKcXMgCSATcXMgE0EedyATQRN3cyATQQp3c2ogFCAGQQ53IAZBGXdzIAZBA3ZzIA5qIBBqIAxBD3cgDEENd3MgDEEKdnNqIhRqIAggGWoiGiAXIBhzcSAXc2ogGkEadyAaQRV3cyAaQQd3c2pB3NPC5QVqIhlqIg5BHncgDkETd3MgDkEKd3MgDiAKIBNzcSAcc2ogC0EOdyALQRl3cyALQQN2cyAGaiAPaiADQQ93IANBDXdzIANBCnZzaiIIIBdqIAQgGWoiFyAYIBpzcSAYc2ogF0EadyAXQRV3cyAXQQd3c2pB2pHmtwdqIgRqIhkgDnEiHCAOIBNxcyATIBlxcyAZQR53IBlBE3dzIBlBCndzaiAYIBJBDncgEkEZd3MgEkEDdnMgC2ogBWogFEEPdyAUQQ13cyAUQQp2c2oiGGogBCAJaiIGIBcgGnNxIBpzaiAGQRp3IAZBFXdzIAZBB3dzakGu3Ya+BmsiBGoiC0EedyALQRN3cyALQQp3cyALIA4gGXNxIBxzaiARQQ53IBFBGXdzIBFBA3ZzIBJqIAdqIAhBD3cgCEENd3MgCEEKdnNqIgkgGmogBCAKaiIaIAYgF3NxIBdzaiAaQRp3IBpBFXdzIBpBB3dzakGT87i+BWsiCmoiBCALcSIcIAsgGXFzIAQgGXFzIARBHncgBEETd3MgBEEKd3NqIBcgFUEOdyAVQRl3cyAVQQN2cyARaiACaiAYQQ93IBhBDXdzIBhBCnZzaiIXaiAKIBNqIhIgBiAac3EgBnNqIBJBGncgEkEVd3MgEkEHd3NqQbiw8/8EayIKaiIRQR53IBFBE3dzIBFBCndzIBEgBCALc3EgHHNqIBZBDncgFkEZd3MgFkEDdnMgFWogDGogCUEPdyAJQQ13cyAJQQp2c2oiEyAGaiAKIA5qIgYgEiAac3EgGnNqIAZBGncgBkEVd3MgBkEHd3NqQbmAmoUEayIOaiIKIBFxIhwgBCARcXMgBCAKcXMgCkEedyAKQRN3cyAKQQp3c2ogGiAbQQ53IBtBGXdzIBtBA3ZzIBZqIANqIBdBD3cgF0ENd3MgF0EKdnNqIhpqIA4gGWoiFSAGIBJzcSASc2ogFUEadyAVQRV3cyAVQQd3c2pBjej/yANrIg5qIhZBHncgFkETd3MgFkEKd3MgFiAKIBFzcSAcc2ogDUEOdyANQRl3cyANQQN2cyAbaiAUaiATQQ93IBNBDXdzIBNBCnZzaiIZIBJqIAsgDmoiCyAGIBVzcSAGc2ogC0EadyALQRV3cyALQQd3c2pBud3h0gJrIhJqIg4gFnEiGyAKIBZxcyAKIA5xcyAOQR53IA5BE3dzIA5BCndzaiAQQQ53IBBBGXdzIBBBA3ZzIA1qIAhqIBpBD3cgGkENd3MgGkEKdnNqIg0gBmogBCASaiIGIAsgFXNxIBVzaiAGQRp3IAZBFXdzIAZBB3dzakHRxqk2aiIEaiISQR53IBJBE3dzIBJBCndzIBIgDiAWc3EgG3NqIA9BDncgD0EZd3MgD0EDdnMgEGogGGogGUEPdyAZQQ13cyAZQQp2c2oiECAVaiAEIBFqIhEgBiALc3EgC3NqIBFBGncgEUEVd3MgEUEHd3NqQefSpKEBaiIVaiIEIBJxIhsgDiAScXMgBCAOcXMgBEEedyAEQRN3cyAEQQp3c2ogBUEOdyAFQRl3cyAFQQN2cyAPaiAJaiANQQ93IA1BDXdzIA1BCnZzaiIPIAtqIAogFWoiCyAGIBFzcSAGc2ogC0EadyALQRV3cyALQQd3c2pBhZXcvQJqIgpqIhVBHncgFUETd3MgFUEKd3MgFSAEIBJzcSAbc2ogB0EOdyAHQRl3cyAHQQN2cyAFaiAXaiAQQQ93IBBBDXdzIBBBCnZzaiIFIAZqIAogFmoiBiALIBFzcSARc2ogBkEadyAGQRV3cyAGQQd3c2pBuMLs8AJqIhZqIgogFXEiGyAEIBVxcyAEIApxcyAKQR53IApBE3dzIApBCndzaiACQQ53IAJBGXdzIAJBA3ZzIAdqIBNqIA9BD3cgD0ENd3MgD0EKdnNqIgcgEWogDiAWaiIRIAYgC3NxIAtzaiARQRp3IBFBFXdzIBFBB3dzakH827HpBGoiDmoiFkEedyAWQRN3cyAWQQp3cyAWIAogFXNxIBtzaiAMQQ53IAxBGXdzIAxBA3ZzIAJqIBpqIAVBD3cgBUENd3MgBUEKdnNqIgIgC2ogDiASaiILIAYgEXNxIAZzaiALQRp3IAtBFXdzIAtBB3dzakGTmuCZBWoiEmoiDiAWcSIbIAogFnFzIAogDnFzIA5BHncgDkETd3MgDkEKd3NqIANBDncgA0EZd3MgA0EDdnMgDGogGWogB0EPdyAHQQ13cyAHQQp2c2oiDCAGaiAEIBJqIgYgCyARc3EgEXNqIAZBGncgBkEVd3MgBkEHd3NqQdTmqagGaiIEaiISQR53IBJBE3dzIBJBCndzIBIgDiAWc3EgG3NqIBRBDncgFEEZd3MgFEEDdnMgA2ogDWogAkEPdyACQQ13cyACQQp2c2oiAyARaiAEIBVqIhEgBiALc3EgC3NqIBFBGncgEUEVd3MgEUEHd3NqQbuVqLMHaiIVaiIEIBJxIhsgDiAScXMgBCAOcXMgBEEedyAEQRN3cyAEQQp3c2ogCEEOdyAIQRl3cyAIQQN2cyAUaiAQaiAMQQ93IAxBDXdzIAxBCnZzaiIUIAtqIAogFWoiCyAGIBFzcSAGc2ogC0EadyALQRV3cyALQQd3c2pB0u308QdrIgpqIhVBHncgFUETd3MgFUEKd3MgFSAEIBJzcSAbc2ogGEEOdyAYQRl3cyAYQQN2cyAIaiAPaiADQQ93IANBDXdzIANBCnZzaiIIIAZqIAogFmoiBiALIBFzcSARc2ogBkEadyAGQRV3cyAGQQd3c2pB+6a37AZrIhZqIgogFXEiGyAEIBVxcyAEIApxcyAKQR53IApBE3dzIApBCndzaiAJQQ53IAlBGXdzIAlBA3ZzIBhqIAVqIBRBD3cgFEENd3MgFEEKdnNqIhggEWogDiAWaiIRIAYgC3NxIAtzaiARQRp3IBFBFXdzIBFBB3dzakHfroDqBWsiDmoiFkEedyAWQRN3cyAWQQp3cyAWIAogFXNxIBtzaiAXQQ53IBdBGXdzIBdBA3ZzIAlqIAdqIAhBD3cgCEENd3MgCEEKdnNqIgkgC2ogDiASaiILIAYgEXNxIAZzaiALQRp3IAtBFXdzIAtBB3dzakG1s5a/BWsiEmoiDiAWcSIbIAogFnFzIAogDnFzIA5BHncgDkETd3MgDkEKd3NqIBNBDncgE0EZd3MgE0EDdnMgF2ogAmogGEEPdyAYQQ13cyAYQQp2c2oiFyAGaiAEIBJqIgYgCyARc3EgEXNqIAZBGncgBkEVd3MgBkEHd3NqQZDp0e0DayIEaiISQR53IBJBE3dzIBJBCndzIBIgDiAWc3EgG3NqIBpBDncgGkEZd3MgGkEDdnMgE2ogDGogCUEPdyAJQQ13cyAJQQp2c2oiEyARaiAEIBVqIhEgBiALc3EgC3NqIBFBGncgEUEVd3MgEUEHd3NqQd3czsQDayIVaiIEIBJxIhsgDiAScXMgBCAOcXMgBEEedyAEQRN3cyAEQQp3c2ogGUEOdyAZQRl3cyAZQQN2cyAaaiADaiAXQQ93IBdBDXdzIBdBCnZzaiIaIAtqIAogFWoiCyAGIBFzcSAGc2ogC0EadyALQRV3cyALQQd3c2pB56+08wJrIgpqIhVBHncgFUETd3MgFUEKd3MgFSAEIBJzcSAbc2ogDUEOdyANQRl3cyANQQN2cyAZaiAUaiATQQ93IBNBDXdzIBNBCnZzaiIZIAZqIAogFmoiBiALIBFzcSARc2ogBkEadyAGQRV3cyAGQQd3c2pB3PObywJrIhZqIgogFXEiGyAEIBVxcyAEIApxcyAKQR53IApBE3dzIApBCndzaiAQQQ53IBBBGXdzIBBBA3ZzIA1qIAhqIBpBD3cgGkENd3MgGkEKdnNqIg0gEWogDiAWaiIRIAYgC3NxIAtzaiARQRp3IBFBFXdzIBFBB3dzakH7lMffAGsiDmoiFkEedyAWQRN3cyAWQQp3cyAWIAogFXNxIBtzaiAPQQ53IA9BGXdzIA9BA3ZzIBBqIBhqIBlBD3cgGUENd3MgGUEKdnNqIhAgC2ogDiASaiILIAYgEXNxIAZzaiALQRp3IAtBFXdzIAtBB3dzakHwwKqDAWoiEmoiDiAWcSIbIAogFnFzIAogDnFzIA5BHncgDkETd3MgDkEKd3NqIAVBDncgBUEZd3MgBUEDdnMgD2ogCWogDUEPdyANQQ13cyANQQp2c2oiDyAGaiAEIBJqIgQgCyARc3EgEXNqIARBGncgBEEVd3MgBEEHd3NqQZaCk80BaiISaiIGQR53IAZBE3dzIAZBCndzIAYgDiAWc3EgG3NqIBEgB0EOdyAHQRl3cyAHQQN2cyAFaiAXaiAQQQ93IBBBDXdzIBBBCnZzaiIRaiASIBVqIhIgBCALc3EgC3NqIBJBGncgEkEVd3MgEkEHd3NqQYjY3fEBaiIVaiIFIAZxIhsgBiAOcXMgBSAOcXMgBUEedyAFQRN3cyAFQQp3c2ogCyACQQ53IAJBGXdzIAJBA3ZzIAdqIBNqIA9BD3cgD0ENd3MgD0EKdnNqIgtqIAogFWoiByAEIBJzcSAEc2ogB0EadyAHQRV3cyAHQQd3c2pBzO6hugJqIhxqIgpBHncgCkETd3MgCkEKd3MgCiAFIAZzcSAbc2ogDEEOdyAMQRl3cyAMQQN2cyACaiAaaiARQQ93IBFBDXdzIBFBCnZzaiIVIARqIBYgHGoiBCAHIBJzcSASc2ogBEEadyAEQRV3cyAEQQd3c2pBtfnCpQNqIhZqIgIgCnEiGyAFIApxcyACIAVxcyACQR53IAJBE3dzIAJBCndzaiASIANBDncgA0EZd3MgA0EDdnMgDGogGWogC0EPdyALQQ13cyALQQp2c2oiEmogDiAWaiIMIAQgB3NxIAdzaiAMQRp3IAxBFXdzIAxBB3dzakGzmfDIA2oiHGoiDkEedyAOQRN3cyAOQQp3cyAOIAIgCnNxIBtzaiAUQQ53IBRBGXdzIBRBA3ZzIANqIA1qIBVBD3cgFUENd3MgFUEKdnNqIhYgB2ogBiAcaiIHIAQgDHNxIARzaiAHQRp3IAdBFXdzIAdBB3dzakHK1OL2BGoiG2oiAyAOcSIcIAIgDnFzIAIgA3FzIANBHncgA0ETd3MgA0EKd3NqIAhBDncgCEEZd3MgCEEDdnMgFGogEGogEkEPdyASQQ13cyASQQp2c2oiBiAEaiAFIBtqIhQgByAMc3EgDHNqIBRBGncgFEEVd3MgFEEHd3NqQc+U89wFaiIFaiIEQR53IARBE3dzIARBCndzIAQgAyAOc3EgHHNqIBhBDncgGEEZd3MgGEEDdnMgCGogD2ogFkEPdyAWQQ13cyAWQQp2c2oiGyAMaiAFIApqIgggByAUc3EgB3NqIAhBGncgCEEVd3MgCEEHd3NqQfPfucEGaiIMaiIFIARxIgogAyAEcXMgAyAFcXMgBUEedyAFQRN3cyAFQQp3c2ogCUEOdyAJQRl3cyAJQQN2cyAYaiARaiAGQQ93IAZBDXdzIAZBCnZzaiIYIAdqIAIgDGoiByAIIBRzcSAUc2ogB0EadyAHQRV3cyAHQQd3c2pB7oW+pAdqIgJqIgxBHncgDEETd3MgDEEKd3MgDCAEIAVzcSAKc2ogF0EOdyAXQRl3cyAXQQN2cyAJaiALaiAbQQ93IBtBDXdzIBtBCnZzaiIKIBRqIAIgDmoiCSAHIAhzcSAIc2ogCUEadyAJQRV3cyAJQQd3c2pB78aVxQdqIhRqIgIgDHEiDiAFIAxxcyACIAVxcyACQR53IAJBE3dzIAJBCndzaiATQQ53IBNBGXdzIBNBA3ZzIBdqIBVqIBhBD3cgGEENd3MgGEEKdnNqIhcgCGogAyAUaiIIIAcgCXNxIAdzaiAIQRp3IAhBFXdzIAhBB3dzakHsj97ZB2siA2oiFEEedyAUQRN3cyAUQQp3cyAUIAIgDHNxIA5zaiAaQQ53IBpBGXdzIBpBA3ZzIBNqIBJqIApBD3cgCkENd3MgCkEKdnNqIhMgB2ogAyAEaiIHIAggCXNxIAlzaiAHQRp3IAdBFXdzIAdBB3dzakH4++OZB2siCmoiAyAUcSIOIAIgFHFzIAIgA3FzIANBHncgA0ETd3MgA0EKd3NqIBlBDncgGUEZd3MgGUEDdnMgGmogFmogF0EPdyAXQQ13cyAXQQp2c2oiBCAJaiAFIApqIgUgByAIc3EgCHNqIAVBGncgBUEVd3MgBUEHd3NqQYaAhPoGayIXaiIJQR53IAlBE3dzIAlBCndzIAkgAyAUc3EgDnNqIA1BDncgDUEZd3MgDUEDdnMgGWogBmogE0EPdyATQQ13cyATQQp2c2oiEyAIaiAMIBdqIgggBSAHc3EgB3NqIAhBGncgCEEVd3MgCEEHd3NqQZWmvt0FayIZaiIMIAlxIhcgAyAJcXMgAyAMcXMgDEEedyAMQRN3cyAMQQp3c2ogDSAQQQ53IBBBGXdzIBBBA3ZzaiAbaiAEQQ93IARBDXdzIARBCnZzaiAHaiACIBlqIgIgBSAIc3EgBXNqIAJBGncgAkEVd3MgAkEHd3NqQYm4mYgEayIHaiINIAkgDHNxIBdzaiANQR53IA1BE3dzIA1BCndzaiAQIA9BDncgD0EZd3MgD0EDdnNqIBhqIBNBD3cgE0ENd3MgE0EKdnNqIAVqIAcgFGoiECACIAhzcSAIc2ogEEEadyAQQRV3cyAQQQd3c2pBjo66zANrIg9qIQUgDSAfaiEfIAwgIWohISAJICNqISMgAyAdaiAPaiEdIBAgHmohHiACICBqISAgCCAiaiEiIAFBQGsiASAkRw0ACwsgACAiNgIcIAAgIDYCGCAAIB42AhQgACAdNgIQIAAgIzYCDCAAICE2AgggACAfNgIEIAAgBTYCAAsMAEL8s+j8jorM8GELGQAgACgCACIAKAIAIAEgACgCBCgCDBEAAAsMACAAKAIAIAEQ2wELxAUAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAALQAAQQFrDigBAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoAAsgAUHbi8EAQQgQwgIPCyABQcuLwQBBEBDCAg8LIAFBuovBAEEREMICDwsgAUGri8EAQQ8QwgIPCyABQZyLwQBBDxDCAg8LIAFBiovBAEESEMICDwsgAUH5isEAQREQwgIPCyABQe2KwQBBDBDCAg8LIAFB5IrBAEEJEMICDwsgAUHUisEAQRAQwgIPCyABQcmKwQBBCxDCAg8LIAFBv4rBAEEKEMICDwsgAUGyisEAQQ0QwgIPCyABQaiKwQBBChDCAg8LIAFBm4rBAEENEMICDwsgAUGPisEAQQwQwgIPCyABQf6JwQBBERDCAg8LIAFB7InBAEESEMICDwsgAUHeicEAQQ4QwgIPCyABQciJwQBBFhDCAg8LIAFBvInBAEEMEMICDwsgAUGxicEAQQsQwgIPCyABQamJwQBBCBDCAg8LIAFBoInBAEEJEMICDwsgAUGVicEAQQsQwgIPCyABQYqJwQBBCxDCAg8LIAFB84jBAEEXEMICDwsgAUHniMEAQQwQwgIPCyABQduIwQBBDBDCAg8LIAFByYjBAEESEMICDwsgAUHBiMEAQQgQwgIPCyABQbOIwQBBDhDCAg8LIAFBp4jBAEEMEMICDwsgAUGYiMEAQQ8QwgIPCyABQYWIwQBBExDCAg8LIAFB+ofBAEELEMICDwsgAUGAh8EAQQsQwgIPCyABQe2HwQBBDRDCAg8LIAFB4ofBAEELEMICDwsgAUHdh8EAQQUQwgIPCyABQdCHwQBBDRDCAgtnAQJ/IwBBEGsiAiQAIAAoAgAiAEEIaigCACEDIAAoAgAhACACIAEQyAI3AwAgAwRAA0AgAiAANgIMIAIgAkEMakGQgsEAELcCIABBAWohACADQQFrIgMNAAsLIAIQuAIgAkEQaiQAC7cBAQN/IAAoAgAhACABEMQCRQRAIAEQxQJFBEAgACABENACDwsjAEGAAWsiAyQAIAAtAAAhAANAIAIgA2pB/wBqQTBBNyAAQQ9xIgRBCkkbIARqOgAAIAJBAWshAiAAIgRBBHYhACAEQQ9LDQALIAJBgAFqIgBBgQFPBEAgAEGAAUHglcEAEJoCAAsgAUEBQfCVwQBBAiACIANqQYABakEAIAJrELoCIANBgAFqJAAPCyAAIAEQ0wILEQAgACgCACAAKAIEIAEQyQILLAACQCABEMQCRQRAIAEQxQINASAAIAEQ2AIPCyAAIAEQ1QIPCyAAIAEQ1wILJgBBoLfBACgCAEEBRgRAQaS3wQAoAgBFDwtBoLfBAEIBNwMAQQELIQEBfwJAIAAoAgQiAUUNACAAQQhqKAIARQ0AIAEQ6wELC9sCAQN/IwBBEGsiAiQAIAAoAgAhAAJAIAFB/wBNBEAgACgCCCIDIABBBGooAgBGBEAgACADQQEQDyAAKAIIIQMLIAAgA0EBajYCCCAAKAIAIANqIAE6AAAMAQsgAkEANgIMAn8gAUGAEE8EQCABQYCABE8EQCACIAFBP3FBgAFyOgAPIAIgAUESdkHwAXI6AAwgAiABQQZ2QT9xQYABcjoADiACIAFBDHZBP3FBgAFyOgANQQQMAgsgAiABQT9xQYABcjoADiACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA1BAwwBCyACIAFBP3FBgAFyOgANIAIgAUEGdkHAAXI6AAxBAgshASABIABBBGooAgAgAEEIaiIEKAIAIgNrSwRAIAAgAyABEA8gBCgCACEDCyAAKAIAIANqIAJBDGogARDdAhogBCABIANqNgIACyACQRBqJABBAAtaAQF/IwBBIGsiAiQAIAIgACgCADYCBCACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCACQQRqQfiBwQAgAkEIahCiAiACQSBqJAALFAAgACgCACAAQQhqKAIAIAEQyQILhwMBA38CQAJAAkACQCABQQlPBEBBEEEIEPkBIAFLDQEMAgsgABDmASEDDAILQRBBCBD5ASEBC0GAgHxBCEEIEPkBQRRBCBD5AWpBEEEIEPkBamtBd3FBA2siBEEAQRBBCBD5AUECdGsiAiACIARLGyABayAATQ0AIAFBECAAQQRqQRBBCBD5AUEFayAASxtBCBD5ASIEakEQQQgQ+QFqQQRrEOYBIgJFDQAgAhCJAiEAAkAgAUEBayIDIAJxRQRAIAAhAQwBCyACIANqQQAgAWtxEIkCIQJBEEEIEPkBIQMgABD9ASACQQAgASACIABrIANLG2oiASAAayICayEDIAAQgAJFBEAgASADEIECIAAgAhCBAiAAIAIQ5wEMAQsgACgCACEAIAEgAzYCBCABIAAgAmo2AgALIAEQgAINASABEP0BIgJBEEEIEPkBIARqTQ0BIAEgBBCGAiEAIAEgBBCBAiAAIAIgBGsiBBCBAiAAIAQQ5wEMAQsgAw8LIAEQiAIgARCAAhoL4yECD38BfiMAQRBrIggkAAJAAkAgAEH1AU8EQEGAgHxBCEEIEPkBQRRBCBD5AWpBEEEIEPkBamtBd3FBA2siAkEAQRBBCBD5AUECdGsiBSACIAVJGyAATQ0CIABBBGpBCBD5ASEEQdSzwQAoAgBFDQFBACAEayEBAkACQAJ/QQAgBEGAAkkNABpBHyAEQf///wdLDQAaIARBBiAEQQh2ZyIAa3ZBAXEgAEEBdGtBPmoLIgdBAnRB4LXBAGooAgAiAARAIAQgBxD8AXQhBkEAIQIDQAJAIAAQ/QEiBSAESQ0AIAUgBGsiBSABTw0AIAAhAiAFIgENAEEAIQEMAwsgAEEUaigCACIFIAMgBSAAIAZBHXZBBHFqQRBqKAIAIgBHGyADIAUbIQMgBkEBdCEGIAANAAsgAwRAIAMhAAwCCyACDQILQQAhAkEBIAd0EPoBQdSzwQAoAgBxIgBFDQMgABD7AWhBAnRB4LXBAGooAgAiAEUNAwsDQCAAIAIgABD9ASICIARPIAIgBGsiAyABSXEiBRshAiADIAEgBRshASAAEIoCIgANAAsgAkUNAgsgBEHgtsEAKAIAIgBNIAEgACAEa09xDQEgAiAEEIYCIQAgAhDoAQJAQRBBCBD5ASABTQRAIAIgBBCDAiAAIAEQhAIgAUGAAk8EQCAAIAEQ6QEMAgsgAUEDdiIDQQN0QdizwQBqIQECf0HQs8EAKAIAIgVBASADdCIDcQRAIAEoAggMAQtB0LPBACADIAVyNgIAIAELIQMgASAANgIIIAMgADYCDCAAIAE2AgwgACADNgIIDAELIAIgASAEahCCAgsgAhCIAiIBRQ0BDAILQRAgAEEEakEQQQgQ+QFBBWsgAEsbQQgQ+QEhBAJAAkACQAJ/AkACQEHQs8EAKAIAIgUgBEEDdiIBdiIAQQNxRQRAIARB4LbBACgCAE0NByAADQFB1LPBACgCACIARQ0HIAAQ+wFoQQJ0QeC1wQBqKAIAIgIQ/QEgBGshASACEIoCIgAEQANAIAAQ/QEgBGsiAyABIAEgA0siAxshASAAIAIgAxshAiAAEIoCIgANAAsLIAIgBBCGAiEFIAIQ6AFBEEEIEPkBIAFLDQUgAiAEEIMCIAUgARCEAkHgtsEAKAIAIgBFDQQgAEEDdiIGQQN0QdizwQBqIQBB6LbBACgCACEDQdCzwQAoAgAiB0EBIAZ0IgZxRQ0CIAAoAggMAwsCQCAAQX9zQQFxIAFqIgBBA3QiA0Hgs8EAaigCACIBQQhqKAIAIgIgA0HYs8EAaiIDRwRAIAIgAzYCDCADIAI2AggMAQtB0LPBACAFQX4gAHdxNgIACyABIABBA3QQggIgARCIAiEBDAcLAkBBASABQR9xIgF0EPoBIAAgAXRxEPsBaCIAQQN0IgNB4LPBAGooAgAiAkEIaigCACIBIANB2LPBAGoiA0cEQCABIAM2AgwgAyABNgIIDAELQdCzwQBB0LPBACgCAEF+IAB3cTYCAAsgAiAEEIMCIAIgBBCGAiIFIABBA3QgBGsiBBCEAkHgtsEAKAIAIgAEQCAAQQN2IgNBA3RB2LPBAGohAEHotsEAKAIAIQECf0HQs8EAKAIAIgZBASADdCIDcQRAIAAoAggMAQtB0LPBACADIAZyNgIAIAALIQMgACABNgIIIAMgATYCDCABIAA2AgwgASADNgIIC0HotsEAIAU2AgBB4LbBACAENgIAIAIQiAIhAQwGC0HQs8EAIAYgB3I2AgAgAAshBiAAIAM2AgggBiADNgIMIAMgADYCDCADIAY2AggLQei2wQAgBTYCAEHgtsEAIAE2AgAMAQsgAiABIARqEIICCyACEIgCIgENAQsCQAJAAkACQAJAAkACQAJAIARB4LbBACgCACIBSwRAQeS2wQAoAgAiACAESw0CQQhBCBD5ASAEakEUQQgQ+QFqQRBBCBD5AWpBgIAEEPkBIgFBEHZAACEAIAhBADYCCCAIQQAgAUGAgHxxIABBf0YiARs2AgQgCEEAIABBEHQgARs2AgAgCCgCACIBDQFBACEBDAkLQei2wQAoAgAhAEEQQQgQ+QEgASAEayIBSwRAQei2wQBBADYCAEHgtsEAKAIAIQFB4LbBAEEANgIAIAAgARCCAiAAEIgCIQEMCQsgACAEEIYCIQJB4LbBACABNgIAQei2wQAgAjYCACACIAEQhAIgACAEEIMCIAAQiAIhAQwICyAIKAIIIQVB8LbBACAIKAIEIgNB8LbBACgCAGoiADYCAEH0tsEAQfS2wQAoAgAiAiAAIAAgAkkbNgIAAkACQEHstsEAKAIABEBB+LbBACEAA0AgABCNAiABRg0CIAAoAggiAA0ACwwCC0GMt8EAKAIAIgBFIAAgAUtyDQMMBwsgABCLAg0AIAAQjAIgBUcNACAAKAIAIgJB7LbBACgCACIGTQR/IAIgACgCBGogBksFQQALDQMLQYy3wQBBjLfBACgCACIAIAEgACABSRs2AgAgASADaiECQfi2wQAhAAJAAkADQCACIAAoAgBHBEAgACgCCCIADQEMAgsLIAAQiwINACAAEIwCIAVGDQELQey2wQAoAgAhAkH4tsEAIQACQANAIAIgACgCAE8EQCAAEI0CIAJLDQILIAAoAggiAA0AC0EAIQALIAIgABCNAiIPQRRBCBD5ASIOa0EXayIAEIgCIgZBCBD5ASAGayAAaiIAIABBEEEIEPkBIAJqSRsiBhCIAiEHIAYgDhCGAiEAQQhBCBD5ASEJQRRBCBD5ASELQRBBCBD5ASEMQey2wQAgASABEIgCIgpBCBD5ASAKayINEIYCIgo2AgBB5LbBACADQQhqIAwgCSALamogDWprIgk2AgAgCiAJQQFyNgIEQQhBCBD5ASELQRRBCBD5ASEMQRBBCBD5ASENIAogCRCGAiANIAwgC0EIa2pqNgIEQYi3wQBBgICAATYCACAGIA4QgwJB+LbBACkCACEQIAdBCGpBgLfBACkCADcCACAHIBA3AgBBhLfBACAFNgIAQfy2wQAgAzYCAEH4tsEAIAE2AgBBgLfBACAHNgIAA0AgAEEEEIYCIQEgAEEHNgIEIA8gASIAQQRqSw0ACyACIAZGDQcgAiAGIAJrIgAgAiAAEIYCEIUCIABBgAJPBEAgAiAAEOkBDAgLIABBA3YiAUEDdEHYs8EAaiEAAn9B0LPBACgCACIDQQEgAXQiAXEEQCAAKAIIDAELQdCzwQAgASADcjYCACAACyEBIAAgAjYCCCABIAI2AgwgAiAANgIMIAIgATYCCAwHCyAAKAIAIQUgACABNgIAIAAgACgCBCADajYCBCABEIgCIgBBCBD5ASECIAUQiAIiA0EIEPkBIQYgASACIABraiICIAQQhgIhASACIAQQgwIgBSAGIANraiIAIAIgBGprIQQgAEHstsEAKAIARwRAQei2wQAoAgAgAEYNBCAAKAIEQQNxQQFHDQUCQCAAEP0BIgNBgAJPBEAgABDoAQwBCyAAQQxqKAIAIgUgAEEIaigCACIGRwRAIAYgBTYCDCAFIAY2AggMAQtB0LPBAEHQs8EAKAIAQX4gA0EDdndxNgIACyADIARqIQQgACADEIYCIQAMBQtB7LbBACABNgIAQeS2wQBB5LbBACgCACAEaiIANgIAIAEgAEEBcjYCBCACEIgCIQEMBwtB5LbBACAAIARrIgE2AgBB7LbBAEHstsEAKAIAIgAgBBCGAiICNgIAIAIgAUEBcjYCBCAAIAQQgwIgABCIAiEBDAYLQYy3wQAgATYCAAwDCyAAIAAoAgQgA2o2AgRB5LbBACgCACEBQey2wQAoAgAiACAAEIgCIgBBCBD5ASAAayICEIYCIQBB5LbBACABIANqIAJrIgE2AgBB7LbBACAANgIAIAAgAUEBcjYCBEEIQQgQ+QEhAkEUQQgQ+QEhA0EQQQgQ+QEhBSAAIAEQhgIgBSADIAJBCGtqajYCBEGIt8EAQYCAgAE2AgAMAwtB6LbBACABNgIAQeC2wQBB4LbBACgCACAEaiIANgIAIAEgABCEAiACEIgCIQEMAwsgASAEIAAQhQIgBEGAAk8EQCABIAQQ6QEgAhCIAiEBDAMLIARBA3YiA0EDdEHYs8EAaiEAAn9B0LPBACgCACIFQQEgA3QiA3EEQCAAKAIIDAELQdCzwQAgAyAFcjYCACAACyEDIAAgATYCCCADIAE2AgwgASAANgIMIAEgAzYCCCACEIgCIQEMAgtBkLfBAEH/HzYCAEGEt8EAIAU2AgBB/LbBACADNgIAQfi2wQAgATYCAEHks8EAQdizwQA2AgBB7LPBAEHgs8EANgIAQeCzwQBB2LPBADYCAEH0s8EAQeizwQA2AgBB6LPBAEHgs8EANgIAQfyzwQBB8LPBADYCAEHws8EAQeizwQA2AgBBhLTBAEH4s8EANgIAQfizwQBB8LPBADYCAEGMtMEAQYC0wQA2AgBBgLTBAEH4s8EANgIAQZS0wQBBiLTBADYCAEGItMEAQYC0wQA2AgBBnLTBAEGQtMEANgIAQZC0wQBBiLTBADYCAEGktMEAQZi0wQA2AgBBmLTBAEGQtMEANgIAQaC0wQBBmLTBADYCAEGstMEAQaC0wQA2AgBBqLTBAEGgtMEANgIAQbS0wQBBqLTBADYCAEGwtMEAQai0wQA2AgBBvLTBAEGwtMEANgIAQbi0wQBBsLTBADYCAEHEtMEAQbi0wQA2AgBBwLTBAEG4tMEANgIAQcy0wQBBwLTBADYCAEHItMEAQcC0wQA2AgBB1LTBAEHItMEANgIAQdC0wQBByLTBADYCAEHctMEAQdC0wQA2AgBB2LTBAEHQtMEANgIAQeS0wQBB2LTBADYCAEHstMEAQeC0wQA2AgBB4LTBAEHYtMEANgIAQfS0wQBB6LTBADYCAEHotMEAQeC0wQA2AgBB/LTBAEHwtMEANgIAQfC0wQBB6LTBADYCAEGEtcEAQfi0wQA2AgBB+LTBAEHwtMEANgIAQYy1wQBBgLXBADYCAEGAtcEAQfi0wQA2AgBBlLXBAEGItcEANgIAQYi1wQBBgLXBADYCAEGctcEAQZC1wQA2AgBBkLXBAEGItcEANgIAQaS1wQBBmLXBADYCAEGYtcEAQZC1wQA2AgBBrLXBAEGgtcEANgIAQaC1wQBBmLXBADYCAEG0tcEAQai1wQA2AgBBqLXBAEGgtcEANgIAQby1wQBBsLXBADYCAEGwtcEAQai1wQA2AgBBxLXBAEG4tcEANgIAQbi1wQBBsLXBADYCAEHMtcEAQcC1wQA2AgBBwLXBAEG4tcEANgIAQdS1wQBByLXBADYCAEHItcEAQcC1wQA2AgBB3LXBAEHQtcEANgIAQdC1wQBByLXBADYCAEHYtcEAQdC1wQA2AgBBCEEIEPkBIQJBFEEIEPkBIQVBEEEIEPkBIQZB7LbBACABIAEQiAIiAEEIEPkBIABrIgEQhgIiADYCAEHktsEAIANBCGogBiACIAVqaiABamsiATYCACAAIAFBAXI2AgRBCEEIEPkBIQJBFEEIEPkBIQNBEEEIEPkBIQUgACABEIYCIAUgAyACQQhramo2AgRBiLfBAEGAgIABNgIAC0EAIQFB5LbBACgCACIAIARNDQBB5LbBACAAIARrIgE2AgBB7LbBAEHstsEAKAIAIgAgBBCGAiICNgIAIAIgAUEBcjYCBCAAIAQQgwIgABCIAiEBCyAIQRBqJAAgAQvaBAEEfyAAIAEQhgIhAgJAAkACQCAAEP8BDQAgACgCACEDAkAgABCAAkUEQCABIANqIQEgACADEIcCIgBB6LbBACgCAEcNASACKAIEQQNxQQNHDQJB4LbBACABNgIAIAAgASACEIUCDwsgASADakEQaiEADAILIANBgAJPBEAgABDoAQwBCyAAQQxqKAIAIgQgAEEIaigCACIFRwRAIAUgBDYCDCAEIAU2AggMAQtB0LPBAEHQs8EAKAIAQX4gA0EDdndxNgIACyACEP4BBEAgACABIAIQhQIMAgsCQEHstsEAKAIAIAJHBEAgAkHotsEAKAIARw0BQei2wQAgADYCAEHgtsEAQeC2wQAoAgAgAWoiATYCACAAIAEQhAIPC0HstsEAIAA2AgBB5LbBAEHktsEAKAIAIAFqIgE2AgAgACABQQFyNgIEIABB6LbBACgCAEcNAUHgtsEAQQA2AgBB6LbBAEEANgIADwsgAhD9ASIDIAFqIQECQCADQYACTwRAIAIQ6AEMAQsgAkEMaigCACIEIAJBCGooAgAiAkcEQCACIAQ2AgwgBCACNgIIDAELQdCzwQBB0LPBACgCAEF+IANBA3Z3cTYCAAsgACABEIQCIABB6LbBACgCAEcNAUHgtsEAIAE2AgALDwsgAUGAAk8EQCAAIAEQ6QEPCyABQQN2IgJBA3RB2LPBAGohAQJ/QdCzwQAoAgAiA0EBIAJ0IgJxBEAgASgCCAwBC0HQs8EAIAIgA3I2AgAgAQshAiABIAA2AgggAiAANgIMIAAgATYCDCAAIAI2AggLtgIBBX8gACgCGCEEAkACQCAAIAAoAgxGBEAgAEEUQRAgAEEUaiIBKAIAIgMbaigCACICDQFBACEBDAILIAAoAggiAiAAKAIMIgE2AgwgASACNgIIDAELIAEgAEEQaiADGyEDA0AgAyEFIAIiAUEUaiIDKAIAIgJFBEAgAUEQaiEDIAEoAhAhAgsgAg0ACyAFQQA2AgALAkAgBEUNAAJAIAAgACgCHEECdEHgtcEAaiICKAIARwRAIARBEEEUIAQoAhAgAEYbaiABNgIAIAENAQwCCyACIAE2AgAgAQ0AQdSzwQBB1LPBACgCAEF+IAAoAhx3cTYCAA8LIAEgBDYCGCAAKAIQIgIEQCABIAI2AhAgAiABNgIYCyAAQRRqKAIAIgBFDQAgAUEUaiAANgIAIAAgATYCGAsLowIBBH8gAEIANwIQIAACf0EAIAFBgAJJDQAaQR8gAUH///8HSw0AGiABQQYgAUEIdmciAmt2QQFxIAJBAXRrQT5qCyICNgIcIAJBAnRB4LXBAGohAwJAAkACQAJAQdSzwQAoAgAiBEEBIAJ0IgVxBEAgAygCACEDIAIQ/AEhAiADEP0BIAFHDQEgAyECDAILQdSzwQAgBCAFcjYCACADIAA2AgAMAwsgASACdCEEA0AgAyAEQR12QQRxakEQaiIFKAIAIgJFDQIgBEEBdCEEIAIiAxD9ASABRw0ACwsgAigCCCIBIAA2AgwgAiAANgIIIAAgAjYCDCAAIAE2AgggAEEANgIYDwsgBSAANgIACyAAIAM2AhggACAANgIIIAAgADYCDAtvAQx/QYC3wQAoAgAiAkUEQEGQt8EAQf8fNgIAQQAPC0H4tsEAIQYDQCACIgEoAgghAiABKAIEIQMgASgCACEEIAFBDGooAgAaIAEhBiAFQQFqIQUgAg0AC0GQt8EAIAVB/x8gBUH/H0sbNgIAIAgLjAcBBX8gABCJAiIAIAAQ/QEiAhCGAiEBAkACQAJAIAAQ/wENACAAKAIAIQMCQCAAEIACRQRAIAIgA2ohAiAAIAMQhwIiAEHotsEAKAIARw0BIAEoAgRBA3FBA0cNAkHgtsEAIAI2AgAgACACIAEQhQIPCyACIANqQRBqIQAMAgsgA0GAAk8EQCAAEOgBDAELIABBDGooAgAiBCAAQQhqKAIAIgVHBEAgBSAENgIMIAQgBTYCCAwBC0HQs8EAQdCzwQAoAgBBfiADQQN2d3E2AgALAkAgARD+AQRAIAAgAiABEIUCDAELAkACQAJAQey2wQAoAgAgAUcEQCABQei2wQAoAgBHDQFB6LbBACAANgIAQeC2wQBB4LbBACgCACACaiIBNgIAIAAgARCEAg8LQey2wQAgADYCAEHktsEAQeS2wQAoAgAgAmoiATYCACAAIAFBAXI2AgQgAEHotsEAKAIARg0BDAILIAEQ/QEiAyACaiECAkAgA0GAAk8EQCABEOgBDAELIAFBDGooAgAiBCABQQhqKAIAIgFHBEAgASAENgIMIAQgATYCCAwBC0HQs8EAQdCzwQAoAgBBfiADQQN2d3E2AgALIAAgAhCEAiAAQei2wQAoAgBHDQJB4LbBACACNgIADAMLQeC2wQBBADYCAEHotsEAQQA2AgALQYi3wQAoAgAgAU8NAUGAgHxBCEEIEPkBQRRBCBD5AWpBEEEIEPkBamtBd3FBA2siAEEAQRBBCBD5AUECdGsiASAAIAFJG0UNAUHstsEAKAIARQ0BQQhBCBD5ASEAQRRBCBD5ASEBQRBBCBD5ASECQQACQEHktsEAKAIAIgQgAiABIABBCGtqaiICTQ0AQey2wQAoAgAhAUH4tsEAIQACQANAIAEgACgCAE8EQCAAEI0CIAFLDQILIAAoAggiAA0AC0EAIQALIAAQiwINACAAQQxqKAIAGgwAC0EAEOoBa0cNAUHktsEAKAIAQYi3wQAoAgBNDQFBiLfBAEF/NgIADwsgAkGAAkkNASAAIAIQ6QFBkLfBAEGQt8EAKAIAQQFrIgA2AgAgAA0AEOoBGg8LDwsgAkEDdiIDQQN0QdizwQBqIQECf0HQs8EAKAIAIgJBASADdCIDcQRAIAEoAggMAQtB0LPBACACIANyNgIAIAELIQMgASAANgIIIAMgADYCDCAAIAE2AgwgACADNgIIC2ABAX8jAEEQayIDJAAgAyACNgIIIAMgATYCBCADIAA2AgAgAygCACEBIAMoAgQhAiADKAIIIQMjAEEQayIAJAAgACACNgIMIAAgATYCCCAAQQhqQeyGwQBBACADEPEBAAuTBAEDfwJ/IwBBIGsiAiQAAkACQAJAAkACQAJAIAAtAABBAWsOAwECAwALIAIgAEEEaigCADYCACACIAFBwITBAEECEMYCNwMYIAJBGGpBwoTBAEEEIAJByITBABCnAiACQSg6AAdBjoTBAEEEIAJBB2pBlITBABCnAkEUQQEQSyIARQ0EIABBEGpB84vBACgAADYAACAAQQhqQeuLwQApAAA3AAAgAEHji8EAKQAANwAAIAJClICAgMACNwIMIAIgADYCCEGkhMEAQQcgAkEIakHYhMEAEKcCELQCIQAgAigCDEUNAyACKAIIIgFFDQMgARDrAQwDCyACIAAtAAE6ABggAkEIaiIAIAFBvITBAEEEEMcCIAAgAkEYakGUhMEAELUCELYCIQAMAgsgAEEEaigCACIDKAIAIQQgAiADKAIENgIcIAIgBDYCGCACIAAtAAE6AAAgAiABQYmEwQBBBRDGAjcDCCACQQhqQY6EwQBBBCACQZSEwQAQpwJBpITBAEEHIAJBGGpBrITBABCnAhC0AiEADAELIABBBGooAgAhACACIAFBqYfBAEEGEMYCNwMIIAIgAEEIajYCGCACQQhqIgFBjoTBAEEEIAJBGGoiA0Gwh8EAEKcCGiACIAA2AhggAUGkh8EAQQUgA0HAh8EAEKcCGiABELQCIQALIAJBIGokACAADAELQRRBARCSAgALC1UBAX8CQCAARQRAQam3wQAtAABFDQELQam3wQBBAToAAAJAQcizwQAoAgBBAUYEQEHMs8EAKAIAIQEMAQtByLPBAEEBNgIAC0HMs8EAIAA2AgALIAELAwABC6EBAQJ/AkBBxLPBACgCAEH/////B3EEQBDgAUUNAQtBuLPBACgCAEG4s8EAQX82AgBFBEBBwLPBACgCACEAQcCzwQBB7MPAADYCAEG8s8EAKAIAIQFBvLPBAEEBNgIAQbizwQBBADYCAAJAIABFDQAgASAAKAIAEQQAIAAoAgRFDQAgACgCCBogARDrAQsPCwALQaSFwQBBNEH0hcEAEOwBAAuKAgEDfyMAQSBrIgQkAEEBIQVBxLPBAEHEs8EAKAIAIgZBAWo2AgACQEGgt8EAKAIAQQFGBEBBpLfBACgCAEEBaiEFDAELQaC3wQBBATYCAAtBpLfBACAFNgIAAkACQCAGQQBIIAVBAktyDQAgBCADNgIcIAQgAjYCGEG4s8EAKAIAIgJBAEgNAEG4s8EAIAJBAWoiAjYCAEG4s8EAQcCzwQAoAgAiAwR/QbyzwQAoAgAgBEEIaiAAIAEoAhARAQAgBCAEKQMINwMQIARBEGogAygCFBEBAEG4s8EAKAIABSACC0EBazYCACAFQQFNDQELAAsjAEEQayICJAAgAiABNgIMIAIgADYCCAALqQICBH8BfiMAQTBrIgIkACABQQRqIQQCQCABKAIEBEBBjIPBACgCACEFDAELIAEoAgAhAyACQgA3AgwgAkGMg8EAKAIAIgU2AgggAiACQQhqNgIUIAJBKGogA0EQaikCADcDACACQSBqIANBCGopAgA3AwAgAiADKQIANwMYIAJBFGpB+IHBACACQRhqEKICGiAEQQhqIAJBEGooAgA2AgAgBCACKQMINwIACyACQSBqIgMgBEEIaigCADYCACABQQxqQQA2AgAgBCkCACEGIAFBCGpBADYCACABIAU2AgQgAiAGNwMYQQxBBBBLIgFFBEBBDEEEEJICAAsgASACKQMYNwIAIAFBCGogAygCADYCACAAQcyGwQA2AgQgACABNgIAIAJBMGokAAuxAQECfyMAQTBrIgIkACABQQRqIQMgASgCBEUEQCABKAIAIQEgAkIANwIMIAJBjIPBACgCADYCCCACIAJBCGo2AhQgAkEoaiABQRBqKQIANwMAIAJBIGogAUEIaikCADcDACACIAEpAgA3AxggAkEUakH4gcEAIAJBGGoQogIaIANBCGogAkEQaigCADYCACADIAIpAwg3AgALIABBzIbBADYCBCAAIAM2AgAgAkEwaiQAC0UBAn8gASgCBCECIAEoAgAhA0EIQQQQSyIBRQRAQQhBBBCSAgALIAEgAjYCBCABIAM2AgAgAEHchsEANgIEIAAgATYCAAsTACAAQdyGwQA2AgQgACABNgIAC1UBAn8gASgCACECIAFBADYCAAJAIAIEQCABKAIEIQNBCEEEEEsiAUUNASABIAM2AgQgASACNgIAIABB3IbBADYCBCAAIAE2AgAPCwALQQhBBBCSAgALHQAgASgCAEUEQAALIABB3IbBADYCBCAAIAE2AgALVwEBfyMAQRBrIgIkACACIAFBi4fBAEEIEMcCIAIgADYCDCACIAJBDGoiAUHsgsEAELUCGiACIABBBGo2AgwgAiABQZSHwQAQtQIaIAIQtgIgAkEQaiQACxAAIAAgAWpBAWtBACABa3ELDwAgAEEBdCIAQQAgAGtyCwoAQQAgAGsgAHELEgBBAEEZIABBAXZrIABBH0YbCwoAIAAoAgRBeHELDQAgAC0ABEECcUEBdgsKACAAKAIEQQFxCwsAIAAtAARBA3FFCyoAIAAgACgCBEEBcSABckECcjYCBCAAIAFqQQRqIgAgACgCAEEBcjYCAAshACAAIAFBA3I2AgQgACABakEEaiIAIAAoAgBBAXI2AgALDAAgACABQQNyNgIECxYAIAAgAUEBcjYCBCAAIAFqIAE2AgALIwAgAiACKAIEQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgALBwAgACABagsHACAAIAFrCwcAIABBCGoLBwAgAEEIawsZAQF/IAAoAhAiAQR/IAEFIABBFGooAgALCwoAIAAoAgxBAXELCgAgACgCDEEBdgsNACAAKAIAIAAoAgRqC2cBAn8jAEEQayICJAAgACgCACIAQQhqKAIAIQMgACgCACEAIAIgARDIAjcDACADBEADQCACIAA2AgwgAiACQQxqQYSOwQAQtwIgAEEBaiEAIANBAWsiAw0ACwsgAhC4AiACQRBqJAAL7QEBAX8gACgCACECIwBBEGsiACQAIAAgAa1CgICAgBBCACABKAIY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AkF8Sw0LIAMgBEkNDCABIAU2AgAgACACNgIEIAAgBjYCACABIAMgBGs2AgQgAEEMakEDNgIADBwLIAlBGHRBGHVBAE4gCUGgAU9yDRIMAgsgC0EfakH/AXFBDE8EQCALQX5xQW5HIAlBGHRBGHVBAE5yIAlBwAFPcg0SDAILIAlBGHRBGHVBAE4NESAJQcABSQ0BDBELIAlB4AFxQaABRw0QCyAGIAJBAmoiBGoiBUGAkMEAIAMgBEsbLQAAQcABcUGAAUYEQCACQQNqIQIMEgsgAiADSw0JIAJBfUsNCiADIARJDQsMFwsgBSAGaiIEQYCQwQAgAyAFSxstAABBwAFxQYABRg0NIAIgA0sNCyACIANPDQwMEwsgAiADQbidwQAQmwIACyAFIANBuJ3BABCbAgALIAIgA0HIncEAEJsCAAsgAiAEQcidwQAQngIACyAEIANByJ3BABCbAgALIAIgA0HYncEAEJsCAAsgAiAEQdidwQAQngIACyAEIANB2J3BABCbAgALIAIgA0H4ncEAEJsCAAsgAiAEQfidwQAQngIACyAEIANB+J3BABCbAgALIAIgA0GYnsEAEJsCAAsgBSADQZiewQAQmwIACyACQQJqIQIMAgsCQCACIANNBEAgAiADTw0BIAEgCDYCAAwHCyACIANBiJ7BABCbAgALIAUgA0GInsEAEJsCAAsCQCACIANNBEAgAiADTw0BDAULIAIgA0HoncEAEJsCAAsgBSADQeidwQAQmwIACyACIANJDQALIAFBADYCBCABQYSQwQA2AgAgACADNgIEIAAgBjYCACAAQQxqQQA2AgAgAEEIakGEkMEANgIADwsgAEEANgIADwsgASAENgIACyAAIAI2AgQgACAGNgIAIAEgAyAFazYCBAsgAEEMakEBNgIADAELIAEgBTYCACAAIAI2AgQgACAGNgIAIAEgAyAEazYCBCAAQQxqQQI2AgALIABBCGogBzYCAAuTAQEDfyMAQYABayIDJAAgAC0AACECQQAhAANAIAAgA2pB/wBqQTBB1wAgAkEPcSIEQQpJGyAEajoAACAAQQFrIQAgAiIEQQR2IQIgBEEPSw0ACyAAQYABaiICQYEBTwRAIAJBgAFB4JXBABCaAgALIAFBAUHwlcEAQQIgACADakGAAWpBACAAaxC6AiADQYABaiQACw4AIAApAwBBASABENYCC40BAQN/IwBBgAFrIgMkACAAKAIAIQADQCACIANqQf8AakEwQdcAIABBD3EiBEEKSRsgBGo6AAAgAkEBayECIABBD0sgAEEEdiEADQALIAJBgAFqIgBBgQFPBEAgAEGAAUHglcEAEJoCAAsgAUEBQfCVwQBBAiACIANqQYABakEAIAJrELoCIANBgAFqJAALwQICBX8BfiMAQTBrIgUkAEEnIQMCQCAAQpDOAFQEQCAAIQgMAQsDQCAFQQlqIANqIgRBBGsgACAAQpDOAIAiCEKQzgB+faciBkH//wNxQeQAbiIHQQF0QfKVwQBqLwAAOwAAIARBAmsgBiAHQeQAbGtB//8DcUEBdEHylcEAai8AADsAACADQQRrIQMgAEL/wdcvViAIIQANAAsLIAinIgRB4wBKBEAgA0ECayIDIAVBCWpqIAinIgQgBEH//wNxQeQAbiIEQeQAbGtB//8DcUEBdEHylcEAai8AADsAAAsCQCAEQQpOBEAgA0ECayIDIAVBCWpqIARBAXRB8pXBAGovAAA7AAAMAQsgA0EBayIDIAVBCWpqIARBMGo6AAALIAIgAUGEkMEAQQAgBUEJaiADakEnIANrELoCIAVBMGokAAuMAQEDfyMAQYABayIDJAAgACgCACEAA0AgAiADakH/AGpBMEE3IABBD3EiBEEKSRsgBGo6AAAgAkEBayECIABBD0sgAEEEdiEADQALIAJBgAFqIgBBgQFPBEAgAEGAAUHglcEAEJoCAAsgAUEBQfCVwQBBAiACIANqQYABakEAIAJrELoCIANBgAFqJAALIgAgACgCACIArSAAQX9zrEIBfCAAQQBOIgAbIAAgARDWAgscACABKAIYQayswQBBBSABQRxqKAIAKAIMEQIAC5gCAQJ/IwBBEGsiAiQAAn8gACgCACIALQAAQQFHBEAgASgCGEGorMEAQQQgAUEcaigCACgCDBECAAwBCyACIAEoAhhBpKzBAEEEIAFBHGooAgAoAgwRAgA6AAggAiABNgIAIAJBADoACSACQQA2AgQgAiAAQQFqNgIMIAIgAkEMakG0lcEAELUCGgJ/IAItAAgiASACKAIEIgNFDQAaIAFB/wFxIQBBASAADQAaIAIoAgAhAAJAIANBAUcNACACLQAJRQ0AIAAtAABBBHENAEEBIAAoAhhBsJXB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AAwAAAANAAAACgAAAAAAAAABAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAACgAAAAAAAAABAAAAFwAAAENvaW5kZW5vbWFtb3VudHdhc21jdXN0b21iYW5rQmFua1F1ZXJ5YWxsX2JhbGFuY2VzYWRkcmVzc2JhbGFuY2VBbGxCYWxhbmNlUmVzcG9uc2VXYXNtUXVlcnljb250cmFjdF9pbmZvY29udHJhY3RfYWRkcnJhd2tleXNtYXJ0bXNnYmxvY2t0cmFuc2FjdGlvbmNvbnRyYWN0aGVpZ2h0dGltZWNoYWluX2lkc2VuZGVyZnVuZHNpbmRleFF1ZXJpZXIgc3lzdGVtIGVycm9yOiAAMQEQABYAAABRdWVyaWVyIGNvbnRyYWN0IGVycm9yOiBQARAAGAAAAFNlcmlhbGl6aW5nIFF1ZXJ5UmVxdWVzdDogAABwARAAGgAAAC9jb2RlL3BhY2thZ2VzL3N0ZC9zcmMvZXhwb3J0cy5ycwAAAJQBEAAhAAAAiQAAABoAAACUARAAIQAAAKEAAAAaAAAAlAEQACEAAABrAAAAGgAAAJQBEAAhAAAAuQAAABoAAACUARAAIQAAAOYAAAAaAAAAQmFua01zZ2J1cm5zZW5kdG9fYWRkcmVzc1dhc21Nc2djbGVhcl9hZG1pbnVwZGF0ZV9hZG1pbmFkbWlubWlncmF0ZW5ld19jb2RlX2lkaW5zdGFudGlhdGVjb2RlX2lkbGFiZWxleGVjdXRlU3ViTXNnZ2FzX2xpbWl0UmVwbHlPbm5ldmVyc3VjY2Vzc2Vycm9yYWx3YXlzb2tFbXB0eUV2ZW50dHlwZWF0dHJpYnV0ZXNBdHRyaWJ1dGV2YWx1ZVJlc3BvbnNlZXZlbnRzABgAAAAMAAAABAAAABkAAAAaAAAAGwAAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkvcnVzdGMvZGI5ZDFiMjBiYmExOTY4YzFlYzFmYzQ5NjE2ZDQ3NDJjMTcyNWI0Yi9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAACcDEABLAAAAYQkAAA4AAABjb3Ntd2FzbV9zdGQ6OnJlc3VsdHM6OmNvbnRyYWN0X3Jlc3VsdDo6Q29udHJhY3RSZXN1bHQ8Y29zbXdhc21fc3RkOjpyZXN1bHRzOjpyZXNwb25zZTo6UmVzcG9uc2U+Y29zbXdhc21fc3RkOjpxdWVyeTo6YmFuazo6QWxsQmFsYW5jZVJlc3BvbnNlaGFja2F0b206Om1zZzo6UmVjdXJzZVJlc3BvbnNlaGFja2F0b206Om1zZzo6UXVlcnlNc2doYWNrYXRvbTo6bXNnOjpJbnRSZXNwb25zZWNvc213YXNtX3N0ZDo6cmVzdWx0czo6Y29udHJhY3RfcmVzdWx0OjpDb250cmFjdFJlc3VsdDxjb3Ntd2FzbV9zdGQ6OmJpbmFyeTo6QmluYXJ5PmNvc213YXNtX3N0ZDo6dHlwZXM6Ok1lc3NhZ2VJbmZvY29zbXdhc21fc3RkOjp0eXBlczo6RW52aGFja2F0b206Om1zZzo6RXhlY3V0ZU1zZ2hhY2thdG9tOjptc2c6OlN1ZG9Nc2doYWNrYXRvbTo6bXNnOjpNaWdyYXRlTXNnaGFja2F0b206OnN0YXRlOjpTdGF0ZWNvc213YXNtX3N0ZDo6cXVlcnk6OlF1ZXJ5UmVxdWVzdDxjb3Ntd2FzbV9zdGQ6OnJlc3VsdHM6OmVtcHR5OjpFbXB0eT5oYWNrYXRvbTo6bXNnOjpJbnN0YW50aWF0ZU1zZ2hhY2thdG9tOjptc2c6OlZlcmlmaWVyUmVzcG9uc2UAAAAKAAAABAAAAAQAAAAcAAAAHQAAAB4AAABjYWxsZWQgYFJlc3VsdDo6dW53cmFwX2VycigpYCBvbiBhbiBgT2tgIHZhbHVlAAAYAAAADAAAAAQAAAAfAAAAGAAAAAwAAAAEAAAAIAAAAAoAAAAAAAAAAQAAACEAAABjYWxsZWQgYFJlc3VsdDo6dW53cmFwKClgIG9uIGFuIGBFcnJgIHZhbHVlACIAAAAgAAAACAAAAAkAAAAEAAAAAAAAAAgAAAAAAAAAAQAAAAAAAABtaXNzaW5nIGZpZWxkIGBgnAYQAA8AAACrBhAAAQAAAGR1cGxpY2F0ZSBmaWVsZCBgAAAAvAYQABEAAACrBhAAAQAAAHVua25vd24gdmFyaWFudCBgYCwgZXhwZWN0ZWQgAAAA4AYQABEAAADxBhAADAAAAGludmFsaWQgYmFzZTY0OiAQBxAAEAAAAGludmFsaWQgVWludDY0ICcnIC0gKAcQABAAAAA4BxAABAAAAGludmFsaWQgVWludDEyOCAnAAAATAcQABEAAAA4BxAABAAAAHVsbGNvbmZpZ2FjdGlvbnJlbGVhc2VkZXN0aW5hdGlvbvALqlN0YXRlcGFzc3dvcmRvdGhlcnNhbHRoYXNoX2VuY29kZWQgZXJyb3JlZDogqgcQABYAAABzcmMvY29udHJhY3QucnN0ZXN0LmtleQDIBxAADwAAAJYAAAAJAAAAbXVzdCBub3QgYmUgZW1wdHkAAADIBxAADwAAAJ4AAAAhAAAAyAcQAA8AAACeAAAAEwAAAG1lbW9yeS5ncm93IGZhaWxlZFRoaXMgcGFnZSBpbnRlbnRpb25hbGx5IGZhdWx0ZWQAAAA2CBAAHwAAAMgHEAAPAAAAwwAAAAUAAADIBxAADwAAANYAAAAoAAAAVW5leHBlY3RlZCBlcnJvciBpbiBkb191c2VyX2Vycm9yc19pbl9hcGlfY2FsbHM6IAAAAIAIEAAxAAAAYm45aGhzc29tZWx0dmh6Z3Z1cWt3amtwd3hvamZ1aWdsdHdlZGF5enhsanVjZWZpa3VpZWlsbG93YXRpY2tzb2lzdHFveW5tZ2NuajIxOWHIBxAADwAAAOMAAAAxAAAAyAcQAA8AAADxAAAAJQAAAMgHEAAPAAAA/QAAACkAAADIBxAADwAAAAkBAAAsAAAAaGVyZSB3ZSBnbyDwn5qATGV0IHRoZWhhY2tpbmcgYmVnaW5VbmF1dGhvcml6ZWQAbwkQAAwAAACEBhAAAAAAAHZlcmlmaWVyYmVuZWZpY2lhcnlzdGVhbF9mdW5kcwAAnwkQAAsAAAByZWNpcGllbnRFeGVjdXRlTXNndXNlcl9lcnJvcnNfaW5fYXBpX2NhbGxzcGFuaWNhbGxvY2F0ZV9sYXJnZV9tZW1vcnlwYWdlc21lc3NhZ2VfbG9vcG1lbW9yeV9sb29wc3RvcmFnZV9sb29wY3B1X2xvb3BhcmdvbjJtZW1fY29zdHRpbWVfY29zdH8HEAAHAAAAKQoQAAYAAAAhChAACAAAABUKEAAMAAAACgoQAAsAAAD+CRAADAAAAOQJEAAVAAAA3wkQAAUAAADHCRAAGAAAAFF1ZXJ5TXNnZ2V0X2ludHJlY3Vyc2VkZXB0aHdvcmtvdGhlcl9iYWxhbmNljAkQAAgAAACnChAADQAAAJcKEAAHAAAAkAoQAAcAAABWZXJpZmllclJlc3BvbnNlUmVjdXJzZVJlc3BvbnNlaGFzaGVkSW50UmVzcG9uc2VpbnRmdW5kZXIAAABhdHRlbXB0IHRvIGFkZCB3aXRoIG92ZXJmbG93QmFkIGhhc2ggbGVuZ3RoOiAAAAAsCxAAEQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9ibGFrZTJiX3NpbWQtMC41LjExL3NyYy9saWIucnNICxAAWAAAAO8AAAAJAAAAKAAAACQAAAAEAAAAKQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9jcm9zc2JlYW0tdXRpbHMtMC44Ljgvc3JjL3RocmVhZC5ycwAAAMALEABdAAAAuAEAACQAAABmYWlsZWQgdG8gc3Bhd24gc2NvcGVkIHRocmVhZAAAAMALEABdAAAA/QAAAA4AAADACxAAXQAAAKoAAAAKAAAAwAsQAF0AAACtAAAALAAAAABjYW5ub3QgcmVjdXJzaXZlbHkgYWNxdWlyZSBtdXRleAAAAIEMEAAgAAAAL3J1c3RjL2RiOWQxYjIwYmJhMTk2OGMxZWMxZmM0OTYxNmQ0NzQyYzE3MjViNGIvbGlicmFyeS9zdGQvc3JjL3N5cy93YXNtLy4uL3Vuc3VwcG9ydGVkL211dGV4LnJzrAwQAGAAAAAXAAAACQAAAC9ydXN0Yy9kYjlkMWIyMGJiYTE5NjhjMWVjMWZjNDk2MTZkNDc0MmMxNzI1YjRiL2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvbW9kLnJzAAAAHA0QAE0AAAD7BAAAHAAAACoAAAAUAAAABAAAACsAAAB0aHJlYWQgbmFtZSBtYXkgbm90IGNvbnRhaW4gaW50ZXJpb3IgbnVsbCBieXRlcwAcDRAATQAAAM4BAAAgAAAALAAAAAgAAAAEAAAALQAAAC4AAABjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlAC8AAAAIAAAABAAAADAAAAAxAAAAEAAAAAQAAAAyAAAAMwAAABQAAAAEAAAANAAA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AC8VEAAgAAAAL3J1c3RjL2RiOWQxYjIwYmJhMTk2OGMxZWMxZmM0OTYxNmQ0NzQyYzE3MjViNGIvbGlicmFyeS9zdGQvc3JjL3N5cy93YXNtLy4uL3Vuc3VwcG9ydGVkL211dGV4LnJzWBUQAGAAAAAXAAAACQBB0KvAAAvxAmF0dGVtcHQgdG8gYWRkIHdpdGggb3ZlcmZsb3djYWxsZWQgYFJlc3VsdDo6dW53cmFwKClgIG9uIGFuIGBFcnJgIHZhbHVlADkAAAAIAAAABAAAADoAAAA7AAAABAAAAAQAAAA8AAAAUG9pc29uRXJyb3IvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvY3Jvc3NiZWFtLXV0aWxzLTAuOC44L3NyYy9zeW5jL3dhaXRfZ3JvdXAucnMAAABDFhAAZgAAAGkAAAAlAAAAQxYQAGYAAABwAAAALAAAAEMWEABmAAAAcgAAACwAAABDFhAAZgAAAHkAAAAxAAAAQxYQAGYAAAB6AAAACQAAAAAAAABhdHRlbXB0IHRvIHN1YnRyYWN0IHdpdGggb3ZlcmZsb3cAAABDFhAAZgAAAIQAAAAxAAAAQxYQAGYAAACFAAAACQBB0K7AAAuhBGF0dGVtcHQgdG8gYWRkIHdpdGggb3ZlcmZsb3cAAAAAYXR0ZW1wdCB0byBzdWJ0cmFjdCB3aXRoIG92ZXJmbG93L3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2JsYWtlMmJfc2ltZC0wLjUuMTEvc3JjL3BvcnRhYmxlLnJzAACRFxAAXQAAAIQAAAAFAAAAkRcQAF0AAACWAAAAFQAAAJEXEABdAAAApAAAAAkAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmxha2UyYl9zaW1kLTAuNS4xMS9zcmMvbGliLnJzIBgQAFgAAACpAQAAHQAAACAYEABYAAAAqgEAACgAAAAgGBAAWAAAAKoBAAAJAAAAIBgQAFgAAACqAQAARQAAACAYEABYAAAAqwEAAAkAAAAgGBAAWAAAAMsBAAAJAAAAIBgQAFgAAADOAQAAEgAAACAYEABYAAAA5QEAAA4AAAAgGBAAWAAAAE4CAAAKAAAAL3J1c3RjL2RiOWQxYjIwYmJhMTk2OGMxZWMxZmM0OTYxNmQ0NzQyYzE3MjViNGIvbGlicmFyeS9jb3JlL3NyYy9pdGVyL2FkYXB0ZXJzL2VudW1lcmF0ZS5ycwAIGRAAWwAAADAAAAAJAEGAs8AAC9EIYXR0ZW1wdCB0byBhZGQgd2l0aCBvdmVyZmxvdwAAAABhdHRlbXB0IHRvIG11bHRpcGx5IHdpdGggb3ZlcmZsb3cAAABMAAAACAAAAAQAAABNAAAATgAAAE8AAAAMAAAABAAAAFAAAABRAAAAUgAAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkvcnVzdGMvZGI5ZDFiMjBiYmExOTY4YzFlYzFmYzQ5NjE2ZDQ3NDJjMTcyNWI0Yi9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAACcaEABLAAAAYQkAAA4AAABjb3Ntd2FzbV9zdGQ6OnJlc3VsdHM6OnN5c3RlbV9yZXN1bHQ6OlN5c3RlbVJlc3VsdDxjb3Ntd2FzbV9zdGQ6OnJlc3VsdHM6OmNvbnRyYWN0X3Jlc3VsdDo6Q29udHJhY3RSZXN1bHQ8Y29zbXdhc21fc3RkOjpiaW5hcnk6OkJpbmFyeT4+TAAAAAQAAAAEAAAAUwAAAFQAAABVAAAATwAAABQAAAAEAAAANAAAAEwAAAAAAAAAAQAAACEAAAAvcnVzdGMvZGI5ZDFiMjBiYmExOTY4YzFlYzFmYzQ5NjE2ZDQ3NDJjMTcyNWI0Yi9saWJyYXJ5L2NvcmUvc3JjL2l0ZXIvdHJhaXRzL2FjY3VtLnJzAAAARBsQAFUAAACNAAAAAQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IAAArBsQACoAAAABAAAAAAAAAG1pc3NpbmcgZmllbGQgYGDoGxAADwAAAPcbEAABAAAAZHVwbGljYXRlIGZpZWxkIGAAAAAIHBAAEQAAAPcbEAABAAAAdW5rbm93biB2YXJpYW50IGBgLCBleHBlY3RlZCAAAAAsHBAAEQAAAD0cEAAMAAAATAAAAAQAAAAEAAAAVgAAAEwAAAAEAAAABAAAAFcAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmFzZTY0LTAuMTMuMC9zcmMvZGVjb2RlLnJzAAAAfBwQAFUAAADSAQAAHwAAAHwcEABVAAAA2AEAAB8AAAB8HBAAVQAAANsBAAANAAAAfBwQAFUAAADhAQAAHwAAAHwcEABVAAAA5AEAAA0AAAB8HBAAVQAAAOoBAAAfAAAAfBwQAFUAAADtAQAADQAAAHwcEABVAAAA8wEAAB8AAAB8HBAAVQAAAPYBAAANAAAAfBwQAFUAAAD8AQAAHwAAAHwcEABVAAAA/wEAAA0AAAB8HBAAVQAAAAUCAAAfAAAAfBwQAFUAAAAIAgAADQAAAHwcEABVAAAADgIAAB8AAAB8HBAAVQAAABECAAANAAAAfBwQAFUAAABuAAAALwBB4LvAAAuHBmF0dGVtcHQgdG8gc3VidHJhY3Qgd2l0aCBvdmVyZmxvdwAAAHwcEABVAAAAAwEAADcAAAB8HBAAVQAAAAMBAAAkAAAAfBwQAFUAAAAEAQAAPgAAAHwcEABVAAAABAEAACkAAAB8HBAAVQAAACEBAAARAAAAfBwQAFUAAAAqAQAAKQAAAHwcEABVAAAAKgEAABYAAAB8HBAAVQAAAC4BAAApAAAAfBwQAFUAAAAuAQAAKAAAAHwcEABVAAAALQEAABoAAAB8HBAAVQAAADMBAAARAAAAfBwQAFUAAABBAQAADgAAAHwcEABVAAAARAEAACcAAAB8HBAAVQAAAEQBAAASAAAAfBwQAFUAAABHAQAACQAAAHwcEABVAAAAWAEAABMAAAB8HBAAVQAAAGYBAAApAAAAfBwQAFUAAAB4AQAADQAAAHwcEABVAAAAggEAABEAAAB8HBAAVQAAAIoBAAAVAAAAfBwQAFUAAACOAQAAMQAAAEltcG9zc2libGU6IG11c3Qgb25seSBoYXZlIDAgdG8gOCBpbnB1dCBieXRlcyBpbiBsYXN0IGNodW5rLCB3aXRoIG5vIGludmFsaWQgbGVuZ3Roc1QfEABUAAAAfBwQAFUAAACdAQAADgAAAHwcEABVAAAAqAEAAA0AAAB8HBAAVQAAALEBAAAJAAAAT3ZlcmZsb3cgd2hlbiBjYWxjdWxhdGluZyBvdXRwdXQgYnVmZmVyIGxlbmd0aAAAfBwQAFUAAACWAAAACgAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYXNlNjQtMC4xMy4wL3NyYy9lbmNvZGUucnNJbnZhbGlkIFVURjgAAAAgIBAAVQAAADQAAAAcAAAAaW50ZWdlciBvdmVyZmxvdyB3aGVuIGNhbGN1bGF0aW5nIGJ1ZmZlciBzaXplAAAAICAQAFUAAAAvAAAAEQAAAEwAAAAIAAAABAAAAFgAAADgGxAAQfDBwAALCSAAAAAIAAAAAgBBhMLAAAu9IAIAAAADAAAAQmluYXJ5KAAMIRAABwAAACkAAAAcIRAAAQAAAGludmFsaWQgYmFzZTY0OiAoIRAAEAAAAFVuc3VwcG9ydGVkIHF1ZXJ5IHR5cGU6IEAhEAAYAAAAVW5rbm93biBzeXN0ZW0gZXJyb3JgIRAAFAAAAE5vIHN1Y2ggY29udHJhY3Q6IAAAfCEQABIAAABDYW5ub3QgcGFyc2UgcmVzcG9uc2U6ICBpbjogmCEQABcAAACvIRAABQAAAENhbm5vdCBwYXJzZSByZXF1ZXN0OiAAAMQhEAAWAAAAryEQAAUAAABMAAAAAAAAAAEAAABZAAAAWgAAAFoAAAAvY29kZS9wYWNrYWdlcy9zdGQvc3JjL3NlY3Rpb25zLnJzAAAEIhAAIgAAABoAAAAQAAAABCIQACIAAAAaAAAABQAAAFRMO0RSOiBWYWx1ZSBtdXN0IG5vdCBiZSBlbXB0eSBpbiBTdG9yYWdlOjpzZXQgYnV0IGluIG1vc3QgY2FzZXMgeW91IGNhbiB1c2UgU3RvcmFnZTo6cmVtb3ZlIGluc3RlYWQuIExvbmcgc3Rvcnk6IEdldHRpbmcgZW1wdHkgdmFsdWVzIGZyb20gc3RvcmFnZSBpcyBub3Qgd2VsbCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudC4gU29tZSBvZiBvdXIgaW50ZXJuYWwgaW50ZXJmYWNlcyBjYW5ub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbm9uLWV4aXN0ZW50IGtleSBhbmQgYW4gZW1wdHkgdmFsdWUuIFJpZ2h0IG5vdywgeW91IGNhbm5vdCByZWx5IG9uIHRoZSBiZWhhdmlvdXIgb2YgZW1wdHkgdmFsdWVzLiBUbyBwcm90ZWN0IHlvdSBmcm9tIHRyb3VibGUgbGF0ZXIgb24sIHdlIHN0b3AgaGVyZS4gU29ycnkgZm9yIHRoZSBpbmNvbnZlbmllbmNlISBXZSBoaWdobHkgd2VsY29tZSB5b3UgdG8gY29udHJpYnV0ZSB0byB1cywgbWFraW5nIHRoaXMgbW9yZSBzb2xpZCBvbmUgd2F5IG9yIHRoZSBvdGhlci4AAEgiEAACAgAAL2NvZGUvcGFja2FnZXMvc3RkL3NyYy9pbXBvcnRzLnJzAAAAVCQQACEAAABwAAAADQAAAGlucHV0IHRvbyBsb25nIGZvciBhZGRyX3ZhbGlkYXRlYWRkcl92YWxpZGF0ZSBlcnJvcmVkOiAAqCQQABcAAABpbnB1dCB0b28gbG9uZyBmb3IgYWRkcl9jYW5vbmljYWxpemVhZGRyX2Nhbm9uaWNhbGl6ZSBlcnJvcmVkOiAA7CQQABsAAABhZGRyX2h1bWFuaXplIGVycm9yZWQ6IAAQJRAAFwAAAE1lc3NhZ2VUb29Mb25nIG11c3Qgbm90IGhhcHBlbi4gVGhpcyBpcyBhIGJ1ZyBpbiB0aGUgVk0uMCUQADgAAABUJBAAIQAAAA0BAAASAAAAVCQQACEAAAAqAQAAEgAAAEludmFsaWRIYXNoRm9ybWF0IG11c3Qgbm90IGhhcHBlbi4gVGhpcyBpcyBhIGJ1ZyBpbiB0aGUgVk0uAJAlEAA7AAAAVCQQACEAAABEAQAAEgAAAEVycm9yIGNvZGUgMiB1bnVzZWQgc2luY2UgQ29zbVdhc20gMC4xNS4gVGhpcyBpcyBhIGJ1ZyBpbiB0aGUgVk0uAAAA5CUQAEEAAABUJBAAIQAAAEMBAAASAAAAVCQQACEAAABkAQAAEgAAAFQkEAAhAAAAYwEAABIAAABUJBAAIQAAAH0BAAASAAAARXhwZWN0ZWQgYSBWZWMgb2YgbGVuZ3RoICBidXQgaXQgd2FzIAAAAHAmEAAZAAAAiSYQAAwAAAAUAAAAVCQQACEAAAB4AQAAFQAAAC9jb2RlL3BhY2thZ2VzL3N0ZC9zcmMvbWVtb3J5LnJzUmVnaW9uIHBvaW50ZXIgaXMgbnVsbAAA3CYQABYAAAC8JhAAIAAAADkAAAAFAAAAUmVnaW9uIHN0YXJ0cyBhdCBudWxsIHBvaW50ZXIAAAAMJxAAHQAAALwmEAAgAAAAPwAAAAUAAABBZGRyQ2Fub25pY2FsQWRkclVua25vd24gZXJyb3I6IFUnEAAPAAAASW5wdXQgaXMgbG9uZ2VyIHRoYW4gc3VwcG9ydGVkAABsJxAAHgAAAElucHV0cyBhcmUgbGFyZ2VyIHRoYW4gc3VwcG9ydGVklCcQACAAAABVbmtub3duRXJyZXJyb3JfY29kZUwAAAAEAAAABAAAAFsAAABJbnB1dFRvb0xvbmdlcklucHV0c1Rvb0xhcmdlckludmFsaWQgcmVjb3ZlcnkgcGFyYW1ldGVyLiBTdXBwb3J0ZWQgdmFsdWVzOiAwIGFuZCAxLgD9JxAANgAAAEludmFsaWQgc2lnbmF0dXJlIGZvcm1hdDwoEAAYAAAASW52YWxpZCBoYXNoIGZvcm1hdABcKBAAEwAAAEludmFsaWRSZWNvdmVyeVBhcmFtSW52YWxpZFNpZ25hdHVyZUZvcm1hdEludmFsaWRIYXNoRm9ybWF0Q29udmVyc2lvbiBlcnJvcjogAAAAsygQABIAAABEaXZpZGUgYnkgemVybzog0CgQABAAAABPdmVyZmxvdzogAADoKBAACgAAAEVycm9yIHNlcmlhbGl6aW5nIHR5cGUgOiAAAAD8KBAAFwAAABMpEAACAAAARXJyb3IgcGFyc2luZyBpbnRvIHR5cGUgKCkQABgAAAATKRAAAgAAACBub3QgZm91bmQAAOAbEAAAAAAAUCkQAAoAAABDYW5ub3QgZGVjb2RlIFVURjggYnl0ZXMgaW50byBzdHJpbmc6IAAAbCkQACYAAABJbnZhbGlkIGRhdGEgc2l6ZTogZXhwZWN0ZWQ9IGFjdHVhbD2cKRAAHAAAALgpEAAIAAAASW52YWxpZCBCYXNlNjQgc3RyaW5nOiAA0CkQABcAAABHZW5lcmljIGVycm9yOiAA8CkQAA8AAABIYXNoIENhbGN1bGF0aW9uIGVycm9yOiAIKhAAGAAAAFJlY292ZXIgcHVia2V5IGVycm9yOiAAACgqEAAWAAAAVmVyaWZpY2F0aW9uIGVycm9yOiBIKhAAFAAAAENvbnZlcnNpb25PdmVyZmxvd3NvdXJjZUwAAAAEAAAABAAAAFwAAABEaXZpZGVCeVplcm9MAAAABAAAAAQAAABdAAAAT3ZlcmZsb3dMAAAABAAAAAQAAABeAAAAU2VyaWFsaXplRXJyc291cmNlX3R5cGVtc2dQYXJzZUVycnRhcmdldF90eXBlTm90Rm91bmRraW5kSW52YWxpZFV0ZjhJbnZhbGlkRGF0YVNpemVleHBlY3RlZABMAAAABAAAAAQAAABfAAAAYWN0dWFsSW52YWxpZEJhc2U2NEdlbmVyaWNFcnJIYXNoQ2FsY3VsYXRpb25FcnJvcgAAAEwAAAAEAAAABAAAAGAAAABSZWNvdmVyUHVia2V5RXJyTAAAAAQAAAAEAAAAYQAAAFZlcmlmaWNhdGlvbkVycgBMAAAABAAAAAQAAABiAAAAU2hsU2hyUG93TXVsU3ViQWRkQ2Fubm90ICB3aXRoICBhbmQgwisQAAcAAADJKxAABgAAAM8rEAAFAAAAT3ZlcmZsb3dFcnJvcm9wZXJhdGlvbgAATAAAAAQAAAAEAAAAPgAAAG9wZXJhbmQxb3BlcmFuZDJDb252ZXJzaW9uT3ZlcmZsb3dFcnJvcgBMAAAABAAAAAQAAABjAAAAdmFsdWVDYW5ub3QgZGV2aWRlICBieSB6ZXJvAFEsEAAOAAAAXywQAAgAAABEaXZpZGVCeVplcm9FcnJvcm9wZXJhbmRpbnZhbGlkX3JlcXVlc3RpbnZhbGlkX3Jlc3BvbnNlbm9fc3VjaF9jb250cmFjdHVua25vd251bnN1cHBvcnRlZF9yZXF1ZXN0AAAAkCwQAA8AAACfLBAAEAAAAK8sEAAQAAAAvywQAAcAAADGLBAAEwAAAGFkZHJlcnJvcnJlc3BvbnNlcmVxdWVzdEludmFsaWQgcHVibGljIGtleSBmb3JtYXQAAAAcLRAAGQAAAEdlbmVyaWMgZXJyb3IAAABALRAADQAAAEJhdGNoIGVycm9yAFgtEAALAAAASW52YWxpZFB1YmtleUZvcm1hdEJhdGNoRXJyb2sAAACHLRAAAgAAAAgtEAAFAAAAZgAAAAgAAAAEAAAAZwAAAGgAAABmAAAACAAAAAQAAABpAAAAsC0QAAAAAABKU09OIGhhcyBhIGNvbW1hIGFmdGVyIHRoZSBsYXN0IHZhbHVlIGluIGFuIGFycmF5IG9yIG1hcC5KU09OIGhhcyBub24td2hpdGVzcGFjZSB0cmFpbGluZyBjaGFyYWN0ZXJzIGFmdGVyIHRoZSB2YWx1ZS5Gb3VuZCBhIGxvbmUgc3Vycm9nYXRlLCB3aGljaCBjYW4gZXhpc3QgaW4gSlNPTiBidXQgY2Fubm90IGJlIGVuY29kZWQgdG8gVVRGLTguT2JqZWN0IGtleSBpcyBub3QgYSBzdHJpbmcuSW52YWxpZCB1bmljb2RlIGNvZGUgcG9pbnQuSW52YWxpZCB0eXBlSW52YWxpZCBudW1iZXIuSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UuRXhwZWN0ZWQgdGhpcyBjaGFyYWN0ZXIgdG8gc3RhcnQgYSBKU09OIHZhbHVlLkV4cGVjdGVkIHRvIHBhcnNlIGVpdGhlciBhIGB0cnVlYCwgYGZhbHNlYCwgb3IgYSBgbnVsbGAuRXhwZWN0ZWQgdGhpcyBjaGFyYWN0ZXIgdG8gYmUgZWl0aGVyIGEgYCcsJ2Agb3IgYSBgJ30nYC5FeHBlY3RlZCBhIGxvdyBzdXJyb2dhdGUgKERDMDDigJNERkZGKS5FeHBlY3RlZCB0aGlzIGNoYXJhY3RlciB0byBiZSBlaXRoZXIgYSBgJywnYCBvcmEgYCddJ2AuRXhwZWN0ZWQgYSBoaWdoIHN1cnJvZ2F0ZSAoRDgwMOKAk0RCRkYpLkV4cGVjdGVkIHRoaXMgY2hhcmFjdGVyIHRvIGJlIGEgYCc6J2AuRU9GIHdoaWxlIHBhcnNpbmcgYSBKU09OIHZhbHVlLkVPRiB3aGlsZSBwYXJzaW5nIGEgc3RyaW5nLkVPRiB3aGlsZSBwYXJzaW5nIGFuIG9iamVjdC5FT0Ygd2hpbGUgcGFyc2luZyBhIGxpc3QuQ29udHJvbCBjaGFyYWN0ZXIgZm91bmQgaW4gc3RyaW5nLi91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9zZXJkZS1qc29uLXdhc20tMC40LjEvc3JjL2RlL3VuZXNjYXBlLnJzAADQMBAAYgAAACUAAAAVAEHQ4sAAC5UDYXR0ZW1wdCB0byBhZGQgd2l0aCBvdmVyZmxvd9AwEABiAAAAMwAAACkAAAAAAAAAYXR0ZW1wdCB0byBzdWJ0cmFjdCB3aXRoIG92ZXJmbG93Tm9uLWhleCBBU0NJSSBjaGFyYWN0ZXIgZm91bmQAANAwEABiAAAAmQAAAA4AAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvc2VyZGUtanNvbi13YXNtLTAuNC4xL3NyYy9kZS9tb2QucnMAAADQMRAAXQAAACQAAAAJAAAA0DEQAF0AAAB9AAAAIgAAANAxEABdAAAAgQAAACwAAABCdWZmZXIgaXMgZnVsbAAAYDIQAA4AAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvc2VyZGUtanNvbi13YXNtLTAuNC4xL3NyYy9zZXIvbW9kLnJzAAB4MhAAXgAAANcAAAAJAEHw5cAACyFhdHRlbXB0IHRvIHN1YnRyYWN0IHdpdGggb3ZlcmZsb3cAQaDmwAALkRphdHRlbXB0IHRvIGFkZCB3aXRoIG92ZXJmbG93L3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2Jhc2U2NC0wLjEzLjAvc3JjL2VuY29kZS5ycwAAADwzEABVAAAAkgAAACcAAAB1c2l6ZSBvdmVyZmxvdyB3aGVuIGNhbGN1bGF0aW5nIGI2NCBsZW5ndGgAADwzEABVAAAAmQAAAAoAAAA8MxAAVQAAALYAAAAzAAAAPDMQAFUAAAC2AAAAIAAAADwzEABVAAAAtwAAADoAAAA8MxAAVQAAALcAAAAlAAAAPDMQAFUAAAD3AAAAGAAAADwzEABVAAAA/AAAAC8AAAA8MxAAVQAAAPwAAAAcAAAAPDMQAFUAAAD9AAAANgAAADwzEABVAAAA/QAAACEAAAA8MxAAVQAAABMBAAAuAAAAPDMQAFUAAAATAQAACQAAADwzEABVAAAAFAEAAAkAAAA8MxAAVQAAAAsBAAAuAAAAPDMQAFUAAAALAQAACQAAADwzEABVAAAADQEAAA8AAAA8MxAAVQAAAAwBAAAJAAAAPDMQAFUAAAAPAQAACQAAADwzEABVAAAAEQEAAAkAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiAAAAA1EAAqAAAASW1wb3NzaWJsZSByZW1haW5kZXI0NRAAFAAAADwzEABVAAAAKgEAABYAAAA8MxAAVQAAADsBAAAJAAAASW52YWxpZCBsYXN0IHN5bWJvbCAsIG9mZnNldCAuAABwNRAAFAAAAIQ1EAAJAAAAjTUQAAEAAABFbmNvZGVkIHRleHQgY2Fubm90IGhhdmUgYSA2LWJpdCByZW1haW5kZXIuAKg1EAArAAAASW52YWxpZCBieXRlIAAAANw1EAANAAAAhDUQAAkAAACNNRAAAQAAAE92ZXJmbG93IHdoZW4gY2FsY3VsYXRpbmcgbnVtYmVyIG9mIGNodW5rcyBpbiBpbnB1dC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYXNlNjQtMC4xMy4wL3NyYy9kZWNvZGUucnM3NhAAVQAAALwAAAAKAAAAISIjJCUmJygpKissLTAxMjM0NTY3ODlAQUJDREVGR0hJSktMTU5QUVJTVFVWWFlaW2BhYmNkZWhpamtsbXBxckFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5KywuL0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Li8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsv////////////////////////////////////////////AAECAwQFBgcICQoLDP//DQ4PEBESExQVFv///////xcYGRobHB0eHyAhIiMkJf8mJygpKiss/y0uLzD/////MTIzNDU2//83ODk6Ozz//z0+P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8+P////zQ1Njc4OTo7PD3/////////AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBn///////8aGxwdHh8gISIjJCUmJygpKissLS4vMDEyM///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAE2Nzg5Ojs8PT4//////////wIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRob////////HB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDX//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wABAgMEBQYHCAkKC/////////8MDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJf///////yYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z7//zQ1Njc4OTo7PD3/////////AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBn/////P/8aGxwdHh8gISIjJCUmJygpKissLS4vMDEyM///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Pv///z80NTY3ODk6Ozw9/////////wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZ////////GhscHR4fICEiIyQlJicoKSorLC0uLzAxMjP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3DcQAJw3EABcNxAAHDcQANw2EACcNhAAHD0QABw8EAAcOxAAHDoQABw5EAAcOBAAbgAAAAgAAAAEAAAAbwAAAHAAAABuAAAACAAAAAQAAABxAAAAYG9uZSBvZiBxPhAABwAAACwgAACAPhAAAgAAAHA+EAABAAAAcD4QAAEAAABgIG9yIGAAAHA+EAABAAAAnD4QAAYAAABwPhAAAQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9zZXJkZS0xLjAuMTM3L3NyYy9kZS9tb2QucnNleHBsaWNpdCBwYW5pYwC8PhAAVQAAAOgIAAASAAAAYXR0ZW1wdCB0byBhZGQgd2l0aCBvdmVyZmxvdy91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9ibG9jay1idWZmZXItMC45LjAvc3JjL2xpYi5ycwBMPxAAVwAAAIQAAAAJAAAATD8QAFcAAACFAAAACQAAAEw/EABXAAAAhwAAABcAAABMPxAAVwAAAIsAAAAbAAAATD8QAFcAAAA6AAAAIwAAAEw/EABXAAAAOgAAAA0AAABMPxAAVwAAADoAAAAxAAAATD8QAFcAAAA7AAAADQAAAEw/EABXAAAAQQAAAA0AQcCAwQALxxthdHRlbXB0IHRvIHN1YnRyYWN0IHdpdGggb3ZlcmZsb3cAAABMPxAAVwAAANYAAAAJAAAAZ+YJaoWuZ7ty8248OvVPpX9SDlGMaAWbq9mDHxnN4FsvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvc2hhMi0wLjkuOS9zcmMvc2hhMjU2LnJzAACUQBAAUgAAAB8AAAAJAAAAcwAAAAQAAAAEAAAAdAAAAHUAAAB2AAAAcwAAAAQAAAAEAAAAdwAAAGFscmVhZHkgYm9ycm93ZWRjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlAHMAAAAAAAAAAQAAAHgAAABzAAAABAAAAAQAAAB5AAAAcwAAAAQAAAAEAAAAegAAAAEAAAAAAAAAbGlicmFyeS9zdGQvc3JjL3RocmVhZC9tb2QucnNmYWlsZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHRocmVhZCBJRDogYml0c3BhY2UgZXhoYXVzdGVklEEQAB0AAAD7AwAAEQAAAJRBEAAdAAAAAQQAACoAAAAARXJyb3JraW5kAABzAAAAAQAAAAEAAAB7AAAAbWVzc2FnZQBzAAAACAAAAAQAAAB8AAAAS2luZE9zY29kZQAAcwAAAAQAAAAEAAAAfQAAAH4AAAAMAAAABAAAAH8AAABsaWJyYXJ5L3N0ZC9zcmMvc3lzX2NvbW1vbi90aHJlYWRfaW5mby5ycwAAAGhCEAApAAAAKwAAACsAAABjYW5ub3QgbW9kaWZ5IHRoZSBwYW5pYyBob29rIGZyb20gYSBwYW5pY2tpbmcgdGhyZWFkbGlicmFyeS9zdGQvc3JjL3Bhbmlja2luZy5yc9hCEAAcAAAAdgAAAAkAAADYQhAAHAAAAPABAAAfAAAA2EIQABwAAADxAQAAHgAAAIAAAAAQAAAABAAAAIEAAACCAAAAcwAAAAgAAAAEAAAAgwAAAIQAAAB+AAAADAAAAAQAAACFAAAAcwAAAAgAAAAEAAAAhgAAAHMAAAAIAAAABAAAAIcAAACIAAAAVW5zdXBwb3J0ZWROdWxFcnJvcgBzAAAABAAAAAQAAACJAAAAZXJyb3JDdXN0b20AcwAAAAQAAAAEAAAAigAAAHMAAAAEAAAABAAAAIsAAABVbmNhdGVnb3JpemVkT3RoZXJPdXRPZk1lbW9yeVVuZXhwZWN0ZWRFb2ZJbnRlcnJ1cHRlZEFyZ3VtZW50TGlzdFRvb0xvbmdGaWxlbmFtZVRvb0xvbmdUb29NYW55TGlua3NDcm9zc2VzRGV2aWNlc0RlYWRsb2NrRXhlY3V0YWJsZUZpbGVCdXN5UmVzb3VyY2VCdXN5RmlsZVRvb0xhcmdlRmlsZXN5c3RlbVF1b3RhRXhjZWVkZWROb3RTZWVrYWJsZVN0b3JhZ2VGdWxsV3JpdGVaZXJvVGltZWRPdXRJbnZhbGlkRGF0YUludmFsaWRJbnB1dFN0YWxlTmV0d29ya0ZpbGVIYW5kbGVGaWxlc3lzdGVtTG9vcFJlYWRPbmx5RmlsZXN5c3RlbURpcmVjdG9yeU5vdEVtcHR5SXNBRGlyZWN0b3J5Tm90QURpcmVjdG9yeVdvdWxkQmxvY2tBbHJlYWR5RXhpc3RzQnJva2VuUGlwZU5ldHdvcmtEb3duQWRkck5vdEF2YWlsYWJsZUFkZHJJblVzZU5vdENvbm5lY3RlZENvbm5lY3Rpb25BYm9ydGVkTmV0d29ya1VucmVhY2hhYmxlSG9zdFVucmVhY2hhYmxlQ29ubmVjdGlvblJlc2V0Q29ubmVjdGlvblJlZnVzZWRQZXJtaXNzaW9uRGVuaWVkTm90Rm91bmRvcGVyYXRpb24gc3VjY2Vzc2Z1bG9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0A90UQACgAAABjb25kdmFyIHdhaXQgbm90IHN1cHBvcnRlZGxpYnJhcnkvc3RkL3NyYy9zeXMvd2FzbS8uLi91bnN1cHBvcnRlZC9jb25kdmFyLnJzQkYQADIAAAAXAAAACQAAAGNhbm5vdCByZWN1cnNpdmVseSBhY3F1aXJlIG11dGV4hEYQACAAAABsaWJyYXJ5L3N0ZC9zcmMvc3lzL3dhc20vLi4vdW5zdXBwb3J0ZWQvbXV0ZXgucnOsRhAAMAAAABcAAAAJAAAAjAAAAAQAAAAEAAAAjQAAAI4AAACPAAAAjAAAAAQAAAAEAAAAkAAAAIwAAAAAAAAAAQAAACEAAABsaWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjLnJzY2FwYWNpdHkgb3ZlcmZsb3cAAAAkRxAAHAAAAP0BAAAFAAAAYSBmb3JtYXR0aW5nIHRyYWl0IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9ybGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAJdHEAAYAAAAVQIAABwAAADvv71Gcm9tVXRmOEVycm9yYnl0ZXMAAACMAAAABAAAAAQAAACRAAAAZXJyb3IAAACMAAAABAAAAAQAAACSAAAAAAAAAG51bWJlciB3b3VsZCBiZSB6ZXJvIGZvciBub24temVybyB0eXBlbnVtYmVyIHRvbyBzbWFsbCB0byBmaXQgaW4gdGFyZ2V0IHR5cGVudW1iZXIgdG9vIGxhcmdlIHRvIGZpdCBpbiB0YXJnZXQgdHlwZWludmFsaWQgZGlnaXQgZm91bmQgaW4gc3RyaW5nY2Fubm90IHBhcnNlIGludGVnZXIgZnJvbSBlbXB0eSBzdHJpbmcuLgC5SBAAAgAAAEJvcnJvd011dEVycm9yY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZToAAARIEAAAAAAA/UgQAAEAAAD9SBAAAQAAAJsAAAAAAAAAAQAAAJwAAABwYW5pY2tlZCBhdCAnJywgNEkQAAEAAAA1SRAAAwAAAARIEAAAAAAAaW5kZXggb3V0IG9mIGJvdW5kczogdGhlIGxlbiBpcyAgYnV0IHRoZSBpbmRleCBpcyAAAFBJEAAgAAAAcEkQABIAAABtYXRjaGVzIT09PWFzc2VydGlvbiBmYWlsZWQ6IGAobGVmdCAgcmlnaHQpYAogIGxlZnQ6IGBgLAogcmlnaHQ6IGBgOiAAAACfSRAAGQAAALhJEAASAAAAykkQAAwAAADWSRAAAwAAAGAAAACfSRAAGQAAALhJEAASAAAAykkQAAwAAAD8SRAAAQAAADogAAAESBAAAAAAACBKEAACAAAAmwAAAAwAAAAEAAAAnQAAAJ4AAACfAAAAICAgIGxpYnJhcnkvY29yZS9zcmMvZm10L2J1aWxkZXJzLnJzUEoQACAAAAAvAAAAIQAAAFBKEAAgAAAAMAAAABIAAAAgewosCiwgIHsgLi4KfSwgLi4gfSB7IC4uIH0gfSgKKCwpClubAAAABAAAAAQAAACgAAAAXWxpYnJhcnkvY29yZS9zcmMvZm10L251bS5yc8VKEAAbAAAAZQAAABQAAAAweDAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5YXNzZXJ0aW9uIGZhaWxlZDogKmN1cnIgPiAxOQAAxUoQABsAAADlAQAABQAAAJsAAAAEAAAABAAAAKEAAACiAAAAowAAAGxpYnJhcnkvY29yZS9zcmMvZm10L21vZC5yc3RydWVmYWxzZQBMEAAbAAAAXQgAAB4AAAAATBAAGwAAAGQIAAAWAAAAbGlicmFyeS9jb3JlL3NyYy9zbGljZS9tZW1jaHIucnNETBAAIAAAAFsAAAAFAAAAcmFuZ2Ugc3RhcnQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIHRMEAASAAAAhkwQACIAAAByYW5nZSBlbmQgaW5kZXgguEwQABAAAACGTBAAIgAAAHNsaWNlIGluZGV4IHN0YXJ0cyBhdCAgYnV0IGVuZHMgYXQgANhMEAAWAAAA7kwQAA0AAABzb3VyY2Ugc2xpY2UgbGVuZ3RoICgpIGRvZXMgbm90IG1hdGNoIGRlc3RpbmF0aW9uIHNsaWNlIGxlbmd0aCAoDE0QABUAAAAhTRAAKwAAALFKEAABAAAAbGlicmFyeS9jb3JlL3NyYy9zdHIvdmFsaWRhdGlvbnMucnMBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB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OQcRQAULAg6X+AiE1ioJoueBMy0DEQQIgYyJBGsFDQMJBxCSYEcJdDyA9gpzCHAVRoCaFAxXCRmAh4FHA4VCDxWEUB+A4SuA1S0DGgQCgUAfEToFAYTggPcpTAQKBAKDEURMPYDCPAYBBFUFGzQCgQ4sBGQMVgqArjgdDSwECQcCDgaAmoPYBRADDQN0DFkHDAQBDwwEOAgKBigIIk6BVAwVAwUDBwkdAwsFBgoKBggIBwmAyyUKhAZsaWJyYXJ5L2NvcmUvc3JjL3VuaWNvZGUvdW5pY29kZV9kYXRhLnJzAAAAuVUQACgAAABLAAAAKAAAALlVEAAoAAAAVwAAABYAAAC5VRAAKAAAAFIAAAA+AAAAmwAAAAQAAAAEAAAApAAAAFNvbWVOb25lRXJyb3JVdGY4RXJyb3J2YWxpZF91cF90b2Vycm9yX2xlbgAAmwAAAAQAAAAEAAAApQAAAAADAACDBCAAkQVgAF0ToAASFyAfDCBgH+8soCsqMCAsb6bgLAKoYC0e+2AuAP4gNp7/YDb9AeE2AQohNyQN4TerDmE5LxihOTAc4UfzHiFM8GrhT09vIVCdvKFQAM9hUWXRoVEA2iFSAODhUzDhYVWu4qFW0OjhViAAblfwAf9XAHAABwAtAQEBAgECAQFICzAVEAFlBwIGAgIBBCMBHhtbCzoJCQEYBAEJAQMBBSsDPAgqGAEgNwEBAQQIBAEDBwoCHQE6AQEBAgQIAQkBCgIaAQICOQEEAgQCAgMDAR4CAwELAjkBBAUBAgQBFAIWBgEBOgEBAgEECAEHAwoCHgE7AQEBDAEJASgBAwE3AQEDBQMBBAcCCwIdAToBAgECAQMBBQIHAgsCHAI5AgEBAgQIAQkBCgIdAUgBBAECAwEBCAFRAQIHDAhiAQIJCwZKAhsBAQEBATcOAQUBAgULASQJAWYEAQYBAgICGQIEAxAEDQECAgYBDwEAAwADHQIeAh4CQAIBBwgBAgsJAS0DAQF1AiIBdgMEAgkBBgPbAgIBOgEBBwEBAQECCAYKAgEwHzEEMAcBAQUBKAkMAiAEAgIBAzgBAQIDAQEDOggCApgDAQ0BBwQBBgEDAsZAAAHDIQADjQFgIAAGaQIABAEKIAJQAgABAwEEARkCBQGXAhoSDQEmCBkLLgMwAQIEAgInAUMGAgICAgwBCAEvATMBAQMCAgUCAQEqAggB7gECAQQBAAEAEBAQAAIAAeIBlQUAAwECBQQoAwQBpQIABAACmQsxBHsBNg8pAQICCgMxBAICBwE9AyQFAQg+AQwCNAkKBAIBXwMCAQECBgGgAQMIFQI5AgEBAQEWAQ4HAwXDCAIDAQEXAVEBAgYBAQIBAQIBAusBAgQGAgECGwJVCAIBAQJqAQEBAgYBAWUDAgQBBQAJAQL1AQoCAQEEAZAEAgIEASAKKAYCBAgBCQYCAy4NAQIABwEGAQFSFgIHAQIBAnoGAwEBAgEHAQFIAgMBAQEAAgAFOwcAAT8EUQEAAgAuAhcAAQEDBAUICAIHHgSUAwA3BDIIAQ4BFgUBDwAHARECBwECAQUABwABPQQAB20HAGCA8ABBqLPBAAsBAQ==", + "code_id": "1", + "code_info": + { + "code_hash": "RwxbcDpoL3eLiwiNSBabjW5D9/RKxwMWaSzb5p5mBeM=", + "creator": "link146asaycmtydq45kxc8evntqfgepagygelel00h", + "instantiate_config": + { + "address": "", + "permission": "Everybody" + } + }, + "pinned": false + } + ], + "contracts": + [ + { + "contract_address": "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8", + "contract_info": + { + "admin": "", + "code_id": "1", + "created": null, + "creator": "link146asaycmtydq45kxc8evntqfgepagygelel00h", + "extension": null, + "ibc_port_id": "", + "label": "From deploy_hackatom.js (0)" + }, + "contract_state": + [ + { + "key": "636F6E666967", + "value": "eyJ2ZXJpZmllciI6ImxpbmsxNDZhc2F5Y210eWRxNDVreGM4ZXZudHFmZ2VwYWd5Z2VsZWwwMGgiLCJiZW5lZmljaWFyeSI6ImxpbmsxNDZhc2F5Y210eWRxNDVreGM4ZXZudHFmZ2VwYWd5Z2VsZWwwMGgiLCJmdW5kZXIiOiJsaW5rMTQ2YXNheWNtdHlkcTQ1a3hjOGV2bnRxZmdlcGFneWdlbGVsMDBoIn0=" + } + ] + } + ], + "gen_msgs": + [], + "inactive_contract_addresses": + ["link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8"], + "params": + { + "code_upload_access": + { + "address": "", + "permission": "Everybody" + }, + "compile_cost": "3", + "gas_multiplier": "140000000", + "instance_cost": "60000", + "instantiate_default_permission": "Everybody" + }, + "sequences": + [ + { + "id_key": "BGxhc3RDb2RlSWQ=", + "value": "2" + }, + { + "id_key": "BGxhc3RDb250cmFjdElk", + "value": "2" + } + ] +} +} \ No newline at end of file diff --git a/x/wasm/client/testutil/tx.go b/x/wasm/client/testutil/tx.go new file mode 100644 index 0000000000..d54599796a --- /dev/null +++ b/x/wasm/client/testutil/tx.go @@ -0,0 +1,245 @@ +package testutil + +import ( + "fmt" + "os" + + "github.com/line/lbm-sdk/client/flags" + clitestutil "github.com/line/lbm-sdk/testutil/cli" + sdk "github.com/line/lbm-sdk/types" + + "github.com/line/wasmd/x/wasm/client/cli" + "github.com/line/wasmd/x/wasm/keeper" +) + +func (s *IntegrationTestSuite) TestInstantiateContractCmd() { + val := s.network.Validators[0] + owner := val.Address.String() + + testCases := map[string]struct { + args []string + valid bool + }{ + "valid instantiateContract": { + []string{ + s.codeID, + fmt.Sprintf("{\"verifier\": \"%s\", \"beneficiary\": \"%s\"}", owner, keeper.RandomAccountAddress(s.T())), + fmt.Sprintf("--label=%s", "TestContract"), + fmt.Sprintf("--admin=%s", owner), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + }, + true, + }, + "wrong args count": { + []string{"0"}, + false, + }, + "no label error": { + []string{ + s.codeID, + fmt.Sprintf("{\"verifier\": \"%s\", \"beneficiary\": \"%s\"}", owner, keeper.RandomAccountAddress(s.T())), + }, + false, + }, + "no admin error": { + []string{ + s.codeID, + fmt.Sprintf("{\"verifier\": \"%s\", \"beneficiary\": \"%s\"}", owner, keeper.RandomAccountAddress(s.T())), + fmt.Sprintf("--label=%s", "TestContract"), + }, + false, + }, + "no sender error": { + []string{ + s.codeID, + fmt.Sprintf("{\"verifier\": \"%s\", \"beneficiary\": \"%s\"}", owner, keeper.RandomAccountAddress(s.T())), + fmt.Sprintf("--label=%s", "TestContract"), + fmt.Sprintf("--admin=%s", owner), + }, + false, + }, + "no instantiate params error": { + []string{ + s.codeID, + fmt.Sprintf("--label=%s", "TestContract"), + fmt.Sprintf("--admin=%s", owner), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + }, + false, + }, + "no exist codeID error": { + []string{ + "0", + fmt.Sprintf("{\"verifier\": \"%s\", \"beneficiary\": \"%s\"}", owner, keeper.RandomAccountAddress(s.T())), + fmt.Sprintf("--label=%s", "TestContract"), + fmt.Sprintf("--admin=%s", owner), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.InstantiateContractCmd() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, commonArgs...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var res sdk.TxResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &res), out.String()) + s.Require().EqualValues(0, res.Code, out.String()) + }) + } +} + +func (s *IntegrationTestSuite) TestExecuteContractCmd() { + val := s.network.Validators[0] + + params := fmt.Sprintf("{\"verifier\": \"%s\", \"beneficiary\": \"%s\"}", s.network.Validators[0].Address.String(), keeper.RandomAccountAddress(s.T())) + contractAddr := s.instantiate(s.codeID, params) + + testCases := map[string]struct { + args []string + valid bool + }{ + "valid executeContract": { + []string{ + contractAddr, + "{\"release\":{}}", + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + }, + true, + }, + "wrong amount": { + []string{ + contractAddr, + "{\"release\":{}}", + fmt.Sprintf("--%s=%s", "amount", "100"), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + }, + false, + }, + "wrong param": { + []string{ + contractAddr, + "{release:{}}", + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + }, + false, + }, + "no contract address": { + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + }, + false, + }, + "no sender": { + []string{ + contractAddr, + "{\"release\":{}}", + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.ExecuteContractCmd() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, commonArgs...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var res sdk.TxResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &res), out.String()) + s.Require().EqualValues(0, res.Code, out.String()) + }) + } +} + +func (s *IntegrationTestSuite) TestStoreCodeAndInstantiateContractCmd() { + val := s.network.Validators[0] + owner := val.Address.String() + + wasmPath := "../../keeper/testdata/hackatom.wasm" + _, err := os.ReadFile(wasmPath) + s.Require().NoError(err) + + params := fmt.Sprintf("{\"verifier\": \"%s\", \"beneficiary\": \"%s\"}", s.network.Validators[0].Address.String(), keeper.RandomAccountAddress(s.T())) + + testCases := map[string]struct { + args []string + valid bool + }{ + "valid storeCodeAndInstantiateContract": { + []string{ + wasmPath, + params, + fmt.Sprintf("--label=%s", "TestContract"), + fmt.Sprintf("--admin=%s", owner), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=%d", flags.FlagGas, 1600000), + }, + true, + }, + "wrong args count": { + []string{"0"}, + false, + }, + "no label error": { + []string{ + wasmPath, + params, + }, + false, + }, + "no sender error": { + []string{ + wasmPath, + params, + fmt.Sprintf("--label=%s", "TestContract"), + fmt.Sprintf("--admin=%s", owner), + }, + false, + }, + "wrong wasm path error": { + []string{ + "../../keeper/testdata/noexist.wasm", + params, + fmt.Sprintf("--label=%s", "TestContract"), + fmt.Sprintf("--admin=%s", owner), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=%d", flags.FlagGas, 1600000), + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.StoreCodeAndInstantiateContractCmd() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, append(tc.args, commonArgs...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var res sdk.TxResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &res), out.String()) + s.Require().EqualValues(0, res.Code, out.String()) + }) + } +} diff --git a/x/wasm/common_test.go b/x/wasm/common_test.go index ce232a5efa..35815dbb96 100644 --- a/x/wasm/common_test.go +++ b/x/wasm/common_test.go @@ -3,8 +3,9 @@ package wasm import ( "testing" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" + + sdk "github.com/line/lbm-sdk/types" ) // ensure store code returns the expected response @@ -32,3 +33,17 @@ func parseInitResponse(t *testing.T, data []byte) string { require.NoError(t, err) return addr } + +// ensures this returns a valid codeID and bech32 address and returns it +func parseStoreAndInitResponse(t *testing.T, data []byte) (uint64, string) { + var res MsgStoreCodeAndInstantiateContractResponse + require.NoError(t, res.Unmarshal(data)) + require.NotEmpty(t, res.CodeID) + require.NotEmpty(t, res.Address) + addr := res.Address + codeID := res.CodeID + // ensure this is a valid sdk address + _, err := sdk.AccAddressFromBech32(addr) + require.NoError(t, err) + return codeID, addr +} diff --git a/x/wasm/genesis_test.go b/x/wasm/genesis_test.go index ea97c97f07..8d71c769fc 100644 --- a/x/wasm/genesis_test.go +++ b/x/wasm/genesis_test.go @@ -4,8 +4,9 @@ import ( "encoding/json" "testing" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" + + sdk "github.com/line/lbm-sdk/types" ) func TestInitGenesis(t *testing.T) { @@ -56,7 +57,7 @@ func TestInitGenesis(t *testing.T) { } res, err = h(data.ctx, &execCmd) require.NoError(t, err) - // from https://github.com/CosmWasm/cosmwasm/blob/master/contracts/hackatom/src/contract.rs#L167 + // executing https://github.com/line/cosmwasm/blob/main/contracts/hackatom/src/contract.rs do_release assertExecuteResponse(t, res.Data, []byte{0xf0, 0x0b, 0xaa}) // ensure all contract state is as after init diff --git a/x/wasm/handler.go b/x/wasm/handler.go index e6004cd7a0..102233d7d9 100644 --- a/x/wasm/handler.go +++ b/x/wasm/handler.go @@ -4,13 +4,14 @@ import ( "fmt" "github.com/gogo/protobuf/proto" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/CosmWasm/wasmd/x/wasm/keeper" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + abci "github.com/line/ostracon/abci/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) // NewHandler returns a handler for "wasm" type messages. @@ -29,6 +30,13 @@ func NewHandler(k types.ContractOpsKeeper) sdk.Handler { res, err = msgServer.StoreCode(sdk.WrapSDKContext(ctx), msg) case *MsgInstantiateContract: res, err = msgServer.InstantiateContract(sdk.WrapSDKContext(ctx), msg) + case *MsgStoreCodeAndInstantiateContract: + lbmMsgServer, ok := msgServer.(lbmtypes.MsgServer) + if !ok { + errMsg := fmt.Sprintf("unrecognized wasm message type: %T", msg) + return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) + } + res, err = lbmMsgServer.StoreCodeAndInstantiateContract(sdk.WrapSDKContext(ctx), msg) case *MsgExecuteContract: res, err = msgServer.ExecuteContract(sdk.WrapSDKContext(ctx), msg) case *MsgMigrateContract: diff --git a/x/wasm/ibc.go b/x/wasm/ibc.go index 4d99b0f244..0c5120f407 100644 --- a/x/wasm/ibc.go +++ b/x/wasm/ibc.go @@ -3,27 +3,26 @@ package wasm import ( "math" - ibcexported "github.com/cosmos/ibc-go/v3/modules/core/exported" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - porttypes "github.com/cosmos/ibc-go/v3/modules/core/05-port/types" - host "github.com/cosmos/ibc-go/v3/modules/core/24-host" - - types "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + capabilitytypes "github.com/line/lbm-sdk/x/capability/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + porttypes "github.com/line/lbm-sdk/x/ibc/core/05-port/types" + host "github.com/line/lbm-sdk/x/ibc/core/24-host" + ibcexported "github.com/line/lbm-sdk/x/ibc/core/exported" + wasmvmtypes "github.com/line/wasmvm/types" + + wasmTypes "github.com/line/wasmd/x/wasm/types" ) var _ porttypes.IBCModule = IBCHandler{} type IBCHandler struct { - keeper types.IBCContractKeeper - channelKeeper types.ChannelKeeper + keeper wasmTypes.IBCContractKeeper + channelKeeper wasmTypes.ChannelKeeper } -func NewIBCHandler(k types.IBCContractKeeper, ck types.ChannelKeeper) IBCHandler { +func NewIBCHandler(k wasmTypes.IBCContractKeeper, ck wasmTypes.ChannelKeeper) IBCHandler { return IBCHandler{keeper: k, channelKeeper: ck} } @@ -338,7 +337,7 @@ func ValidateChannelParams(channelID string) error { return err } if channelSequence > math.MaxUint32 { - return sdkerrors.Wrapf(types.ErrMaxIBCChannels, "channel sequence %d is greater than max allowed transfer channels %d", channelSequence, math.MaxUint32) + return sdkerrors.Wrapf(wasmTypes.ErrMaxIBCChannels, "channel sequence %d is greater than max allowed transfer channels %d", channelSequence, math.MaxUint32) } return nil } diff --git a/x/wasm/ibc_reflect_test.go b/x/wasm/ibc_reflect_test.go index 16a10c8b74..dd7d790a17 100644 --- a/x/wasm/ibc_reflect_test.go +++ b/x/wasm/ibc_reflect_test.go @@ -4,15 +4,14 @@ import ( "testing" "github.com/stretchr/testify/assert" - - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - ibctesting "github.com/cosmos/ibc-go/v3/testing" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/stretchr/testify/require" - wasmibctesting "github.com/CosmWasm/wasmd/x/wasm/ibctesting" - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + ibctesting "github.com/line/lbm-sdk/x/ibc/testing" + wasmvmtypes "github.com/line/wasmvm/types" + + wasmibctesting "github.com/line/wasmd/x/wasm/ibctesting" + wasmkeeper "github.com/line/wasmd/x/wasm/keeper" ) func TestIBCReflectContract(t *testing.T) { diff --git a/x/wasm/ibc_test.go b/x/wasm/ibc_test.go index 767ccbe9aa..09a20ebf06 100644 --- a/x/wasm/ibc_test.go +++ b/x/wasm/ibc_test.go @@ -3,10 +3,11 @@ package wasm import ( "testing" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" "github.com/stretchr/testify/assert" + + clienttypes "github.com/line/lbm-sdk/x/ibc/core/02-client/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + wasmvmtypes "github.com/line/wasmvm/types" ) func TestMapToWasmVMIBCPacket(t *testing.T) { diff --git a/x/wasm/ibctesting/README.md b/x/wasm/ibctesting/README.md deleted file mode 100644 index 1c9286995d..0000000000 --- a/x/wasm/ibctesting/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# testing package for ibc -Customized version of cosmos-sdk x/ibc/testing \ No newline at end of file diff --git a/x/wasm/ibctesting/chain.go b/x/wasm/ibctesting/chain.go index 16f46b7b32..cb88428b0f 100644 --- a/x/wasm/ibctesting/chain.go +++ b/x/wasm/ibctesting/chain.go @@ -6,43 +6,44 @@ import ( "testing" "time" - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - "github.com/cosmos/cosmos-sdk/x/staking/teststaking" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - commitmenttypes "github.com/cosmos/ibc-go/v3/modules/core/23-commitment/types" - host "github.com/cosmos/ibc-go/v3/modules/core/24-host" - "github.com/cosmos/ibc-go/v3/modules/core/exported" - ibckeeper "github.com/cosmos/ibc-go/v3/modules/core/keeper" - "github.com/cosmos/ibc-go/v3/modules/core/types" - ibctmtypes "github.com/cosmos/ibc-go/v3/modules/light-clients/07-tendermint/types" - ibctesting "github.com/cosmos/ibc-go/v3/testing" - "github.com/cosmos/ibc-go/v3/testing/mock" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/crypto/tmhash" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmprotoversion "github.com/tendermint/tendermint/proto/tendermint/version" - tmtypes "github.com/tendermint/tendermint/types" - tmversion "github.com/tendermint/tendermint/version" - - wasmd "github.com/CosmWasm/wasmd/app" - "github.com/CosmWasm/wasmd/x/wasm" + + "github.com/line/lbm-sdk/baseapp" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/line/lbm-sdk/crypto/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + authtypes "github.com/line/lbm-sdk/x/auth/types" + banktypes "github.com/line/lbm-sdk/x/bank/types" + capabilitykeeper "github.com/line/lbm-sdk/x/capability/keeper" + capabilitytypes "github.com/line/lbm-sdk/x/capability/types" + clienttypes "github.com/line/lbm-sdk/x/ibc/core/02-client/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + commitmenttypes "github.com/line/lbm-sdk/x/ibc/core/23-commitment/types" + host "github.com/line/lbm-sdk/x/ibc/core/24-host" + "github.com/line/lbm-sdk/x/ibc/core/exported" + ibckeeper "github.com/line/lbm-sdk/x/ibc/core/keeper" + "github.com/line/lbm-sdk/x/ibc/core/types" + ibcoctypes "github.com/line/lbm-sdk/x/ibc/light-clients/99-ostracon/types" + ibctesting "github.com/line/lbm-sdk/x/ibc/testing" + "github.com/line/lbm-sdk/x/ibc/testing/mock" + stakingkeeper "github.com/line/lbm-sdk/x/staking/keeper" + "github.com/line/lbm-sdk/x/staking/teststaking" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + abci "github.com/line/ostracon/abci/types" + "github.com/line/ostracon/crypto/tmhash" + ocproto "github.com/line/ostracon/proto/ostracon/types" + ocprotoversion "github.com/line/ostracon/proto/ostracon/version" + octypes "github.com/line/ostracon/types" + ocversion "github.com/line/ostracon/version" + + wasmd "github.com/line/wasmd/app" + "github.com/line/wasmd/x/wasm" ) -// TestChain is a testing struct that wraps a simapp with the last TM Header, the current ABCI +// TestChain is a testing struct that wraps a simapp with the last OC Header, the current ABCI // header and the validators of the TestChain. It also contains a field called ChainID. This // is the clientID that *other* chains use to refer to this TestChain. The SenderAccount // is used for delivering transactions through the application state. @@ -53,14 +54,15 @@ type TestChain struct { Coordinator *Coordinator App ibctesting.TestingApp ChainID string - LastHeader *ibctmtypes.Header // header for last block height committed - CurrentHeader tmproto.Header // header for current block height + LastHeader *ibcoctypes.Header // header for last block height committed + CurrentHeader ocproto.Header // header for current block height QueryServer types.QueryServer TxConfig client.TxConfig Codec codec.BinaryCodec - Vals *tmtypes.ValidatorSet - Signers []tmtypes.PrivValidator + Vals *octypes.ValidatorSet + Voters *octypes.VoterSet + Signers []octypes.PrivValidator senderPrivKey cryptotypes.PrivKey SenderAccount authtypes.AccountI @@ -89,9 +91,10 @@ func NewTestChain(t *testing.T, coord *Coordinator, chainID string, opts ...wasm require.NoError(t, err) // create validator set with single validator - validator := tmtypes.NewValidator(pubKey, 1) - valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) - signers := []tmtypes.PrivValidator{privVal} + validator := ibctesting.NewTestValidator(pubKey, 1) + valSet := octypes.NewValidatorSet([]*octypes.Validator{validator}) + voterSet := octypes.WrapValidatorsToVoterSet(valSet.Validators) + signers := []octypes.PrivValidator{privVal} // generate genesis account senderPrivKey := secp256k1.GenPrivKey() @@ -107,7 +110,7 @@ func NewTestChain(t *testing.T, coord *Coordinator, chainID string, opts ...wasm app := NewTestingAppDecorator(t, wasmd.SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, opts, balance)) // create current header and call begin block - header := tmproto.Header{ + header := ocproto.Header{ ChainID: chainID, Height: 1, Time: coord.CurrentTime.UTC(), @@ -126,6 +129,7 @@ func NewTestChain(t *testing.T, coord *Coordinator, chainID string, opts ...wasm TxConfig: txConfig, Codec: app.AppCodec(), Vals: valSet, + Voters: voterSet, Signers: signers, senderPrivKey: senderPrivKey, SenderAccount: acc, @@ -142,13 +146,13 @@ func (chain *TestChain) GetContext() sdk.Context { } // QueryProof performs an abci query with the given key and returns the proto encoded merkle proof -// for the query and the height at which the proof will succeed on a tendermint verifier. +// for the query and the height at which the proof will succeed on a ostracon verifier. func (chain *TestChain) QueryProof(key []byte) ([]byte, clienttypes.Height) { return chain.QueryProofAtHeight(key, chain.App.LastBlockHeight()) } // QueryProof performs an abci query with the given key and returns the proto encoded merkle proof -// for the query and the height at which the proof will succeed on a tendermint verifier. +// for the query and the height at which the proof will succeed on a ostracon verifier. func (chain *TestChain) QueryProofAtHeight(key []byte, height int64) ([]byte, clienttypes.Height) { res := chain.App.Query(abci.RequestQuery{ Path: fmt.Sprintf("store/%s/key", host.StoreKey), @@ -166,13 +170,13 @@ func (chain *TestChain) QueryProofAtHeight(key []byte, height int64) ([]byte, cl revision := clienttypes.ParseChainID(chain.ChainID) // proof height + 1 is returned as the proof created corresponds to the height the proof - // was created in the IAVL tree. Tendermint and subsequently the clients that rely on it + // was created in the IAVL tree. Ostracon and subsequently the clients that rely on it // have heights 1 above the IAVL tree. Thus we return proof height + 1 return proof, clienttypes.NewHeight(revision, uint64(res.Height)+1) } // QueryUpgradeProof performs an abci query with the given key and returns the proto encoded merkle proof -// for the query and the height at which the proof will succeed on a tendermint verifier. +// for the query and the height at which the proof will succeed on a ostracon verifier. func (chain *TestChain) QueryUpgradeProof(key []byte, height uint64) ([]byte, clienttypes.Height) { res := chain.App.Query(abci.RequestQuery{ Path: "store/upgrade/key", @@ -190,7 +194,7 @@ func (chain *TestChain) QueryUpgradeProof(key []byte, height uint64) ([]byte, cl revision := clienttypes.ParseChainID(chain.ChainID) // proof height + 1 is returned as the proof created corresponds to the height the proof - // was created in the IAVL tree. Tendermint and subsequently the clients that rely on it + // was created in the IAVL tree. Ostracon and subsequently the clients that rely on it // have heights 1 above the IAVL tree. Thus we return proof height + 1 return proof, clienttypes.NewHeight(revision, uint64(res.Height+1)) } @@ -214,10 +218,10 @@ func (chain *TestChain) QueryConsensusStateProof(clientID string) ([]byte, clien func (chain *TestChain) NextBlock() { // set the last header to the current header // use nil trusted fields - chain.LastHeader = chain.CurrentTMClientHeader() + chain.LastHeader = chain.CurrentOCClientHeader() // increment the current header - chain.CurrentHeader = tmproto.Header{ + chain.CurrentHeader = ocproto.Header{ ChainID: chain.ChainID, Height: chain.App.LastBlockHeight() + 1, AppHash: chain.App.LastCommitID().Hash, @@ -231,6 +235,14 @@ func (chain *TestChain) NextBlock() { chain.App.BeginBlock(abci.RequestBeginBlock{Header: chain.CurrentHeader}) } +func (chain *TestChain) CommitBlock() { + chain.App.EndBlock(abci.RequestEndBlock{Height: chain.CurrentHeader.Height}) + chain.App.Commit() + + chain.App.BeginRecheckTx(abci.RequestBeginRecheckTx{Header: chain.CurrentHeader}) + chain.App.EndRecheckTx(abci.RequestEndRecheckTx{Height: chain.CurrentHeader.Height}) +} + // sendMsgs delivers a transaction through the application without returning the result. func (chain *TestChain) sendMsgs(msgs ...sdk.Msg) error { _, err := chain.SendMsgs(msgs...) @@ -305,7 +317,7 @@ func (chain *TestChain) GetConsensusState(clientID string, height exported.Heigh // GetValsAtHeight will return the validator set of the chain at a given height. It will return // a success boolean depending on if the validator set exists or not at that height. -func (chain *TestChain) GetValsAtHeight(height int64) (*tmtypes.ValidatorSet, bool) { +func (chain *TestChain) GetValsAtHeight(height int64) (*octypes.ValidatorSet, bool) { histInfo, ok := chain.App.GetStakingKeeper().GetHistoricalInfo(chain.GetContext(), height) if !ok { return nil, false @@ -313,11 +325,31 @@ func (chain *TestChain) GetValsAtHeight(height int64) (*tmtypes.ValidatorSet, bo valSet := stakingtypes.Validators(histInfo.Valset) - tmValidators, err := teststaking.ToTmValidators(valSet, sdk.DefaultPowerReduction) + tmValidators, err := teststaking.ToOcValidators(valSet, sdk.DefaultPowerReduction) + if err != nil { + panic(err) + } + return octypes.NewValidatorSet(tmValidators), true +} + +func (chain *TestChain) GetVotersAtHeight(height int64) (*octypes.VoterSet, bool) { + histInfo, ok := chain.App.GetStakingKeeper().GetHistoricalInfo(chain.GetContext(), height) + if !ok { + return nil, false + } + + // Voters of test chain is always same to validator set + voters := stakingtypes.Validators(histInfo.Valset) + ocVoters, err := teststaking.ToOcValidators(voters, sdk.DefaultPowerReduction) if err != nil { panic(err) } - return tmtypes.NewValidatorSet(tmValidators), true + // Validators saved in HistoricalInfo store have no voting power. + // We set voting weight same as voting power for test. + for i := 0; i < len(ocVoters); i++ { + ocVoters[i].VotingWeight = ocVoters[i].VotingPower + } + return octypes.WrapValidatorsToVoterSet(ocVoters), true } // GetAcknowledgement retrieves an acknowledgement for the provided packet. If the @@ -334,29 +366,31 @@ func (chain *TestChain) GetPrefix() commitmenttypes.MerklePrefix { return commitmenttypes.NewMerklePrefix(chain.App.GetIBCKeeper().ConnectionKeeper.GetCommitmentPrefix().Bytes()) } -// ConstructUpdateTMClientHeader will construct a valid 07-tendermint Header to update the +// ConstructUpdateOCClientHeader will construct a valid 99-ostracon Header to update the // light client on the source chain. -func (chain *TestChain) ConstructUpdateTMClientHeader(counterparty *TestChain, clientID string) (*ibctmtypes.Header, error) { - return chain.ConstructUpdateTMClientHeaderWithTrustedHeight(counterparty, clientID, clienttypes.ZeroHeight()) +func (chain *TestChain) ConstructUpdateOCClientHeader(counterparty *TestChain, clientID string) (*ibcoctypes.Header, error) { + return chain.ConstructUpdateOCClientHeaderWithTrustedHeight(counterparty, clientID, clienttypes.ZeroHeight()) } -// ConstructUpdateTMClientHeader will construct a valid 07-tendermint Header to update the +// ConstructUpdateOCClientHeader will construct a valid 99-ostracon Header to update the // light client on the source chain. -func (chain *TestChain) ConstructUpdateTMClientHeaderWithTrustedHeight(counterparty *TestChain, clientID string, trustedHeight clienttypes.Height) (*ibctmtypes.Header, error) { +func (chain *TestChain) ConstructUpdateOCClientHeaderWithTrustedHeight(counterparty *TestChain, clientID string, trustedHeight clienttypes.Height) (*ibcoctypes.Header, error) { header := counterparty.LastHeader // Relayer must query for LatestHeight on client to get TrustedHeight if the trusted height is not set if trustedHeight.IsZero() { trustedHeight = chain.GetClientState(clientID).GetLatestHeight().(clienttypes.Height) } var ( - tmTrustedVals *tmtypes.ValidatorSet - ok bool + tmTrustedVals *octypes.ValidatorSet + tmTrustedVoters *octypes.VoterSet + ok bool ) // Once we get TrustedHeight from client, we must query the validators from the counterparty chain // If the LatestHeight == LastHeader.Height, then TrustedValidators are current validators // If LatestHeight < LastHeader.Height, we can query the historical validator set from HistoricalInfo if trustedHeight == counterparty.LastHeader.GetHeight() { tmTrustedVals = counterparty.Vals + tmTrustedVoters = counterparty.Voters } else { // NOTE: We need to get validators from counterparty at height: trustedHeight+1 // since the last trusted validators for a header at height h @@ -364,7 +398,12 @@ func (chain *TestChain) ConstructUpdateTMClientHeaderWithTrustedHeight(counterpa // NextValidatorsHash tmTrustedVals, ok = counterparty.GetValsAtHeight(int64(trustedHeight.RevisionHeight + 1)) if !ok { - return nil, sdkerrors.Wrapf(ibctmtypes.ErrInvalidHeaderHeight, "could not retrieve trusted validators at trustedHeight: %d", trustedHeight) + return nil, sdkerrors.Wrapf(ibcoctypes.ErrInvalidHeaderHeight, "could not retrieve trusted validators at trustedHeight: %d", trustedHeight) + } + + tmTrustedVoters, ok = counterparty.GetVotersAtHeight(int64(trustedHeight.RevisionHeight + 1)) + if !ok { + return nil, sdkerrors.Wrapf(ibcoctypes.ErrInvalidHeaderHeight, "could not retrieve trusted voters at trustedHeight: %d", trustedHeight) } } // inject trusted fields into last header @@ -375,7 +414,12 @@ func (chain *TestChain) ConstructUpdateTMClientHeaderWithTrustedHeight(counterpa if err != nil { return nil, err } + trustedVoters, err := tmTrustedVoters.ToProto() + if err != nil { + return nil, err + } header.TrustedValidators = trustedVals + header.TrustedVoters = trustedVoters return header, nil } @@ -386,25 +430,28 @@ func (chain *TestChain) ExpireClient(amount time.Duration) { chain.Coordinator.IncrementTimeBy(amount) } -// CurrentTMClientHeader creates a TM header using the current header parameters +// CurrentOCClientHeader creates a OC header using the current header parameters // on the chain. The trusted fields in the header are set to nil. -func (chain *TestChain) CurrentTMClientHeader() *ibctmtypes.Header { - return chain.CreateTMClientHeader(chain.ChainID, chain.CurrentHeader.Height, clienttypes.Height{}, chain.CurrentHeader.Time, chain.Vals, nil, chain.Signers) +func (chain *TestChain) CurrentOCClientHeader() *ibcoctypes.Header { + return chain.CreateOCClientHeader(chain.ChainID, chain.CurrentHeader.Height, clienttypes.Height{}, chain.CurrentHeader.Time, chain.Vals, nil, chain.Voters, nil, chain.Signers) } -// CreateTMClientHeader creates a TM header to update the TM client. Args are passed in to allow +// CreateOCClientHeader creates a OC header to update the OC client. Args are passed in to allow // caller flexibility to use params that differ from the chain. -func (chain *TestChain) CreateTMClientHeader(chainID string, blockHeight int64, trustedHeight clienttypes.Height, timestamp time.Time, tmValSet, tmTrustedVals *tmtypes.ValidatorSet, signers []tmtypes.PrivValidator) *ibctmtypes.Header { +func (chain *TestChain) CreateOCClientHeader(chainID string, blockHeight int64, trustedHeight clienttypes.Height, timestamp time.Time, tmValSet, tmTrustedVals *octypes.ValidatorSet, tmVoterSet, tmTrustedVoterSet *octypes.VoterSet, signers []octypes.PrivValidator) *ibcoctypes.Header { var ( - valSet *tmproto.ValidatorSet - trustedVals *tmproto.ValidatorSet + valSet *ocproto.ValidatorSet + trustedVals *ocproto.ValidatorSet + voterSet *ocproto.VoterSet + trustedVoters *ocproto.VoterSet ) require.NotNil(chain.t, tmValSet) + require.NotNil(chain.t, tmVoterSet) vsetHash := tmValSet.Hash() - tmHeader := tmtypes.Header{ - Version: tmprotoversion.Consensus{Block: tmversion.BlockProtocol, App: 2}, + tmHeader := octypes.Header{ + Version: ocprotoversion.Consensus{Block: ocversion.BlockProtocol, App: 2}, ChainID: chainID, Height: blockHeight, Time: timestamp, @@ -412,52 +459,64 @@ func (chain *TestChain) CreateTMClientHeader(chainID string, blockHeight int64, LastCommitHash: chain.App.LastCommitID().Hash, DataHash: tmhash.Sum([]byte("data_hash")), ValidatorsHash: vsetHash, + VotersHash: tmVoterSet.Hash(), NextValidatorsHash: vsetHash, ConsensusHash: tmhash.Sum([]byte("consensus_hash")), AppHash: chain.CurrentHeader.AppHash, LastResultsHash: tmhash.Sum([]byte("last_results_hash")), EvidenceHash: tmhash.Sum([]byte("evidence_hash")), - ProposerAddress: tmValSet.Proposer.Address, //nolint:staticcheck + ProposerAddress: tmValSet.SelectProposer([]byte{}, blockHeight, 0).Address, //nolint:staticcheck } + hhash := tmHeader.Hash() blockID := MakeBlockID(hhash, 3, tmhash.Sum([]byte("part_set"))) - voteSet := tmtypes.NewVoteSet(chainID, blockHeight, 1, tmproto.PrecommitType, tmValSet) + voteSet := octypes.NewVoteSet(chainID, blockHeight, 1, ocproto.PrecommitType, tmVoterSet) - commit, err := tmtypes.MakeCommit(blockID, blockHeight, 1, voteSet, signers, timestamp) + commit, err := octypes.MakeCommit(blockID, blockHeight, 1, voteSet, signers, timestamp) require.NoError(chain.t, err) - signedHeader := &tmproto.SignedHeader{ + signedHeader := &ocproto.SignedHeader{ Header: tmHeader.ToProto(), Commit: commit.ToProto(), } - valSet, err = tmValSet.ToProto() - if err != nil { - panic(err) + if tmValSet != nil { + valSet, err = tmValSet.ToProto() + require.NoError(chain.t, err) } if tmTrustedVals != nil { trustedVals, err = tmTrustedVals.ToProto() - if err != nil { - panic(err) - } + require.NoError(chain.t, err) + } + + if tmVoterSet != nil { + voterSet, err = tmVoterSet.ToProto() + require.NoError(chain.t, err) + } + + if tmTrustedVoterSet != nil { + trustedVoters, err = tmTrustedVoterSet.ToProto() + require.NoError(chain.t, err) } // The trusted fields may be nil. They may be filled before relaying messages to a client. // The relayer is responsible for querying client and injecting appropriate trusted fields. - return &ibctmtypes.Header{ + return &ibcoctypes.Header{ SignedHeader: signedHeader, ValidatorSet: valSet, + VoterSet: voterSet, TrustedHeight: trustedHeight, TrustedValidators: trustedVals, + TrustedVoters: trustedVoters, } } -// MakeBlockID copied unimported test functions from tmtypes to use them here -func MakeBlockID(hash []byte, partSetSize uint32, partSetHash []byte) tmtypes.BlockID { - return tmtypes.BlockID{ +// MakeBlockID copied unimported test functions from octypes to use them here +func MakeBlockID(hash []byte, partSetSize uint32, partSetHash []byte) octypes.BlockID { + return octypes.BlockID{ Hash: hash, - PartSetHeader: tmtypes.PartSetHeader{ + PartSetHeader: octypes.PartSetHeader{ Total: partSetSize, Hash: partSetHash, }, @@ -468,19 +527,19 @@ func MakeBlockID(hash []byte, partSetSize uint32, partSetHash []byte) tmtypes.Bl // (including voting power). It returns a signer array of PrivValidators that matches the // sorting of ValidatorSet. // The sorting is first by .VotingPower (descending), with secondary index of .Address (ascending). -func CreateSortedSignerArray(altPrivVal, suitePrivVal tmtypes.PrivValidator, - altVal, suiteVal *tmtypes.Validator, -) []tmtypes.PrivValidator { +func CreateSortedSignerArray(altPrivVal, suitePrivVal octypes.PrivValidator, + altVal, suiteVal *octypes.Validator, +) []octypes.PrivValidator { switch { case altVal.VotingPower > suiteVal.VotingPower: - return []tmtypes.PrivValidator{altPrivVal, suitePrivVal} + return []octypes.PrivValidator{altPrivVal, suitePrivVal} case altVal.VotingPower < suiteVal.VotingPower: - return []tmtypes.PrivValidator{suitePrivVal, altPrivVal} + return []octypes.PrivValidator{suitePrivVal, altPrivVal} default: if bytes.Compare(altVal.Address, suiteVal.Address) == -1 { - return []tmtypes.PrivValidator{altPrivVal, suitePrivVal} + return []octypes.PrivValidator{altPrivVal, suitePrivVal} } - return []tmtypes.PrivValidator{suitePrivVal, altPrivVal} + return []octypes.PrivValidator{suitePrivVal, altPrivVal} } } @@ -501,7 +560,7 @@ func (chain *TestChain) CreatePortCapability(scopedKeeper capabilitykeeper.Scope require.NoError(chain.t, err) } - chain.App.Commit() + chain.CommitBlock() chain.NextBlock() } @@ -529,7 +588,7 @@ func (chain *TestChain) CreateChannelCapability(scopedKeeper capabilitykeeper.Sc require.NoError(chain.t, err) } - chain.App.Commit() + chain.CommitBlock() chain.NextBlock() } @@ -562,8 +621,8 @@ type TestingAppDecorator struct { t *testing.T } -func NewTestingAppDecorator(t *testing.T, wasmApp *wasmd.WasmApp) *TestingAppDecorator { - return &TestingAppDecorator{WasmApp: wasmApp, t: t} +func NewTestingAppDecorator(t *testing.T, simApp *wasmd.WasmApp) *TestingAppDecorator { + return &TestingAppDecorator{WasmApp: simApp, t: t} } func (a TestingAppDecorator) GetBaseApp() *baseapp.BaseApp { diff --git a/x/wasm/ibctesting/coordinator.go b/x/wasm/ibctesting/coordinator.go index ed85a4e786..18bdec6660 100644 --- a/x/wasm/ibctesting/coordinator.go +++ b/x/wasm/ibctesting/coordinator.go @@ -6,13 +6,14 @@ import ( "testing" "time" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v3/modules/core/24-host" - ibctesting "github.com/cosmos/ibc-go/v3/testing" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + host "github.com/line/lbm-sdk/x/ibc/core/24-host" + ibctesting "github.com/line/lbm-sdk/x/ibc/testing" + abci "github.com/line/ostracon/abci/types" + + wasmkeeper "github.com/line/wasmd/x/wasm/keeper" ) const ChainIDPrefix = "testchain" @@ -80,7 +81,7 @@ func (coord *Coordinator) UpdateTimeForChain(chain *TestChain) { chain.App.BeginBlock(abci.RequestBeginBlock{Header: chain.CurrentHeader}) } -// Setup constructs a TM client, connection, and channel on both chains provided. It will +// Setup constructs a OC client, connection, and channel on both chains provided. It will // fail if any error occurs. The clientID's, TestConnections, and TestChannels are returned // for both chains. The channels created are connected to the ibc-transfer application. func (coord *Coordinator) Setup(path *Path) { @@ -191,7 +192,7 @@ func GetChainID(index int) string { // CONTRACT: the passed in list of indexes must not contain duplicates func (coord *Coordinator) CommitBlock(chains ...*TestChain) { for _, chain := range chains { - chain.App.Commit() + chain.CommitBlock() chain.NextBlock() } coord.IncrementTime() @@ -201,7 +202,7 @@ func (coord *Coordinator) CommitBlock(chains ...*TestChain) { func (coord *Coordinator) CommitNBlocks(chain *TestChain, n uint64) { for i := uint64(0); i < n; i++ { chain.App.BeginBlock(abci.RequestBeginBlock{Header: chain.CurrentHeader}) - chain.App.Commit() + chain.CommitBlock() chain.NextBlock() coord.IncrementTime() } diff --git a/x/wasm/ibctesting/endpoint.go b/x/wasm/ibctesting/endpoint.go index 9411a79724..88a0af3159 100644 --- a/x/wasm/ibctesting/endpoint.go +++ b/x/wasm/ibctesting/endpoint.go @@ -3,18 +3,16 @@ package ibctesting import ( "fmt" - ibctesting "github.com/cosmos/ibc-go/v3/testing" - - // sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - commitmenttypes "github.com/cosmos/ibc-go/v3/modules/core/23-commitment/types" - host "github.com/cosmos/ibc-go/v3/modules/core/24-host" - "github.com/cosmos/ibc-go/v3/modules/core/exported" - ibctmtypes "github.com/cosmos/ibc-go/v3/modules/light-clients/07-tendermint/types" + clienttypes "github.com/line/lbm-sdk/x/ibc/core/02-client/types" + connectiontypes "github.com/line/lbm-sdk/x/ibc/core/03-connection/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + commitmenttypes "github.com/line/lbm-sdk/x/ibc/core/23-commitment/types" + host "github.com/line/lbm-sdk/x/ibc/core/24-host" + "github.com/line/lbm-sdk/x/ibc/core/exported" + ibcoctypes "github.com/line/lbm-sdk/x/ibc/light-clients/99-ostracon/types" + ibctesting "github.com/line/lbm-sdk/x/ibc/testing" ) // Endpoint is a which represents a channel endpoint and its associated @@ -52,7 +50,7 @@ func NewEndpoint( func NewDefaultEndpoint(chain *TestChain) *Endpoint { return &Endpoint{ Chain: chain, - ClientConfig: ibctesting.NewTendermintConfig(), + ClientConfig: ibctesting.NewOstraconConfig(), ConnectionConfig: ibctesting.NewConnectionConfig(), ChannelConfig: ibctesting.NewChannelConfig(), } @@ -88,12 +86,12 @@ func (endpoint *Endpoint) CreateClient() (err error) { ) switch endpoint.ClientConfig.GetClientType() { - case exported.Tendermint: - tmConfig, ok := endpoint.ClientConfig.(*ibctesting.TendermintConfig) + case exported.Ostracon: + tmConfig, ok := endpoint.ClientConfig.(*ibctesting.OstraconConfig) require.True(endpoint.Chain.t, ok) height := endpoint.Counterparty.Chain.LastHeader.GetHeight().(clienttypes.Height) - clientState = ibctmtypes.NewClientState( + clientState = ibcoctypes.NewClientState( endpoint.Counterparty.Chain.ChainID, tmConfig.TrustLevel, tmConfig.TrustingPeriod, tmConfig.UnbondingPeriod, tmConfig.MaxClockDrift, height, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, tmConfig.AllowUpdateAfterExpiry, tmConfig.AllowUpdateAfterMisbehaviour, ) @@ -136,8 +134,8 @@ func (endpoint *Endpoint) UpdateClient() (err error) { var header exported.Header switch endpoint.ClientConfig.GetClientType() { - case exported.Tendermint: - header, err = endpoint.Chain.ConstructUpdateTMClientHeader(endpoint.Counterparty.Chain, endpoint.ClientID) + case exported.Ostracon: + header, err = endpoint.Chain.ConstructUpdateOCClientHeader(endpoint.Counterparty.Chain, endpoint.ClientID) default: err = fmt.Errorf("client type %s is not supported", endpoint.ClientConfig.GetClientType()) diff --git a/x/wasm/ibctesting/event_utils.go b/x/wasm/ibctesting/event_utils.go index 6463515ffa..029021b3b1 100644 --- a/x/wasm/ibctesting/event_utils.go +++ b/x/wasm/ibctesting/event_utils.go @@ -4,9 +4,9 @@ import ( "strconv" "strings" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - abci "github.com/tendermint/tendermint/abci/types" + clienttypes "github.com/line/lbm-sdk/x/ibc/core/02-client/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + abci "github.com/line/ostracon/abci/types" ) func getSendPackets(evts []abci.Event) []channeltypes.Packet { diff --git a/x/wasm/ibctesting/path.go b/x/wasm/ibctesting/path.go index 2ce5e044a6..2707cb161b 100644 --- a/x/wasm/ibctesting/path.go +++ b/x/wasm/ibctesting/path.go @@ -4,8 +4,8 @@ import ( "bytes" "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" + sdk "github.com/line/lbm-sdk/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" ) // Path contains two endpoints representing two chains connected over IBC diff --git a/x/wasm/ibctesting/wasm.go b/x/wasm/ibctesting/wasm.go index 6957f63404..282097dcab 100644 --- a/x/wasm/ibctesting/wasm.go +++ b/x/wasm/ibctesting/wasm.go @@ -5,20 +5,19 @@ import ( "compress/gzip" "encoding/json" "fmt" - "io/ioutil" + "os" "strings" - wasmd "github.com/CosmWasm/wasmd/app" - - ibctesting "github.com/cosmos/ibc-go/v3/testing" - - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/golang/protobuf/proto" //nolint "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/rand" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + ibctesting "github.com/line/lbm-sdk/x/ibc/testing" + abci "github.com/line/ostracon/abci/types" + "github.com/line/ostracon/libs/rand" + + wasmd "github.com/line/wasmd/app" + "github.com/line/wasmd/x/wasm/types" ) var wasmIdent = []byte("\x00\x61\x73\x6D") @@ -37,7 +36,7 @@ func (chain *TestChain) SeedNewContractInstance() sdk.AccAddress { } func (chain *TestChain) StoreCodeFile(filename string) types.MsgStoreCodeResponse { - wasmCode, err := ioutil.ReadFile(filename) + wasmCode, err := os.ReadFile(filename) require.NoError(chain.t, err) if strings.HasSuffix(filename, "wasm") { // compress for gas limit var buf bytes.Buffer diff --git a/x/wasm/ioutils/ioutil.go b/x/wasm/ioutils/ioutil.go index 9c7bd81f04..42a7015471 100644 --- a/x/wasm/ioutils/ioutil.go +++ b/x/wasm/ioutils/ioutil.go @@ -4,9 +4,8 @@ import ( "bytes" "compress/gzip" "io" - "io/ioutil" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) // Uncompress returns gzip uncompressed content if input was gzip, or original src otherwise @@ -26,7 +25,7 @@ func Uncompress(src []byte, limit uint64) ([]byte, error) { } zr.Multistream(false) defer zr.Close() - return ioutil.ReadAll(LimitReader(zr, int64(limit))) + return io.ReadAll(LimitReader(zr, int64(limit))) } // LimitReader returns a Reader that reads from r diff --git a/x/wasm/ioutils/ioutil_test.go b/x/wasm/ioutils/ioutil_test.go index 13bbbb110e..5f1f9500b5 100644 --- a/x/wasm/ioutils/ioutil_test.go +++ b/x/wasm/ioutils/ioutil_test.go @@ -5,21 +5,21 @@ import ( "compress/gzip" "errors" "io" - "io/ioutil" + "os" "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) func TestUncompress(t *testing.T) { - wasmRaw, err := ioutil.ReadFile("../keeper/testdata/hackatom.wasm") + wasmRaw, err := os.ReadFile("../keeper/testdata/hackatom.wasm") require.NoError(t, err) - wasmGzipped, err := ioutil.ReadFile("../keeper/testdata/hackatom.wasm.gzip") + wasmGzipped, err := os.ReadFile("../keeper/testdata/hackatom.wasm.gzip") require.NoError(t, err) const maxSize = 400_000 diff --git a/x/wasm/ioutils/utils_test.go b/x/wasm/ioutils/utils_test.go index 0d2c0a130e..6d9fa52bb0 100644 --- a/x/wasm/ioutils/utils_test.go +++ b/x/wasm/ioutils/utils_test.go @@ -1,14 +1,15 @@ package ioutils import ( - "io/ioutil" + "os" "testing" "github.com/stretchr/testify/require" ) func GetTestData() ([]byte, []byte, []byte, error) { - wasmCode, err := ioutil.ReadFile("../keeper/testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("../keeper/testdata/hackatom.wasm") + if err != nil { return nil, nil, nil, err } @@ -46,10 +47,8 @@ func TestIsGzip(t *testing.T) { func TestGzipIt(t *testing.T) { wasmCode, someRandomStr, _, err := GetTestData() - originalGzipData := []byte{ - 31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 202, 72, 205, 201, 201, 87, 40, 207, 47, 202, 73, 1, - 4, 0, 0, 255, 255, 133, 17, 74, 13, 11, 0, 0, 0, - } + originalGzipData := []byte{31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 202, 72, 205, 201, 201, 87, 40, 207, 47, 202, 73, 1, + 4, 0, 0, 255, 255, 133, 17, 74, 13, 11, 0, 0, 0} require.NoError(t, err) diff --git a/x/wasm/keeper/ante.go b/x/wasm/keeper/ante.go index 1ffd34befd..176121307c 100644 --- a/x/wasm/keeper/ante.go +++ b/x/wasm/keeper/ante.go @@ -3,9 +3,9 @@ package keeper import ( "encoding/binary" - sdk "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/line/lbm-sdk/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) // CountTXDecorator ante handler to count the tx position in a block. @@ -77,7 +77,7 @@ func NewLimitSimulationGasDecorator(gasLimit *sdk.Gas) *LimitSimulationGasDecora func (d LimitSimulationGasDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { if !simulate { // Wasm code is not executed in checkTX so that we don't need to limit it further. - // Tendermint rejects the TX afterwards when the tx.gas > max block gas. + // Ostracon rejects the TX afterwards when the tx.gas > max block gas. // On deliverTX we rely on the tendermint/sdk mechanics that ensure // tx has gas set and gas < max block gas return next(ctx, tx, simulate) diff --git a/x/wasm/keeper/ante_test.go b/x/wasm/keeper/ante_test.go index fa64b62fe3..8287f8c40b 100644 --- a/x/wasm/keeper/ante_test.go +++ b/x/wasm/keeper/ante_test.go @@ -4,19 +4,18 @@ import ( "testing" "time" - abci "github.com/tendermint/tendermint/abci/types" - - "github.com/CosmWasm/wasmd/x/wasm/keeper" - - "github.com/cosmos/cosmos-sdk/store" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" "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/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/store" + sdk "github.com/line/lbm-sdk/types" + abci "github.com/line/ostracon/abci/types" + "github.com/line/ostracon/libs/log" + ocproto "github.com/line/ostracon/proto/ostracon/types" + + "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/types" ) func TestCountTxDecorator(t *testing.T) { @@ -92,7 +91,7 @@ func TestCountTxDecorator(t *testing.T) { } for name, spec := range specs { t.Run(name, func(t *testing.T) { - ctx := sdk.NewContext(ms.CacheMultiStore(), tmproto.Header{ + ctx := sdk.NewContext(ms.CacheMultiStore(), ocproto.Header{ Height: myCurrentBlockHeight, Time: time.Date(2021, time.September, 27, 12, 0, 0, 0, time.UTC), }, false, log.NewNopLogger()) @@ -111,7 +110,6 @@ func TestCountTxDecorator(t *testing.T) { }) } } - func TestLimitSimulationGasDecorator(t *testing.T) { var ( hundred sdk.Gas = 100 @@ -165,8 +163,7 @@ func TestLimitSimulationGasDecorator(t *testing.T) { ctx := sdk.Context{}. WithGasMeter(sdk.NewInfiniteGasMeter()). WithConsensusParams(&abci.ConsensusParams{ - Block: &abci.BlockParams{MaxGas: spec.maxBlockGas}, - }) + Block: &abci.BlockParams{MaxGas: spec.maxBlockGas}}) // when if spec.expErr != nil { require.PanicsWithValue(t, spec.expErr, func() { diff --git a/x/wasm/keeper/api.go b/x/wasm/keeper/api.go index 3b39b34d80..d7b091bb75 100644 --- a/x/wasm/keeper/api.go +++ b/x/wasm/keeper/api.go @@ -1,43 +1,49 @@ package keeper import ( - wasmvm "github.com/CosmWasm/wasmvm" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/line/lbm-sdk/types" + wasmvm "github.com/line/wasmvm" + wasmvmtypes "github.com/line/wasmvm/types" + + types "github.com/line/wasmd/x/wasm/types" ) -const ( - // DefaultGasCostHumanAddress is how moch SDK gas we charge to convert to a human address format - DefaultGasCostHumanAddress = 5 - // DefaultGasCostCanonicalAddress is how moch SDK gas we charge to convert to a canonical address format - DefaultGasCostCanonicalAddress = 4 +type cosmwasmAPIImpl struct { + gasMultiplier GasMultiplier +} +const ( // DefaultDeserializationCostPerByte The formular should be `len(data) * deserializationCostPerByte` DefaultDeserializationCostPerByte = 1 ) var ( - costHumanize = DefaultGasCostHumanAddress * DefaultGasMultiplier - costCanonical = DefaultGasCostCanonicalAddress * DefaultGasMultiplier costJSONDeserialization = wasmvmtypes.UFraction{ - Numerator: DefaultDeserializationCostPerByte * DefaultGasMultiplier, + Numerator: DefaultDeserializationCostPerByte * types.DefaultGasMultiplier, Denominator: 1, } ) -func humanAddress(canon []byte) (string, uint64, error) { +func (a cosmwasmAPIImpl) humanAddress(canon []byte) (string, uint64, error) { + gas := a.gasMultiplier.FromWasmVMGas(5) if err := sdk.VerifyAddressFormat(canon); err != nil { - return "", costHumanize, err + return "", gas, err } - return sdk.AccAddress(canon).String(), costHumanize, nil + + return sdk.AccAddress(canon).String(), gas, nil } -func canonicalAddress(human string) ([]byte, uint64, error) { +func (a cosmwasmAPIImpl) canonicalAddress(human string) ([]byte, uint64, error) { bz, err := sdk.AccAddressFromBech32(human) - return bz, costCanonical, err + return bz, a.gasMultiplier.ToWasmVMGas(4), err } -var cosmwasmAPI = wasmvm.GoAPI{ - HumanAddress: humanAddress, - CanonicalAddress: canonicalAddress, +func (k Keeper) cosmwasmAPI(ctx sdk.Context) wasmvm.GoAPI { + x := cosmwasmAPIImpl{ + gasMultiplier: k.getGasMultiplier(ctx), + } + return wasmvm.GoAPI{ + HumanAddress: x.humanAddress, + CanonicalAddress: x.canonicalAddress, + } } diff --git a/x/wasm/keeper/authz_policy.go b/x/wasm/keeper/authz_policy.go index 32d8c9952b..740195b19a 100644 --- a/x/wasm/keeper/authz_policy.go +++ b/x/wasm/keeper/authz_policy.go @@ -1,9 +1,9 @@ package keeper import ( - sdk "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/line/lbm-sdk/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) type AuthorizationPolicy interface { @@ -12,7 +12,8 @@ type AuthorizationPolicy interface { CanModifyContract(admin, actor sdk.AccAddress) bool } -type DefaultAuthorizationPolicy struct{} +type DefaultAuthorizationPolicy struct { +} func (p DefaultAuthorizationPolicy) CanCreateCode(config types.AccessConfig, actor sdk.AccAddress) bool { return config.Allowed(actor) @@ -26,16 +27,21 @@ func (p DefaultAuthorizationPolicy) CanModifyContract(admin, actor sdk.AccAddres return admin != nil && admin.Equals(actor) } -type GovAuthorizationPolicy struct{} +// GovAuthorizationPolicy is for the gov handler(proposal_handler.go) authorities +type GovAuthorizationPolicy struct { +} func (p GovAuthorizationPolicy) CanCreateCode(types.AccessConfig, sdk.AccAddress) bool { + // The gov handler can create code regardless of the current access config return true } func (p GovAuthorizationPolicy) CanInstantiateContract(types.AccessConfig, sdk.AccAddress) bool { + // The gov handler can instantiate contract regardless of the code access config return true } func (p GovAuthorizationPolicy) CanModifyContract(sdk.AccAddress, sdk.AccAddress) bool { + // The gov handler can migrate contract regardless of the contract admin return true } diff --git a/x/wasm/keeper/bench_test.go b/x/wasm/keeper/bench_test.go index ca5489d5bb..7ce5513526 100644 --- a/x/wasm/keeper/bench_test.go +++ b/x/wasm/keeper/bench_test.go @@ -1,14 +1,16 @@ package keeper import ( - "io/ioutil" + "os" "testing" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/stretchr/testify/require" + "github.com/syndtr/goleveldb/leveldb/opt" dbm "github.com/tendermint/tm-db" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/crypto/keys/secp256k1" + + "github.com/line/wasmd/x/wasm/types" ) // BenchmarkVerification benchmarks secp256k1 verification which is 1000 gas based on cpu time. @@ -47,11 +49,26 @@ func BenchmarkInstantiationOverhead(b *testing.B) { db: func() dbm.DB { return dbm.NewMemDB() }, pinned: true, }, + "unpinned, level db": { + db: func() dbm.DB { + levelDB, err := dbm.NewGoLevelDBWithOpts("testing", b.TempDir(), &opt.Options{BlockCacher: opt.NoCacher}) + require.NoError(b, err) + return levelDB + }, + }, + "pinned, level db": { + db: func() dbm.DB { + levelDB, err := dbm.NewGoLevelDBWithOpts("testing", b.TempDir(), &opt.Options{BlockCacher: opt.NoCacher}) + require.NoError(b, err) + return levelDB + }, + pinned: true, + }, } for name, spec := range specs { b.Run(name, func(b *testing.B) { wasmConfig := types.WasmConfig{MemoryCacheSize: 0} - ctx, keepers := createTestInput(b, false, SupportedFeatures, wasmConfig, spec.db()) + ctx, keepers := createTestInput(b, false, SupportedFeatures, nil, nil, wasmConfig, spec.db()) example := InstantiateHackatomExampleContract(b, ctx, keepers) if spec.pinned { require.NoError(b, keepers.ContractKeeper.PinCode(ctx, example.CodeID)) @@ -70,14 +87,18 @@ func BenchmarkInstantiationOverhead(b *testing.B) { func BenchmarkCompilation(b *testing.B) { specs := map[string]struct { wasmFile string + db func() dbm.DB }{ "hackatom": { + db: func() dbm.DB { return dbm.NewMemDB() }, wasmFile: "./testdata/hackatom.wasm", }, "burner": { + db: func() dbm.DB { return dbm.NewMemDB() }, wasmFile: "./testdata/burner.wasm", }, "ibc_reflect": { + db: func() dbm.DB { return dbm.NewMemDB() }, wasmFile: "./testdata/ibc_reflect.wasm", }, } @@ -85,11 +106,10 @@ func BenchmarkCompilation(b *testing.B) { for name, spec := range specs { b.Run(name, func(b *testing.B) { wasmConfig := types.WasmConfig{MemoryCacheSize: 0} - db := dbm.NewMemDB() - ctx, keepers := createTestInput(b, false, SupportedFeatures, wasmConfig, db) + ctx, keepers := createTestInput(b, false, SupportedFeatures, nil, nil, wasmConfig, spec.db()) // print out code size for comparisons - code, err := ioutil.ReadFile(spec.wasmFile) + code, err := os.ReadFile(spec.wasmFile) require.NoError(b, err) b.Logf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b(size: %d) ", len(code)) diff --git a/x/wasm/keeper/contract_keeper.go b/x/wasm/keeper/contract_keeper.go index 9dc0a4be9d..c8dab777eb 100644 --- a/x/wasm/keeper/contract_keeper.go +++ b/x/wasm/keeper/contract_keeper.go @@ -1,9 +1,9 @@ package keeper import ( - sdk "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/line/lbm-sdk/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) var _ types.ContractOpsKeeper = PermissionedKeeper{} @@ -20,6 +20,9 @@ type decoratedKeeper interface { Sudo(ctx sdk.Context, contractAddress sdk.AccAddress, msg []byte) ([]byte, error) setContractInfoExtension(ctx sdk.Context, contract sdk.AccAddress, extra types.ContractInfoExtension) error setAccessConfig(ctx sdk.Context, codeID uint64, config types.AccessConfig) error + + activateContract(ctx sdk.Context, contractAddress sdk.AccAddress) error + deactivateContract(ctx sdk.Context, contractAddress sdk.AccAddress) error } type PermissionedKeeper struct { @@ -84,3 +87,11 @@ func (p PermissionedKeeper) SetContractInfoExtension(ctx sdk.Context, contract s func (p PermissionedKeeper) SetAccessConfig(ctx sdk.Context, codeID uint64, config types.AccessConfig) error { return p.nested.setAccessConfig(ctx, codeID, config) } + +func (p PermissionedKeeper) DeactivateContract(ctx sdk.Context, contractAddress sdk.AccAddress) error { + return p.nested.deactivateContract(ctx, contractAddress) +} + +func (p PermissionedKeeper) ActivateContract(ctx sdk.Context, contractAddress sdk.AccAddress) error { + return p.nested.activateContract(ctx, contractAddress) +} diff --git a/x/wasm/keeper/events.go b/x/wasm/keeper/events.go index 03cb7ea778..ffb72553a5 100644 --- a/x/wasm/keeper/events.go +++ b/x/wasm/keeper/events.go @@ -4,11 +4,11 @@ import ( "fmt" "strings" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + wasmvmtypes "github.com/line/wasmvm/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) // newWasmModuleEvent creates with wasm module event for interacting with the given contract. Adds custom attributes diff --git a/x/wasm/keeper/events_test.go b/x/wasm/keeper/events_test.go index d35c88ecf0..fc33e7dbb4 100644 --- a/x/wasm/keeper/events_test.go +++ b/x/wasm/keeper/events_test.go @@ -4,11 +4,12 @@ import ( "context" "testing" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/types" ) func TestHasWasmModuleEvent(t *testing.T) { @@ -71,10 +72,8 @@ func TestNewCustomEvents(t *testing.T) { "multiple attributes": { src: wasmvmtypes.Events{{ Type: "foo", - Attributes: []wasmvmtypes.EventAttribute{ - {Key: "myKey", Value: "myVal"}, - {Key: "myOtherKey", Value: "myOtherVal"}, - }, + Attributes: []wasmvmtypes.EventAttribute{{Key: "myKey", Value: "myVal"}, + {Key: "myOtherKey", Value: "myOtherVal"}}, }}, exp: sdk.Events{sdk.NewEvent("wasm-foo", sdk.NewAttribute("_contract_address", myContract.String()), @@ -123,8 +122,7 @@ func TestNewCustomEvents(t *testing.T) { Type: "wasm", Attributes: []wasmvmtypes.EventAttribute{ {Key: "_reserved", Value: "is skipped"}, - {Key: "normal", Value: "is used"}, - }, + {Key: "normal", Value: "is used"}}, }}, isError: true, }, @@ -221,10 +219,8 @@ func TestNewWasmModuleEvent(t *testing.T) { sdk.NewAttribute("myKey", "myVal"))}, }, "multiple attributes": { - src: []wasmvmtypes.EventAttribute{ - {Key: "myKey", Value: "myVal"}, - {Key: "myOtherKey", Value: "myOtherVal"}, - }, + src: []wasmvmtypes.EventAttribute{{Key: "myKey", Value: "myVal"}, + {Key: "myOtherKey", Value: "myOtherVal"}}, exp: sdk.Events{sdk.NewEvent("wasm", sdk.NewAttribute("_contract_address", myContract.String()), sdk.NewAttribute("myKey", "myVal"), diff --git a/x/wasm/keeper/gas_register.go b/x/wasm/keeper/gas_register.go index c21606344f..116a549fe3 100644 --- a/x/wasm/keeper/gas_register.go +++ b/x/wasm/keeper/gas_register.go @@ -1,42 +1,11 @@ package keeper import ( - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + wasmvmtypes "github.com/line/wasmvm/types" ) const ( - // DefaultGasMultiplier is how many CosmWasm gas points = 1 Cosmos SDK gas point. - // - // CosmWasm gas strategy is documented in https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta/docs/GAS.md. - // Cosmos SDK reference costs can be found here: https://github.com/cosmos/cosmos-sdk/blob/v0.42.10/store/types/gas.go#L198-L209. - // - // The original multiplier of 100 up to CosmWasm 0.16 was based on - // "A write at ~3000 gas and ~200us = 10 gas per us (microsecond) cpu/io - // Rough timing have 88k gas at 90us, which is equal to 1k sdk gas... (one read)" - // as well as manual Wasmer benchmarks from 2019. This was then multiplied by 150_000 - // in the 0.16 -> 1.0 upgrade (https://github.com/CosmWasm/cosmwasm/pull/1120). - // - // The multiplier deserves more reproducible benchmarking and a strategy that allows easy adjustments. - // This is tracked in https://github.com/CosmWasm/wasmd/issues/566 and https://github.com/CosmWasm/wasmd/issues/631. - // Gas adjustments are consensus breaking but may happen in any release marked as consensus breaking. - // Do not make assumptions on how much gas an operation will consume in places that are hard to adjust, - // such as hardcoding them in contracts. - // - // Please note that all gas prices returned to wasmvm should have this multiplied. - // Benchmarks and numbers were discussed in: https://github.com/CosmWasm/wasmd/pull/634#issuecomment-938055852 - DefaultGasMultiplier uint64 = 140_000_000 - // DefaultInstanceCost is how much SDK gas we charge each time we load a WASM instance. - // Creating a new instance is costly, and this helps put a recursion limit to contracts calling contracts. - // Benchmarks and numbers were discussed in: https://github.com/CosmWasm/wasmd/pull/634#issuecomment-938056803 - DefaultInstanceCost uint64 = 60_000 - // DefaultCompileCost is how much SDK gas is charged *per byte* for compiling WASM code. - // Benchmarks and numbers were discussed in: https://github.com/CosmWasm/wasmd/pull/634#issuecomment-938056803 - DefaultCompileCost uint64 = 3 // DefaultEventAttributeDataCost is how much SDK gas is charged *per byte* for attribute data in events. // This is used with len(key) + len(value) DefaultEventAttributeDataCost uint64 = 1 @@ -57,30 +26,12 @@ const ( // GasRegister abstract source for gas costs type GasRegister interface { // NewContractInstanceCosts costs to crate a new contract instance from code - NewContractInstanceCosts(pinned bool, msgLen int) sdk.Gas - // CompileCosts costs to persist and "compile" a new wasm contract - CompileCosts(byteLength int) sdk.Gas - // InstantiateContractCosts costs when interacting with a wasm contract - InstantiateContractCosts(pinned bool, msgLen int) sdk.Gas - // ReplyCosts costs to to handle a message reply - ReplyCosts(pinned bool, reply wasmvmtypes.Reply) sdk.Gas // EventCosts costs to persist an event EventCosts(attrs []wasmvmtypes.EventAttribute, events wasmvmtypes.Events) sdk.Gas - // ToWasmVMGas converts from sdk gas to wasmvm gas - ToWasmVMGas(source sdk.Gas) uint64 - // FromWasmVMGas converts from wasmvm gas to sdk gas - FromWasmVMGas(source uint64) sdk.Gas } // WasmGasRegisterConfig config type type WasmGasRegisterConfig struct { - // InstanceCost costs when interacting with a wasm contract - InstanceCost sdk.Gas - // CompileCosts costs to persist and "compile" a new wasm contract - CompileCost sdk.Gas - // GasMultiplier is how many cosmwasm gas points = 1 sdk gas point - // SDK reference costs can be found here: https://github.com/cosmos/cosmos-sdk/blob/02c6c9fafd58da88550ab4d7d494724a477c8a68/store/types/gas.go#L153-L164 - GasMultiplier sdk.Gas // EventPerAttributeCost is how much SDK gas is charged *per byte* for attribute data in events. // This is used with len(key) + len(value) EventPerAttributeCost sdk.Gas @@ -99,9 +50,6 @@ type WasmGasRegisterConfig struct { // DefaultGasRegisterConfig default values func DefaultGasRegisterConfig() WasmGasRegisterConfig { return WasmGasRegisterConfig{ - InstanceCost: DefaultInstanceCost, - CompileCost: DefaultCompileCost, - GasMultiplier: DefaultGasMultiplier, EventPerAttributeCost: DefaultPerAttributeCost, CustomEventCost: DefaultPerCustomEventCost, EventAttributeDataCost: DefaultEventAttributeDataCost, @@ -122,56 +70,11 @@ func NewDefaultWasmGasRegister() WasmGasRegister { // NewWasmGasRegister constructor func NewWasmGasRegister(c WasmGasRegisterConfig) WasmGasRegister { - if c.GasMultiplier == 0 { - panic(sdkerrors.Wrap(sdkerrors.ErrLogic, "GasMultiplier can not be 0")) - } return WasmGasRegister{ c: c, } } -// NewContractInstanceCosts costs to crate a new contract instance from code -func (g WasmGasRegister) NewContractInstanceCosts(pinned bool, msgLen int) storetypes.Gas { - return g.InstantiateContractCosts(pinned, msgLen) -} - -// CompileCosts costs to persist and "compile" a new wasm contract -func (g WasmGasRegister) CompileCosts(byteLength int) storetypes.Gas { - if byteLength < 0 { - panic(sdkerrors.Wrap(types.ErrInvalid, "negative length")) - } - return g.c.CompileCost * uint64(byteLength) -} - -// InstantiateContractCosts costs when interacting with a wasm contract -func (g WasmGasRegister) InstantiateContractCosts(pinned bool, msgLen int) sdk.Gas { - if msgLen < 0 { - panic(sdkerrors.Wrap(types.ErrInvalid, "negative length")) - } - dataCosts := sdk.Gas(msgLen) * g.c.ContractMessageDataCost - if pinned { - return dataCosts - } - return g.c.InstanceCost + dataCosts -} - -// ReplyCosts costs to to handle a message reply -func (g WasmGasRegister) ReplyCosts(pinned bool, reply wasmvmtypes.Reply) sdk.Gas { - var eventGas sdk.Gas - msgLen := len(reply.Result.Err) - if reply.Result.Ok != nil { - msgLen += len(reply.Result.Ok.Data) - var attrs []wasmvmtypes.EventAttribute - for _, e := range reply.Result.Ok.Events { - eventGas += sdk.Gas(len(e.Type)) * g.c.EventAttributeDataCost - attrs = append(attrs, e.Attributes...) - } - // apply free tier on the whole set not per event - eventGas += g.EventCosts(attrs, nil) - } - return eventGas + g.InstantiateContractCosts(pinned, msgLen) -} - // EventCosts costs to persist an event func (g WasmGasRegister) EventCosts(attrs []wasmvmtypes.EventAttribute, events wasmvmtypes.Events) sdk.Gas { gas, remainingFreeTier := g.eventAttributeCosts(attrs, g.c.EventAttributeDataFreeTier) @@ -211,17 +114,3 @@ func calcWithFreeTier(storedBytes uint64, freeTier uint64) (uint64, uint64) { storedBytes -= freeTier return storedBytes, 0 } - -// ToWasmVMGas convert to wasmVM contract runtime gas unit -func (g WasmGasRegister) ToWasmVMGas(source storetypes.Gas) uint64 { - x := source * g.c.GasMultiplier - if x < source { - panic(sdk.ErrorOutOfGas{Descriptor: "overflow"}) - } - return x -} - -// FromWasmVMGas converts to SDK gas unit -func (g WasmGasRegister) FromWasmVMGas(source uint64) sdk.Gas { - return source / g.c.GasMultiplier -} diff --git a/x/wasm/keeper/gas_register_test.go b/x/wasm/keeper/gas_register_test.go deleted file mode 100644 index bc3e761a26..0000000000 --- a/x/wasm/keeper/gas_register_test.go +++ /dev/null @@ -1,432 +0,0 @@ -package keeper - -import ( - "math" - "strings" - "testing" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/assert" -) - -func TestCompileCosts(t *testing.T) { - specs := map[string]struct { - srcLen int - srcConfig WasmGasRegisterConfig - exp sdk.Gas - expPanic bool - }{ - "one byte": { - srcLen: 1, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(3), // DefaultCompileCost - }, - "zero byte": { - srcLen: 0, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(0), - }, - "negative len": { - srcLen: -1, - srcConfig: DefaultGasRegisterConfig(), - expPanic: true, - }, - } - for name, spec := range specs { - t.Run(name, func(t *testing.T) { - if spec.expPanic { - assert.Panics(t, func() { - NewWasmGasRegister(spec.srcConfig).CompileCosts(spec.srcLen) - }) - return - } - gotGas := NewWasmGasRegister(spec.srcConfig).CompileCosts(spec.srcLen) - assert.Equal(t, spec.exp, gotGas) - }) - } -} - -func TestNewContractInstanceCosts(t *testing.T) { - specs := map[string]struct { - srcLen int - srcConfig WasmGasRegisterConfig - pinned bool - exp sdk.Gas - expPanic bool - }{ - "small msg - pinned": { - srcLen: 1, - srcConfig: DefaultGasRegisterConfig(), - pinned: true, - exp: DefaultContractMessageDataCost, - }, - "big msg - pinned": { - srcLen: math.MaxUint32, - srcConfig: DefaultGasRegisterConfig(), - pinned: true, - exp: DefaultContractMessageDataCost * sdk.Gas(math.MaxUint32), - }, - "empty msg - pinned": { - srcLen: 0, - pinned: true, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(0), - }, - "small msg - unpinned": { - srcLen: 1, - srcConfig: DefaultGasRegisterConfig(), - exp: DefaultContractMessageDataCost + DefaultInstanceCost, - }, - "big msg - unpinned": { - srcLen: math.MaxUint32, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(DefaultContractMessageDataCost*math.MaxUint32 + DefaultInstanceCost), - }, - "empty msg - unpinned": { - srcLen: 0, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(DefaultInstanceCost), - }, - - "negative len": { - srcLen: -1, - srcConfig: DefaultGasRegisterConfig(), - expPanic: true, - }, - } - for name, spec := range specs { - t.Run(name, func(t *testing.T) { - if spec.expPanic { - assert.Panics(t, func() { - NewWasmGasRegister(spec.srcConfig).NewContractInstanceCosts(spec.pinned, spec.srcLen) - }) - return - } - gotGas := NewWasmGasRegister(spec.srcConfig).NewContractInstanceCosts(spec.pinned, spec.srcLen) - assert.Equal(t, spec.exp, gotGas) - }) - } -} - -func TestContractInstanceCosts(t *testing.T) { - // same as TestNewContractInstanceCosts currently - specs := map[string]struct { - srcLen int - srcConfig WasmGasRegisterConfig - pinned bool - exp sdk.Gas - expPanic bool - }{ - "small msg - pinned": { - srcLen: 1, - srcConfig: DefaultGasRegisterConfig(), - pinned: true, - exp: DefaultContractMessageDataCost, - }, - "big msg - pinned": { - srcLen: math.MaxUint32, - srcConfig: DefaultGasRegisterConfig(), - pinned: true, - exp: sdk.Gas(DefaultContractMessageDataCost * math.MaxUint32), - }, - "empty msg - pinned": { - srcLen: 0, - pinned: true, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(0), - }, - "small msg - unpinned": { - srcLen: 1, - srcConfig: DefaultGasRegisterConfig(), - exp: DefaultContractMessageDataCost + DefaultInstanceCost, - }, - "big msg - unpinned": { - srcLen: math.MaxUint32, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(DefaultContractMessageDataCost*math.MaxUint32 + DefaultInstanceCost), - }, - "empty msg - unpinned": { - srcLen: 0, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(DefaultInstanceCost), - }, - - "negative len": { - srcLen: -1, - srcConfig: DefaultGasRegisterConfig(), - expPanic: true, - }, - } - for name, spec := range specs { - t.Run(name, func(t *testing.T) { - if spec.expPanic { - assert.Panics(t, func() { - NewWasmGasRegister(spec.srcConfig).InstantiateContractCosts(spec.pinned, spec.srcLen) - }) - return - } - gotGas := NewWasmGasRegister(spec.srcConfig).InstantiateContractCosts(spec.pinned, spec.srcLen) - assert.Equal(t, spec.exp, gotGas) - }) - } -} - -func TestReplyCost(t *testing.T) { - specs := map[string]struct { - src wasmvmtypes.Reply - srcConfig WasmGasRegisterConfig - pinned bool - exp sdk.Gas - expPanic bool - }{ - "subcall response with events and data - pinned": { - src: wasmvmtypes.Reply{ - Result: wasmvmtypes.SubMsgResult{ - Ok: &wasmvmtypes.SubMsgResponse{ - Events: []wasmvmtypes.Event{ - {Type: "foo", Attributes: []wasmvmtypes.EventAttribute{{Key: "myKey", Value: "myData"}}}, - }, - Data: []byte{0x1}, - }, - }, - }, - srcConfig: DefaultGasRegisterConfig(), - pinned: true, - exp: sdk.Gas(3*DefaultEventAttributeDataCost + DefaultPerAttributeCost + DefaultContractMessageDataCost), // 3 == len("foo") - }, - "subcall response with events - pinned": { - src: wasmvmtypes.Reply{ - Result: wasmvmtypes.SubMsgResult{ - Ok: &wasmvmtypes.SubMsgResponse{ - Events: []wasmvmtypes.Event{ - {Type: "foo", Attributes: []wasmvmtypes.EventAttribute{{Key: "myKey", Value: "myData"}}}, - }, - }, - }, - }, - srcConfig: DefaultGasRegisterConfig(), - pinned: true, - exp: sdk.Gas(3*DefaultEventAttributeDataCost + DefaultPerAttributeCost), // 3 == len("foo") - }, - "subcall response with events exceeds free tier- pinned": { - src: wasmvmtypes.Reply{ - Result: wasmvmtypes.SubMsgResult{ - Ok: &wasmvmtypes.SubMsgResponse{ - Events: []wasmvmtypes.Event{ - {Type: "foo", Attributes: []wasmvmtypes.EventAttribute{{Key: strings.Repeat("x", DefaultEventAttributeDataFreeTier), Value: "myData"}}}, - }, - }, - }, - }, - srcConfig: DefaultGasRegisterConfig(), - pinned: true, - exp: sdk.Gas((3+6)*DefaultEventAttributeDataCost + DefaultPerAttributeCost), // 3 == len("foo"), 6 == len("myData") - }, - "subcall response error - pinned": { - src: wasmvmtypes.Reply{ - Result: wasmvmtypes.SubMsgResult{ - Err: "foo", - }, - }, - srcConfig: DefaultGasRegisterConfig(), - pinned: true, - exp: 3 * DefaultContractMessageDataCost, - }, - "subcall response with events and data - unpinned": { - src: wasmvmtypes.Reply{ - Result: wasmvmtypes.SubMsgResult{ - Ok: &wasmvmtypes.SubMsgResponse{ - Events: []wasmvmtypes.Event{ - {Type: "foo", Attributes: []wasmvmtypes.EventAttribute{{Key: "myKey", Value: "myData"}}}, - }, - Data: []byte{0x1}, - }, - }, - }, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(DefaultInstanceCost + 3*DefaultEventAttributeDataCost + DefaultPerAttributeCost + DefaultContractMessageDataCost), - }, - "subcall response with events - unpinned": { - src: wasmvmtypes.Reply{ - Result: wasmvmtypes.SubMsgResult{ - Ok: &wasmvmtypes.SubMsgResponse{ - Events: []wasmvmtypes.Event{ - {Type: "foo", Attributes: []wasmvmtypes.EventAttribute{{Key: "myKey", Value: "myData"}}}, - }, - }, - }, - }, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(DefaultInstanceCost + 3*DefaultEventAttributeDataCost + DefaultPerAttributeCost), - }, - "subcall response with events exceeds free tier- unpinned": { - src: wasmvmtypes.Reply{ - Result: wasmvmtypes.SubMsgResult{ - Ok: &wasmvmtypes.SubMsgResponse{ - Events: []wasmvmtypes.Event{ - {Type: "foo", Attributes: []wasmvmtypes.EventAttribute{{Key: strings.Repeat("x", DefaultEventAttributeDataFreeTier), Value: "myData"}}}, - }, - }, - }, - }, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(DefaultInstanceCost + (3+6)*DefaultEventAttributeDataCost + DefaultPerAttributeCost), // 3 == len("foo"), 6 == len("myData") - }, - "subcall response error - unpinned": { - src: wasmvmtypes.Reply{ - Result: wasmvmtypes.SubMsgResult{ - Err: "foo", - }, - }, - srcConfig: DefaultGasRegisterConfig(), - exp: sdk.Gas(DefaultInstanceCost + 3*DefaultContractMessageDataCost), - }, - "subcall response with empty events": { - src: wasmvmtypes.Reply{ - Result: wasmvmtypes.SubMsgResult{ - Ok: &wasmvmtypes.SubMsgResponse{ - Events: make([]wasmvmtypes.Event, 10), - }, - }, - }, - srcConfig: DefaultGasRegisterConfig(), - exp: DefaultInstanceCost, - }, - "subcall response with events unset": { - src: wasmvmtypes.Reply{ - Result: wasmvmtypes.SubMsgResult{ - Ok: &wasmvmtypes.SubMsgResponse{}, - }, - }, - srcConfig: DefaultGasRegisterConfig(), - exp: DefaultInstanceCost, - }, - } - for name, spec := range specs { - t.Run(name, func(t *testing.T) { - if spec.expPanic { - assert.Panics(t, func() { - NewWasmGasRegister(spec.srcConfig).ReplyCosts(spec.pinned, spec.src) - }) - return - } - gotGas := NewWasmGasRegister(spec.srcConfig).ReplyCosts(spec.pinned, spec.src) - assert.Equal(t, spec.exp, gotGas) - }) - } -} - -func TestEventCosts(t *testing.T) { - // most cases are covered in TestReplyCost already. This ensures some edge cases - specs := map[string]struct { - srcAttrs []wasmvmtypes.EventAttribute - srcEvents wasmvmtypes.Events - expGas sdk.Gas - }{ - "empty events": { - srcEvents: make([]wasmvmtypes.Event, 1), - expGas: DefaultPerCustomEventCost, - }, - "empty attributes": { - srcAttrs: make([]wasmvmtypes.EventAttribute, 1), - expGas: DefaultPerAttributeCost, - }, - "both nil": { - expGas: 0, - }, - } - for name, spec := range specs { - t.Run(name, func(t *testing.T) { - gotGas := NewDefaultWasmGasRegister().EventCosts(spec.srcAttrs, spec.srcEvents) - assert.Equal(t, spec.expGas, gotGas) - }) - } -} - -func TestToWasmVMGasConversion(t *testing.T) { - specs := map[string]struct { - src storetypes.Gas - srcConfig WasmGasRegisterConfig - exp uint64 - expPanic bool - }{ - "0": { - src: 0, - exp: 0, - srcConfig: DefaultGasRegisterConfig(), - }, - "max": { - srcConfig: WasmGasRegisterConfig{ - GasMultiplier: 1, - }, - src: math.MaxUint64, - exp: math.MaxUint64, - }, - "overflow": { - srcConfig: WasmGasRegisterConfig{ - GasMultiplier: 2, - }, - src: math.MaxUint64, - expPanic: true, - }, - } - for name, spec := range specs { - t.Run(name, func(t *testing.T) { - if spec.expPanic { - assert.Panics(t, func() { - r := NewWasmGasRegister(spec.srcConfig) - _ = r.ToWasmVMGas(spec.src) - }) - return - } - r := NewWasmGasRegister(spec.srcConfig) - got := r.ToWasmVMGas(spec.src) - assert.Equal(t, spec.exp, got) - }) - } -} - -func TestFromWasmVMGasConversion(t *testing.T) { - specs := map[string]struct { - src uint64 - exp storetypes.Gas - srcConfig WasmGasRegisterConfig - expPanic bool - }{ - "0": { - src: 0, - exp: 0, - srcConfig: DefaultGasRegisterConfig(), - }, - "max": { - srcConfig: WasmGasRegisterConfig{ - GasMultiplier: 1, - }, - src: math.MaxUint64, - exp: math.MaxUint64, - }, - "missconfigured": { - srcConfig: WasmGasRegisterConfig{ - GasMultiplier: 0, - }, - src: 1, - expPanic: true, - }, - } - for name, spec := range specs { - t.Run(name, func(t *testing.T) { - if spec.expPanic { - assert.Panics(t, func() { - r := NewWasmGasRegister(spec.srcConfig) - _ = r.FromWasmVMGas(spec.src) - }) - return - } - r := NewWasmGasRegister(spec.srcConfig) - got := r.FromWasmVMGas(spec.src) - assert.Equal(t, spec.exp, got) - }) - } -} diff --git a/x/wasm/keeper/genesis.go b/x/wasm/keeper/genesis.go index 7fa5280b9e..bdcf99d03f 100644 --- a/x/wasm/keeper/genesis.go +++ b/x/wasm/keeper/genesis.go @@ -1,11 +1,11 @@ package keeper import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - abci "github.com/tendermint/tendermint/abci/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + abci "github.com/line/ostracon/abci/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) // ValidatorSetSource is a subset of the staking keeper @@ -65,6 +65,17 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState, staki return nil, sdkerrors.Wrapf(types.ErrInvalid, "seq %s with value: %d must be greater than: %d ", string(types.KeyLastInstanceID), seqVal, maxContractID) } + for i, contractAddr := range data.InactiveContractAddresses { + inactiveContractAddr, err := sdk.AccAddressFromBech32(contractAddr) + if err != nil { + return nil, sdkerrors.Wrapf(err, "wrong contract address %s", contractAddr) + } + err = keeper.deactivateContract(ctx, inactiveContractAddr) + if err != nil { + return nil, sdkerrors.Wrapf(err, "contract number %d", i) + } + } + if len(data.GenMsgs) == 0 { return nil, nil } @@ -124,5 +135,10 @@ func ExportGenesis(ctx sdk.Context, keeper *Keeper) *types.GenesisState { }) } + keeper.IterateInactiveContracts(ctx, func(contractAddr sdk.AccAddress) (stop bool) { + genState.InactiveContractAddresses = append(genState.InactiveContractAddresses, contractAddr.String()) + return false + }) + return &genState } diff --git a/x/wasm/keeper/genesis_test.go b/x/wasm/keeper/genesis_test.go index ff7c6db53a..eaad499160 100644 --- a/x/wasm/keeper/genesis_test.go +++ b/x/wasm/keeper/genesis_test.go @@ -6,32 +6,33 @@ import ( "encoding/base64" "errors" "fmt" - "io/ioutil" "math/rand" "os" "testing" "time" - "github.com/cosmos/cosmos-sdk/store" - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" fuzz "github.com/google/gofuzz" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/log" - "github.com/tendermint/tendermint/proto/tendermint/crypto" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" - "github.com/CosmWasm/wasmd/x/wasm/types" - wasmTypes "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/store" + "github.com/line/lbm-sdk/store/prefix" + sdk "github.com/line/lbm-sdk/types" + authkeeper "github.com/line/lbm-sdk/x/auth/keeper" + bankpluskeeper "github.com/line/lbm-sdk/x/bankplus/keeper" + distributionkeeper "github.com/line/lbm-sdk/x/distribution/keeper" + govtypes "github.com/line/lbm-sdk/x/gov/types" + paramskeeper "github.com/line/lbm-sdk/x/params/keeper" + paramtypes "github.com/line/lbm-sdk/x/params/types" + stakingkeeper "github.com/line/lbm-sdk/x/staking/keeper" + abci "github.com/line/ostracon/abci/types" + "github.com/line/ostracon/libs/log" + "github.com/line/ostracon/proto/ostracon/crypto" + ocproto "github.com/line/ostracon/proto/ostracon/types" + + "github.com/line/wasmd/x/wasm/types" + wasmTypes "github.com/line/wasmd/x/wasm/types" ) const firstCodeID = 1 @@ -40,7 +41,7 @@ func TestGenesisExportImport(t *testing.T) { wasmKeeper, srcCtx, srcStoreKeys := setupKeeper(t) contractKeeper := NewGovPermissionKeeper(wasmKeeper) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) // store some test data @@ -127,7 +128,7 @@ func TestGenesisExportImport(t *testing.T) { }) // re-import - var importState wasmTypes.GenesisState + var importState types.GenesisState err = dstKeeper.cdc.UnmarshalJSON(exportedGenesis, &importState) require.NoError(t, err) InitGenesis(dstCtx, dstKeeper, importState, &StakingKeeperMock{}, TestHandler(contractKeeper)) @@ -153,7 +154,7 @@ func TestGenesisExportImport(t *testing.T) { } func TestGenesisInit(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) myCodeInfo := wasmTypes.CodeInfoFixture(wasmTypes.WithSHA256CodeHash(wasmCode)) @@ -403,7 +404,7 @@ func TestGenesisInit(t *testing.T) { }, }, "validator set update called for any genesis messages": { - src: wasmTypes.GenesisState{ + src: types.GenesisState{ GenMsgs: []types.GenesisState_GenMsgs{ {Sum: &types.GenesisState_GenMsgs_StoreCode{ StoreCode: types.MsgStoreCodeFixture(), @@ -412,10 +413,8 @@ func TestGenesisInit(t *testing.T) { Params: types.DefaultParams(), }, stakingMock: StakingKeeperMock{expCalls: 1, validatorUpdate: []abci.ValidatorUpdate{ - { - PubKey: crypto.PublicKey{Sum: &crypto.PublicKey_Ed25519{ - Ed25519: []byte("a valid key"), - }}, + {PubKey: crypto.PublicKey{Sum: &crypto.PublicKey_Ed25519{ + Ed25519: []byte("a valid key")}}, Power: 100, }, }}, @@ -423,7 +422,7 @@ func TestGenesisInit(t *testing.T) { expSuccess: true, }, "validator set update not called on genesis msg handler errors": { - src: wasmTypes.GenesisState{ + src: types.GenesisState{ GenMsgs: []types.GenesisState_GenMsgs{ {Sum: &types.GenesisState_GenMsgs_StoreCode{ StoreCode: types.MsgStoreCodeFixture(), @@ -463,17 +462,20 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { "code_upload_access": { "permission": "Everybody" }, - "instantiate_default_permission": "Everybody" + "instantiate_default_permission": "Everybody", + "gas_multiplier": 100, + "instance_cost": 40000, + "compile_cost": 2 }, "codes": [ { "code_id": "1", "code_info": { "code_hash": %q, - "creator": "cosmos1qtu5n0cnhfkjj6l2rq97hmky9fd89gwca9yarx", + "creator": "link18vd8fpwxzck93qlwghaj6arh4p7c5n89fvcmzu", "instantiate_config": { "permission": "OnlyAddress", - "address": "cosmos1qtu5n0cnhfkjj6l2rq97hmky9fd89gwca9yarx" + "address": "link18vd8fpwxzck93qlwghaj6arh4p7c5n89fvcmzu" } }, "code_bytes": %q @@ -481,11 +483,11 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { ], "contracts": [ { - "contract_address": "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", + "contract_address": "link1ghekyjucln7y67ntx7cf27m9dpuxxemnqk82wt", "contract_info": { "code_id": "1", - "creator": "cosmos13x849jzd03vne42ynpj25hn8npjecxqrjghd8x", - "admin": "cosmos1h5t8zxmjr30e9dqghtlpl40f2zz5cgey6esxtn", + "creator": "link1p0yx9c9q4xsnedlcn24gqfry5dcu6e9xkhv9aj", + "admin": "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgp8apuk5", "label": "ȀĴnZV芢毤" } } @@ -498,14 +500,14 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { keeper, ctx, _ := setupKeeper(t) contractKeeper := NewGovPermissionKeeper(keeper) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) wasmCodeHash := sha256.Sum256(wasmCode) enc64 := base64.StdEncoding.EncodeToString genesisStr := fmt.Sprintf(genesisTemplate, enc64(wasmCodeHash[:]), enc64(wasmCode)) - var importState wasmTypes.GenesisState + var importState types.GenesisState err = keeper.cdc.UnmarshalJSON([]byte(genesisStr), &importState) require.NoError(t, err) require.NoError(t, importState.ValidateBasic(), genesisStr) @@ -524,7 +526,7 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { // verify code info gotCodeInfo := keeper.GetCodeInfo(ctx, 1) require.NotNil(t, gotCodeInfo) - codeCreatorAddr := "cosmos1qtu5n0cnhfkjj6l2rq97hmky9fd89gwca9yarx" + codeCreatorAddr := "link18vd8fpwxzck93qlwghaj6arh4p7c5n89fvcmzu" expCodeInfo := types.CodeInfo{ CodeHash: wasmCodeHash[:], Creator: codeCreatorAddr, @@ -536,11 +538,11 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { assert.Equal(t, expCodeInfo, *gotCodeInfo) // verify contract - contractAddr, _ := sdk.AccAddressFromBech32("cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr") + contractAddr, _ := sdk.AccAddressFromBech32("link1ghekyjucln7y67ntx7cf27m9dpuxxemnqk82wt") gotContractInfo := keeper.GetContractInfo(ctx, contractAddr) require.NotNil(t, gotContractInfo) - contractCreatorAddr := "cosmos13x849jzd03vne42ynpj25hn8npjecxqrjghd8x" - adminAddr := "cosmos1h5t8zxmjr30e9dqghtlpl40f2zz5cgey6esxtn" + contractCreatorAddr := "link1p0yx9c9q4xsnedlcn24gqfry5dcu6e9xkhv9aj" + adminAddr := "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgp8apuk5" expContractInfo := types.ContractInfo{ CodeID: firstCodeID, @@ -564,7 +566,7 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { } func TestSupportedGenMsgTypes(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) var ( myAddress sdk.AccAddress = bytes.Repeat([]byte{1}, types.ContractAddrLen) @@ -636,12 +638,12 @@ func TestSupportedGenMsgTypes(t *testing.T) { func setupKeeper(t *testing.T) (*Keeper, sdk.Context, []sdk.StoreKey) { t.Helper() - tempDir, err := ioutil.TempDir("", "wasm") + tempDir, err := os.MkdirTemp("", "wasm") require.NoError(t, err) t.Cleanup(func() { os.RemoveAll(tempDir) }) var ( keyParams = sdk.NewKVStoreKey(paramtypes.StoreKey) - tkeyParams = sdk.NewTransientStoreKey(paramtypes.TStoreKey) + tkeyParams = sdk.NewKVStoreKey(paramtypes.TStoreKey) keyWasm = sdk.NewKVStoreKey(wasmTypes.StoreKey) ) @@ -649,10 +651,9 @@ func setupKeeper(t *testing.T) (*Keeper, sdk.Context, []sdk.StoreKey) { ms := store.NewCommitMultiStore(db) ms.MountStoreWithDB(keyWasm, sdk.StoreTypeIAVL, db) ms.MountStoreWithDB(keyParams, sdk.StoreTypeIAVL, db) - ms.MountStoreWithDB(tkeyParams, sdk.StoreTypeTransient, db) require.NoError(t, ms.LoadLatestVersion()) - ctx := sdk.NewContext(ms, tmproto.Header{ + ctx := sdk.NewContext(ms, ocproto.Header{ Height: 1234567, Time: time.Date(2020, time.April, 22, 12, 0, 0, 0, time.UTC), }, false, log.NewNopLogger()) @@ -669,7 +670,7 @@ func setupKeeper(t *testing.T) (*Keeper, sdk.Context, []sdk.StoreKey) { wasmConfig := wasmTypes.DefaultWasmConfig() pk := paramskeeper.NewKeeper(encodingConfig.Marshaler, encodingConfig.Amino, keyParams, tkeyParams) - srcKeeper := NewKeeper(encodingConfig.Marshaler, keyWasm, pk.Subspace(wasmTypes.ModuleName), authkeeper.AccountKeeper{}, nil, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, tempDir, wasmConfig, SupportedFeatures) + srcKeeper := NewKeeper(encodingConfig.Marshaler, keyWasm, pk.Subspace(wasmTypes.ModuleName), authkeeper.AccountKeeper{}, bankpluskeeper.BaseKeeper{}, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, tempDir, wasmConfig, SupportedFeatures, nil, nil) return &srcKeeper, ctx, []sdk.StoreKey{keyWasm, keyParams} } diff --git a/x/wasm/keeper/handler_plugin.go b/x/wasm/keeper/handler_plugin.go index c138e5ed00..944e0fdc41 100644 --- a/x/wasm/keeper/handler_plugin.go +++ b/x/wasm/keeper/handler_plugin.go @@ -4,15 +4,15 @@ import ( "errors" "fmt" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - "github.com/cosmos/cosmos-sdk/baseapp" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v3/modules/core/24-host" - - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/baseapp" + codectypes "github.com/line/lbm-sdk/codec/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + host "github.com/line/lbm-sdk/x/ibc/core/24-host" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/types" ) // msgEncoder is an extension point to customize encodings diff --git a/x/wasm/keeper/handler_plugin_encoders.go b/x/wasm/keeper/handler_plugin_encoders.go index 90734c1dc2..d1e5612d05 100644 --- a/x/wasm/keeper/handler_plugin_encoders.go +++ b/x/wasm/keeper/handler_plugin_encoders.go @@ -4,30 +4,28 @@ import ( "encoding/json" "fmt" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - ibcclienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" + codectypes "github.com/line/lbm-sdk/codec/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + banktypes "github.com/line/lbm-sdk/x/bank/types" + distributiontypes "github.com/line/lbm-sdk/x/distribution/types" + govtypes "github.com/line/lbm-sdk/x/gov/types" + ibctransfertypes "github.com/line/lbm-sdk/x/ibc/applications/transfer/types" + ibcclienttypes "github.com/line/lbm-sdk/x/ibc/core/02-client/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + wasmvmtypes "github.com/line/wasmvm/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) -type ( - BankEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.BankMsg) ([]sdk.Msg, error) - CustomEncoder func(sender sdk.AccAddress, msg json.RawMessage) ([]sdk.Msg, error) - DistributionEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.DistributionMsg) ([]sdk.Msg, error) - StakingEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.StakingMsg) ([]sdk.Msg, error) - StargateEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.StargateMsg) ([]sdk.Msg, error) - WasmEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.WasmMsg) ([]sdk.Msg, error) - IBCEncoder func(ctx sdk.Context, sender sdk.AccAddress, contractIBCPortID string, msg *wasmvmtypes.IBCMsg) ([]sdk.Msg, error) -) +type BankEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.BankMsg) ([]sdk.Msg, error) +type CustomEncoder func(sender sdk.AccAddress, msg json.RawMessage) ([]sdk.Msg, error) +type DistributionEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.DistributionMsg) ([]sdk.Msg, error) +type StakingEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.StakingMsg) ([]sdk.Msg, error) +type StargateEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.StargateMsg) ([]sdk.Msg, error) +type WasmEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.WasmMsg) ([]sdk.Msg, error) +type IBCEncoder func(ctx sdk.Context, sender sdk.AccAddress, contractIBCPortID string, msg *wasmvmtypes.IBCMsg) ([]sdk.Msg, error) type MessageEncoders struct { Bank func(sender sdk.AccAddress, msg *wasmvmtypes.BankMsg) ([]sdk.Msg, error) diff --git a/x/wasm/keeper/handler_plugin_encoders_test.go b/x/wasm/keeper/handler_plugin_encoders_test.go index e1c49c591c..0ae62d8647 100644 --- a/x/wasm/keeper/handler_plugin_encoders_test.go +++ b/x/wasm/keeper/handler_plugin_encoders_test.go @@ -3,23 +3,23 @@ package keeper import ( "testing" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" "github.com/golang/protobuf/proto" "github.com/stretchr/testify/assert" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/require" - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - "github.com/CosmWasm/wasmd/x/wasm/types" + codectypes "github.com/line/lbm-sdk/codec/types" + sdk "github.com/line/lbm-sdk/types" + banktypes "github.com/line/lbm-sdk/x/bank/types" + distributiontypes "github.com/line/lbm-sdk/x/distribution/types" + govtypes "github.com/line/lbm-sdk/x/gov/types" + ibctransfertypes "github.com/line/lbm-sdk/x/ibc/applications/transfer/types" + clienttypes "github.com/line/lbm-sdk/x/ibc/core/02-client/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + "github.com/line/wasmd/x/wasm/types" ) func TestEncoding(t *testing.T) { @@ -374,7 +374,7 @@ func TestEncoding(t *testing.T) { sender: addr2, srcMsg: wasmvmtypes.CosmosMsg{ Stargate: &wasmvmtypes.StargateMsg{ - TypeURL: "/cosmos.bank.v2.MsgSend", + TypeURL: "/lbm.bank.invalidversion.MsgSend", Value: bankMsgBin, }, }, @@ -634,4 +634,5 @@ func TestConvertWasmCoinToSdkCoin(t *testing.T) { assert.Equal(t, spec.expVal, gotVal) }) } + } diff --git a/x/wasm/keeper/handler_plugin_test.go b/x/wasm/keeper/handler_plugin_test.go index 4c60bc550f..02fa9fc1ed 100644 --- a/x/wasm/keeper/handler_plugin_test.go +++ b/x/wasm/keeper/handler_plugin_test.go @@ -4,21 +4,22 @@ import ( "encoding/json" "testing" - wasmvm "github.com/CosmWasm/wasmvm" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - "github.com/cosmos/cosmos-sdk/baseapp" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - ibcexported "github.com/cosmos/ibc-go/v3/modules/core/exported" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/baseapp" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + banktypes "github.com/line/lbm-sdk/x/bank/types" + capabilitytypes "github.com/line/lbm-sdk/x/capability/types" + clienttypes "github.com/line/lbm-sdk/x/ibc/core/02-client/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + ibcexported "github.com/line/lbm-sdk/x/ibc/core/exported" + wasmvm "github.com/line/wasmvm" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + "github.com/line/wasmd/x/wasm/types" ) func TestMessageHandlerChainDispatch(t *testing.T) { @@ -27,15 +28,13 @@ func TestMessageHandlerChainDispatch(t *testing.T) { alwaysUnknownMsgHandler := &wasmtesting.MockMessageHandler{ DispatchMsgFn: func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { return nil, nil, types.ErrUnknownMsg - }, - } + }} assertNotCalledHandler := &wasmtesting.MockMessageHandler{ DispatchMsgFn: func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { t.Fatal("not expected to be called") return - }, - } + }} myMsg := wasmvmtypes.CosmosMsg{Custom: []byte(`{}`)} specs := map[string]struct { @@ -56,18 +55,15 @@ func TestMessageHandlerChainDispatch(t *testing.T) { handlers: []Messenger{&wasmtesting.MockMessageHandler{ DispatchMsgFn: func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { return nil, nil, types.ErrInvalidMsg - }, - }, assertNotCalledHandler}, + }}, assertNotCalledHandler}, expErr: types.ErrInvalidMsg, }, "return events when handle": { - handlers: []Messenger{ - &wasmtesting.MockMessageHandler{ - DispatchMsgFn: func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { - _, data, _ = capturingHandler.DispatchMsg(ctx, contractAddr, contractIBCPortID, msg) - return []sdk.Event{sdk.NewEvent("myEvent", sdk.NewAttribute("foo", "bar"))}, data, nil - }, - }, + handlers: []Messenger{&wasmtesting.MockMessageHandler{ + DispatchMsgFn: func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { + _, data, _ = capturingHandler.DispatchMsg(ctx, contractAddr, contractIBCPortID, msg) + return []sdk.Event{sdk.NewEvent("myEvent", sdk.NewAttribute("foo", "bar"))}, data, nil + }}, }, expEvents: []sdk.Event{sdk.NewEvent("myEvent", sdk.NewAttribute("foo", "bar"))}, }, @@ -236,8 +232,7 @@ func TestIBCRawPacketHandler(t *testing.T) { Counterparty: channeltypes.NewCounterparty( "other-port", "other-channel-1", - ), - }, true + )}, true }, SendPacketFn: func(ctx sdk.Context, channelCap *capabilitytypes.Capability, packet ibcexported.PacketI) error { capturedPacket = packet @@ -284,8 +279,7 @@ func TestIBCRawPacketHandler(t *testing.T) { chanKeeper: &wasmtesting.MockChannelKeeper{ GetNextSequenceSendFn: func(ctx sdk.Context, portID, channelID string) (uint64, bool) { return 0, false - }, - }, + }}, expErr: channeltypes.ErrSequenceSendNotFound, }, "capability not found returns error": { @@ -298,8 +292,7 @@ func TestIBCRawPacketHandler(t *testing.T) { capKeeper: wasmtesting.MockCapabilityKeeper{ GetCapabilityFn: func(ctx sdk.Context, name string) (*capabilitytypes.Capability, bool) { return nil, false - }, - }, + }}, expErr: channeltypes.ErrChannelCapabilityNotFound, }, } @@ -380,10 +373,9 @@ func TestBurnCoinMessageHandlerIntegration(t *testing.T) { t.Run(name, func(t *testing.T) { ctx, _ = parentCtx.CacheContext() k.wasmVM = &wasmtesting.MockWasmer{ExecuteFn: func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, executeMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { - return &wasmvmtypes.Response{ - Messages: []wasmvmtypes.SubMsg{ - {Msg: wasmvmtypes.CosmosMsg{Bank: &wasmvmtypes.BankMsg{Burn: &spec.msg}}, ReplyOn: wasmvmtypes.ReplyNever}, - }, + return &wasmvmtypes.Response{Messages: []wasmvmtypes.SubMsg{ + {Msg: wasmvmtypes.CosmosMsg{Bank: &wasmvmtypes.BankMsg{Burn: &spec.msg}}, ReplyOn: wasmvmtypes.ReplyNever}, + }, }, 0, nil }} diff --git a/x/wasm/keeper/ibc.go b/x/wasm/keeper/ibc.go index f6f928df62..a2c81479aa 100644 --- a/x/wasm/keeper/ibc.go +++ b/x/wasm/keeper/ibc.go @@ -3,12 +3,12 @@ package keeper import ( "strings" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - host "github.com/cosmos/ibc-go/v3/modules/core/24-host" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + capabilitytypes "github.com/line/lbm-sdk/x/capability/types" + host "github.com/line/lbm-sdk/x/ibc/core/24-host" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) // bindIbcPort will reserve the port. diff --git a/x/wasm/keeper/ibc_test.go b/x/wasm/keeper/ibc_test.go index 704e2f6c2a..db20c36e2b 100644 --- a/x/wasm/keeper/ibc_test.go +++ b/x/wasm/keeper/ibc_test.go @@ -4,21 +4,21 @@ import ( "fmt" "testing" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + + sdk "github.com/line/lbm-sdk/types" ) func TestDontBindPortNonIBCContract(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) example := InstantiateHackatomExampleContract(t, ctx, keepers) // ensure we bound the port _, _, err := keepers.IBCKeeper.PortKeeper.LookupModuleByPort(ctx, keepers.WasmKeeper.GetContractInfo(ctx, example.Contract).IBCPortID) require.Error(t, err) } func TestBindingPortForIBCContractOnInstantiate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) example := InstantiateIBCReflectContract(t, ctx, keepers) // ensure we bound the port owner, _, err := keepers.IBCKeeper.PortKeeper.LookupModuleByPort(ctx, keepers.WasmKeeper.GetContractInfo(ctx, example.Contract).IBCPortID) require.NoError(t, err) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 3fdcbec483..30a063c8f3 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -11,20 +11,21 @@ import ( "strings" "time" - "github.com/cosmos/cosmos-sdk/types/address" - - wasmvm "github.com/CosmWasm/wasmvm" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/store/prefix" - "github.com/cosmos/cosmos-sdk/telemetry" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/tendermint/tendermint/libs/log" - - "github.com/CosmWasm/wasmd/x/wasm/ioutils" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/store/prefix" + storetypes "github.com/line/lbm-sdk/store/types" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/types/address" + sdkerrors "github.com/line/lbm-sdk/types/errors" + authkeeper "github.com/line/lbm-sdk/x/auth/keeper" + bankpluskeeper "github.com/line/lbm-sdk/x/bankplus/keeper" + paramtypes "github.com/line/lbm-sdk/x/params/types" + "github.com/line/ostracon/libs/log" + wasmvm "github.com/line/wasmvm" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/ioutils" + "github.com/line/wasmd/x/wasm/types" ) // contractMemoryLimit is the memory limit of each contract execution (in MiB) @@ -52,6 +53,8 @@ type WasmVMQueryHandler interface { type CoinTransferrer interface { // TransferCoins sends the coin amounts from the source to the destination with rules applied. TransferCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error + AddToInactiveAddr(ctx sdk.Context, address sdk.AccAddress) + DeleteFromInactiveAddr(ctx sdk.Context, address sdk.AccAddress) } // WasmVMResponseHandler is an extension point to handles the response data returned by a contract call. @@ -78,10 +81,11 @@ type Keeper struct { wasmVMQueryHandler WasmVMQueryHandler wasmVMResponseHandler WasmVMResponseHandler messenger Messenger + metrics *Metrics // queryGasLimit is the max wasmvm gas that can be spent on executing a query with a contract queryGasLimit uint64 paramSpace paramtypes.Subspace - gasRegister GasRegister + gasRegister WasmGasRegister maxQueryStackSize uint32 } @@ -91,7 +95,7 @@ func NewKeeper( cdc codec.Codec, storeKey sdk.StoreKey, paramSpace paramtypes.Subspace, - accountKeeper types.AccountKeeper, + accountKeeper authkeeper.AccountKeeper, bankKeeper types.BankKeeper, stakingKeeper types.StakingKeeper, distKeeper types.DistributionKeeper, @@ -104,6 +108,8 @@ func NewKeeper( homeDir string, wasmConfig types.WasmConfig, supportedFeatures string, + customEncoders *MessageEncoders, + customPlugins *QueryPlugins, opts ...Option, ) Keeper { wasmer, err := wasmvm.NewVM(filepath.Join(homeDir, "wasm"), supportedFeatures, contractMemoryLimit, wasmConfig.ContractDebugMode, wasmConfig.MemoryCacheSize) @@ -123,13 +129,14 @@ func NewKeeper( bank: NewBankCoinTransferrer(bankKeeper), portKeeper: portKeeper, capabilityKeeper: capabilityKeeper, - messenger: NewDefaultMessageHandler(router, channelKeeper, capabilityKeeper, bankKeeper, cdc, portSource), + messenger: NewDefaultMessageHandler(router, channelKeeper, capabilityKeeper, bankKeeper, cdc, portSource, customEncoders), queryGasLimit: wasmConfig.SmartQueryGasLimit, paramSpace: paramSpace, + metrics: NopMetrics(), gasRegister: NewDefaultWasmGasRegister(), maxQueryStackSize: types.DefaultMaxQueryStackSize, } - keeper.wasmVMQueryHandler = DefaultQueryPlugins(bankKeeper, stakingKeeper, distKeeper, channelKeeper, queryRouter, keeper) + keeper.wasmVMQueryHandler = DefaultQueryPlugins(bankKeeper, stakingKeeper, distKeeper, channelKeeper, queryRouter, keeper).Merge(customPlugins) for _, o := range opts { o.apply(keeper) } @@ -150,6 +157,66 @@ func (k Keeper) getInstantiateAccessConfig(ctx sdk.Context) types.AccessType { return a } +func (k Keeper) getGasMultiplier(ctx sdk.Context) GasMultiplier { + var a uint64 + k.paramSpace.Get(ctx, types.ParamStoreKeyGasMultiplier, &a) + return NewGasMultiplier(a) +} + +func (k Keeper) getInstanceCost(ctx sdk.Context) uint64 { + var a uint64 + k.paramSpace.Get(ctx, types.ParamStoreKeyInstanceCost, &a) + return a +} + +// NewContractInstanceCosts costs to crate a new contract instance from code +func (k Keeper) newContractInstanceCosts(g WasmGasRegister, ctx sdk.Context, pinned bool, msgLen int) storetypes.Gas { + return k.instantiateContractCosts(g, ctx, pinned, msgLen) +} + +// InstantiateContractCosts costs when interacting with a wasm contract +func (k Keeper) instantiateContractCosts(g WasmGasRegister, ctx sdk.Context, pinned bool, msgLen int) sdk.Gas { + if msgLen < 0 { + panic(sdkerrors.Wrap(types.ErrInvalid, "negative length")) + } + dataCosts := sdk.Gas(msgLen) * g.c.ContractMessageDataCost + if pinned { + return dataCosts + } + return k.getInstanceCost(ctx) + dataCosts +} + +// ReplyCosts costs to to handle a message reply +func (k Keeper) replyCosts(g WasmGasRegister, ctx sdk.Context, pinned bool, reply wasmvmtypes.Reply) sdk.Gas { + var eventGas sdk.Gas + msgLen := len(reply.Result.Err) + if reply.Result.Ok != nil { + msgLen += len(reply.Result.Ok.Data) + var attrs []wasmvmtypes.EventAttribute + for _, e := range reply.Result.Ok.Events { + eventGas += sdk.Gas(len(e.Type)) * g.c.EventAttributeDataCost + attrs = append(attrs, e.Attributes...) + } + // apply free tier on the whole set not per event + eventGas += g.EventCosts(attrs, nil) + } + return eventGas + k.instantiateContractCosts(g, ctx, pinned, msgLen) +} + +func (k Keeper) getCompileCost(ctx sdk.Context) uint64 { + var a uint64 + k.paramSpace.Get(ctx, types.ParamStoreKeyCompileCost, &a) + return a +} + +// CompileCosts costs to persist and "compile" a new wasm contract +func (k Keeper) compileCosts(ctx sdk.Context, byteLength int) storetypes.Gas { + if byteLength < 0 { + panic(sdkerrors.Wrap(types.ErrInvalid, "negative length")) + } + return k.getCompileCost(ctx) * uint64(byteLength) +} + // GetParams returns the total set of wasm parameters. func (k Keeper) GetParams(ctx sdk.Context) types.Params { var params types.Params @@ -163,7 +230,7 @@ func (k Keeper) SetParams(ctx sdk.Context, ps types.Params) { func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *types.AccessConfig, authZ AuthorizationPolicy) (codeID uint64, err error) { if creator == nil { - return 0, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "cannot be nil") + return 0, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "cannot be empty") } if !authZ.CanCreateCode(k.getUploadAccessConfig(ctx), creator) { @@ -182,7 +249,7 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, if err != nil { return 0, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) } - ctx.GasMeter().ConsumeGas(k.gasRegister.CompileCosts(len(wasmCode)), "Compiling WASM Bytecode") + ctx.GasMeter().ConsumeGas(k.compileCosts(ctx, len(wasmCode)), "Compiling WASM Bytecode") checksum, err := k.wasmVM.Create(wasmCode) if err != nil { @@ -239,9 +306,9 @@ func (k Keeper) importCode(ctx sdk.Context, codeID uint64, codeInfo types.CodeIn } func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins, authZ AuthorizationPolicy) (sdk.AccAddress, []byte, error) { - defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "instantiate") + defer func(begin time.Time) { k.metrics.InstantiateElapsedTimes.Observe(time.Since(begin).Seconds()) }(time.Now()) - instanceCosts := k.gasRegister.NewContractInstanceCosts(k.IsPinnedCode(ctx, codeID), len(initMsg)) + instanceCosts := k.newContractInstanceCosts(k.gasRegister, ctx, k.IsPinnedCode(ctx, codeID), len(initMsg)) ctx.GasMeter().ConsumeGas(instanceCosts, "Loading CosmWasm module: instantiate") // create contract address @@ -284,13 +351,14 @@ func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.A // 0x03 | BuildContractAddress (sdk.AccAddress) prefixStoreKey := types.GetContractStorePrefix(contractAddress) prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), prefixStoreKey) + wasmStore := types.NewWasmStore(prefixStore) // prepare querier querier := k.newQueryHandler(ctx, contractAddress) // instantiate wasm contract gas := k.runtimeGasForContract(ctx) - res, gasUsed, err := k.wasmVM.Instantiate(codeInfo.CodeHash, env, info, initMsg, prefixStore, cosmwasmAPI, querier, k.gasMeter(ctx), gas, costJSONDeserialization) + res, gasUsed, err := k.wasmVM.Instantiate(codeInfo.CodeHash, env, info, initMsg, wasmStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) if err != nil { return nil, nil, sdkerrors.Wrap(types.ErrInstantiateFailed, err.Error()) @@ -336,13 +404,16 @@ func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.A // Execute executes the contract instance func (k Keeper) execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) ([]byte, error) { - defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "execute") + defer func(begin time.Time) { k.metrics.ExecuteElapsedTimes.Observe(time.Since(begin).Seconds()) }(time.Now()) contractInfo, codeInfo, prefixStore, err := k.contractInstance(ctx, contractAddress) if err != nil { return nil, err } + if k.IsInactiveContract(ctx, contractAddress) { + return nil, sdkerrors.Wrap(types.ErrInactiveContract, "can not execute") + } - executeCosts := k.gasRegister.InstantiateContractCosts(k.IsPinnedCode(ctx, contractInfo.CodeID), len(msg)) + executeCosts := k.instantiateContractCosts(k.gasRegister, ctx, k.IsPinnedCode(ctx, contractInfo.CodeID), len(msg)) ctx.GasMeter().ConsumeGas(executeCosts, "Loading CosmWasm module: execute") // add more funds @@ -358,7 +429,8 @@ func (k Keeper) execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller // prepare querier querier := k.newQueryHandler(ctx, contractAddress) gas := k.runtimeGasForContract(ctx) - res, gasUsed, execErr := k.wasmVM.Execute(codeInfo.CodeHash, env, info, msg, prefixStore, cosmwasmAPI, querier, k.gasMeter(ctx), gas, costJSONDeserialization) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmVM.Execute(codeInfo.CodeHash, env, info, msg, wasmStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) if execErr != nil { return nil, sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -378,14 +450,17 @@ func (k Keeper) execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller } func (k Keeper) migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte, authZ AuthorizationPolicy) ([]byte, error) { - defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "migrate") - migrateSetupCosts := k.gasRegister.InstantiateContractCosts(k.IsPinnedCode(ctx, newCodeID), len(msg)) + defer func(begin time.Time) { k.metrics.MigrateElapsedTimes.Observe(time.Since(begin).Seconds()) }(time.Now()) + migrateSetupCosts := k.instantiateContractCosts(k.gasRegister, ctx, k.IsPinnedCode(ctx, newCodeID), len(msg)) ctx.GasMeter().ConsumeGas(migrateSetupCosts, "Loading CosmWasm module: migrate") contractInfo := k.GetContractInfo(ctx, contractAddress) if contractInfo == nil { return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "unknown contract") } + if k.IsInactiveContract(ctx, contractAddress) { + return nil, sdkerrors.Wrap(types.ErrInactiveContract, "can not migrate") + } if !authZ.CanModifyContract(contractInfo.AdminAddr(), caller) { return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "can not migrate") } @@ -419,7 +494,8 @@ func (k Keeper) migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller prefixStoreKey := types.GetContractStorePrefix(contractAddress) prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), prefixStoreKey) gas := k.runtimeGasForContract(ctx) - res, gasUsed, err := k.wasmVM.Migrate(newCodeInfo.CodeHash, env, msg, &prefixStore, cosmwasmAPI, &querier, k.gasMeter(ctx), gas, costJSONDeserialization) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, err := k.wasmVM.Migrate(newCodeInfo.CodeHash, env, msg, &wasmStore, k.cosmwasmAPI(ctx), &querier, k.gasMeter(ctx), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) if err != nil { return nil, sdkerrors.Wrap(types.ErrMigrationFailed, err.Error()) @@ -451,21 +527,22 @@ func (k Keeper) migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller // another native Go module directly, or on-chain governance (if sudo proposals are enabled). Thus, the keeper doesn't // place any access controls on it, that is the responsibility or the app developer (who passes the wasm.Keeper in app.go) func (k Keeper) Sudo(ctx sdk.Context, contractAddress sdk.AccAddress, msg []byte) ([]byte, error) { - defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "sudo") + defer func(begin time.Time) { k.metrics.SudoElapsedTimes.Observe(time.Since(begin).Seconds()) }(time.Now()) contractInfo, codeInfo, prefixStore, err := k.contractInstance(ctx, contractAddress) if err != nil { return nil, err } - sudoSetupCosts := k.gasRegister.InstantiateContractCosts(k.IsPinnedCode(ctx, contractInfo.CodeID), len(msg)) + sudoSetupCosts := k.instantiateContractCosts(k.gasRegister, ctx, k.IsPinnedCode(ctx, contractInfo.CodeID), len(msg)) ctx.GasMeter().ConsumeGas(sudoSetupCosts, "Loading CosmWasm module: sudo") env := types.NewEnv(ctx, contractAddress) // prepare querier querier := k.newQueryHandler(ctx, contractAddress) + wasmStore := types.NewWasmStore(prefixStore) gas := k.runtimeGasForContract(ctx) - res, gasUsed, execErr := k.wasmVM.Sudo(codeInfo.CodeHash, env, msg, prefixStore, cosmwasmAPI, querier, k.gasMeter(ctx), gas, costJSONDeserialization) + res, gasUsed, execErr := k.wasmVM.Sudo(codeInfo.CodeHash, env, msg, wasmStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) if execErr != nil { return nil, sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -492,7 +569,7 @@ func (k Keeper) reply(ctx sdk.Context, contractAddress sdk.AccAddress, reply was } // always consider this pinned - replyCosts := k.gasRegister.ReplyCosts(true, reply) + replyCosts := k.replyCosts(k.gasRegister, ctx, true, reply) ctx.GasMeter().ConsumeGas(replyCosts, "Loading CosmWasm module: reply") env := types.NewEnv(ctx, contractAddress) @@ -500,7 +577,8 @@ func (k Keeper) reply(ctx sdk.Context, contractAddress sdk.AccAddress, reply was // prepare querier querier := k.newQueryHandler(ctx, contractAddress) gas := k.runtimeGasForContract(ctx) - res, gasUsed, execErr := k.wasmVM.Reply(codeInfo.CodeHash, env, reply, prefixStore, cosmwasmAPI, querier, k.gasMeter(ctx), gas, costJSONDeserialization) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmVM.Reply(codeInfo.CodeHash, env, reply, wasmStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) if execErr != nil { return nil, sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -549,6 +627,9 @@ func (k Keeper) setContractAdmin(ctx sdk.Context, contractAddress, caller, newAd if contractInfo == nil { return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "unknown contract") } + if k.IsInactiveContract(ctx, contractAddress) { + return sdkerrors.Wrap(types.ErrInactiveContract, "can not modify contract") + } if !authZ.CanModifyContract(contractInfo.AdminAddr(), caller) { return sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "can not modify contract") } @@ -569,10 +650,10 @@ func (k Keeper) appendToContractHistory(ctx sdk.Context, contractAddr sdk.AccAdd pos = sdk.BigEndianToUint64(iter.Value()) } // then store with incrementing position - for _, e := range newEntries { + for i := range newEntries { pos++ key := types.GetContractCodeHistoryElementKey(contractAddr, pos) - store.Set(key, k.cdc.MustMarshal(&e)) //nolint:gosec + store.Set(key, k.cdc.MustMarshal(&newEntries[i])) //nolint:gosec } } @@ -607,7 +688,7 @@ func (k Keeper) getLastContractHistoryEntry(ctx sdk.Context, contractAddr sdk.Ac // QuerySmart queries the smart contract itself. func (k Keeper) QuerySmart(ctx sdk.Context, contractAddr sdk.AccAddress, req []byte) ([]byte, error) { - defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "query-smart") + defer func(begin time.Time) { k.metrics.QuerySmartElapsedTimes.Observe(time.Since(begin).Seconds()) }(time.Now()) // checks and increase query stack size ctx, err := checkAndIncreaseQueryStackSize(ctx, k.maxQueryStackSize) @@ -620,14 +701,15 @@ func (k Keeper) QuerySmart(ctx sdk.Context, contractAddr sdk.AccAddress, req []b return nil, err } - smartQuerySetupCosts := k.gasRegister.InstantiateContractCosts(k.IsPinnedCode(ctx, contractInfo.CodeID), len(req)) + smartQuerySetupCosts := k.instantiateContractCosts(k.gasRegister, ctx, k.IsPinnedCode(ctx, contractInfo.CodeID), len(req)) ctx.GasMeter().ConsumeGas(smartQuerySetupCosts, "Loading CosmWasm module: query") // prepare querier querier := k.newQueryHandler(ctx, contractAddr) env := types.NewEnv(ctx, contractAddr) - queryResult, gasUsed, qErr := k.wasmVM.Query(codeInfo.CodeHash, env, req, prefixStore, cosmwasmAPI, querier, k.gasMeter(ctx), k.runtimeGasForContract(ctx), costJSONDeserialization) + wasmStore := types.NewWasmStore(prefixStore) + queryResult, gasUsed, qErr := k.wasmVM.Query(codeInfo.CodeHash, env, req, wasmStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), k.runtimeGasForContract(ctx), costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) if qErr != nil { return nil, sdkerrors.Wrap(types.ErrQueryFailed, qErr.Error()) @@ -661,7 +743,7 @@ func checkAndIncreaseQueryStackSize(ctx sdk.Context, maxQueryStackSize uint32) ( // QueryRaw returns the contract's state for give key. Returns `nil` when key is `nil`. func (k Keeper) QueryRaw(ctx sdk.Context, contractAddress sdk.AccAddress, key []byte) []byte { - defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "query-raw") + defer func(begin time.Time) { k.metrics.QueryRawElapsedTimes.Observe(time.Since(begin).Seconds()) }(time.Now()) if key == nil { return nil } @@ -794,7 +876,7 @@ func (k Keeper) GetByteCode(ctx sdk.Context, codeID uint64) ([]byte, error) { var codeInfo types.CodeInfo codeInfoBz := store.Get(types.GetCodeKey(codeID)) if codeInfoBz == nil { - return nil, nil + return nil, types.ErrNotFound } k.cdc.MustUnmarshal(codeInfoBz, &codeInfo) return k.wasmVM.GetCode(codeInfo.CodeHash) @@ -924,14 +1006,16 @@ func (k Keeper) runtimeGasForContract(ctx sdk.Context) uint64 { if meter.IsOutOfGas() { return 0 } + if meter.Limit() == 0 { // infinite gas meter with limit=0 and not out of gas return math.MaxUint64 } - return k.gasRegister.ToWasmVMGas(meter.Limit() - meter.GasConsumedToLimit()) + + return k.getGasMultiplier(ctx).ToWasmVMGas(meter.Limit() - meter.GasConsumedToLimit()) } func (k Keeper) consumeRuntimeGas(ctx sdk.Context, gas uint64) { - consumed := k.gasRegister.FromWasmVMGas(gas) + consumed := k.getGasMultiplier(ctx).FromWasmVMGas(gas) ctx.GasMeter().ConsumeGas(consumed, "wasm contract") // throw OutOfGas error if we ran out (got exactly to zero due to better limit enforcing) if ctx.GasMeter().IsOutOfGas() { @@ -1002,27 +1086,53 @@ func (k Keeper) importContract(ctx sdk.Context, contractAddr sdk.AccAddress, c * } func (k Keeper) newQueryHandler(ctx sdk.Context, contractAddress sdk.AccAddress) QueryHandler { - return NewQueryHandler(ctx, k.wasmVMQueryHandler, contractAddress, k.gasRegister) + return NewQueryHandler(ctx, k.wasmVMQueryHandler, contractAddress, k.getGasMultiplier(ctx)) +} + +type GasMultiplier struct { + multiplier uint64 +} + +func NewGasMultiplier(multiplier uint64) GasMultiplier { + if multiplier == 0 { + panic(sdkerrors.Wrap(sdkerrors.ErrLogic, "GasMultiplier can not be 0")) + } + + return GasMultiplier{multiplier: multiplier} +} + +// ToWasmVMGas convert to wasmVM contract runtime gas unit +func (m GasMultiplier) ToWasmVMGas(source storetypes.Gas) uint64 { + x := source * m.multiplier + if x < source { + panic(sdk.ErrorOutOfGas{Descriptor: "overflow"}) + } + return x +} + +// FromWasmVMGas converts to SDK gas unit +func (m GasMultiplier) FromWasmVMGas(source uint64) sdk.Gas { + return source / m.multiplier } // MultipliedGasMeter wraps the GasMeter from context and multiplies all reads by out defined multiplier type MultipliedGasMeter struct { originalMeter sdk.GasMeter - GasRegister GasRegister + GasMultiplier GasMultiplier } -func NewMultipliedGasMeter(originalMeter sdk.GasMeter, gr GasRegister) MultipliedGasMeter { - return MultipliedGasMeter{originalMeter: originalMeter, GasRegister: gr} +func NewMultipliedGasMeter(originalMeter sdk.GasMeter, m GasMultiplier) MultipliedGasMeter { + return MultipliedGasMeter{originalMeter: originalMeter, GasMultiplier: m} } var _ wasmvm.GasMeter = MultipliedGasMeter{} func (m MultipliedGasMeter) GasConsumed() sdk.Gas { - return m.GasRegister.ToWasmVMGas(m.originalMeter.GasConsumed()) + return m.GasMultiplier.ToWasmVMGas(m.originalMeter.GasConsumed()) } func (k Keeper) gasMeter(ctx sdk.Context) MultipliedGasMeter { - return NewMultipliedGasMeter(ctx.GasMeter(), k.gasRegister) + return NewMultipliedGasMeter(ctx.GasMeter(), k.getGasMultiplier(ctx)) } // Logger returns a module-specific logger. @@ -1035,7 +1145,7 @@ func moduleLogger(ctx sdk.Context) log.Logger { } // Querier creates a new grpc querier instance -func Querier(k *Keeper) *grpcQuerier { //nolint:revive +func Querier(k *Keeper) *GrpcQuerier { //nolint:revive return NewGrpcQuerier(k.cdc, k.storeKey, k, k.queryGasLimit) } @@ -1045,14 +1155,16 @@ func (k Keeper) QueryGasLimit() sdk.Gas { } // BankCoinTransferrer replicates the cosmos-sdk behaviour as in -// https://github.com/cosmos/cosmos-sdk/blob/v0.41.4/x/bank/keeper/msg_server.go#L26 +// lbm-sdk's x/bank/keeper/msg_server.go Send +// (https://github.com/line/lbm-sdk/blob/2a5a2d2c885b03e278bcd67546d4f21e74614ead/x/bank/keeper/msg_server.go#L26) type BankCoinTransferrer struct { - keeper types.BankKeeper + keeper bankpluskeeper.Keeper } func NewBankCoinTransferrer(keeper types.BankKeeper) BankCoinTransferrer { + bankPlusKeeper := keeper.(bankpluskeeper.Keeper) return BankCoinTransferrer{ - keeper: keeper, + keeper: bankPlusKeeper, } } @@ -1081,6 +1193,14 @@ func (c BankCoinTransferrer) TransferCoins(parentCtx sdk.Context, fromAddr sdk.A return nil } +func (c BankCoinTransferrer) AddToInactiveAddr(ctx sdk.Context, address sdk.AccAddress) { + c.keeper.AddToInactiveAddr(ctx, address) +} + +func (c BankCoinTransferrer) DeleteFromInactiveAddr(ctx sdk.Context, address sdk.AccAddress) { + c.keeper.DeleteFromInactiveAddr(ctx, address) +} + type msgDispatcher interface { DispatchSubmessages(ctx sdk.Context, contractAddr sdk.AccAddress, ibcPort string, msgs []wasmvmtypes.SubMsg) ([]byte, error) } diff --git a/x/wasm/keeper/keeper_extension.go b/x/wasm/keeper/keeper_extension.go new file mode 100644 index 0000000000..73a0ba7306 --- /dev/null +++ b/x/wasm/keeper/keeper_extension.go @@ -0,0 +1,67 @@ +package keeper + +import ( + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + + wasmtypes "github.com/line/wasmd/x/wasm/types" +) + +func (k Keeper) IsInactiveContract(ctx sdk.Context, contractAddress sdk.AccAddress) bool { + store := ctx.KVStore(k.storeKey) + return store.Has(wasmtypes.GetInactiveContractKey(contractAddress)) +} + +func (k Keeper) IterateInactiveContracts(ctx sdk.Context, fn func(contractAddress sdk.AccAddress) (stop bool)) { + store := ctx.KVStore(k.storeKey) + prefix := wasmtypes.InactiveContractPrefix + iterator := sdk.KVStorePrefixIterator(store, prefix) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + contractAddress := sdk.AccAddress(iterator.Value()) + if stop := fn(contractAddress); stop { + break + } + } +} + +func (k Keeper) addInactiveContract(ctx sdk.Context, contractAddress sdk.AccAddress) { + store := ctx.KVStore(k.storeKey) + key := wasmtypes.GetInactiveContractKey(contractAddress) + + store.Set(key, contractAddress) +} + +func (k Keeper) deleteInactiveContract(ctx sdk.Context, contractAddress sdk.AccAddress) { + store := ctx.KVStore(k.storeKey) + key := wasmtypes.GetInactiveContractKey(contractAddress) + store.Delete(key) +} + +// activateContract delete the contract address from inactivateContract list if the contract is deactivated. +func (k Keeper) activateContract(ctx sdk.Context, contractAddress sdk.AccAddress) error { + if !k.IsInactiveContract(ctx, contractAddress) { + return sdkerrors.Wrapf(wasmtypes.ErrNotFound, "no inactivate contract %s", contractAddress.String()) + } + + k.deleteInactiveContract(ctx, contractAddress) + k.bank.DeleteFromInactiveAddr(ctx, contractAddress) + + return nil +} + +// deactivateContract add the contract address to inactivateContract list. +func (k Keeper) deactivateContract(ctx sdk.Context, contractAddress sdk.AccAddress) error { + if k.IsInactiveContract(ctx, contractAddress) { + return sdkerrors.Wrapf(wasmtypes.ErrAccountExists, "already inactivate contract %s", contractAddress.String()) + } + if !k.HasContractInfo(ctx, contractAddress) { + return sdkerrors.Wrapf(wasmtypes.ErrInvalid, "no contract %s", contractAddress.String()) + } + + k.addInactiveContract(ctx, contractAddress) + k.bank.AddToInactiveAddr(ctx, contractAddress) + + return nil +} diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index bb20a39267..375d5bd899 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -4,34 +4,32 @@ import ( "bytes" "encoding/json" "errors" - "io/ioutil" + "fmt" "math" + "os" "testing" "time" - distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - - wasmvm "github.com/CosmWasm/wasmvm" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - - stypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - "github.com/CosmWasm/wasmd/x/wasm/types" + stypes "github.com/line/lbm-sdk/store/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + authtypes "github.com/line/lbm-sdk/x/auth/types" + banktypes "github.com/line/lbm-sdk/x/bank/types" + distributiontypes "github.com/line/lbm-sdk/x/distribution/types" + ocproto "github.com/line/ostracon/proto/ostracon/types" + wasmvm "github.com/line/wasmvm" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + "github.com/line/wasmd/x/wasm/types" ) // When migrated to go 1.16, embed package should be used instead. func init() { - b, err := ioutil.ReadFile("./testdata/hackatom.wasm") + b, err := os.ReadFile("./testdata/hackatom.wasm") if err != nil { panic(err) } @@ -43,12 +41,12 @@ var hackatomWasm []byte const SupportedFeatures = "iterator,staking,stargate" func TestNewKeeper(t *testing.T) { - _, keepers := CreateTestInput(t, false, SupportedFeatures) + _, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) require.NotNil(t, keepers.ContractKeeper) } func TestCreateSuccess(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -68,14 +66,14 @@ func TestCreateSuccess(t *testing.T) { } func TestCreateNilCreatorAddress(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) _, err := keepers.ContractKeeper.Create(ctx, nil, hackatomWasm, nil) require.Error(t, err, "nil creator is not allowed") } func TestCreateNilWasmCode(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) @@ -84,7 +82,7 @@ func TestCreateNilWasmCode(t *testing.T) { } func TestCreateInvalidWasmCode(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) @@ -121,11 +119,14 @@ func TestCreateStoresInstantiatePermission(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper keepers.WasmKeeper.SetParams(ctx, types.Params{ CodeUploadAccess: types.AllowEverybody, InstantiateDefaultPermission: spec.srcPermission, + GasMultiplier: types.DefaultGasMultiplier, + InstanceCost: types.DefaultInstanceCost, + CompileCost: types.DefaultCompileCost, }) fundAccounts(t, ctx, accKeeper, bankKeeper, myAddr, deposit) @@ -140,7 +141,7 @@ func TestCreateStoresInstantiatePermission(t *testing.T) { } func TestCreateWithParamPermissions(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -186,7 +187,7 @@ func TestCreateWithParamPermissions(t *testing.T) { // ensure that the user cannot set the code instantiate permission to something more permissive // than the default func TestEnforceValidPermissionsOnCreate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper contractKeeper := keepers.ContractKeeper @@ -262,7 +263,7 @@ func TestEnforceValidPermissionsOnCreate(t *testing.T) { } func TestCreateDuplicate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -288,9 +289,9 @@ func TestCreateDuplicate(t *testing.T) { } func TestCreateWithSimulation(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) - ctx = ctx.WithBlockHeader(tmproto.Header{Height: 1}). + ctx = ctx.WithBlockHeader(ocproto.Header{Height: 1}). WithGasMeter(stypes.NewInfiniteGasMeter()) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -302,7 +303,7 @@ func TestCreateWithSimulation(t *testing.T) { require.Equal(t, uint64(1), contractID) // then try to create it in non-simulation mode (should not fail) - ctx, keepers = CreateTestInput(t, false, SupportedFeatures) + ctx, keepers = CreateTestInput(t, false, SupportedFeatures, nil, nil) ctx = ctx.WithGasMeter(sdk.NewGasMeter(10_000_000)) creator = keepers.Faucet.NewFundedAccount(ctx, deposit...) contractID, err = keepers.ContractKeeper.Create(ctx, creator, hackatomWasm, nil) @@ -322,15 +323,15 @@ func TestIsSimulationMode(t *testing.T) { exp bool }{ "genesis block": { - ctx: sdk.Context{}.WithBlockHeader(tmproto.Header{}).WithGasMeter(stypes.NewInfiniteGasMeter()), + ctx: sdk.Context{}.WithBlockHeader(ocproto.Header{}).WithGasMeter(stypes.NewInfiniteGasMeter()), exp: false, }, "any regular block": { - ctx: sdk.Context{}.WithBlockHeader(tmproto.Header{Height: 1}).WithGasMeter(stypes.NewGasMeter(10000000)), + ctx: sdk.Context{}.WithBlockHeader(ocproto.Header{Height: 1}).WithGasMeter(stypes.NewGasMeter(10000000)), exp: false, }, "simulation": { - ctx: sdk.Context{}.WithBlockHeader(tmproto.Header{Height: 1}).WithGasMeter(stypes.NewInfiniteGasMeter()), + ctx: sdk.Context{}.WithBlockHeader(ocproto.Header{Height: 1}).WithGasMeter(stypes.NewInfiniteGasMeter()), exp: true, }, } @@ -342,13 +343,13 @@ func TestIsSimulationMode(t *testing.T) { } func TestCreateWithGzippedPayload(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm.gzip") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm.gzip") require.NoError(t, err, "reading gzipped WASM code") contractID, err := keeper.Create(ctx, creator, wasmCode, nil) @@ -361,7 +362,7 @@ func TestCreateWithGzippedPayload(t *testing.T) { } func TestInstantiate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -386,11 +387,11 @@ func TestInstantiate(t *testing.T) { // create with no balance is also legal gotContractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx.WithEventManager(em), codeID, creator, nil, initMsgBz, "demo contract 1", nil) require.NoError(t, err) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", gotContractAddr.String()) + require.Equal(t, "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8", gotContractAddr.String()) gasAfter := ctx.GasMeter().GasConsumed() if types.EnableGasVerification { - require.Equal(t, uint64(0x18db5), gasAfter-gasBefore) + require.Equal(t, uint64(0x18bfc), gasAfter-gasBefore) } // ensure it is stored properly @@ -451,7 +452,7 @@ func TestInstantiateWithDeposit(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper if spec.fundAddr { @@ -512,13 +513,14 @@ func TestInstantiateWithPermissions(t *testing.T) { srcActor: myAddr, }, "onlyAddress with non matching address": { + srcActor: myAddr, srcPermission: types.AccessTypeOnlyAddress.With(otherAddr), expError: sdkerrors.ErrUnauthorized, }, } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper fundAccounts(t, ctx, accKeeper, bankKeeper, spec.srcActor, deposit) @@ -532,7 +534,7 @@ func TestInstantiateWithPermissions(t *testing.T) { } func TestInstantiateWithNonExistingCodeID(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) @@ -548,7 +550,7 @@ func TestInstantiateWithNonExistingCodeID(t *testing.T) { } func TestInstantiateWithContractDataResponse(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) wasmerMock := &wasmtesting.MockWasmer{ InstantiateFn: func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, initMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { @@ -565,7 +567,7 @@ func TestInstantiateWithContractDataResponse(t *testing.T) { } func TestExecute(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -586,7 +588,7 @@ func TestExecute(t *testing.T) { addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) require.NoError(t, err) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", addr.String()) + require.Equal(t, "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8", addr.String()) // ensure bob doesn't exist bobAcct := accKeeper.GetAccount(ctx, bob) @@ -623,7 +625,7 @@ func TestExecute(t *testing.T) { // make sure gas is properly deducted from ctx gasAfter := ctx.GasMeter().GasConsumed() if types.EnableGasVerification { - require.Equal(t, uint64(0x17cd2), gasAfter-gasBefore) + require.Equal(t, uint64(0x16f9c), gasAfter-gasBefore) } // ensure bob now exists and got both payments released bobAcct = accKeeper.GetAccount(ctx, bob) @@ -702,7 +704,7 @@ func TestExecuteWithDeposit(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper if spec.newBankParams != nil { bankKeeper.SetParams(ctx, *spec.newBankParams) @@ -736,7 +738,7 @@ func TestExecuteWithDeposit(t *testing.T) { } func TestExecuteWithNonExistingAddress(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -749,7 +751,7 @@ func TestExecuteWithNonExistingAddress(t *testing.T) { } func TestExecuteWithPanic(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -776,11 +778,11 @@ func TestExecuteWithPanic(t *testing.T) { require.Error(t, err) require.True(t, errors.Is(err, types.ErrExecuteFailed)) // test with contains as "Display" implementation of the Wasmer "RuntimeError" is different for Mac and Linux - assert.Contains(t, err.Error(), "Error calling the VM: Error executing Wasm: Wasmer runtime error: RuntimeError: unreachable") + assert.Contains(t, err.Error(), "Error calling the VM: Error executing Wasm: Wasmer runtime error: RuntimeError: Aborted: panicked at 'This page intentionally faulted'") } func TestExecuteWithCpuLoop(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -821,7 +823,7 @@ func TestExecuteWithCpuLoop(t *testing.T) { } func TestExecuteWithStorageLoop(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -862,7 +864,7 @@ func TestExecuteWithStorageLoop(t *testing.T) { } func TestMigrate(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -1043,7 +1045,7 @@ func TestMigrate(t *testing.T) { } func TestMigrateReplacesTheSecondIndex(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) example := InstantiateHackatomExampleContract(t, ctx, keepers) // then assert a second index exists @@ -1077,14 +1079,14 @@ func TestMigrateReplacesTheSecondIndex(t *testing.T) { } func TestMigrateWithDispatchedMessage(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) fred := keepers.Faucet.NewFundedAccount(ctx, sdk.NewInt64Coin("denom", 5000)) - burnerCode, err := ioutil.ReadFile("./testdata/burner.wasm") + burnerCode, err := os.ReadFile("./testdata/burner.wasm") require.NoError(t, err) originalContractID, err := keeper.Create(ctx, creator, hackatomWasm, nil) @@ -1162,7 +1164,7 @@ func TestMigrateWithDispatchedMessage(t *testing.T) { } func TestIterateContractsByCode(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) k, c := keepers.WasmKeeper, keepers.ContractKeeper example1 := InstantiateHackatomExampleContract(t, ctx, keepers) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) @@ -1208,7 +1210,7 @@ func TestIterateContractsByCodeWithMigration(t *testing.T) { return &wasmvmtypes.Response{}, 1, nil }} wasmtesting.MakeInstantiable(&mockWasmVM) - ctx, keepers := CreateTestInput(t, false, SupportedFeatures, WithWasmEngine(&mockWasmVM)) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil, WithWasmEngine(&mockWasmVM)) k, c := keepers.WasmKeeper, keepers.ContractKeeper example1 := InstantiateHackatomExampleContract(t, ctx, keepers) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) @@ -1247,7 +1249,7 @@ type stealFundsMsg struct { } func TestSudo(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -1266,7 +1268,7 @@ func TestSudo(t *testing.T) { require.NoError(t, err) addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) require.NoError(t, err) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", addr.String()) + require.Equal(t, "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8", addr.String()) // the community is broke _, _, community := keyPubAddr() @@ -1330,7 +1332,7 @@ func mustMarshal(t *testing.T, r interface{}) []byte { } func TestUpdateContractAdmin(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -1398,7 +1400,7 @@ func TestUpdateContractAdmin(t *testing.T) { } func TestClearContractAdmin(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -1460,8 +1462,36 @@ func TestClearContractAdmin(t *testing.T) { } } +func TestExecuteManualInactiveContractFailure(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) + keeper := keepers.ContractKeeper + + deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) + topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) + creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + fred := keepers.Faucet.NewFundedAccount(ctx, topUp...) + + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") + require.NoError(t, err) + + contractID, err := keeper.Create(ctx, creator, wasmCode, nil) + require.NoError(t, err) + + _, _, bob := keyPubAddr() + initMsg := HackatomExampleInitMsg{ + Verifier: fred, + Beneficiary: bob, + } + initMsgBz, err := json.Marshal(initMsg) + require.NoError(t, err) + + addr, _, err := keeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) + require.NoError(t, err) + require.Equal(t, "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8", addr.String()) +} + func TestPinCode(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) k := keepers.WasmKeeper var capturedChecksums []wasmvm.Checksum @@ -1488,7 +1518,7 @@ func TestPinCode(t *testing.T) { } func TestUnpinCode(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) k := keepers.WasmKeeper var capturedChecksums []wasmvm.Checksum @@ -1522,7 +1552,7 @@ func TestUnpinCode(t *testing.T) { } func TestInitializePinnedCodes(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) k := keepers.WasmKeeper var capturedChecksums []wasmvm.Checksum @@ -1562,7 +1592,7 @@ func TestPinnedContractLoops(t *testing.T) { // a pinned contract that calls itself via submessages should terminate with an // error at some point - ctx, keepers := CreateTestInput(t, false, SupportedFeatures, WithWasmEngine(&mock)) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil, WithWasmEngine(&mock)) k := keepers.WasmKeeper example := SeedNewContractInstance(t, ctx, keepers, &mock) @@ -1588,7 +1618,7 @@ func TestPinnedContractLoops(t *testing.T) { }, }, 0, nil } - ctx = ctx.WithGasMeter(sdk.NewGasMeter(20000)) + ctx = ctx.WithGasMeter(sdk.NewGasMeter(21000)) require.PanicsWithValue(t, sdk.ErrorOutOfGas{Descriptor: "ReadFlat"}, func() { _, err := k.execute(ctx, example.Contract, RandomAccountAddress(t), anyMsg, nil) require.NoError(t, err) @@ -1658,7 +1688,9 @@ func TestNewDefaultWasmVMContractResponseHandler(t *testing.T) { } for name, spec := range specs { t.Run(name, func(t *testing.T) { - var msgs []wasmvmtypes.SubMsg + var ( + msgs []wasmvmtypes.SubMsg + ) var mock wasmtesting.MockMsgDispatcher spec.setup(&mock) d := NewDefaultWasmVMContractResponseHandler(&mock) @@ -1678,7 +1710,7 @@ func TestNewDefaultWasmVMContractResponseHandler(t *testing.T) { } func TestReply(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) k := keepers.WasmKeeper var mock wasmtesting.MockWasmer wasmtesting.MakeInstantiable(&mock) @@ -1703,7 +1735,7 @@ func TestReply(t *testing.T) { Bank: &wasmvmtypes.BankQuery{ Balance: &wasmvmtypes.BalanceQuery{Address: env.Contract.Address, Denom: "stake"}, }, - }, 10_000*DefaultGasMultiplier) + }, 1_000_000*types.DefaultGasMultiplier) require.NoError(t, err) var gotBankRsp wasmvmtypes.BalanceResponse require.NoError(t, json.Unmarshal(bzRsp, &gotBankRsp)) @@ -1747,7 +1779,7 @@ func TestReply(t *testing.T) { } func TestQueryIsolation(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) k := keepers.WasmKeeper var mock wasmtesting.MockWasmer wasmtesting.MakeInstantiable(&mock) @@ -1767,7 +1799,7 @@ func TestQueryIsolation(t *testing.T) { mock.ReplyFn = func(codeID wasmvm.Checksum, env wasmvmtypes.Env, reply wasmvmtypes.Reply, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { _, err := querier.Query(wasmvmtypes.QueryRequest{ Custom: []byte(`{}`), - }, 10000*DefaultGasMultiplier) + }, 1_000_000*types.DefaultGasMultiplier) require.NoError(t, err) return &wasmvmtypes.Response{}, 0, nil } @@ -1786,12 +1818,12 @@ func TestBuildContractAddress(t *testing.T) { "initial contract": { srcCodeID: 1, srcInstanceID: 1, - expectedAddr: "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", + expectedAddr: "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8", }, "demo value": { srcCodeID: 1, srcInstanceID: 100, - expectedAddr: "cosmos1mujpjkwhut9yjw4xueyugc02evfv46y0dtmnz4lh8xxkkdapym9stu5qm8", + expectedAddr: "link1mujpjkwhut9yjw4xueyugc02evfv46y0dtmnz4lh8xxkkdapym9skz93hr", }, "both below max": { srcCodeID: math.MaxUint32 - 1, @@ -1804,12 +1836,12 @@ func TestBuildContractAddress(t *testing.T) { "codeID > max u32": { srcCodeID: math.MaxUint32 + 1, srcInstanceID: 17, - expectedAddr: "cosmos1673hrexz4h6s0ft04l96ygq667djzh2nsr335kstjp49x5dk6rpsf5t0le", + expectedAddr: "link1673hrexz4h6s0ft04l96ygq667djzh2nsr335kstjp49x5dk6rps5267na", }, "instanceID > max u32": { srcCodeID: 22, srcInstanceID: math.MaxUint32 + 1, - expectedAddr: "cosmos10q3pgfvmeyy0veekgtqhxujxkhz0vm9zmalqgc7evrhj68q3l62qrdfg4m", + expectedAddr: "link10q3pgfvmeyy0veekgtqhxujxkhz0vm9zmalqgc7evrhj68q3l62q7nceel", }, } for name, spec := range specs { @@ -1823,3 +1855,114 @@ func TestBuildContractAddress(t *testing.T) { }) } } + +func TestActivateContract(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) + + k := keepers.WasmKeeper + var mock wasmtesting.MockWasmer + wasmtesting.MakeInstantiable(&mock) + example := SeedNewContractInstance(t, ctx, keepers, &mock) + em := sdk.NewEventManager() + + // request no contract address -> fail + err := k.activateContract(ctx, example.CreatorAddr) + require.Error(t, err, fmt.Sprintf("no contract %s", example.CreatorAddr)) + + // try to activate an activated contract -> fail + err = k.activateContract(ctx.WithEventManager(em), example.Contract) + require.Error(t, err, fmt.Sprintf("no inactivate contract %s", example.Contract)) + + // add to inactive contract + err = k.deactivateContract(ctx, example.Contract) + require.NoError(t, err) + + // try to activate an inactivated contract -> success + err = k.activateContract(ctx, example.Contract) + require.NoError(t, err) +} + +func TestDeactivateContract(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) + + k := keepers.WasmKeeper + var mock wasmtesting.MockWasmer + wasmtesting.MakeInstantiable(&mock) + example := SeedNewContractInstance(t, ctx, keepers, &mock) + em := sdk.NewEventManager() + + // request no contract address -> fail + err := k.deactivateContract(ctx, example.CreatorAddr) + require.Error(t, err, fmt.Sprintf("no contract %s", example.CreatorAddr)) + + // success case + err = k.deactivateContract(ctx, example.Contract) + require.NoError(t, err) + + // already inactivate contract -> fail + err = k.deactivateContract(ctx.WithEventManager(em), example.Contract) + require.Error(t, err, fmt.Sprintf("already inactivate contract %s", example.Contract)) +} + +func TestIterateInactiveContracts(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) + k := keepers.WasmKeeper + + var mock wasmtesting.MockWasmer + wasmtesting.MakeInstantiable(&mock) + example1 := SeedNewContractInstance(t, ctx, keepers, &mock) + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + example2 := SeedNewContractInstance(t, ctx, keepers, &mock) + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + + err := k.deactivateContract(ctx, example1.Contract) + require.NoError(t, err) + err = k.deactivateContract(ctx, example2.Contract) + require.NoError(t, err) + + var inactiveContracts []sdk.AccAddress + k.IterateInactiveContracts(ctx, func(contractAddress sdk.AccAddress) (stop bool) { + inactiveContracts = append(inactiveContracts, contractAddress) + return false + }) + assert.Equal(t, 2, len(inactiveContracts)) + expectList := []sdk.AccAddress{example1.Contract, example2.Contract} + assert.ElementsMatch(t, expectList, inactiveContracts) +} + +func TestKeeper_GetByteCode(t *testing.T) { + + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) + keeper := keepers.ContractKeeper + + deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) + creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) + + em := sdk.NewEventManager() + _, err := keeper.Create(ctx.WithEventManager(em), creator, hackatomWasm, nil) + require.NoError(t, err) + + tests := []struct { + name string + codeID uint64 + want []byte + wantErr bool + expErr *sdkerrors.Error + }{ + {name: "success", codeID: 1, want: hackatomWasm, wantErr: false, expErr: nil}, + {name: "not found contract", codeID: 42, want: nil, wantErr: true, expErr: types.ErrNotFound}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := keepers.WasmKeeper.GetByteCode(ctx, tt.codeID) + if tt.wantErr { + require.Equal(t, err, tt.expErr) + return + } + require.NoError(t, err) + require.Equal(t, tt.want, got) + + }) + } +} diff --git a/x/wasm/keeper/legacy_querier.go b/x/wasm/keeper/legacy_querier.go index a4dd3055aa..59f9a481f1 100644 --- a/x/wasm/keeper/legacy_querier.go +++ b/x/wasm/keeper/legacy_querier.go @@ -5,11 +5,11 @@ import ( "reflect" "strconv" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - abci "github.com/tendermint/tendermint/abci/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + abci "github.com/line/ostracon/abci/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) const ( @@ -19,6 +19,8 @@ const ( QueryGetCode = "code" QueryListCode = "list-code" QueryContractHistory = "contract-history" + QueryInactiveContracts = "inactive-contracts" + QueryIsInactiveContract = "inactive-contract" ) const ( @@ -40,12 +42,14 @@ func NewLegacyQuerier(keeper types.ViewKeeper, gasLimit sdk.Gas) sdk.Querier { if addrErr != nil { return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, addrErr.Error()) } + //nolint:staticcheck rsp, err = queryContractInfo(ctx, addr, keeper) case QueryListContractByCode: codeID, parseErr := strconv.ParseUint(path[1], 10, 64) if parseErr != nil { return nil, sdkerrors.Wrapf(types.ErrInvalid, "code id: %s", parseErr.Error()) } + //nolint:staticcheck rsp = queryContractListByCode(ctx, codeID, keeper) case QueryGetContractState: if len(path) < 3 { @@ -57,15 +61,28 @@ func NewLegacyQuerier(keeper types.ViewKeeper, gasLimit sdk.Gas) sdk.Querier { if parseErr != nil { return nil, sdkerrors.Wrapf(types.ErrInvalid, "code id: %s", parseErr.Error()) } + //nolint:staticcheck rsp, err = queryCode(ctx, codeID, keeper) case QueryListCode: + //nolint:staticcheck rsp, err = queryCodeList(ctx, keeper) case QueryContractHistory: contractAddr, addrErr := sdk.AccAddressFromBech32(path[1]) if addrErr != nil { return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, addrErr.Error()) } + //nolint:staticcheck rsp, err = queryContractHistory(ctx, contractAddr, keeper) + case QueryInactiveContracts: + //nolint:staticcheck + rsp = queryInactiveContracts(ctx, keeper) + case QueryIsInactiveContract: + contractAddr, addrErr := sdk.AccAddressFromBech32(path[1]) + if addrErr != nil { + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, addrErr.Error()) + } + //nolint:staticcheck + rsp = keeper.IsInactiveContract(ctx, contractAddr) default: return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "unknown data query endpoint") } @@ -120,6 +137,7 @@ func queryContractState(ctx sdk.Context, bech, queryMethod string, data []byte, } } +//nolint:unparam func queryCodeList(ctx sdk.Context, keeper types.ViewKeeper) ([]types.CodeInfoResponse, error) { var info []types.CodeInfoResponse keeper.IterateCodeInfos(ctx, func(i uint64, res types.CodeInfo) bool { @@ -134,6 +152,7 @@ func queryCodeList(ctx sdk.Context, keeper types.ViewKeeper) ([]types.CodeInfoRe return info, nil } +//nolint:unparam func queryContractHistory(ctx sdk.Context, contractAddr sdk.AccAddress, keeper types.ViewKeeper) ([]types.ContractCodeHistoryEntry, error) { history := keeper.GetContractHistory(ctx, contractAddr) // redact response @@ -143,6 +162,7 @@ func queryContractHistory(ctx sdk.Context, contractAddr sdk.AccAddress, keeper t return history, nil } +//nolint:unparam func queryContractListByCode(ctx sdk.Context, codeID uint64, keeper types.ViewKeeper) []string { var contracts []string keeper.IterateContractsByCode(ctx, codeID, func(addr sdk.AccAddress) bool { @@ -151,3 +171,12 @@ func queryContractListByCode(ctx sdk.Context, codeID uint64, keeper types.ViewKe }) return contracts } + +func queryInactiveContracts(ctx sdk.Context, keeper types.ViewKeeper) []string { + var contracts []string + keeper.IterateInactiveContracts(ctx, func(contractAddress sdk.AccAddress) bool { + contracts = append(contracts, contractAddress.String()) + return false + }) + return contracts +} diff --git a/x/wasm/keeper/legacy_querier_test.go b/x/wasm/keeper/legacy_querier_test.go index e21dd23536..76dbbadcab 100644 --- a/x/wasm/keeper/legacy_querier_test.go +++ b/x/wasm/keeper/legacy_querier_test.go @@ -5,26 +5,27 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "os" "testing" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + abci "github.com/line/ostracon/abci/types" + + "github.com/line/wasmd/x/wasm/types" ) func TestLegacyQueryContractState(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) anyAddr := keepers.Faucet.NewFundedAccount(ctx, sdk.NewInt64Coin("denom", 5000)) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) contractID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) @@ -154,7 +155,7 @@ func TestLegacyQueryContractState(t *testing.T) { } func TestLegacyQueryContractListByCodeOrdering(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 1000000)) @@ -162,7 +163,7 @@ func TestLegacyQueryContractListByCodeOrdering(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, deposit.Add(deposit...)...) anyAddr := keepers.Faucet.NewFundedAccount(ctx, topUp...) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) @@ -218,7 +219,7 @@ func TestLegacyQueryContractListByCodeOrdering(t *testing.T) { } func TestLegacyQueryContractHistory(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper var otherAddr sdk.AccAddress = bytes.Repeat([]byte{0x2}, types.ContractAddrLen) @@ -312,7 +313,7 @@ func TestLegacyQueryContractHistory(t *testing.T) { } func TestLegacyQueryCodeList(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) specs := map[string]struct { @@ -329,7 +330,7 @@ func TestLegacyQueryCodeList(t *testing.T) { for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper for _, codeID := range spec.codeIDs { @@ -358,6 +359,7 @@ func TestLegacyQueryCodeList(t *testing.T) { require.Len(t, got, len(spec.codeIDs)) for i, exp := range spec.codeIDs { assert.EqualValues(t, exp, got[i]["id"]) + assert.NotNil(t, got[i]["instantiate_permission"]) } }) } diff --git a/x/wasm/keeper/metrics.go b/x/wasm/keeper/metrics.go index 4c4b959f50..9eeb4594dc 100644 --- a/x/wasm/keeper/metrics.go +++ b/x/wasm/keeper/metrics.go @@ -1,25 +1,109 @@ package keeper import ( - wasmvmtypes "github.com/CosmWasm/wasmvm/types" + "github.com/go-kit/kit/metrics" + "github.com/go-kit/kit/metrics/discard" + go_prometheus "github.com/go-kit/kit/metrics/prometheus" "github.com/prometheus/client_golang/prometheus" + + wasmvmtypes "github.com/line/wasmvm/types" ) const ( - labelPinned = "pinned" - labelMemory = "memory" - labelFs = "fs" + labelPinned = "pinned" + labelMemory = "memory" + labelFs = "fs" + MetricsSubsystem = "wasm" ) +type Metrics struct { + InstantiateElapsedTimes metrics.Histogram + ExecuteElapsedTimes metrics.Histogram + MigrateElapsedTimes metrics.Histogram + SudoElapsedTimes metrics.Histogram + QuerySmartElapsedTimes metrics.Histogram + QueryRawElapsedTimes metrics.Histogram +} + +func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { + return &Metrics{ + InstantiateElapsedTimes: go_prometheus.NewSummaryFrom(prometheus.SummaryOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "instantiate", + Help: "elapsed time of Instantiate the wasm contract", + }, nil), + ExecuteElapsedTimes: go_prometheus.NewSummaryFrom(prometheus.SummaryOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "execute", + Help: "elapsed time of Execute the wasm contract", + }, nil), + MigrateElapsedTimes: go_prometheus.NewSummaryFrom(prometheus.SummaryOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "migrate", + Help: "elapsed time of Migrate the wasm contract", + }, nil), + SudoElapsedTimes: go_prometheus.NewSummaryFrom(prometheus.SummaryOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "sudo", + Help: "elapsed time of Sudo the wasm contract", + }, nil), + QuerySmartElapsedTimes: go_prometheus.NewSummaryFrom(prometheus.SummaryOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "query_smart", + Help: "elapsed time of QuerySmart the wasm contract", + }, nil), + QueryRawElapsedTimes: go_prometheus.NewSummaryFrom(prometheus.SummaryOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "query_raw", + Help: "elapsed time of QueryRaw the wasm contract", + }, nil), + } +} + +// NopMetrics returns no-op Metrics. +func NopMetrics() *Metrics { + return &Metrics{ + InstantiateElapsedTimes: discard.NewHistogram(), + ExecuteElapsedTimes: discard.NewHistogram(), + MigrateElapsedTimes: discard.NewHistogram(), + SudoElapsedTimes: discard.NewHistogram(), + QuerySmartElapsedTimes: discard.NewHistogram(), + QueryRawElapsedTimes: discard.NewHistogram(), + } +} + +type MetricsProvider func() *Metrics + +// PrometheusMetricsProvider returns PrometheusMetrics for each store +func PrometheusMetricsProvider(namespace string, labelsAndValues ...string) func() *Metrics { + return func() *Metrics { + return PrometheusMetrics(namespace, labelsAndValues...) + } +} + +// NopMetricsProvider returns NopMetrics for each store +func NopMetricsProvider() func() *Metrics { + //nolint:gocritic + return func() *Metrics { + return NopMetrics() + } +} + // metricSource source of wasmvm metrics type metricSource interface { GetMetrics() (*wasmvmtypes.Metrics, error) } -var _ prometheus.Collector = (*WasmVMMetricsCollector)(nil) +var _ prometheus.Collector = (*WasmVMCacheMetricsCollector)(nil) -// WasmVMMetricsCollector custom metrics collector to be used with Prometheus -type WasmVMMetricsCollector struct { +// WasmVMCacheMetricsCollector custom metrics collector to be used with Prometheus +type WasmVMCacheMetricsCollector struct { source metricSource CacheHitsDescr *prometheus.Desc CacheMissesDescr *prometheus.Desc @@ -27,9 +111,9 @@ type WasmVMMetricsCollector struct { CacheSizeDescr *prometheus.Desc } -// NewWasmVMMetricsCollector constructor -func NewWasmVMMetricsCollector(s metricSource) *WasmVMMetricsCollector { - return &WasmVMMetricsCollector{ +// NewWasmVMCacheMetricsCollector constructor +func NewWasmVMCacheMetricsCollector(s metricSource) *WasmVMCacheMetricsCollector { + return &WasmVMCacheMetricsCollector{ source: s, CacheHitsDescr: prometheus.NewDesc("wasmvm_cache_hits_total", "Total number of cache hits", []string{"type"}, nil), CacheMissesDescr: prometheus.NewDesc("wasmvm_cache_misses_total", "Total number of cache misses", nil, nil), @@ -39,12 +123,12 @@ func NewWasmVMMetricsCollector(s metricSource) *WasmVMMetricsCollector { } // Register registers all metrics -func (p *WasmVMMetricsCollector) Register(r prometheus.Registerer) { +func (p *WasmVMCacheMetricsCollector) Register(r prometheus.Registerer) { r.MustRegister(p) } // Describe sends the super-set of all possible descriptors of metrics -func (p *WasmVMMetricsCollector) Describe(descs chan<- *prometheus.Desc) { +func (p *WasmVMCacheMetricsCollector) Describe(descs chan<- *prometheus.Desc) { descs <- p.CacheHitsDescr descs <- p.CacheMissesDescr descs <- p.CacheElementsDescr @@ -52,7 +136,7 @@ func (p *WasmVMMetricsCollector) Describe(descs chan<- *prometheus.Desc) { } // Collect is called by the Prometheus registry when collecting metrics. -func (p *WasmVMMetricsCollector) Collect(c chan<- prometheus.Metric) { +func (p *WasmVMCacheMetricsCollector) Collect(c chan<- prometheus.Metric) { m, err := p.source.GetMetrics() if err != nil { return diff --git a/x/wasm/keeper/migrations.go b/x/wasm/keeper/migrations.go new file mode 100644 index 0000000000..775ea928f7 --- /dev/null +++ b/x/wasm/keeper/migrations.go @@ -0,0 +1,20 @@ +package keeper + +import ( + sdk "github.com/line/lbm-sdk/types" +) + +// Migrator is a struct for handling in-place store migrations. +type Migrator struct { + keeper Keeper +} + +// NewMigrator returns a new Migrator. +func NewMigrator(keeper Keeper) Migrator { + return Migrator{keeper: keeper} +} + +// Migrate1to2 migrates from version 1 to 2. +func (m Migrator) Migrate1to2(ctx sdk.Context) error { + return nil +} diff --git a/x/wasm/keeper/msg_dispatcher.go b/x/wasm/keeper/msg_dispatcher.go index a3e7e3a142..0b56701c18 100644 --- a/x/wasm/keeper/msg_dispatcher.go +++ b/x/wasm/keeper/msg_dispatcher.go @@ -3,12 +3,12 @@ package keeper import ( "fmt" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - abci "github.com/tendermint/tendermint/abci/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + abci "github.com/line/ostracon/abci/types" + wasmvmtypes "github.com/line/wasmvm/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) // Messenger is an extension point for custom wasmd message handling diff --git a/x/wasm/keeper/msg_dispatcher_test.go b/x/wasm/keeper/msg_dispatcher_test.go index 529a208ff0..8c3e4bb115 100644 --- a/x/wasm/keeper/msg_dispatcher_test.go +++ b/x/wasm/keeper/msg_dispatcher_test.go @@ -5,15 +5,15 @@ import ( "fmt" "testing" - "github.com/tendermint/tendermint/libs/log" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" + sdk "github.com/line/lbm-sdk/types" + abci "github.com/line/ostracon/abci/types" + "github.com/line/ostracon/libs/log" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" ) func TestDispatchSubmessages(t *testing.T) { @@ -101,11 +101,10 @@ func TestDispatchSubmessages(t *testing.T) { }, expData: []byte("myReplyData"), expCommits: []bool{true}, - expEvents: []sdk.Event{ - { - Type: "myEvent", - Attributes: []abci.EventAttribute{{Key: []byte("foo"), Value: []byte("bar")}}, - }, + expEvents: []sdk.Event{{ + Type: "myEvent", + Attributes: []abci.EventAttribute{{Key: []byte("foo"), Value: []byte("bar")}}, + }, sdk.NewEvent("wasm-reply"), }, }, diff --git a/x/wasm/keeper/msg_server.go b/x/wasm/keeper/msg_server.go index 1c45ff52ec..5cef0f2bfa 100644 --- a/x/wasm/keeper/msg_server.go +++ b/x/wasm/keeper/msg_server.go @@ -3,10 +3,11 @@ package keeper import ( "context" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) var _ types.MsgServer = msgServer{} @@ -73,6 +74,45 @@ func (m msgServer) InstantiateContract(goCtx context.Context, msg *types.MsgInst }, nil } +func (m msgServer) StoreCodeAndInstantiateContract(goCtx context.Context, + msg *lbmtypes.MsgStoreCodeAndInstantiateContract) (*lbmtypes.MsgStoreCodeAndInstantiateContractResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return nil, sdkerrors.Wrap(err, "sender") + } + codeID, err := m.keeper.Create(ctx, senderAddr, msg.WASMByteCode, msg.InstantiatePermission) + if err != nil { + return nil, err + } + + ctx.EventManager().EmitEvent(sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), + )) + + var adminAddr sdk.AccAddress + if msg.Admin != "" { + adminAddr, err = sdk.AccAddressFromBech32(msg.Admin) + if err != nil { + return nil, sdkerrors.Wrap(err, "admin") + } + } + + contractAddr, data, err := m.keeper.Instantiate(ctx, codeID, senderAddr, adminAddr, msg.Msg, + msg.Label, msg.Funds) + if err != nil { + return nil, err + } + + return &lbmtypes.MsgStoreCodeAndInstantiateContractResponse{ + CodeID: codeID, + Address: contractAddr.String(), + Data: data, + }, nil +} + func (m msgServer) ExecuteContract(goCtx context.Context, msg *types.MsgExecuteContract) (*types.MsgExecuteContractResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) diff --git a/x/wasm/keeper/options.go b/x/wasm/keeper/options.go index c3d9d1248e..fe0b45672a 100644 --- a/x/wasm/keeper/options.go +++ b/x/wasm/keeper/options.go @@ -5,7 +5,7 @@ import ( "github.com/prometheus/client_golang/prometheus" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) type optsFn func(*Keeper) @@ -96,27 +96,25 @@ func WithCoinTransferrer(x CoinTransferrer) Option { func WithVMCacheMetrics(r prometheus.Registerer) Option { return optsFn(func(k *Keeper) { - NewWasmVMMetricsCollector(k.wasmVM).Register(r) + NewWasmVMCacheMetricsCollector(k.wasmVM).Register(r) + }) +} + +func WithVMMetrics(provider MetricsProvider) Option { + return optsFn(func(k *Keeper) { + k.metrics = provider() }) } // WithGasRegister set a new gas register to implement custom gas costs. // When the "gas multiplier" for wasmvm gas conversion is modified inside the new register, // make sure to also use `WithApiCosts` option for non default values -func WithGasRegister(x GasRegister) Option { +func WithGasRegister(x WasmGasRegister) Option { return optsFn(func(k *Keeper) { k.gasRegister = x }) } -// WithAPICosts sets custom api costs. Amounts are in cosmwasm gas Not SDK gas. -func WithAPICosts(human, canonical uint64) Option { - return optsFn(func(_ *Keeper) { - costHumanize = human - costCanonical = canonical - }) -} - // WithMaxQueryStackSize overwrites the default limit for maximum query stacks func WithMaxQueryStackSize(m uint32) Option { return optsFn(func(k *Keeper) { diff --git a/x/wasm/keeper/options_test.go b/x/wasm/keeper/options_test.go index 6e50c7ba96..cf2f29e1d2 100644 --- a/x/wasm/keeper/options_test.go +++ b/x/wasm/keeper/options_test.go @@ -3,15 +3,17 @@ package keeper import ( "testing" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - "github.com/CosmWasm/wasmd/x/wasm/types" + authkeeper "github.com/line/lbm-sdk/x/auth/keeper" + bankpluskeeper "github.com/line/lbm-sdk/x/bankplus/keeper" + distributionkeeper "github.com/line/lbm-sdk/x/distribution/keeper" + paramtypes "github.com/line/lbm-sdk/x/params/types" + stakingkeeper "github.com/line/lbm-sdk/x/staking/keeper" + + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + "github.com/line/wasmd/x/wasm/types" ) func TestConstructorOptions(t *testing.T) { @@ -61,20 +63,6 @@ func TestConstructorOptions(t *testing.T) { assert.IsType(t, &wasmtesting.MockCoinTransferrer{}, k.bank) }, }, - "costs": { - srcOpt: WithGasRegister(&wasmtesting.MockGasRegister{}), - verify: func(t *testing.T, k Keeper) { - assert.IsType(t, &wasmtesting.MockGasRegister{}, k.gasRegister) - }, - }, - "api costs": { - srcOpt: WithAPICosts(1, 2), - verify: func(t *testing.T, k Keeper) { - t.Cleanup(setApiDefaults) - assert.Equal(t, uint64(1), costHumanize) - assert.Equal(t, uint64(2), costCanonical) - }, - }, "max recursion query limit": { srcOpt: WithMaxQueryStackSize(1), verify: func(t *testing.T, k Keeper) { @@ -84,13 +72,9 @@ func TestConstructorOptions(t *testing.T) { } for name, spec := range specs { t.Run(name, func(t *testing.T) { - k := NewKeeper(nil, nil, paramtypes.NewSubspace(nil, nil, nil, nil, ""), authkeeper.AccountKeeper{}, nil, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, "tempDir", types.DefaultWasmConfig(), SupportedFeatures, spec.srcOpt) + k := NewKeeper(nil, nil, paramtypes.NewSubspace(nil, nil, nil, nil, ""), authkeeper.AccountKeeper{}, bankpluskeeper.BaseKeeper{}, stakingkeeper.Keeper{}, distributionkeeper.Keeper{}, nil, nil, nil, nil, nil, nil, "tempDir", types.DefaultWasmConfig(), SupportedFeatures, nil, nil, spec.srcOpt) spec.verify(t, k) }) } -} -func setApiDefaults() { - costHumanize = DefaultGasCostHumanAddress * DefaultGasMultiplier - costCanonical = DefaultGasCostCanonicalAddress * DefaultGasMultiplier } diff --git a/x/wasm/keeper/proposal_handler.go b/x/wasm/keeper/proposal_handler.go index 9da330ce0f..e86d9e9ad1 100644 --- a/x/wasm/keeper/proposal_handler.go +++ b/x/wasm/keeper/proposal_handler.go @@ -3,11 +3,12 @@ package keeper import ( "encoding/hex" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + govtypes "github.com/line/lbm-sdk/x/gov/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) // NewWasmProposalHandler creates a new governance Handler for wasm proposals @@ -49,6 +50,10 @@ func NewWasmProposalHandlerX(k types.ContractOpsKeeper, enabledProposalTypes []t return handleUnpinCodesProposal(ctx, k, *c) case *types.UpdateInstantiateConfigProposal: return handleUpdateInstantiateConfigProposal(ctx, k, *c) + case *lbmtypes.DeactivateContractProposal: + return handleDeactivateContractProposal(ctx, k, *c) + case *lbmtypes.ActivateContractProposal: + return handleActivateContractProposal(ctx, k, *c) default: return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized wasm proposal content type: %T", c) } @@ -107,9 +112,6 @@ func handleMigrateProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.M if err != nil { return sdkerrors.Wrap(err, "contract") } - if err != nil { - return sdkerrors.Wrap(err, "run as address") - } // runAs is not used if this is permissioned, so just put any valid address there (second contractAddr) data, err := k.Migrate(ctx, contractAddr, contractAddr, p.CodeID, p.Msg) if err != nil { @@ -221,6 +223,7 @@ func handleUnpinCodesProposal(ctx sdk.Context, k types.ContractOpsKeeper, p type return sdkerrors.Wrapf(err, "code id: %d", v) } } + return nil } @@ -236,3 +239,49 @@ func handleUpdateInstantiateConfigProposal(ctx sdk.Context, k types.ContractOpsK } return nil } + +func handleDeactivateContractProposal(ctx sdk.Context, k types.ContractOpsKeeper, p lbmtypes.DeactivateContractProposal) error { + if err := p.ValidateBasic(); err != nil { + return err + } + + // The error is already checked in ValidateBasic. + //nolint:errcheck + contractAddr, _ := sdk.AccAddressFromBech32(p.Contract) + + err := k.DeactivateContract(ctx, contractAddr) + if err != nil { + return err + } + + event := lbmtypes.EventDeactivateContractProposal{ + Contract: contractAddr.String(), + } + if err := ctx.EventManager().EmitTypedEvent(&event); err != nil { + return err + } + + return nil +} + +func handleActivateContractProposal(ctx sdk.Context, k types.ContractOpsKeeper, p lbmtypes.ActivateContractProposal) error { + if err := p.ValidateBasic(); err != nil { + return err + } + + // The error is already checked in ValidateBasic. + //nolint:errcheck + contractAddr, _ := sdk.AccAddressFromBech32(p.Contract) + + err := k.ActivateContract(ctx, contractAddr) + if err != nil { + return err + } + + event := lbmtypes.EventActivateContractProposal{Contract: contractAddr.String()} + if err := ctx.EventManager().EmitTypedEvent(&event); err != nil { + return nil + } + + return nil +} diff --git a/x/wasm/keeper/proposal_integration_test.go b/x/wasm/keeper/proposal_integration_test.go index 3d5097b501..5c9a58e55a 100644 --- a/x/wasm/keeper/proposal_integration_test.go +++ b/x/wasm/keeper/proposal_integration_test.go @@ -5,32 +5,34 @@ import ( "encoding/hex" "encoding/json" "errors" - "io/ioutil" + "os" "testing" - "github.com/cosmos/cosmos-sdk/x/params/client/utils" - - wasmvm "github.com/CosmWasm/wasmvm" - - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - - sdk "github.com/cosmos/cosmos-sdk/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/cosmos/cosmos-sdk/x/params/types/proposal" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + govtypes "github.com/line/lbm-sdk/x/gov/types" + "github.com/line/lbm-sdk/x/params/client/utils" + "github.com/line/lbm-sdk/x/params/types/proposal" + wasmvm "github.com/line/wasmvm" + + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) func TestStoreCodeProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper wasmKeeper.SetParams(ctx, types.Params{ CodeUploadAccess: types.AllowNobody, InstantiateDefaultPermission: types.AccessTypeNobody, + GasMultiplier: types.DefaultGasMultiplier, + InstanceCost: types.DefaultInstanceCost, + CompileCost: types.DefaultCompileCost, }) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) myActorAddress := RandomBech32AccountAddress(t) @@ -61,14 +63,17 @@ func TestStoreCodeProposal(t *testing.T) { } func TestInstantiateProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper wasmKeeper.SetParams(ctx, types.Params{ CodeUploadAccess: types.AllowNobody, InstantiateDefaultPermission: types.AccessTypeNobody, + GasMultiplier: types.DefaultGasMultiplier, + InstanceCost: types.DefaultInstanceCost, + CompileCost: types.DefaultCompileCost, }) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) require.NoError(t, wasmKeeper.importCode(ctx, 1, @@ -98,7 +103,7 @@ func TestInstantiateProposal(t *testing.T) { require.NoError(t, err) // then - contractAddr, err := sdk.AccAddressFromBech32("cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr") + contractAddr, err := sdk.AccAddressFromBech32("link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8") require.NoError(t, err) cInfo := wasmKeeper.GetContractInfo(ctx, contractAddr) @@ -119,19 +124,24 @@ func TestInstantiateProposal(t *testing.T) { require.Equal(t, types.EventTypeInstantiate, em.Events()[0].Type) require.Equal(t, types.WasmModuleEventType, em.Events()[1].Type) require.Equal(t, types.EventTypeGovContractResult, em.Events()[2].Type) + require.Len(t, em.Events()[0].Attributes, 2) + require.Len(t, em.Events()[1].Attributes, 2) require.Len(t, em.Events()[2].Attributes, 1) require.NotEmpty(t, em.Events()[2].Attributes[0]) } func TestInstantiateProposal_NoAdmin(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper wasmKeeper.SetParams(ctx, types.Params{ CodeUploadAccess: types.AllowNobody, InstantiateDefaultPermission: types.AccessTypeNobody, + GasMultiplier: types.DefaultGasMultiplier, + InstanceCost: types.DefaultInstanceCost, + CompileCost: types.DefaultCompileCost, }) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) require.NoError(t, wasmKeeper.importCode(ctx, 1, @@ -170,7 +180,7 @@ func TestInstantiateProposal_NoAdmin(t *testing.T) { require.NoError(t, err) // then - contractAddr, err := sdk.AccAddressFromBech32("cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr") + contractAddr, err := sdk.AccAddressFromBech32("link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8") require.NoError(t, err) cInfo := wasmKeeper.GetContractInfo(ctx, contractAddr) @@ -196,14 +206,17 @@ func TestInstantiateProposal_NoAdmin(t *testing.T) { } func TestMigrateProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper wasmKeeper.SetParams(ctx, types.Params{ CodeUploadAccess: types.AllowNobody, InstantiateDefaultPermission: types.AccessTypeNobody, + GasMultiplier: types.DefaultGasMultiplier, + InstanceCost: types.DefaultInstanceCost, + CompileCost: types.DefaultCompileCost, }) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) codeInfoFixture := types.CodeInfoFixture(types.WithSHA256CodeHash(wasmCode)) @@ -277,7 +290,7 @@ func TestMigrateProposal(t *testing.T) { } func TestExecuteProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, bankKeeper := keepers.GovKeeper, keepers.BankKeeper exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) @@ -337,7 +350,7 @@ func TestExecuteProposal(t *testing.T) { } func TestSudoProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, bankKeeper := keepers.GovKeeper, keepers.BankKeeper exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) @@ -394,7 +407,7 @@ func TestAdminProposals(t *testing.T) { otherAddress sdk.AccAddress = bytes.Repeat([]byte{0x2}, types.ContractAddrLen) contractAddr = BuildContractAddress(1, 1) ) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) specs := map[string]struct { @@ -447,11 +460,14 @@ func TestAdminProposals(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper wasmKeeper.SetParams(ctx, types.Params{ CodeUploadAccess: types.AllowNobody, InstantiateDefaultPermission: types.AccessTypeNobody, + GasMultiplier: types.DefaultGasMultiplier, + InstanceCost: types.DefaultInstanceCost, + CompileCost: types.DefaultCompileCost, }) codeInfoFixture := types.CodeInfoFixture(types.WithSHA256CodeHash(wasmCode)) @@ -476,7 +492,7 @@ func TestAdminProposals(t *testing.T) { } func TestUpdateParamsProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper var ( @@ -573,7 +589,7 @@ func TestUpdateParamsProposal(t *testing.T) { } func TestPinCodesProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper mock := wasmtesting.MockWasmer{ @@ -661,7 +677,7 @@ func TestPinCodesProposal(t *testing.T) { } func TestUnpinCodesProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper mock := wasmtesting.MockWasmer{ @@ -749,14 +765,14 @@ func TestUnpinCodesProposal(t *testing.T) { } func TestUpdateInstantiateConfigProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, "staking") + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper mock := wasmtesting.MockWasmer{ CreateFn: wasmtesting.NoOpCreateFn, AnalyzeCodeFn: wasmtesting.WithoutIBCAnalyzeFn, } - anyAddress, err := sdk.AccAddressFromBech32("cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz") + anyAddress, err := sdk.AccAddressFromBech32("link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23") require.NoError(t, err) withAddressAccessConfig := types.AccessTypeOnlyAddress.With(anyAddress) @@ -841,3 +857,66 @@ func TestUpdateInstantiateConfigProposal(t *testing.T) { }) } } + +func TestValidateDeactivateContractProposal(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) + govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper + + var mock wasmtesting.MockWasmer + wasmtesting.MakeInstantiable(&mock) + example := SeedNewContractInstance(t, ctx, keepers, &mock) + + src := lbmtypes.DeactivateContractProposal{ + Title: "Foo", + Description: "Bar", + Contract: example.Contract.String(), + } + + em := sdk.NewEventManager() + + // when stored + storedProposal, err := govKeeper.SubmitProposal(ctx, &src) + require.NoError(t, err) + + // proposal execute + handler := govKeeper.Router().GetRoute(storedProposal.ProposalRoute()) + err = handler(ctx.WithEventManager(em), storedProposal.GetContent()) + require.NoError(t, err) + + // then + isInactive := wasmKeeper.IsInactiveContract(ctx, example.Contract) + require.True(t, isInactive) +} + +func TestActivateContractProposal(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, "staking", nil, nil) + govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper + + var mock wasmtesting.MockWasmer + wasmtesting.MakeInstantiable(&mock) + example := SeedNewContractInstance(t, ctx, keepers, &mock) + // set deactivate + err := wasmKeeper.deactivateContract(ctx, example.Contract) + require.NoError(t, err) + + src := lbmtypes.ActivateContractProposal{ + Title: "Foo", + Description: "Bar", + Contract: example.Contract.String(), + } + + em := sdk.NewEventManager() + + // when stored + storedProposal, err := govKeeper.SubmitProposal(ctx, &src) + require.NoError(t, err) + + // proposal execute + handler := govKeeper.Router().GetRoute(storedProposal.ProposalRoute()) + err = handler(ctx.WithEventManager(em), storedProposal.GetContent()) + require.NoError(t, err) + + // then + isInactive := wasmKeeper.IsInactiveContract(ctx, example.Contract) + require.False(t, isInactive) +} diff --git a/x/wasm/keeper/querier.go b/x/wasm/keeper/querier.go index 6c4e45430c..0728135ac7 100644 --- a/x/wasm/keeper/querier.go +++ b/x/wasm/keeper/querier.go @@ -5,21 +5,22 @@ import ( "encoding/binary" "runtime/debug" - "github.com/cosmos/cosmos-sdk/codec" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/types/query" + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/store/prefix" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + "github.com/line/lbm-sdk/types/query" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) -var _ types.QueryServer = &grpcQuerier{} +var _ types.QueryServer = &GrpcQuerier{} -type grpcQuerier struct { +type GrpcQuerier struct { cdc codec.Codec storeKey sdk.StoreKey keeper types.ViewKeeper @@ -27,11 +28,11 @@ type grpcQuerier struct { } // NewGrpcQuerier constructor -func NewGrpcQuerier(cdc codec.Codec, storeKey sdk.StoreKey, keeper types.ViewKeeper, queryGasLimit sdk.Gas) *grpcQuerier { //nolint:revive - return &grpcQuerier{cdc: cdc, storeKey: storeKey, keeper: keeper, queryGasLimit: queryGasLimit} +func NewGrpcQuerier(cdc codec.Codec, storeKey sdk.StoreKey, keeper types.ViewKeeper, queryGasLimit sdk.Gas) *GrpcQuerier { //nolint:revive + return &GrpcQuerier{cdc: cdc, storeKey: storeKey, keeper: keeper, queryGasLimit: queryGasLimit} } -func (q grpcQuerier) ContractInfo(c context.Context, req *types.QueryContractInfoRequest) (*types.QueryContractInfoResponse, error) { +func (q GrpcQuerier) ContractInfo(c context.Context, req *types.QueryContractInfoRequest) (*types.QueryContractInfoResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -49,7 +50,7 @@ func (q grpcQuerier) ContractInfo(c context.Context, req *types.QueryContractInf return rsp, nil } -func (q grpcQuerier) ContractHistory(c context.Context, req *types.QueryContractHistoryRequest) (*types.QueryContractHistoryResponse, error) { +func (q GrpcQuerier) ContractHistory(c context.Context, req *types.QueryContractHistoryRequest) (*types.QueryContractHistoryResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -83,7 +84,7 @@ func (q grpcQuerier) ContractHistory(c context.Context, req *types.QueryContract } // ContractsByCode lists all smart contracts for a code id -func (q grpcQuerier) ContractsByCode(c context.Context, req *types.QueryContractsByCodeRequest) (*types.QueryContractsByCodeResponse, error) { +func (q GrpcQuerier) ContractsByCode(c context.Context, req *types.QueryContractsByCodeRequest) (*types.QueryContractsByCodeResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -110,7 +111,7 @@ func (q grpcQuerier) ContractsByCode(c context.Context, req *types.QueryContract }, nil } -func (q grpcQuerier) AllContractState(c context.Context, req *types.QueryAllContractStateRequest) (*types.QueryAllContractStateResponse, error) { +func (q GrpcQuerier) AllContractState(c context.Context, req *types.QueryAllContractStateRequest) (*types.QueryAllContractStateResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -143,7 +144,7 @@ func (q grpcQuerier) AllContractState(c context.Context, req *types.QueryAllCont }, nil } -func (q grpcQuerier) RawContractState(c context.Context, req *types.QueryRawContractStateRequest) (*types.QueryRawContractStateResponse, error) { +func (q GrpcQuerier) RawContractState(c context.Context, req *types.QueryRawContractStateRequest) (*types.QueryRawContractStateResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -161,7 +162,7 @@ func (q grpcQuerier) RawContractState(c context.Context, req *types.QueryRawCont return &types.QueryRawContractStateResponse{Data: rsp}, nil } -func (q grpcQuerier) SmartContractState(c context.Context, req *types.QuerySmartContractStateRequest) (rsp *types.QuerySmartContractStateResponse, err error) { +func (q GrpcQuerier) SmartContractState(c context.Context, req *types.QuerySmartContractStateRequest) (rsp *types.QuerySmartContractStateResponse, err error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -204,7 +205,7 @@ func (q grpcQuerier) SmartContractState(c context.Context, req *types.QuerySmart return &types.QuerySmartContractStateResponse{Data: bz}, nil } -func (q grpcQuerier) Code(c context.Context, req *types.QueryCodeRequest) (*types.QueryCodeResponse, error) { +func (q GrpcQuerier) Code(c context.Context, req *types.QueryCodeRequest) (*types.QueryCodeResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -224,7 +225,7 @@ func (q grpcQuerier) Code(c context.Context, req *types.QueryCodeRequest) (*type }, nil } -func (q grpcQuerier) Codes(c context.Context, req *types.QueryCodesRequest) (*types.QueryCodesResponse, error) { +func (q GrpcQuerier) Codes(c context.Context, req *types.QueryCodesRequest) (*types.QueryCodesResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -289,7 +290,7 @@ func queryCode(ctx sdk.Context, codeID uint64, keeper types.ViewKeeper) (*types. return &types.QueryCodeResponse{CodeInfoResponse: &info, Data: code}, nil } -func (q grpcQuerier) PinnedCodes(c context.Context, req *types.QueryPinnedCodesRequest) (*types.QueryPinnedCodesResponse, error) { +func (q GrpcQuerier) PinnedCodes(c context.Context, req *types.QueryPinnedCodesRequest) (*types.QueryPinnedCodesResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -311,3 +312,48 @@ func (q grpcQuerier) PinnedCodes(c context.Context, req *types.QueryPinnedCodesR Pagination: pageRes, }, nil } + +func (q GrpcQuerier) InactiveContracts(c context.Context, req *lbmtypes.QueryInactiveContractsRequest) (*lbmtypes.QueryInactiveContractsResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + ctx := sdk.UnwrapSDKContext(c) + + addresses := make([]string, 0) + prefixStore := prefix.NewStore(ctx.KVStore(q.storeKey), types.InactiveContractPrefix) + pageRes, err := query.FilteredPaginate(prefixStore, req.Pagination, func(key []byte, value []byte, accumulate bool) (bool, error) { + if accumulate { + contractAddress := sdk.AccAddress(value) + addresses = append(addresses, contractAddress.String()) + } + return true, nil + }) + if err != nil { + return nil, err + } + return &lbmtypes.QueryInactiveContractsResponse{ + Addresses: addresses, + Pagination: pageRes, + }, nil +} + +func (q GrpcQuerier) InactiveContract(c context.Context, req *lbmtypes.QueryInactiveContractRequest) (*lbmtypes.QueryInactiveContractResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + ctx := sdk.UnwrapSDKContext(c) + + contractAddr, err := sdk.AccAddressFromBech32(req.Address) + if err != nil { + return nil, err + } + + if !q.keeper.HasContractInfo(ctx, contractAddr) { + return nil, types.ErrNotFound + } + + inactivated := q.keeper.IsInactiveContract(ctx, contractAddr) + return &lbmtypes.QueryInactiveContractResponse{ + Inactivated: inactivated, + }, nil +} diff --git a/x/wasm/keeper/querier_test.go b/x/wasm/keeper/querier_test.go index f473f52fac..3b84c44ab3 100644 --- a/x/wasm/keeper/querier_test.go +++ b/x/wasm/keeper/querier_test.go @@ -5,29 +5,30 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" + "os" "testing" "time" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - wasmvm "github.com/CosmWasm/wasmvm" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkErrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/types/query" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + sdkErrors "github.com/line/lbm-sdk/types/errors" + "github.com/line/lbm-sdk/types/query" + govtypes "github.com/line/lbm-sdk/x/gov/types" + "github.com/line/ostracon/libs/log" + wasmvm "github.com/line/wasmvm" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) func TestQueryAllContractState(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) @@ -114,7 +115,7 @@ func TestQueryAllContractState(t *testing.T) { } func TestQuerySmartContractState(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) @@ -157,14 +158,14 @@ func TestQuerySmartContractState(t *testing.T) { } func TestQuerySmartContractPanics(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) contractAddr := BuildContractAddress(1, 1) keepers.WasmKeeper.storeCodeInfo(ctx, 1, types.CodeInfo{}) keepers.WasmKeeper.storeContractInfo(ctx, contractAddr, &types.ContractInfo{ CodeID: 1, Created: types.NewAbsoluteTxPosition(ctx), }) - ctx = ctx.WithGasMeter(sdk.NewGasMeter(DefaultInstanceCost)).WithLogger(log.TestingLogger()) + ctx = ctx.WithGasMeter(sdk.NewGasMeter(types.DefaultInstanceCost)).WithLogger(log.TestingLogger()) specs := map[string]struct { doInContract func() @@ -202,7 +203,7 @@ func TestQuerySmartContractPanics(t *testing.T) { } func TestQueryRawContractState(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) @@ -257,7 +258,7 @@ func TestQueryRawContractState(t *testing.T) { } func TestQueryContractListByCodeOrdering(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 1000000)) @@ -265,7 +266,7 @@ func TestQueryContractListByCodeOrdering(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) anyAddr := keepers.Faucet.NewFundedAccount(ctx, topUp...) - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, nil) @@ -313,7 +314,7 @@ func TestQueryContractListByCodeOrdering(t *testing.T) { } func TestQueryContractHistory(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper var ( @@ -453,11 +454,64 @@ func TestQueryContractHistory(t *testing.T) { } } +func TestQueryCode(t *testing.T) { + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") + require.NoError(t, err) + + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) + keeper := keepers.WasmKeeper + + codeID := uint64(1) + require.NoError(t, keeper.importCode(ctx, codeID, + types.CodeInfoFixture(types.WithSHA256CodeHash(wasmCode)), wasmCode)) + + specs := map[string]struct { + req *types.QueryCodeRequest + expErr error + }{ + "req nil": { + req: nil, + expErr: status.Error(codes.InvalidArgument, "empty request"), + }, + "req.CodeId=0": { + req: &types.QueryCodeRequest{CodeId: 0}, + expErr: sdkErrors.Wrap(types.ErrInvalid, "code id"), + }, + "not exist codeID": { + req: &types.QueryCodeRequest{CodeId: 2}, + expErr: types.ErrNotFound, + }, + "code codeID": { + req: &types.QueryCodeRequest{CodeId: 1}, + expErr: nil, + }, + } + + for msg, spec := range specs { + t.Run(msg, func(t *testing.T) { + xCtx, _ := ctx.CacheContext() + + q := Querier(keeper) + got, err := q.Code(sdk.WrapSDKContext(xCtx), spec.req) + if spec.expErr != nil { + assert.Nil(t, got) + assert.NotNil(t, err) + assert.EqualError(t, err, spec.expErr.Error()) + } else { + assert.Nil(t, err) + assert.NotNil(t, got) + assert.EqualValues(t, got.CodeID, codeID) + assert.NotNil(t, got.InstantiatePermission) + } + }) + } +} + func TestQueryCodeList(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper specs := map[string]struct { @@ -533,7 +587,7 @@ func TestQueryContractInfo(t *testing.T) { contractAddr = RandomAccountAddress(t) anyDate = time.Now().UTC() ) - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) // register an example extension. must be protobuf keepers.EncodingConfig.InterfaceRegistry.RegisterImplementations( (*types.ContractInfoExtension)(nil), @@ -599,7 +653,7 @@ func TestQueryContractInfo(t *testing.T) { } func TestQueryPinnedCodes(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper exampleContract1 := InstantiateHackatomExampleContract(t, ctx, keepers) @@ -611,8 +665,12 @@ func TestQueryPinnedCodes(t *testing.T) { specs := map[string]struct { srcQuery *types.QueryPinnedCodesRequest expCodeIDs []uint64 - expErr *sdkErrors.Error + expErr bool }{ + "req nil": { + srcQuery: nil, + expErr: true, + }, "query all": { srcQuery: &types.QueryPinnedCodesRequest{}, expCodeIDs: []uint64{exampleContract1.CodeID, exampleContract2.CodeID}, @@ -625,6 +683,15 @@ func TestQueryPinnedCodes(t *testing.T) { }, expCodeIDs: []uint64{exampleContract2.CodeID}, }, + "with invalid pagination key": { + srcQuery: &types.QueryPinnedCodesRequest{ + Pagination: &query.PageRequest{ + Offset: 1, + Key: []byte("test"), + }, + }, + expErr: true, + }, "with pagination limit": { srcQuery: &types.QueryPinnedCodesRequest{ Pagination: &query.PageRequest{ @@ -645,8 +712,10 @@ func TestQueryPinnedCodes(t *testing.T) { for msg, spec := range specs { t.Run(msg, func(t *testing.T) { got, err := q.PinnedCodes(sdk.WrapSDKContext(ctx), spec.srcQuery) - require.True(t, spec.expErr.Is(err), err) - if spec.expErr != nil { + if spec.expErr { + assert.Nil(t, got) + assert.NotNil(t, err) + return } require.NotNil(t, got) @@ -656,13 +725,13 @@ func TestQueryPinnedCodes(t *testing.T) { } func TestQueryCodeInfo(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper - anyAddress, err := sdk.AccAddressFromBech32("cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz") + anyAddress, err := sdk.AccAddressFromBech32("link1qyqszqgpqyqszqgpqyqszqgpqyqszqgp8apuk5") require.NoError(t, err) specs := map[string]struct { codeId uint64 @@ -711,13 +780,14 @@ func TestQueryCodeInfo(t *testing.T) { } func TestQueryCodeInfoList(t *testing.T) { - wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + + wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - ctx, keepers := CreateTestInput(t, false, SupportedFeatures) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) keeper := keepers.WasmKeeper - anyAddress, err := sdk.AccAddressFromBech32("cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz") + anyAddress, err := sdk.AccAddressFromBech32("link1qyqszqgpqyqszqgpqyqszqgpqyqszqgp8apuk5") require.NoError(t, err) codeInfoWithConfig := func(accessConfig types.AccessConfig) types.CodeInfo { codeInfo := types.CodeInfoFixture(types.WithSHA256CodeHash(wasmCode)) @@ -781,3 +851,54 @@ func fromBase64(s string) []byte { } return r } + +func TestQueryInactiveContracts(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) + keeper := keepers.WasmKeeper + + var mock wasmtesting.MockWasmer + wasmtesting.MakeInstantiable(&mock) + example1 := SeedNewContractInstance(t, ctx, keepers, &mock) + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + example2 := SeedNewContractInstance(t, ctx, keepers, &mock) + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + + // set inactive + err := keeper.deactivateContract(ctx, example1.Contract) + require.NoError(t, err) + err = keeper.deactivateContract(ctx, example2.Contract) + require.NoError(t, err) + + q := Querier(keeper) + rq := lbmtypes.QueryInactiveContractsRequest{} + res, err := q.InactiveContracts(sdk.WrapSDKContext(ctx), &rq) + require.NoError(t, err) + expect := []string{example1.Contract.String(), example2.Contract.String()} + for _, exp := range expect { + assert.Contains(t, res.Addresses, exp) + } +} + +func TestQueryIsInactiveContract(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil) + keeper := keepers.WasmKeeper + + var mock wasmtesting.MockWasmer + wasmtesting.MakeInstantiable(&mock) + example := SeedNewContractInstance(t, ctx, keepers, &mock) + + q := Querier(keeper) + rq := lbmtypes.QueryInactiveContractRequest{Address: example.Contract.String()} + res, err := q.InactiveContract(sdk.WrapSDKContext(ctx), &rq) + require.NoError(t, err) + require.False(t, res.Inactivated) + + // set inactive + err = keeper.deactivateContract(ctx, example.Contract) + require.NoError(t, err) + + rq = lbmtypes.QueryInactiveContractRequest{Address: example.Contract.String()} + res, err = q.InactiveContract(sdk.WrapSDKContext(ctx), &rq) + require.NoError(t, err) + require.True(t, res.Inactivated) +} diff --git a/x/wasm/keeper/query_plugins.go b/x/wasm/keeper/query_plugins.go index b0e095b12c..eaa6295eb7 100644 --- a/x/wasm/keeper/query_plugins.go +++ b/x/wasm/keeper/query_plugins.go @@ -4,32 +4,31 @@ import ( "encoding/json" "errors" - "github.com/cosmos/cosmos-sdk/baseapp" - - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - - "github.com/CosmWasm/wasmd/x/wasm/types" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + baseapp "github.com/line/lbm-sdk/baseapp" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + distributiontypes "github.com/line/lbm-sdk/x/distribution/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + abci "github.com/line/ostracon/abci/types" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/types" ) type QueryHandler struct { - Ctx sdk.Context - Plugins WasmVMQueryHandler - Caller sdk.AccAddress - gasRegister GasRegister + Ctx sdk.Context + Plugins WasmVMQueryHandler + Caller sdk.AccAddress + GasMultiplier GasMultiplier } -func NewQueryHandler(ctx sdk.Context, vmQueryHandler WasmVMQueryHandler, caller sdk.AccAddress, gasRegister GasRegister) QueryHandler { +func NewQueryHandler(ctx sdk.Context, vmQueryHandler WasmVMQueryHandler, caller sdk.AccAddress, gasMultiplier GasMultiplier) QueryHandler { return QueryHandler{ - Ctx: ctx, - Plugins: vmQueryHandler, - Caller: caller, - gasRegister: gasRegister, + Ctx: ctx, + Plugins: vmQueryHandler, + Caller: caller, + GasMultiplier: gasMultiplier, } } @@ -43,7 +42,7 @@ var _ wasmvmtypes.Querier = QueryHandler{} func (q QueryHandler) Query(request wasmvmtypes.QueryRequest, gasLimit uint64) ([]byte, error) { // set a limit for a subCtx - sdkGas := q.gasRegister.FromWasmVMGas(gasLimit) + sdkGas := q.GasMultiplier.FromWasmVMGas(gasLimit) // discard all changes/ events in subCtx by not committing the cached context subCtx, _ := q.Ctx.WithGasMeter(sdk.NewGasMeter(sdkGas)).CacheContext() @@ -104,7 +103,7 @@ func DefaultQueryPlugins( ) QueryPlugins { return QueryPlugins{ Bank: BankQuerier(bank), - Custom: NoCustomQuerier, + Custom: CustomQuerierImpl(queryRouter), IBC: IBCQuerier(wasm, channelKeeper), Staking: StakingQuerier(staking, distKeeper), Stargate: StargateQuerier(queryRouter), @@ -192,9 +191,28 @@ func BankQuerier(bankKeeper types.BankViewKeeper) func(ctx sdk.Context, request return nil, wasmvmtypes.UnsupportedRequest{Kind: "unknown BankQuery variant"} } } +func CustomQuerierImpl(queryRouter GRPCQueryRouter) func(ctx sdk.Context, querierJson json.RawMessage) ([]byte, error) { + return func(ctx sdk.Context, querierJson json.RawMessage) ([]byte, error) { + var linkQueryWrapper types.LinkQueryWrapper + err := json.Unmarshal(querierJson, &linkQueryWrapper) + if err != nil { + return nil, err + } + route := queryRouter.Route(linkQueryWrapper.Path) + if route == nil { + return nil, wasmvmtypes.UnsupportedRequest{Kind: "Unknown encode module"} + } + req := abci.RequestQuery{ + Data: linkQueryWrapper.Data, + Path: linkQueryWrapper.Path, + } + res, err := route(ctx, req) + if err != nil { + return nil, err + } -func NoCustomQuerier(sdk.Context, json.RawMessage) ([]byte, error) { - return nil, wasmvmtypes.UnsupportedRequest{Kind: "custom"} + return res.Value, nil + } } func IBCQuerier(wasm contractMetaDataSource, channelKeeper types.ChannelKeeper) func(ctx sdk.Context, caller sdk.AccAddress, request *wasmvmtypes.IBCQuery) ([]byte, error) { @@ -371,7 +389,8 @@ func sdkToDelegations(ctx sdk.Context, keeper types.StakingKeeper, delegations [ } // shares to amount logic comes from here: - // https://github.com/cosmos/cosmos-sdk/blob/v0.38.3/x/staking/keeper/querier.go#L404 + // x/staking/keeper/querier.go DelegationToDelegationResponse + /// https://github.com/cosmos/cosmos-sdk/blob/3ccf3913f53e2a9ccb4be8429bee32e67669e89a/x/staking/keeper/querier.go#L450 val, found := keeper.GetValidator(ctx, valAddr) if !found { return nil, sdkerrors.Wrap(stakingtypes.ErrNoValidatorFound, "can't load validator for delegation") @@ -406,7 +425,7 @@ func sdkToFullDelegation(ctx sdk.Context, keeper types.StakingKeeper, distKeeper delegationCoins := ConvertSdkCoinToWasmCoin(amount) // FIXME: this is very rough but better than nothing... - // https://github.com/CosmWasm/wasmd/issues/282 + // https://github.com/line/lbm-sdk/issues/225 // if this (val, delegate) pair is receiving a redelegation, it cannot redelegate more // otherwise, it can redelegate the full amount // (there are cases of partial funds redelegated, but this is a start) diff --git a/x/wasm/keeper/query_plugins_test.go b/x/wasm/keeper/query_plugins_test.go index c58932d67e..805df3067b 100644 --- a/x/wasm/keeper/query_plugins_test.go +++ b/x/wasm/keeper/query_plugins_test.go @@ -4,18 +4,18 @@ import ( "encoding/json" "testing" - "github.com/cosmos/cosmos-sdk/store" - dbm "github.com/tendermint/tm-db" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + dbm "github.com/tendermint/tm-db" - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/store" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + "github.com/line/wasmd/x/wasm/types" ) func TestIBCQuerier(t *testing.T) { @@ -316,6 +316,7 @@ func TestIBCQuerier(t *testing.T) { assert.JSONEq(t, spec.expJsonResult, string(gotResult), string(gotResult)) }) } + } func TestBankQuerierBalance(t *testing.T) { @@ -359,13 +360,12 @@ func TestContractInfoWasmQuerier(t *testing.T) { req: &wasmvmtypes.WasmQuery{ ContractInfo: &wasmvmtypes.ContractInfoQuery{ContractAddr: myValidContractAddr}, }, - mock: mockWasmQueryKeeper{ - GetContractInfoFn: func(ctx sdk.Context, contractAddress sdk.AccAddress) *types.ContractInfo { - val := types.ContractInfoFixture(func(i *types.ContractInfo) { - i.Admin, i.Creator, i.IBCPortID = myAdminAddr, myCreatorAddr, "myIBCPort" - }) - return &val - }, + mock: mockWasmQueryKeeper{GetContractInfoFn: func(ctx sdk.Context, contractAddress sdk.AccAddress) *types.ContractInfo { + val := types.ContractInfoFixture(func(i *types.ContractInfo) { + i.Admin, i.Creator, i.IBCPortID = myAdminAddr, myCreatorAddr, "myIBCPort" + }) + return &val + }, IsPinnedCodeFn: func(ctx sdk.Context, codeID uint64) bool { return true }, }, expRes: wasmvmtypes.ContractInfoResponse{ @@ -395,13 +395,12 @@ func TestContractInfoWasmQuerier(t *testing.T) { req: &wasmvmtypes.WasmQuery{ ContractInfo: &wasmvmtypes.ContractInfoQuery{ContractAddr: myValidContractAddr}, }, - mock: mockWasmQueryKeeper{ - GetContractInfoFn: func(ctx sdk.Context, contractAddress sdk.AccAddress) *types.ContractInfo { - val := types.ContractInfoFixture(func(i *types.ContractInfo) { - i.Admin, i.Creator = myAdminAddr, myCreatorAddr - }) - return &val - }, + mock: mockWasmQueryKeeper{GetContractInfoFn: func(ctx sdk.Context, contractAddress sdk.AccAddress) *types.ContractInfo { + val := types.ContractInfoFixture(func(i *types.ContractInfo) { + i.Admin, i.Creator = myAdminAddr, myCreatorAddr + }) + return &val + }, IsPinnedCodeFn: func(ctx sdk.Context, codeID uint64) bool { return false }, }, expRes: wasmvmtypes.ContractInfoResponse{ @@ -415,13 +414,12 @@ func TestContractInfoWasmQuerier(t *testing.T) { req: &wasmvmtypes.WasmQuery{ ContractInfo: &wasmvmtypes.ContractInfoQuery{ContractAddr: myValidContractAddr}, }, - mock: mockWasmQueryKeeper{ - GetContractInfoFn: func(ctx sdk.Context, contractAddress sdk.AccAddress) *types.ContractInfo { - val := types.ContractInfoFixture(func(i *types.ContractInfo) { - i.Creator = myCreatorAddr - }) - return &val - }, + mock: mockWasmQueryKeeper{GetContractInfoFn: func(ctx sdk.Context, contractAddress sdk.AccAddress) *types.ContractInfo { + val := types.ContractInfoFixture(func(i *types.ContractInfo) { + i.Creator = myCreatorAddr + }) + return &val + }, IsPinnedCodeFn: func(ctx sdk.Context, codeID uint64) bool { return true }, }, expRes: wasmvmtypes.ContractInfoResponse{ @@ -468,7 +466,7 @@ func TestQueryErrors(t *testing.T) { return nil, spec.src }) ctx := sdk.Context{}.WithGasMeter(sdk.NewInfiniteGasMeter()).WithMultiStore(store.NewCommitMultiStore(dbm.NewMemDB())) - q := NewQueryHandler(ctx, mock, sdk.AccAddress{}, NewDefaultWasmGasRegister()) + q := NewQueryHandler(ctx, mock, sdk.AccAddress{}, NewGasMultiplier(types.DefaultGasMultiplier)) _, gotErr := q.Query(wasmvmtypes.QueryRequest{}, 1) assert.Equal(t, spec.expErr, gotErr) }) diff --git a/x/wasm/keeper/recurse_test.go b/x/wasm/keeper/recurse_test.go index cfb49e0ac1..96ddcf9232 100644 --- a/x/wasm/keeper/recurse_test.go +++ b/x/wasm/keeper/recurse_test.go @@ -4,14 +4,14 @@ import ( "encoding/json" "testing" - "github.com/CosmWasm/wasmd/x/wasm/types" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" + sdk "github.com/line/lbm-sdk/types" + abci "github.com/line/ostracon/abci/types" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/types" ) type Recurse struct { @@ -45,7 +45,7 @@ func initRecurseContract(t *testing.T) (contract sdk.AccAddress, creator sdk.Acc return realWasmQuerier.HandleQuery(ctx, caller, request) }) } - ctx, keepers := CreateTestInput(t, false, SupportedFeatures, WithQueryHandlerDecorator(countingQuerierDec)) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil, WithQueryHandlerDecorator(countingQuerierDec)) keeper = keepers.WasmKeeper exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) return exampleContract.Contract, exampleContract.CreatorAddr, ctx, keeper @@ -53,12 +53,12 @@ func initRecurseContract(t *testing.T) (contract sdk.AccAddress, creator sdk.Acc func TestGasCostOnQuery(t *testing.T) { const ( - GasNoWork uint64 = 63_958 + GasNoWork uint64 = 63_931 // Note: about 100 SDK gas (10k wasmer gas) for each round of sha256 - GasWork50 uint64 = 64_401 // this is a little shy of 50k gas - to keep an eye on the limit + GasWork50 uint64 = 64_229 // this is a little shy of 50k gas - to keep an eye on the limit - GasReturnUnhashed uint64 = 33 - GasReturnHashed uint64 = 25 + GasReturnUnhashed uint64 = 29 + GasReturnHashed uint64 = 24 ) cases := map[string]struct { @@ -140,7 +140,7 @@ func TestGasCostOnQuery(t *testing.T) { func TestGasOnExternalQuery(t *testing.T) { const ( - GasWork50 uint64 = DefaultInstanceCost + 8_464 + GasWork50 uint64 = types.DefaultInstanceCost + 8_464 ) cases := map[string]struct { @@ -216,9 +216,9 @@ func TestLimitRecursiveQueryGas(t *testing.T) { const ( // Note: about 100 SDK gas (10k wasmer gas) for each round of sha256 - GasWork2k uint64 = 84_236 // = NewContractInstanceCosts + x // we have 6x gas used in cpu than in the instance + GasWork2k uint64 = 78_193 // = NewContractInstanceCosts + x // we have 6x gas used in cpu than in the instance // This is overhead for calling into a sub-contract - GasReturnHashed uint64 = 26 + GasReturnHashed uint64 = 21 ) cases := map[string]struct { @@ -246,18 +246,19 @@ func TestLimitRecursiveQueryGas(t *testing.T) { }, expectQueriesFromContract: 5, // FIXME: why -1 ... confused a bit by calculations, seems like rounding issues - expectedGas: GasWork2k + 5*(GasWork2k+GasReturnHashed) - 1, + expectedGas: GasWork2k + 5*(GasWork2k+GasReturnHashed) + 16, }, // this is where we expect an error... // it has enough gas to run 4 times and die on the 5th (4th time dispatching to sub-contract) // however, if we don't charge the cpu gas before sub-dispatching, we can recurse over 20 times + // TODO: figure out how to asset how deep it went "deep recursion, should die on 5th level": { gasLimit: 400_000, msg: Recurse{ Depth: 50, Work: 2000, }, - expectQueriesFromContract: 4, + expectQueriesFromContract: 5, expectOutOfGas: true, }, "very deep recursion, hits recursion limit": { @@ -269,7 +270,7 @@ func TestLimitRecursiveQueryGas(t *testing.T) { expectQueriesFromContract: 10, expectOutOfGas: false, expectError: "query wasm contract failed", // Error we get from the contract instance doing the failing query, not wasmd - expectedGas: 10*(GasWork2k+GasReturnHashed) - 264, + expectedGas: 10*(GasWork2k+GasReturnHashed) - 216, }, } diff --git a/x/wasm/keeper/reflect_test.go b/x/wasm/keeper/reflect_test.go index 9b81eb6aab..57df48cbd9 100644 --- a/x/wasm/keeper/reflect_test.go +++ b/x/wasm/keeper/reflect_test.go @@ -2,24 +2,25 @@ package keeper import ( "encoding/json" - "io/ioutil" + "os" "strings" "testing" "github.com/golang/protobuf/proto" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/codec" + codectypes "github.com/line/lbm-sdk/codec/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + authkeeper "github.com/line/lbm-sdk/x/auth/keeper" + bankkeeper "github.com/line/lbm-sdk/x/bank/keeper" + banktypes "github.com/line/lbm-sdk/x/bank/types" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/types" ) // ReflectInitMsg is {} @@ -86,7 +87,7 @@ const ReflectFeatures = "staking,mask,stargate" func TestReflectContractSend(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler - ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc))) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil, WithMessageEncoders(reflectEncoders(cdc))) accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -94,14 +95,14 @@ func TestReflectContractSend(t *testing.T) { _, _, bob := keyPubAddr() // upload reflect code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) reflectID, err := keeper.Create(ctx, creator, reflectCode, nil) require.NoError(t, err) require.Equal(t, uint64(1), reflectID) // upload hackatom escrow code - escrowCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + escrowCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) escrowID, err := keeper.Create(ctx, creator, escrowCode, nil) require.NoError(t, err) @@ -167,7 +168,7 @@ func TestReflectContractSend(t *testing.T) { func TestReflectCustomMsg(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler - ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -176,7 +177,7 @@ func TestReflectCustomMsg(t *testing.T) { _, _, fred := keyPubAddr() // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) codeID, err := keeper.Create(ctx, creator, reflectCode, nil) require.NoError(t, err) @@ -260,14 +261,14 @@ func TestReflectCustomMsg(t *testing.T) { func TestMaskReflectCustomQuery(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler - ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) require.NoError(t, err) @@ -310,7 +311,7 @@ func TestMaskReflectCustomQuery(t *testing.T) { func TestReflectStargateQuery(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler - ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) keeper := keepers.WasmKeeper funds := sdk.NewCoins(sdk.NewInt64Coin("denom", 320000)) @@ -319,7 +320,7 @@ func TestReflectStargateQuery(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, funds...) // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) require.NoError(t, err) @@ -355,7 +356,7 @@ func TestReflectStargateQuery(t *testing.T) { func TestReflectInvalidStargateQuery(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler - ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) keeper := keepers.WasmKeeper funds := sdk.NewCoins(sdk.NewInt64Coin("denom", 320000)) @@ -363,7 +364,7 @@ func TestReflectInvalidStargateQuery(t *testing.T) { creator := keepers.Faucet.NewFundedAccount(ctx, funds...) // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) require.NoError(t, err) @@ -415,7 +416,7 @@ func TestReflectInvalidStargateQuery(t *testing.T) { // and another one protoRequest = wasmvmtypes.QueryRequest{ Stargate: &wasmvmtypes.StargateQuery{ - Path: "/cosmos.base.tendermint.v1beta1.Service/GetNodeInfo", + Path: "/lbm.base.ostracon.v1.Service/GetNodeInfo", Data: []byte{}, }, } @@ -436,14 +437,14 @@ type reflectState struct { func TestMaskReflectWasmQueries(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler - ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) // upload reflect code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) reflectID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) require.NoError(t, err) @@ -508,14 +509,14 @@ func TestMaskReflectWasmQueries(t *testing.T) { func TestWasmRawQueryWithNil(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler - ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := keepers.Faucet.NewFundedAccount(ctx, deposit...) // upload reflect code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) reflectID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) require.NoError(t, err) diff --git a/x/wasm/keeper/relay.go b/x/wasm/keeper/relay.go index 5a74ebe2ca..66d4cd6a98 100644 --- a/x/wasm/keeper/relay.go +++ b/x/wasm/keeper/relay.go @@ -3,12 +3,12 @@ package keeper import ( "time" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - "github.com/cosmos/cosmos-sdk/telemetry" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/line/lbm-sdk/telemetry" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + wasmvmtypes "github.com/line/wasmvm/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) var _ types.IBCContractKeeper = (*Keeper)(nil) @@ -35,7 +35,8 @@ func (k Keeper) OnOpenChannel( querier := k.newQueryHandler(ctx, contractAddr) gas := k.runtimeGasForContract(ctx) - res, gasUsed, execErr := k.wasmVM.IBCChannelOpen(codeInfo.CodeHash, env, msg, prefixStore, cosmwasmAPI, querier, ctx.GasMeter(), gas, costJSONDeserialization) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmVM.IBCChannelOpen(codeInfo.CodeHash, env, msg, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) if execErr != nil { return "", sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -70,8 +71,10 @@ func (k Keeper) OnConnectChannel( querier := k.newQueryHandler(ctx, contractAddr) gas := k.runtimeGasForContract(ctx) - res, gasUsed, execErr := k.wasmVM.IBCChannelConnect(codeInfo.CodeHash, env, msg, prefixStore, cosmwasmAPI, querier, ctx.GasMeter(), gas, costJSONDeserialization) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmVM.IBCChannelConnect(codeInfo.CodeHash, env, msg, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) + if execErr != nil { return sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) } @@ -101,8 +104,10 @@ func (k Keeper) OnCloseChannel( querier := k.newQueryHandler(ctx, contractAddr) gas := k.runtimeGasForContract(ctx) - res, gasUsed, execErr := k.wasmVM.IBCChannelClose(codeInfo.CodeHash, params, msg, prefixStore, cosmwasmAPI, querier, ctx.GasMeter(), gas, costJSONDeserialization) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmVM.IBCChannelClose(codeInfo.CodeHash, params, msg, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) + if execErr != nil { return sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) } @@ -131,8 +136,10 @@ func (k Keeper) OnRecvPacket( querier := k.newQueryHandler(ctx, contractAddr) gas := k.runtimeGasForContract(ctx) - res, gasUsed, execErr := k.wasmVM.IBCPacketReceive(codeInfo.CodeHash, env, msg, prefixStore, cosmwasmAPI, querier, ctx.GasMeter(), gas, costJSONDeserialization) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmVM.IBCPacketReceive(codeInfo.CodeHash, env, msg, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) + if execErr != nil { return nil, sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) } @@ -165,8 +172,10 @@ func (k Keeper) OnAckPacket( querier := k.newQueryHandler(ctx, contractAddr) gas := k.runtimeGasForContract(ctx) - res, gasUsed, execErr := k.wasmVM.IBCPacketAck(codeInfo.CodeHash, env, msg, prefixStore, cosmwasmAPI, querier, ctx.GasMeter(), gas, costJSONDeserialization) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmVM.IBCPacketAck(codeInfo.CodeHash, env, msg, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) + if execErr != nil { return sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) } @@ -192,8 +201,10 @@ func (k Keeper) OnTimeoutPacket( querier := k.newQueryHandler(ctx, contractAddr) gas := k.runtimeGasForContract(ctx) - res, gasUsed, execErr := k.wasmVM.IBCPacketTimeout(codeInfo.CodeHash, env, msg, prefixStore, cosmwasmAPI, querier, ctx.GasMeter(), gas, costJSONDeserialization) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmVM.IBCPacketTimeout(codeInfo.CodeHash, env, msg, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) + if execErr != nil { return sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) } diff --git a/x/wasm/keeper/relay_test.go b/x/wasm/keeper/relay_test.go index dd9c3da231..8ec2a2d0dc 100644 --- a/x/wasm/keeper/relay_test.go +++ b/x/wasm/keeper/relay_test.go @@ -6,21 +6,22 @@ import ( "math" "testing" - wasmvm "github.com/CosmWasm/wasmvm" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + wasmvm "github.com/line/wasmvm" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + "github.com/line/wasmd/x/wasm/types" ) func TestOnOpenChannel(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 @@ -38,8 +39,8 @@ func TestOnOpenChannel(t *testing.T) { }, "consume max gas": { contractAddr: example.Contract, - contractGas: math.MaxUint64 / DefaultGasMultiplier, - expGas: math.MaxUint64 / DefaultGasMultiplier, + contractGas: math.MaxUint64 / types.DefaultGasMultiplier, + expGas: math.MaxUint64 / types.DefaultGasMultiplier, }, "consume gas on error": { contractAddr: example.Contract, @@ -58,7 +59,7 @@ func TestOnOpenChannel(t *testing.T) { myMsg := wasmvmtypes.IBCChannelOpenMsg{OpenTry: &wasmvmtypes.IBCOpenTry{Channel: myChannel, CounterpartyVersion: "foo"}} m.IBCChannelOpenFn = func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCChannelOpenMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBC3ChannelOpenResponse, uint64, error) { assert.Equal(t, myMsg, msg) - return &wasmvmtypes.IBC3ChannelOpenResponse{}, spec.contractGas * DefaultGasMultiplier, spec.contractErr + return &wasmvmtypes.IBC3ChannelOpenResponse{}, spec.contractGas * types.DefaultGasMultiplier, spec.contractErr } ctx, _ := parentCtx.CacheContext() @@ -80,7 +81,7 @@ func TestOnOpenChannel(t *testing.T) { } require.NoError(t, err) // verify gas consumed - const storageCosts = sdk.Gas(2903) + const storageCosts = sdk.Gas(2879) assert.Equal(t, spec.expGas, ctx.GasMeter().GasConsumed()-before-storageCosts) }) } @@ -90,7 +91,7 @@ func TestOnConnectChannel(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 @@ -155,7 +156,7 @@ func TestOnConnectChannel(t *testing.T) { myMsg := wasmvmtypes.IBCChannelConnectMsg{OpenConfirm: &wasmvmtypes.IBCOpenConfirm{Channel: myChannel}} m.IBCChannelConnectFn = func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCChannelConnectMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) { assert.Equal(t, msg, myMsg) - return spec.contractResp, myContractGas * DefaultGasMultiplier, spec.contractErr + return spec.contractResp, myContractGas * types.DefaultGasMultiplier, spec.contractErr } ctx, _ := parentCtx.CacheContext() @@ -185,7 +186,7 @@ func TestOnConnectChannel(t *testing.T) { } require.NoError(t, err) // verify gas consumed - const storageCosts = sdk.Gas(2903) + const storageCosts = sdk.Gas(2879) assert.Equal(t, spec.expContractGas, ctx.GasMeter().GasConsumed()-before-storageCosts) // verify msgs dispatched require.Len(t, *capturedMsgs, len(spec.contractResp.Messages)) @@ -201,7 +202,7 @@ func TestOnCloseChannel(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 @@ -266,7 +267,7 @@ func TestOnCloseChannel(t *testing.T) { myMsg := wasmvmtypes.IBCChannelCloseMsg{CloseInit: &wasmvmtypes.IBCCloseInit{Channel: myChannel}} m.IBCChannelCloseFn = func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCChannelCloseMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) { assert.Equal(t, msg, myMsg) - return spec.contractResp, myContractGas * DefaultGasMultiplier, spec.contractErr + return spec.contractResp, myContractGas * types.DefaultGasMultiplier, spec.contractErr } ctx, _ := parentCtx.CacheContext() @@ -295,7 +296,7 @@ func TestOnCloseChannel(t *testing.T) { } require.NoError(t, err) // verify gas consumed - const storageCosts = sdk.Gas(2903) + const storageCosts = sdk.Gas(2879) assert.Equal(t, spec.expContractGas, ctx.GasMeter().GasConsumed()-before-storageCosts) // verify msgs dispatched require.Len(t, *capturedMsgs, len(spec.contractResp.Messages)) @@ -311,10 +312,10 @@ func TestOnRecvPacket(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 - const storageCosts = sdk.Gas(2903) + const storageCosts = sdk.Gas(2879) specs := map[string]struct { contractAddr sdk.AccAddress @@ -423,7 +424,7 @@ func TestOnRecvPacket(t *testing.T) { m.IBCPacketReceiveFn = func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCPacketReceiveMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCReceiveResult, uint64, error) { assert.Equal(t, myPacket, msg.Packet) - return &wasmvmtypes.IBCReceiveResult{Ok: spec.contractResp}, myContractGas * DefaultGasMultiplier, spec.contractErr + return &wasmvmtypes.IBCReceiveResult{Ok: spec.contractResp}, myContractGas * types.DefaultGasMultiplier, spec.contractErr } if spec.mockReplyFn != nil { m.ReplyFn = spec.mockReplyFn @@ -457,7 +458,7 @@ func TestOnRecvPacket(t *testing.T) { require.Equal(t, spec.expAck, gotAck) // verify gas consumed - const storageCosts = sdk.Gas(2903) + const storageCosts = sdk.Gas(2879) assert.Equal(t, spec.expContractGas, ctx.GasMeter().GasConsumed()-before-storageCosts) // verify msgs dispatched require.Len(t, *capturedMsgs, len(spec.contractResp.Messages)) @@ -473,7 +474,7 @@ func TestOnAckPacket(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 @@ -537,7 +538,7 @@ func TestOnAckPacket(t *testing.T) { myAck := wasmvmtypes.IBCPacketAckMsg{Acknowledgement: wasmvmtypes.IBCAcknowledgement{Data: []byte("myAck")}} m.IBCPacketAckFn = func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCPacketAckMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) { assert.Equal(t, myAck, msg) - return spec.contractResp, myContractGas * DefaultGasMultiplier, spec.contractErr + return spec.contractResp, myContractGas * types.DefaultGasMultiplier, spec.contractErr } ctx, _ := parentCtx.CacheContext() @@ -562,7 +563,7 @@ func TestOnAckPacket(t *testing.T) { } require.NoError(t, err) // verify gas consumed - const storageCosts = sdk.Gas(2903) + const storageCosts = sdk.Gas(2879) assert.Equal(t, spec.expContractGas, ctx.GasMeter().GasConsumed()-before-storageCosts) // verify msgs dispatched require.Len(t, *capturedMsgs, len(spec.contractResp.Messages)) @@ -578,7 +579,7 @@ func TestOnTimeoutPacket(t *testing.T) { var m wasmtesting.MockWasmer wasmtesting.MakeIBCInstantiable(&m) messenger := &wasmtesting.MockMessageHandler{} - parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, WithMessageHandler(messenger)) + parentCtx, keepers := CreateTestInput(t, false, SupportedFeatures, nil, nil, WithMessageHandler(messenger)) example := SeedNewContractInstance(t, parentCtx, keepers, &m) const myContractGas = 40 @@ -657,7 +658,7 @@ func TestOnTimeoutPacket(t *testing.T) { myPacket := wasmvmtypes.IBCPacket{Data: []byte("my test packet")} m.IBCPacketTimeoutFn = func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCPacketTimeoutMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) { assert.Equal(t, myPacket, msg.Packet) - return spec.contractResp, myContractGas * DefaultGasMultiplier, spec.contractErr + return spec.contractResp, myContractGas * types.DefaultGasMultiplier, spec.contractErr } ctx, _ := parentCtx.CacheContext() @@ -682,7 +683,7 @@ func TestOnTimeoutPacket(t *testing.T) { } require.NoError(t, err) // verify gas consumed - const storageCosts = sdk.Gas(2903) + const storageCosts = sdk.Gas(2879) assert.Equal(t, spec.expContractGas, ctx.GasMeter().GasConsumed()-before-storageCosts) // verify msgs dispatched require.Len(t, *capturedMsgs, len(spec.contractResp.Messages)) diff --git a/x/wasm/keeper/snapshotter.go b/x/wasm/keeper/snapshotter.go index a781cb07a3..b6e7ec8917 100644 --- a/x/wasm/keeper/snapshotter.go +++ b/x/wasm/keeper/snapshotter.go @@ -4,15 +4,16 @@ import ( "encoding/hex" "io" - snapshot "github.com/cosmos/cosmos-sdk/snapshots/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" protoio "github.com/gogo/protobuf/io" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - "github.com/CosmWasm/wasmd/x/wasm/ioutils" - "github.com/CosmWasm/wasmd/x/wasm/types" + snapshot "github.com/line/lbm-sdk/snapshots/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + "github.com/line/ostracon/libs/log" + ocproto "github.com/line/ostracon/proto/ostracon/types" + + "github.com/line/wasmd/x/wasm/ioutils" + "github.com/line/wasmd/x/wasm/types" ) var _ snapshot.ExtensionSnapshotter = &WasmSnapshotter{} @@ -51,7 +52,7 @@ func (ws *WasmSnapshotter) Snapshot(height uint64, protoWriter protoio.Writer) e return err } - ctx := sdk.NewContext(cacheMS, tmproto.Header{}, false, log.NewNopLogger()) + ctx := sdk.NewContext(cacheMS, ocproto.Header{}, false, log.NewNopLogger()) seenBefore := make(map[string]bool) var rerr error @@ -123,7 +124,7 @@ func (ws *WasmSnapshotter) processAllItems( cb func(sdk.Context, *Keeper, []byte) error, finalize func(sdk.Context, *Keeper) error, ) (snapshot.SnapshotItem, error) { - ctx := sdk.NewContext(ws.cms, tmproto.Header{Height: int64(height)}, false, log.NewNopLogger()) + ctx := sdk.NewContext(ws.cms, ocproto.Header{Height: int64(height)}, false, log.NewNopLogger()) // keep the last item here... if we break, it will either be empty (if we hit io.EOF) // or contain the last item (if we hit payload == nil) diff --git a/x/wasm/keeper/snapshotter_integration_test.go b/x/wasm/keeper/snapshotter_integration_test.go index 49f2ca6baf..d5afa072e5 100644 --- a/x/wasm/keeper/snapshotter_integration_test.go +++ b/x/wasm/keeper/snapshotter_integration_test.go @@ -2,25 +2,24 @@ package keeper_test import ( "crypto/sha256" - "io/ioutil" + "os" "testing" "time" - "github.com/CosmWasm/wasmd/x/wasm/types" - "github.com/stretchr/testify/assert" - - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/stretchr/testify/require" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmtypes "github.com/tendermint/tendermint/types" - "github.com/CosmWasm/wasmd/app" - "github.com/CosmWasm/wasmd/x/wasm/keeper" + cryptocodec "github.com/line/lbm-sdk/crypto/codec" + "github.com/line/lbm-sdk/crypto/keys/ed25519" + sdk "github.com/line/lbm-sdk/types" + authtypes "github.com/line/lbm-sdk/x/auth/types" + banktypes "github.com/line/lbm-sdk/x/bank/types" + ocproto "github.com/line/ostracon/proto/ostracon/types" + octypes "github.com/line/ostracon/types" + + "github.com/line/wasmd/app" + "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/types" ) func TestSnapshotter(t *testing.T) { @@ -43,7 +42,7 @@ func TestSnapshotter(t *testing.T) { srcWasmApp, genesisAddr := newWasmExampleApp(t) // store wasm codes on chain - ctx := srcWasmApp.NewUncachedContext(false, tmproto.Header{ + ctx := srcWasmApp.NewUncachedContext(false, ocproto.Header{ ChainID: "foo", Height: srcWasmApp.LastBlockHeight() + 1, Time: time.Now(), @@ -53,7 +52,7 @@ func TestSnapshotter(t *testing.T) { srcCodeIDToChecksum := make(map[uint64][]byte, len(spec.wasmFiles)) for i, v := range spec.wasmFiles { - wasmCode, err := ioutil.ReadFile(v) + wasmCode, err := os.ReadFile(v) require.NoError(t, err) codeID, err := contractKeeper.Create(ctx, genesisAddr, wasmCode, nil) require.NoError(t, err) @@ -83,7 +82,7 @@ func TestSnapshotter(t *testing.T) { // then all wasm contracts are imported wasmKeeper = app.NewTestSupport(t, destWasmApp).WasmKeeper() - ctx = destWasmApp.NewUncachedContext(false, tmproto.Header{ + ctx = destWasmApp.NewUncachedContext(false, ocproto.Header{ ChainID: "foo", Height: destWasmApp.LastBlockHeight() + 1, Time: time.Now(), @@ -105,7 +104,7 @@ func TestSnapshotter(t *testing.T) { func newWasmExampleApp(t *testing.T) (*app.WasmApp, sdk.AccAddress) { senderPrivKey := ed25519.GenPrivKey() - pubKey, err := cryptocodec.ToTmPubKeyInterface(senderPrivKey.PubKey()) + pubKey, err := cryptocodec.ToOcPubKeyInterface(senderPrivKey.PubKey()) require.NoError(t, err) senderAddr := senderPrivKey.PubKey().Address().Bytes() @@ -117,8 +116,8 @@ func newWasmExampleApp(t *testing.T) (*app.WasmApp, sdk.AccAddress) { Address: acc.GetAddress().String(), Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, amount)), } - validator := tmtypes.NewValidator(pubKey, 1) - valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) + validator := octypes.NewValidator(pubKey, 1) + valSet := octypes.NewValidatorSet([]*octypes.Validator{validator}) wasmApp := app.SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, nil, balance) return wasmApp, senderAddr diff --git a/x/wasm/keeper/staking_test.go b/x/wasm/keeper/staking_test.go index 5265be597d..244d550e6a 100644 --- a/x/wasm/keeper/staking_test.go +++ b/x/wasm/keeper/staking_test.go @@ -2,25 +2,26 @@ package keeper import ( "encoding/json" - "io/ioutil" + "os" "testing" - wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - sdk "github.com/cosmos/cosmos-sdk/types" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - "github.com/cosmos/cosmos-sdk/x/staking" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - "github.com/cosmos/cosmos-sdk/x/staking/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + codectypes "github.com/line/lbm-sdk/codec/types" + "github.com/line/lbm-sdk/crypto/keys/secp256k1" + sdk "github.com/line/lbm-sdk/types" + authkeeper "github.com/line/lbm-sdk/x/auth/keeper" + bankkeeper "github.com/line/lbm-sdk/x/bank/keeper" + distributionkeeper "github.com/line/lbm-sdk/x/distribution/keeper" + distributiontypes "github.com/line/lbm-sdk/x/distribution/types" + "github.com/line/lbm-sdk/x/staking" + stakingkeeper "github.com/line/lbm-sdk/x/staking/keeper" + "github.com/line/lbm-sdk/x/staking/types" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + wasmvmtypes "github.com/line/wasmvm/types" + + wasmtypes "github.com/line/wasmd/x/wasm/types" ) type StakingInitMsg struct { @@ -92,7 +93,7 @@ type InvestmentResponse struct { } func TestInitializeStaking(t *testing.T) { - ctx, k := CreateTestInput(t, false, SupportedFeatures) + ctx, k := CreateTestInput(t, false, SupportedFeatures, nil, nil) accKeeper, stakingKeeper, keeper, bankKeeper := k.AccountKeeper, k.StakingKeeper, k.ContractKeeper, k.BankKeeper valAddr := addValidator(t, ctx, stakingKeeper, k.Faucet, sdk.NewInt64Coin("stake", 1234567)) @@ -105,7 +106,7 @@ func TestInitializeStaking(t *testing.T) { creator := k.Faucet.NewFundedAccount(ctx, deposit...) // upload staking derivates code - stakingCode, err := ioutil.ReadFile("./testdata/staking.wasm") + stakingCode, err := os.ReadFile("./testdata/staking.wasm") require.NoError(t, err) stakingID, err := keeper.Create(ctx, creator, stakingCode, nil) require.NoError(t, err) @@ -167,7 +168,7 @@ type initInfo struct { } func initializeStaking(t *testing.T) initInfo { - ctx, k := CreateTestInput(t, false, SupportedFeatures) + ctx, k := CreateTestInput(t, false, SupportedFeatures, nil, nil) accKeeper, stakingKeeper, keeper, bankKeeper := k.AccountKeeper, k.StakingKeeper, k.WasmKeeper, k.BankKeeper valAddr := addValidator(t, ctx, stakingKeeper, k.Faucet, sdk.NewInt64Coin("stake", 1000000)) @@ -188,7 +189,7 @@ func initializeStaking(t *testing.T) initInfo { creator := k.Faucet.NewFundedAccount(ctx, deposit...) // upload staking derivates code - stakingCode, err := ioutil.ReadFile("./testdata/staking.wasm") + stakingCode, err := os.ReadFile("./testdata/staking.wasm") require.NoError(t, err) stakingID, err := k.ContractKeeper.Create(ctx, creator, stakingCode, nil) require.NoError(t, err) @@ -446,7 +447,7 @@ func TestQueryStakingInfo(t *testing.T) { creator := initInfo.faucet.NewFundedAccount(ctx, deposit...) // upload mask code - maskCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + maskCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) maskID, err := initInfo.contractKeeper.Create(ctx, creator, maskCode, nil) require.NoError(t, err) diff --git a/x/wasm/keeper/submsg_test.go b/x/wasm/keeper/submsg_test.go index 7d83c8ffcd..856f1b26bb 100644 --- a/x/wasm/keeper/submsg_test.go +++ b/x/wasm/keeper/submsg_test.go @@ -3,24 +3,24 @@ package keeper import ( "encoding/json" "fmt" - "io/ioutil" + "os" "strconv" "testing" - "github.com/CosmWasm/wasmd/x/wasm/types" - "github.com/stretchr/testify/assert" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" + + sdk "github.com/line/lbm-sdk/types" + wasmvmtypes "github.com/line/wasmvm/types" + + "github.com/line/wasmd/x/wasm/types" ) // test handing of submessages, very closely related to the reflect_test // Try a simple send, no gas limit to for a sanity check before trying table tests func TestDispatchSubMsgSuccessCase(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, ReflectFeatures) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil) accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -31,7 +31,7 @@ func TestDispatchSubMsgSuccessCase(t *testing.T) { _, _, fred := keyPubAddr() // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) require.NoError(t, err) @@ -114,7 +114,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { subGasLimit := uint64(300_000) // prep - create one chain and upload the code - ctx, keepers := CreateTestInput(t, false, ReflectFeatures) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil) ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) ctx = ctx.WithBlockGasMeter(sdk.NewInfiniteGasMeter()) keeper := keepers.WasmKeeper @@ -122,13 +122,13 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { uploader := keepers.Faucet.NewFundedAccount(ctx, contractStart.Add(contractStart...)...) // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) reflectID, err := keepers.ContractKeeper.Create(ctx, uploader, reflectCode, nil) require.NoError(t, err) // create hackatom contract for testing (for infinite loop) - hackatomCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") + hackatomCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) hackatomID, err := keepers.ContractKeeper.Create(ctx, uploader, hackatomCode, nil) require.NoError(t, err) @@ -247,14 +247,14 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { "send tokens": { submsgID: 5, msg: validBankSend, - resultAssertions: []assertion{assertReturnedEvents(3), assertGasUsed(112000, 112900)}, + resultAssertions: []assertion{assertReturnedEvents(3), assertGasUsed(111000, 113100)}, }, "not enough tokens": { submsgID: 6, msg: invalidBankSend, subMsgError: true, // uses less gas than the send tokens (cost of bank transfer) - resultAssertions: []assertion{assertGasUsed(76000, 79000), assertErrorString("codespace: sdk, code: 5")}, + resultAssertions: []assertion{assertGasUsed(76000, 77000), assertErrorString("codespace: sdk, code: 5")}, }, "out of gas panic with no gas limit": { submsgID: 7, @@ -267,7 +267,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { msg: validBankSend, gasLimit: &subGasLimit, // uses same gas as call without limit (note we do not charge the 40k on reply) - resultAssertions: []assertion{assertReturnedEvents(3), assertGasUsed(112000, 113000)}, + resultAssertions: []assertion{assertReturnedEvents(3), assertGasUsed(111400, 111500)}, }, "not enough tokens with limit": { submsgID: 16, @@ -275,7 +275,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { subMsgError: true, gasLimit: &subGasLimit, // uses same gas as call without limit (note we do not charge the 40k on reply) - resultAssertions: []assertion{assertGasUsed(77800, 77900), assertErrorString("codespace: sdk, code: 5")}, + resultAssertions: []assertion{assertGasUsed(76000, 77000), assertErrorString("codespace: sdk, code: 5")}, }, "out of gas caught with gas limit": { submsgID: 17, @@ -283,7 +283,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { subMsgError: true, gasLimit: &subGasLimit, // uses all the subGasLimit, plus the 52k or so for the main contract - resultAssertions: []assertion{assertGasUsed(subGasLimit+73000, subGasLimit+74000), assertErrorString("codespace: sdk, code: 11")}, + resultAssertions: []assertion{assertGasUsed(subGasLimit+74000, subGasLimit+75000), assertErrorString("codespace: sdk, code: 11")}, }, "instantiate contract gets address in data and events": { submsgID: 21, @@ -371,7 +371,7 @@ func TestDispatchSubMsgEncodeToNoSdkMsg(t *testing.T) { Bank: nilEncoder, } - ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageHandler(NewSDKMessageHandler(nil, customEncoders))) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil, WithMessageHandler(NewSDKMessageHandler(nil, customEncoders))) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -381,7 +381,7 @@ func TestDispatchSubMsgEncodeToNoSdkMsg(t *testing.T) { _, _, fred := keyPubAddr() // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) require.NoError(t, err) @@ -439,7 +439,7 @@ func TestDispatchSubMsgEncodeToNoSdkMsg(t *testing.T) { // Try a simple send, no gas limit to for a sanity check before trying table tests func TestDispatchSubMsgConditionalReplyOn(t *testing.T) { - ctx, keepers := CreateTestInput(t, false, ReflectFeatures) + ctx, keepers := CreateTestInput(t, false, ReflectFeatures, nil, nil) keeper := keepers.WasmKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) @@ -449,7 +449,7 @@ func TestDispatchSubMsgConditionalReplyOn(t *testing.T) { _, _, fred := keyPubAddr() // upload code - reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + reflectCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, nil) require.NoError(t, err) diff --git a/x/wasm/keeper/test_common.go b/x/wasm/keeper/test_common.go index 29e47ab42d..f704a34f1a 100644 --- a/x/wasm/keeper/test_common.go +++ b/x/wasm/keeper/test_common.go @@ -4,72 +4,75 @@ import ( "encoding/binary" "encoding/json" "fmt" - "io/ioutil" + "os" "testing" "time" - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/std" - "github.com/cosmos/cosmos-sdk/store" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/auth" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - "github.com/cosmos/cosmos-sdk/x/bank" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/capability" - capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - "github.com/cosmos/cosmos-sdk/x/crisis" - crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" - "github.com/cosmos/cosmos-sdk/x/distribution" - distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" - distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - "github.com/cosmos/cosmos-sdk/x/evidence" - evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - "github.com/cosmos/cosmos-sdk/x/feegrant" - "github.com/cosmos/cosmos-sdk/x/gov" - govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/cosmos/cosmos-sdk/x/mint" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - "github.com/cosmos/cosmos-sdk/x/params" - paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" - paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - "github.com/cosmos/cosmos-sdk/x/slashing" - slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - "github.com/cosmos/cosmos-sdk/x/staking" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/cosmos-sdk/x/upgrade" - upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" - upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/ibc-go/v3/modules/apps/transfer" - ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v3/modules/core" - ibchost "github.com/cosmos/ibc-go/v3/modules/core/24-host" - ibckeeper "github.com/cosmos/ibc-go/v3/modules/core/keeper" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/libs/log" - "github.com/tendermint/tendermint/libs/rand" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" - wasmappparams "github.com/CosmWasm/wasmd/app/params" - - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/baseapp" + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/std" + "github.com/line/lbm-sdk/store" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + "github.com/line/lbm-sdk/types/module" + "github.com/line/lbm-sdk/x/auth" + authkeeper "github.com/line/lbm-sdk/x/auth/keeper" + authtypes "github.com/line/lbm-sdk/x/auth/types" + authzkeeper "github.com/line/lbm-sdk/x/authz/keeper" + "github.com/line/lbm-sdk/x/bank" + bankkeeper "github.com/line/lbm-sdk/x/bank/keeper" + banktypes "github.com/line/lbm-sdk/x/bank/types" + "github.com/line/lbm-sdk/x/bankplus" + bankpluskeeper "github.com/line/lbm-sdk/x/bankplus/keeper" + "github.com/line/lbm-sdk/x/capability" + capabilitykeeper "github.com/line/lbm-sdk/x/capability/keeper" + capabilitytypes "github.com/line/lbm-sdk/x/capability/types" + "github.com/line/lbm-sdk/x/crisis" + crisistypes "github.com/line/lbm-sdk/x/crisis/types" + "github.com/line/lbm-sdk/x/distribution" + distrclient "github.com/line/lbm-sdk/x/distribution/client" + distributionkeeper "github.com/line/lbm-sdk/x/distribution/keeper" + distributiontypes "github.com/line/lbm-sdk/x/distribution/types" + "github.com/line/lbm-sdk/x/evidence" + evidencetypes "github.com/line/lbm-sdk/x/evidence/types" + "github.com/line/lbm-sdk/x/feegrant" + "github.com/line/lbm-sdk/x/gov" + govkeeper "github.com/line/lbm-sdk/x/gov/keeper" + govtypes "github.com/line/lbm-sdk/x/gov/types" + "github.com/line/lbm-sdk/x/ibc/applications/transfer" + ibctransfertypes "github.com/line/lbm-sdk/x/ibc/applications/transfer/types" + ibc "github.com/line/lbm-sdk/x/ibc/core" + ibchost "github.com/line/lbm-sdk/x/ibc/core/24-host" + ibckeeper "github.com/line/lbm-sdk/x/ibc/core/keeper" + "github.com/line/lbm-sdk/x/mint" + minttypes "github.com/line/lbm-sdk/x/mint/types" + "github.com/line/lbm-sdk/x/params" + paramsclient "github.com/line/lbm-sdk/x/params/client" + paramskeeper "github.com/line/lbm-sdk/x/params/keeper" + paramstypes "github.com/line/lbm-sdk/x/params/types" + paramproposal "github.com/line/lbm-sdk/x/params/types/proposal" + "github.com/line/lbm-sdk/x/slashing" + slashingtypes "github.com/line/lbm-sdk/x/slashing/types" + "github.com/line/lbm-sdk/x/staking" + stakingkeeper "github.com/line/lbm-sdk/x/staking/keeper" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" + "github.com/line/lbm-sdk/x/upgrade" + upgradeclient "github.com/line/lbm-sdk/x/upgrade/client" + upgradekeeper "github.com/line/lbm-sdk/x/upgrade/keeper" + upgradetypes "github.com/line/lbm-sdk/x/upgrade/types" + "github.com/line/ostracon/crypto" + "github.com/line/ostracon/crypto/ed25519" + "github.com/line/ostracon/libs/log" + "github.com/line/ostracon/libs/rand" + ocproto "github.com/line/ostracon/proto/ostracon/types" + + wasmappparams "github.com/line/wasmd/app/params" + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/types" ) var ModuleBasics = module.NewBasicManager( @@ -106,8 +109,8 @@ func MakeEncodingConfig(_ testing.TB) wasmappparams.EncodingConfig { ModuleBasics.RegisterLegacyAminoCodec(amino) ModuleBasics.RegisterInterfaces(interfaceRegistry) // add wasmd types - types.RegisterInterfaces(interfaceRegistry) - types.RegisterLegacyAminoCodec(amino) + lbmtypes.RegisterInterfaces(interfaceRegistry) + lbmtypes.RegisterLegacyAminoCodec(amino) return encodingConfig } @@ -183,13 +186,13 @@ type TestKeepers struct { // CreateDefaultTestInput common settings for CreateTestInput func CreateDefaultTestInput(t testing.TB) (sdk.Context, TestKeepers) { - return CreateTestInput(t, false, "staking") + return CreateTestInput(t, false, "staking", nil, nil) } // CreateTestInput encoders can be nil to accept the defaults, or set it to override some of the message handlers (like default) -func CreateTestInput(t testing.TB, isCheckTx bool, supportedFeatures string, opts ...Option) (sdk.Context, TestKeepers) { +func CreateTestInput(t testing.TB, isCheckTx bool, supportedFeatures string, encoders *MessageEncoders, queriers *QueryPlugins, opts ...Option) (sdk.Context, TestKeepers) { // Load default wasm config - return createTestInput(t, isCheckTx, supportedFeatures, types.DefaultWasmConfig(), dbm.NewMemDB(), opts...) + return createTestInput(t, isCheckTx, supportedFeatures, encoders, queriers, types.DefaultWasmConfig(), dbm.NewMemDB(), opts...) } // encoders can be nil to accept the defaults, or set it to override some of the message handlers (like default) @@ -197,6 +200,8 @@ func createTestInput( t testing.TB, isCheckTx bool, supportedFeatures string, + encoders *MessageEncoders, + queriers *QueryPlugins, wasmConfig types.WasmConfig, db dbm.DB, opts ...Option, @@ -227,7 +232,7 @@ func createTestInput( require.NoError(t, ms.LoadLatestVersion()) - ctx := sdk.NewContext(ms, tmproto.Header{ + ctx := sdk.NewContext(ms, ocproto.Header{ Height: 1234567, Time: time.Date(2020, time.April, 22, 12, 0, 0, 0, time.UTC), }, isCheckTx, log.NewNopLogger()) @@ -285,7 +290,7 @@ func createTestInput( blockedAddrs[authtypes.NewModuleAddress(acc).String()] = true } - bankKeeper := bankkeeper.NewBaseKeeper( + bankKeeper := bankpluskeeper.NewBaseKeeper( appCodec, keys[banktypes.StoreKey], accountKeeper, @@ -330,7 +335,7 @@ func createTestInput( faucet := NewTestFaucet(t, ctx, bankKeeper, minttypes.ModuleName, sdk.NewCoin("stake", sdk.NewInt(100_000_000_000))) // set some funds ot pay out validatores, based on code from: - // https://github.com/cosmos/cosmos-sdk/blob/fea231556aee4d549d7551a6190389c4328194eb/x/distribution/keeper/keeper_test.go#L50-L57 + // https://github.com/line/lbm-sdk/blob/95b22d3a685f7eb531198e0023ef06873835e632/x/distribution/keeper/keeper_test.go#L49-L56 distrAcc := distKeeper.GetDistributionAccount(ctx) faucet.Fund(ctx, distrAcc.GetAddress(), sdk.NewCoin("stake", sdk.NewInt(2000000))) accountKeeper.SetModuleAccount(ctx, distrAcc) @@ -385,6 +390,8 @@ func createTestInput( tempDir, wasmConfig, supportedFeatures, + encoders, + queriers, opts..., ) keeper.SetParams(ctx, types.DefaultParams()) @@ -393,7 +400,7 @@ func createTestInput( router.AddRoute(sdk.NewRoute(types.RouterKey, TestHandler(contractKeeper))) am := module.NewManager( // minimal module set that we use for message/ query tests - bank.NewAppModule(appCodec, bankKeeper, accountKeeper), + bankplus.NewAppModule(appCodec, bankKeeper, accountKeeper), staking.NewAppModule(appCodec, stakingKeeper, accountKeeper, bankKeeper), distribution.NewAppModule(appCodec, distKeeper, accountKeeper, bankKeeper, stakingKeeper), ) @@ -405,7 +412,7 @@ func createTestInput( AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(paramsKeeper)). AddRoute(distributiontypes.RouterKey, distribution.NewCommunityPoolSpendProposalHandler(distKeeper)). - AddRoute(types.RouterKey, NewWasmProposalHandler(&keeper, types.EnableAllProposals)) + AddRoute(types.RouterKey, NewWasmProposalHandler(&keeper, lbmtypes.EnableAllProposals)) govKeeper := govkeeper.NewKeeper( appCodec, @@ -545,7 +552,7 @@ func StoreIBCReflectContract(t testing.TB, ctx sdk.Context, keepers TestKeepers) } func StoreReflectContract(t testing.TB, ctx sdk.Context, keepers TestKeepers) uint64 { - wasmCode, err := ioutil.ReadFile("./testdata/reflect.wasm") + wasmCode, err := os.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) _, _, creatorAddr := keyPubAddr() @@ -559,7 +566,7 @@ func StoreExampleContract(t testing.TB, ctx sdk.Context, keepers TestKeepers, wa creator, _, creatorAddr := keyPubAddr() fundAccounts(t, ctx, keepers.AccountKeeper, keepers.BankKeeper, creatorAddr, anyAmount) - wasmCode, err := ioutil.ReadFile(wasmFile) + wasmCode, err := os.ReadFile(wasmFile) require.NoError(t, err) codeID, err := keepers.ContractKeeper.Create(ctx, creatorAddr, wasmCode, nil) @@ -713,6 +720,8 @@ var keyCounter uint64 // we need to make this deterministic (same every test run), as encoded address size and thus gas cost, // depends on the actual bytes (due to ugly CanonicalAddress encoding) +// +//nolint:unparam func keyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { keyCounter++ seed := make([]byte, 8) diff --git a/x/wasm/keeper/test_fuzz.go b/x/wasm/keeper/test_fuzz.go index d6a2ce870d..19b86272b8 100644 --- a/x/wasm/keeper/test_fuzz.go +++ b/x/wasm/keeper/test_fuzz.go @@ -3,11 +3,12 @@ package keeper import ( "encoding/json" - sdk "github.com/cosmos/cosmos-sdk/types" fuzz "github.com/google/gofuzz" - tmBytes "github.com/tendermint/tendermint/libs/bytes" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + tmBytes "github.com/line/ostracon/libs/bytes" + + "github.com/line/wasmd/x/wasm/types" ) var ModelFuzzers = []interface{}{FuzzAddr, FuzzAddrString, FuzzAbsoluteTxPosition, FuzzContractInfo, FuzzStateModel, FuzzAccessType, FuzzAccessConfig, FuzzContractCodeHistory} diff --git a/x/wasm/keeper/testdata/burner.wasm b/x/wasm/keeper/testdata/burner.wasm index 4e65059f7c44782d3c97612f7f8414c7371b527a..0e98d677dfc41442fd6e7c46b33a4b4b75398841 100644 GIT binary patch literal 127056 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

p84TO=eIQtp6zxsI`ca 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.txt \ No newline at end of file +echo "$tag" >version.txt diff --git a/x/wasm/keeper/testdata/hackatom.wasm b/x/wasm/keeper/testdata/hackatom.wasm index 183eef304c9de413a24884ec6611ee0d13434fae..cd608004d9c2ef188ba22a4299e05629f2a8b4b0 100644 GIT binary patch literal 216295 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%0Ae~4fwq<~}s+LIVGj#gt^ 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

(J?i00oLJzEP|M)dX1g?`kZS!@SeGAvudou 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 literal 208805 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

}GU#h*Z)$o|;7eU!8k$7&m@*^f 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 D^F!=F diff --git a/x/wasm/keeper/testdata/hackatom.wasm.gzip b/x/wasm/keeper/testdata/hackatom.wasm.gzip index 29b10c7d57cb0530d07f01496e5649842ce01d75..5ad6d7fb6f4949d51418842070ed5e7a18e9a161 100644 GIT binary patch literal 78110 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%0A4d9R|u1j%o^zKJe>u!|;+ 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 diff --git a/x/wasm/keeper/testdata/ibc_reflect.wasm b/x/wasm/keeper/testdata/ibc_reflect.wasm index ec1739d898d9ef679373ae57d99e7fd421296c62..0dddf5c1e0afb6170bd15690f0d459ae01bfa43d 100644 GIT binary patch literal 264774 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

NE4~|Qy`WA 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�#v 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 literal 262794 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

04Lg}KJvZxIWL~dWU3aQjL16YDv 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 diff --git a/x/wasm/keeper/testdata/staking.wasm b/x/wasm/keeper/testdata/staking.wasm index d73c1b19a8581ca890ea546b910ef0123b8c7a93..0e78257da9932bcc619c61a2265c0401d7cedb74 100644 GIT binary patch literal 229214 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%0D+=%E-vP|se1A#p* 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 diff --git a/x/wasm/keeper/testdata/version.txt b/x/wasm/keeper/testdata/version.txt index 820bf4362b..f8e5462831 100644 --- a/x/wasm/keeper/testdata/version.txt +++ b/x/wasm/keeper/testdata/version.txt @@ -1 +1 @@ -v1.0.0-beta +v1.0.0-0.6.0 diff --git a/x/wasm/keeper/wasmtesting/coin_transferrer.go b/x/wasm/keeper/wasmtesting/coin_transferrer.go index 497ecc747f..4164ee4046 100644 --- a/x/wasm/keeper/wasmtesting/coin_transferrer.go +++ b/x/wasm/keeper/wasmtesting/coin_transferrer.go @@ -1,11 +1,21 @@ package wasmtesting -import sdk "github.com/cosmos/cosmos-sdk/types" +import ( + sdk "github.com/line/lbm-sdk/types" +) type MockCoinTransferrer struct { TransferCoinsFn func(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error } +func (m *MockCoinTransferrer) AddToInactiveAddr(ctx sdk.Context, address sdk.AccAddress) { + panic("implement me") +} + +func (m *MockCoinTransferrer) DeleteFromInactiveAddr(ctx sdk.Context, address sdk.AccAddress) { + panic("implement me") +} + func (m *MockCoinTransferrer) TransferCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error { if m.TransferCoinsFn == nil { panic("not expected to be called") diff --git a/x/wasm/keeper/wasmtesting/gas_register.go b/x/wasm/keeper/wasmtesting/gas_register.go deleted file mode 100644 index 1c1a319ba0..0000000000 --- a/x/wasm/keeper/wasmtesting/gas_register.go +++ /dev/null @@ -1,66 +0,0 @@ -package wasmtesting - -import ( - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// MockGasRegister mock that implements keeper.GasRegister -type MockGasRegister struct { - CompileCostFn func(byteLength int) sdk.Gas - NewContractInstanceCostFn func(pinned bool, msgLen int) sdk.Gas - InstantiateContractCostFn func(pinned bool, msgLen int) sdk.Gas - ReplyCostFn func(pinned bool, reply wasmvmtypes.Reply) sdk.Gas - EventCostsFn func(evts []wasmvmtypes.EventAttribute) sdk.Gas - ToWasmVMGasFn func(source sdk.Gas) uint64 - FromWasmVMGasFn func(source uint64) sdk.Gas -} - -func (m MockGasRegister) NewContractInstanceCosts(pinned bool, msgLen int) sdk.Gas { - if m.NewContractInstanceCostFn == nil { - panic("not expected to be called") - } - return m.NewContractInstanceCostFn(pinned, msgLen) -} - -func (m MockGasRegister) CompileCosts(byteLength int) sdk.Gas { - if m.CompileCostFn == nil { - panic("not expected to be called") - } - return m.CompileCostFn(byteLength) -} - -func (m MockGasRegister) InstantiateContractCosts(pinned bool, msgLen int) sdk.Gas { - if m.InstantiateContractCostFn == nil { - panic("not expected to be called") - } - return m.InstantiateContractCostFn(pinned, msgLen) -} - -func (m MockGasRegister) ReplyCosts(pinned bool, reply wasmvmtypes.Reply) sdk.Gas { - if m.ReplyCostFn == nil { - panic("not expected to be called") - } - return m.ReplyCostFn(pinned, reply) -} - -func (m MockGasRegister) EventCosts(evts []wasmvmtypes.EventAttribute, events wasmvmtypes.Events) sdk.Gas { - if m.EventCostsFn == nil { - panic("not expected to be called") - } - return m.EventCostsFn(evts) -} - -func (m MockGasRegister) ToWasmVMGas(source sdk.Gas) uint64 { - if m.ToWasmVMGasFn == nil { - panic("not expected to be called") - } - return m.ToWasmVMGasFn(source) -} - -func (m MockGasRegister) FromWasmVMGas(source uint64) sdk.Gas { - if m.FromWasmVMGasFn == nil { - panic("not expected to be called") - } - return m.FromWasmVMGasFn(source) -} diff --git a/x/wasm/keeper/wasmtesting/message_router.go b/x/wasm/keeper/wasmtesting/message_router.go index 712e012d4e..74d77e6c4f 100644 --- a/x/wasm/keeper/wasmtesting/message_router.go +++ b/x/wasm/keeper/wasmtesting/message_router.go @@ -1,8 +1,8 @@ package wasmtesting import ( - "github.com/cosmos/cosmos-sdk/baseapp" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/line/lbm-sdk/baseapp" + sdk "github.com/line/lbm-sdk/types" ) // MockMessageRouter mock for testing diff --git a/x/wasm/keeper/wasmtesting/messenger.go b/x/wasm/keeper/wasmtesting/messenger.go index dbafda3886..c54793abfa 100644 --- a/x/wasm/keeper/wasmtesting/messenger.go +++ b/x/wasm/keeper/wasmtesting/messenger.go @@ -3,8 +3,8 @@ package wasmtesting import ( "errors" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/line/lbm-sdk/types" + wasmvmtypes "github.com/line/wasmvm/types" ) type MockMessageHandler struct { diff --git a/x/wasm/keeper/wasmtesting/mock_engine.go b/x/wasm/keeper/wasmtesting/mock_engine.go index ebf7dbcf19..01d23efe0c 100644 --- a/x/wasm/keeper/wasmtesting/mock_engine.go +++ b/x/wasm/keeper/wasmtesting/mock_engine.go @@ -4,12 +4,12 @@ import ( "bytes" "crypto/sha256" - wasmvm "github.com/CosmWasm/wasmvm" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/tendermint/tendermint/libs/rand" + "github.com/line/ostracon/libs/rand" + wasmvm "github.com/line/wasmvm" + wasmvmtypes "github.com/line/wasmvm/types" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + "github.com/line/wasmd/x/wasm/types" ) var _ types.WasmerEngine = &MockWasmer{} @@ -127,6 +127,7 @@ func (m *MockWasmer) Sudo(codeID wasmvm.Checksum, env wasmvmtypes.Env, sudoMsg [ panic("not supposed to be called!") } return m.SudoFn(codeID, env, sudoMsg, store, goapi, querier, gasMeter, gasLimit, deserCost) + } func (m *MockWasmer) Reply(codeID wasmvm.Checksum, env wasmvmtypes.Env, reply wasmvmtypes.Reply, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { @@ -176,6 +177,7 @@ var AlwaysPanicMockWasmer = &MockWasmer{} // SelfCallingInstMockWasmer prepares a Wasmer mock that calls itself on instantiation. func SelfCallingInstMockWasmer(executeCalled *bool) *MockWasmer { return &MockWasmer{ + CreateFn: func(code wasmvm.WasmCode) (wasmvm.Checksum, error) { anyCodeID := bytes.Repeat([]byte{0x1}, 32) return anyCodeID, nil diff --git a/x/wasm/keeper/wasmtesting/mock_keepers.go b/x/wasm/keeper/wasmtesting/mock_keepers.go index 4295b24ef0..52e51d4b52 100644 --- a/x/wasm/keeper/wasmtesting/mock_keepers.go +++ b/x/wasm/keeper/wasmtesting/mock_keepers.go @@ -1,12 +1,12 @@ package wasmtesting import ( - sdk "github.com/cosmos/cosmos-sdk/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - ibcexported "github.com/cosmos/ibc-go/v3/modules/core/exported" + sdk "github.com/line/lbm-sdk/types" + capabilitytypes "github.com/line/lbm-sdk/x/capability/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + ibcexported "github.com/line/lbm-sdk/x/ibc/core/exported" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) type MockChannelKeeper struct { diff --git a/x/wasm/keeper/wasmtesting/msg_dispatcher.go b/x/wasm/keeper/wasmtesting/msg_dispatcher.go index a6600941a5..f880b55a7b 100644 --- a/x/wasm/keeper/wasmtesting/msg_dispatcher.go +++ b/x/wasm/keeper/wasmtesting/msg_dispatcher.go @@ -1,8 +1,8 @@ package wasmtesting import ( - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/line/lbm-sdk/types" + wasmvmtypes "github.com/line/wasmvm/types" ) type MockMsgDispatcher struct { diff --git a/x/wasm/keeper/wasmtesting/query_handler.go b/x/wasm/keeper/wasmtesting/query_handler.go index 52cf97d31f..d05214f644 100644 --- a/x/wasm/keeper/wasmtesting/query_handler.go +++ b/x/wasm/keeper/wasmtesting/query_handler.go @@ -1,8 +1,8 @@ package wasmtesting import ( - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/line/lbm-sdk/types" + wasmvmtypes "github.com/line/wasmvm/types" ) type MockQueryHandler struct { diff --git a/x/wasm/keeper/wasmtesting/store.go b/x/wasm/keeper/wasmtesting/store.go index 6548c8bae2..d666e1e53b 100644 --- a/x/wasm/keeper/wasmtesting/store.go +++ b/x/wasm/keeper/wasmtesting/store.go @@ -1,8 +1,8 @@ package wasmtesting import ( - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" + storetypes "github.com/line/lbm-sdk/store/types" + sdk "github.com/line/lbm-sdk/types" ) // MockCommitMultiStore mock with a CacheMultiStore to capture commits diff --git a/x/wasm/lbmtypes/codec.go b/x/wasm/lbmtypes/codec.go new file mode 100644 index 0000000000..c25188bdd4 --- /dev/null +++ b/x/wasm/lbmtypes/codec.go @@ -0,0 +1,54 @@ +package lbmtypes + +import ( + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/codec/legacy" + "github.com/line/lbm-sdk/codec/types" + cryptocodec "github.com/line/lbm-sdk/crypto/codec" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/types/msgservice" + authzcodec "github.com/line/lbm-sdk/x/authz/codec" + govcodec "github.com/line/lbm-sdk/x/gov/codec" + govtypes "github.com/line/lbm-sdk/x/gov/types" + + wasmTypes "github.com/line/wasmd/x/wasm/types" +) + +// RegisterLegacyAminoCodec registers the account types and interface +func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { //nolint:staticcheck + legacy.RegisterAminoMsg(cdc, &MsgStoreCodeAndInstantiateContract{}, "wasm/StoreCodeAndInstantiateContract") + + cdc.RegisterConcrete(&DeactivateContractProposal{}, "wasm/DeactivateContractProposal", nil) + cdc.RegisterConcrete(&ActivateContractProposal{}, "wasm/ActivateContractProposal", nil) +} + +func RegisterInterfaces(registry types.InterfaceRegistry) { + wasmTypes.RegisterInterfaces(registry) + registry.RegisterImplementations( + (*sdk.Msg)(nil), + &MsgStoreCodeAndInstantiateContract{}, + ) + registry.RegisterImplementations( + (*govtypes.Content)(nil), + &DeactivateContractProposal{}, + &ActivateContractProposal{}, + ) + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) +} + +var ( + amino = codec.NewLegacyAmino() + ModuleCdc = codec.NewAminoCodec(amino) +) + +func init() { + RegisterLegacyAminoCodec(amino) + cryptocodec.RegisterCrypto(amino) + sdk.RegisterLegacyAminoCodec(amino) + + // Register all Amino interfaces and concrete types on the authz and gov Amino codec so that this can later be + // used to properly serialize MsgGrant, MsgExec and MsgSubmitProposal instances + RegisterLegacyAminoCodec(authzcodec.Amino) + RegisterLegacyAminoCodec(govcodec.Amino) +} diff --git a/x/wasm/lbmtypes/event.pb.go b/x/wasm/lbmtypes/event.pb.go new file mode 100644 index 0000000000..ead9217eec --- /dev/null +++ b/x/wasm/lbmtypes/event.pb.go @@ -0,0 +1,490 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: lbm/wasm/v1/event.proto + +package lbmtypes + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// EventDeactivateContractProposal is the event that is emitted when the contract is deactivate. +type EventDeactivateContractProposal struct { + // contract is the smart contract's address + Contract string `protobuf:"bytes,1,opt,name=contract,proto3" json:"contract,omitempty"` +} + +func (m *EventDeactivateContractProposal) Reset() { *m = EventDeactivateContractProposal{} } +func (m *EventDeactivateContractProposal) String() string { return proto.CompactTextString(m) } +func (*EventDeactivateContractProposal) ProtoMessage() {} +func (*EventDeactivateContractProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_4be408da9fc96f03, []int{0} +} +func (m *EventDeactivateContractProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventDeactivateContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventDeactivateContractProposal.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 *EventDeactivateContractProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventDeactivateContractProposal.Merge(m, src) +} +func (m *EventDeactivateContractProposal) XXX_Size() int { + return m.Size() +} +func (m *EventDeactivateContractProposal) XXX_DiscardUnknown() { + xxx_messageInfo_EventDeactivateContractProposal.DiscardUnknown(m) +} + +var xxx_messageInfo_EventDeactivateContractProposal proto.InternalMessageInfo + +func (m *EventDeactivateContractProposal) GetContract() string { + if m != nil { + return m.Contract + } + return "" +} + +// EventActivateContractProposal is the event that is emitted when the contract is activates. +type EventActivateContractProposal struct { + // contract is the smart contract's address + Contract string `protobuf:"bytes,1,opt,name=contract,proto3" json:"contract,omitempty"` +} + +func (m *EventActivateContractProposal) Reset() { *m = EventActivateContractProposal{} } +func (m *EventActivateContractProposal) String() string { return proto.CompactTextString(m) } +func (*EventActivateContractProposal) ProtoMessage() {} +func (*EventActivateContractProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_4be408da9fc96f03, []int{1} +} +func (m *EventActivateContractProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventActivateContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventActivateContractProposal.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 *EventActivateContractProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventActivateContractProposal.Merge(m, src) +} +func (m *EventActivateContractProposal) XXX_Size() int { + return m.Size() +} +func (m *EventActivateContractProposal) XXX_DiscardUnknown() { + xxx_messageInfo_EventActivateContractProposal.DiscardUnknown(m) +} + +var xxx_messageInfo_EventActivateContractProposal proto.InternalMessageInfo + +func (m *EventActivateContractProposal) GetContract() string { + if m != nil { + return m.Contract + } + return "" +} + +func init() { + proto.RegisterType((*EventDeactivateContractProposal)(nil), "lbm.wasm.v1.EventDeactivateContractProposal") + proto.RegisterType((*EventActivateContractProposal)(nil), "lbm.wasm.v1.EventActivateContractProposal") +} + +func init() { proto.RegisterFile("lbm/wasm/v1/event.proto", fileDescriptor_4be408da9fc96f03) } + +var fileDescriptor_4be408da9fc96f03 = []byte{ + // 183 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xcf, 0x49, 0xca, 0xd5, + 0x2f, 0x4f, 0x2c, 0xce, 0xd5, 0x2f, 0x33, 0xd4, 0x4f, 0x2d, 0x4b, 0xcd, 0x2b, 0xd1, 0x2b, 0x28, + 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0xce, 0x49, 0xca, 0xd5, 0x03, 0x49, 0xe8, 0x95, 0x19, 0x2a, 0xd9, + 0x72, 0xc9, 0xbb, 0x82, 0xe4, 0x5c, 0x52, 0x13, 0x93, 0x4b, 0x32, 0xcb, 0x12, 0x4b, 0x52, 0x9d, + 0xf3, 0xf3, 0x4a, 0x8a, 0x12, 0x93, 0x4b, 0x02, 0x8a, 0xf2, 0x0b, 0xf2, 0x8b, 0x13, 0x73, 0x84, + 0xa4, 0xb8, 0x38, 0x92, 0xa1, 0x62, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x41, 0x70, 0xbe, 0x92, + 0x35, 0x97, 0x2c, 0x58, 0xbb, 0x23, 0x19, 0x9a, 0x9d, 0xec, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, + 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, + 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x35, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, + 0x3f, 0x27, 0x33, 0x2f, 0x15, 0xec, 0x8f, 0x14, 0xfd, 0x0a, 0x88, 0x7f, 0x72, 0x92, 0x72, 0x4b, + 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x1e, 0x32, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x7e, + 0x8a, 0x63, 0x0f, 0xeb, 0x00, 0x00, 0x00, +} + +func (m *EventDeactivateContractProposal) 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 *EventDeactivateContractProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventDeactivateContractProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Contract) > 0 { + i -= len(m.Contract) + copy(dAtA[i:], m.Contract) + i = encodeVarintEvent(dAtA, i, uint64(len(m.Contract))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EventActivateContractProposal) 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 *EventActivateContractProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventActivateContractProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Contract) > 0 { + i -= len(m.Contract) + copy(dAtA[i:], m.Contract) + i = encodeVarintEvent(dAtA, i, uint64(len(m.Contract))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintEvent(dAtA []byte, offset int, v uint64) int { + offset -= sovEvent(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *EventDeactivateContractProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Contract) + if l > 0 { + n += 1 + l + sovEvent(uint64(l)) + } + return n +} + +func (m *EventActivateContractProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Contract) + if l > 0 { + n += 1 + l + sovEvent(uint64(l)) + } + return n +} + +func sovEvent(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozEvent(x uint64) (n int) { + return sovEvent(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *EventDeactivateContractProposal) 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 ErrIntOverflowEvent + } + 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: EventDeactivateContractProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventDeactivateContractProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Contract", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvent + } + 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 ErrInvalidLengthEvent + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvent + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Contract = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvent(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EventActivateContractProposal) 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 ErrIntOverflowEvent + } + 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: EventActivateContractProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventActivateContractProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Contract", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvent + } + 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 ErrInvalidLengthEvent + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvent + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Contract = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvent(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipEvent(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, ErrIntOverflowEvent + } + 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, ErrIntOverflowEvent + } + 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, ErrIntOverflowEvent + } + 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, ErrInvalidLengthEvent + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupEvent + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthEvent + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthEvent = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowEvent = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupEvent = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/wasm/lbmtypes/proposal.go b/x/wasm/lbmtypes/proposal.go new file mode 100644 index 0000000000..32e18f78cb --- /dev/null +++ b/x/wasm/lbmtypes/proposal.go @@ -0,0 +1,76 @@ +package lbmtypes + +import ( + "fmt" + + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + govtypes "github.com/line/lbm-sdk/x/gov/types" + + wasmtypes "github.com/line/wasmd/x/wasm/types" +) + +const ( + ProposalTypeDeactivateContract wasmtypes.ProposalType = "DeactivateContract" + ProposalTypeActivateContract wasmtypes.ProposalType = "ActivateContract" +) + +var EnableAllProposals = append([]wasmtypes.ProposalType{ + ProposalTypeDeactivateContract, + ProposalTypeActivateContract, +}, wasmtypes.EnableAllProposals...) + +func init() { + govtypes.RegisterProposalType(string(ProposalTypeDeactivateContract)) + govtypes.RegisterProposalType(string(ProposalTypeActivateContract)) +} + +func (p DeactivateContractProposal) GetTitle() string { return p.Title } + +func (p DeactivateContractProposal) GetDescription() string { return p.Description } + +func (p DeactivateContractProposal) ProposalRoute() string { return wasmtypes.RouterKey } + +func (p DeactivateContractProposal) ProposalType() string { + return string(ProposalTypeDeactivateContract) +} + +func (p DeactivateContractProposal) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(p.Contract); err != nil { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "contract") + } + + return nil +} + +func (p DeactivateContractProposal) String() string { + return fmt.Sprintf(`Deactivate Contract Proposal: + Title: %s + Description: %s + Contract: %s +`, p.Title, p.Description, p.Contract) +} + +func (p ActivateContractProposal) GetTitle() string { return p.Title } + +func (p ActivateContractProposal) GetDescription() string { return p.Description } + +func (p ActivateContractProposal) ProposalRoute() string { return wasmtypes.RouterKey } + +func (p ActivateContractProposal) ProposalType() string { return string(ProposalTypeActivateContract) } + +func (p ActivateContractProposal) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(p.Contract); err != nil { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "contract") + } + + return nil +} + +func (p ActivateContractProposal) String() string { + return fmt.Sprintf(`Activate Contract Proposal: + Title: %s + Description: %s + Contract: %s +`, p.Title, p.Description, p.Contract) +} diff --git a/x/wasm/lbmtypes/proposal.pb.go b/x/wasm/lbmtypes/proposal.pb.go new file mode 100644 index 0000000000..bbeb16d93b --- /dev/null +++ b/x/wasm/lbmtypes/proposal.pb.go @@ -0,0 +1,721 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: lbm/wasm/v1/proposal.proto + +package lbmtypes + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// DeactivateContractProposal gov proposal content type adds a contract to inactive list. +type DeactivateContractProposal struct { + // Title is a short summary + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty" yaml:"title"` + // Description is a human readable text + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty" yaml:"description"` + // Contract is the smart contract address to deactivate + Contract string `protobuf:"bytes,3,opt,name=contract,proto3" json:"contract,omitempty" yaml:"contract"` +} + +func (m *DeactivateContractProposal) Reset() { *m = DeactivateContractProposal{} } +func (*DeactivateContractProposal) ProtoMessage() {} +func (*DeactivateContractProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_38b6af62537450c9, []int{0} +} +func (m *DeactivateContractProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeactivateContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DeactivateContractProposal.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 *DeactivateContractProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeactivateContractProposal.Merge(m, src) +} +func (m *DeactivateContractProposal) XXX_Size() int { + return m.Size() +} +func (m *DeactivateContractProposal) XXX_DiscardUnknown() { + xxx_messageInfo_DeactivateContractProposal.DiscardUnknown(m) +} + +var xxx_messageInfo_DeactivateContractProposal proto.InternalMessageInfo + +// ActivateContractProposal gov proposal content type deletes a contract from inactive list. +type ActivateContractProposal struct { + // Title is a short summary + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty" yaml:"title"` + // Description is a human readable text + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty" yaml:"description"` + // Contract is the smart contract address to activate + Contract string `protobuf:"bytes,3,opt,name=contract,proto3" json:"contract,omitempty" yaml:"contract"` +} + +func (m *ActivateContractProposal) Reset() { *m = ActivateContractProposal{} } +func (*ActivateContractProposal) ProtoMessage() {} +func (*ActivateContractProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_38b6af62537450c9, []int{1} +} +func (m *ActivateContractProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ActivateContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ActivateContractProposal.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 *ActivateContractProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_ActivateContractProposal.Merge(m, src) +} +func (m *ActivateContractProposal) XXX_Size() int { + return m.Size() +} +func (m *ActivateContractProposal) XXX_DiscardUnknown() { + xxx_messageInfo_ActivateContractProposal.DiscardUnknown(m) +} + +var xxx_messageInfo_ActivateContractProposal proto.InternalMessageInfo + +func init() { + proto.RegisterType((*DeactivateContractProposal)(nil), "lbm.wasm.v1.DeactivateContractProposal") + proto.RegisterType((*ActivateContractProposal)(nil), "lbm.wasm.v1.ActivateContractProposal") +} + +func init() { proto.RegisterFile("lbm/wasm/v1/proposal.proto", fileDescriptor_38b6af62537450c9) } + +var fileDescriptor_38b6af62537450c9 = []byte{ + // 279 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xca, 0x49, 0xca, 0xd5, + 0x2f, 0x4f, 0x2c, 0xce, 0xd5, 0x2f, 0x33, 0xd4, 0x2f, 0x28, 0xca, 0x2f, 0xc8, 0x2f, 0x4e, 0xcc, + 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0xce, 0x49, 0xca, 0xd5, 0x03, 0xc9, 0xe9, 0x95, + 0x19, 0x4a, 0x89, 0xa4, 0xe7, 0xa7, 0xe7, 0x83, 0xc5, 0xf5, 0x41, 0x2c, 0x88, 0x12, 0xa5, 0xf5, + 0x8c, 0x5c, 0x52, 0x2e, 0xa9, 0x89, 0xc9, 0x25, 0x99, 0x65, 0x89, 0x25, 0xa9, 0xce, 0xf9, 0x79, + 0x25, 0x45, 0x89, 0xc9, 0x25, 0x01, 0x50, 0x73, 0x84, 0xd4, 0xb8, 0x58, 0x4b, 0x32, 0x4b, 0x72, + 0x52, 0x25, 0x18, 0x15, 0x18, 0x35, 0x38, 0x9d, 0x04, 0x3e, 0xdd, 0x93, 0xe7, 0xa9, 0x4c, 0xcc, + 0xcd, 0xb1, 0x52, 0x02, 0x0b, 0x2b, 0x05, 0x41, 0xa4, 0x85, 0x2c, 0xb8, 0xb8, 0x53, 0x52, 0x8b, + 0x93, 0x8b, 0x32, 0x0b, 0x4a, 0x32, 0xf3, 0xf3, 0x24, 0x98, 0xc0, 0xaa, 0xc5, 0x3e, 0xdd, 0x93, + 0x17, 0x82, 0xa8, 0x46, 0x92, 0x54, 0x0a, 0x42, 0x56, 0x2a, 0xa4, 0xcf, 0xc5, 0x91, 0x0c, 0xb5, + 0x55, 0x82, 0x19, 0xac, 0x4d, 0xf8, 0xd3, 0x3d, 0x79, 0x7e, 0x88, 0x36, 0x98, 0x8c, 0x52, 0x10, + 0x5c, 0x91, 0xd2, 0x5a, 0x46, 0x2e, 0x09, 0xc7, 0xa1, 0xe3, 0x5e, 0x27, 0xef, 0x13, 0x0f, 0xe5, + 0x18, 0x6e, 0x3c, 0x94, 0x63, 0x58, 0xf1, 0x48, 0x8e, 0xf1, 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, 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, + 0x73, 0x32, 0xf3, 0x52, 0xc1, 0x51, 0x9a, 0xa2, 0x5f, 0x01, 0x89, 0xda, 0x9c, 0xa4, 0xdc, 0x92, + 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0x70, 0xac, 0x19, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x1f, + 0xd4, 0x06, 0xb2, 0xf6, 0x01, 0x00, 0x00, +} + +func (this *DeactivateContractProposal) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*DeactivateContractProposal) + if !ok { + that2, ok := that.(DeactivateContractProposal) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Title != that1.Title { + return false + } + if this.Description != that1.Description { + return false + } + if this.Contract != that1.Contract { + return false + } + return true +} +func (this *ActivateContractProposal) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*ActivateContractProposal) + if !ok { + that2, ok := that.(ActivateContractProposal) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Title != that1.Title { + return false + } + if this.Description != that1.Description { + return false + } + if this.Contract != that1.Contract { + return false + } + return true +} +func (m *DeactivateContractProposal) 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 *DeactivateContractProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeactivateContractProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Contract) > 0 { + i -= len(m.Contract) + copy(dAtA[i:], m.Contract) + i = encodeVarintProposal(dAtA, i, uint64(len(m.Contract))) + i-- + dAtA[i] = 0x1a + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintProposal(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if len(m.Title) > 0 { + i -= len(m.Title) + copy(dAtA[i:], m.Title) + i = encodeVarintProposal(dAtA, i, uint64(len(m.Title))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ActivateContractProposal) 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 *ActivateContractProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ActivateContractProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Contract) > 0 { + i -= len(m.Contract) + copy(dAtA[i:], m.Contract) + i = encodeVarintProposal(dAtA, i, uint64(len(m.Contract))) + i-- + dAtA[i] = 0x1a + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintProposal(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if len(m.Title) > 0 { + i -= len(m.Title) + copy(dAtA[i:], m.Title) + i = encodeVarintProposal(dAtA, i, uint64(len(m.Title))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintProposal(dAtA []byte, offset int, v uint64) int { + offset -= sovProposal(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *DeactivateContractProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Title) + if l > 0 { + n += 1 + l + sovProposal(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovProposal(uint64(l)) + } + l = len(m.Contract) + if l > 0 { + n += 1 + l + sovProposal(uint64(l)) + } + return n +} + +func (m *ActivateContractProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Title) + if l > 0 { + n += 1 + l + sovProposal(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovProposal(uint64(l)) + } + l = len(m.Contract) + if l > 0 { + n += 1 + l + sovProposal(uint64(l)) + } + return n +} + +func sovProposal(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozProposal(x uint64) (n int) { + return sovProposal(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *DeactivateContractProposal) 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 ErrIntOverflowProposal + } + 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: DeactivateContractProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeactivateContractProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProposal + } + 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 ErrInvalidLengthProposal + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProposal + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Title = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProposal + } + 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 ErrInvalidLengthProposal + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProposal + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Contract", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProposal + } + 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 ErrInvalidLengthProposal + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProposal + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Contract = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProposal(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProposal + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ActivateContractProposal) 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 ErrIntOverflowProposal + } + 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: ActivateContractProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ActivateContractProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProposal + } + 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 ErrInvalidLengthProposal + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProposal + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Title = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProposal + } + 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 ErrInvalidLengthProposal + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProposal + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Contract", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProposal + } + 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 ErrInvalidLengthProposal + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProposal + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Contract = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProposal(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProposal + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipProposal(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, ErrIntOverflowProposal + } + 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, ErrIntOverflowProposal + } + 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, ErrIntOverflowProposal + } + 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, ErrInvalidLengthProposal + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupProposal + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthProposal + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthProposal = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowProposal = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupProposal = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/wasm/lbmtypes/query.pb.go b/x/wasm/lbmtypes/query.pb.go new file mode 100644 index 0000000000..c4311ddf58 --- /dev/null +++ b/x/wasm/lbmtypes/query.pb.go @@ -0,0 +1,1005 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: lbm/wasm/v1/query.proto + +package lbmtypes + +import ( + context "context" + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + query "github.com/line/lbm-sdk/types/query" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// QueryInactiveContractsRequest is the request type for Query/InactiveContract RPC method. +type QueryInactiveContractsRequest struct { + // pagination defines an optional pagination for the request + Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryInactiveContractsRequest) Reset() { *m = QueryInactiveContractsRequest{} } +func (m *QueryInactiveContractsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryInactiveContractsRequest) ProtoMessage() {} +func (*QueryInactiveContractsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f1bdb66850244231, []int{0} +} +func (m *QueryInactiveContractsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryInactiveContractsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryInactiveContractsRequest.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 *QueryInactiveContractsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryInactiveContractsRequest.Merge(m, src) +} +func (m *QueryInactiveContractsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryInactiveContractsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryInactiveContractsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryInactiveContractsRequest proto.InternalMessageInfo + +// QueryInactiveContractsResponse is the response type for the Query/InactiveContract RPC method. +type QueryInactiveContractsResponse struct { + // addresses is the inactive address list + Addresses []string `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` + // pagination defines the pagination in the response + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryInactiveContractsResponse) Reset() { *m = QueryInactiveContractsResponse{} } +func (m *QueryInactiveContractsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryInactiveContractsResponse) ProtoMessage() {} +func (*QueryInactiveContractsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f1bdb66850244231, []int{1} +} +func (m *QueryInactiveContractsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryInactiveContractsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryInactiveContractsResponse.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 *QueryInactiveContractsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryInactiveContractsResponse.Merge(m, src) +} +func (m *QueryInactiveContractsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryInactiveContractsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryInactiveContractsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryInactiveContractsResponse proto.InternalMessageInfo + +// QueryIsInactiveContractRequest is the request type for Query/IsInactiveContract RPC method. +type QueryInactiveContractRequest struct { + // address is the address of the contract + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *QueryInactiveContractRequest) Reset() { *m = QueryInactiveContractRequest{} } +func (m *QueryInactiveContractRequest) String() string { return proto.CompactTextString(m) } +func (*QueryInactiveContractRequest) ProtoMessage() {} +func (*QueryInactiveContractRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f1bdb66850244231, []int{2} +} +func (m *QueryInactiveContractRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryInactiveContractRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryInactiveContractRequest.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 *QueryInactiveContractRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryInactiveContractRequest.Merge(m, src) +} +func (m *QueryInactiveContractRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryInactiveContractRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryInactiveContractRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryInactiveContractRequest proto.InternalMessageInfo + +// QueryInactiveContractsResponse is the response type for the Query/IsInactiveContract RPC method. +type QueryInactiveContractResponse struct { + // inactivated is the result if the contract is inactive contract or not + Inactivated bool `protobuf:"varint,1,opt,name=inactivated,proto3" json:"inactivated,omitempty"` +} + +func (m *QueryInactiveContractResponse) Reset() { *m = QueryInactiveContractResponse{} } +func (m *QueryInactiveContractResponse) String() string { return proto.CompactTextString(m) } +func (*QueryInactiveContractResponse) ProtoMessage() {} +func (*QueryInactiveContractResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f1bdb66850244231, []int{3} +} +func (m *QueryInactiveContractResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryInactiveContractResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryInactiveContractResponse.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 *QueryInactiveContractResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryInactiveContractResponse.Merge(m, src) +} +func (m *QueryInactiveContractResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryInactiveContractResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryInactiveContractResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryInactiveContractResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*QueryInactiveContractsRequest)(nil), "lbm.wasm.v1.QueryInactiveContractsRequest") + proto.RegisterType((*QueryInactiveContractsResponse)(nil), "lbm.wasm.v1.QueryInactiveContractsResponse") + proto.RegisterType((*QueryInactiveContractRequest)(nil), "lbm.wasm.v1.QueryInactiveContractRequest") + proto.RegisterType((*QueryInactiveContractResponse)(nil), "lbm.wasm.v1.QueryInactiveContractResponse") +} + +func init() { proto.RegisterFile("lbm/wasm/v1/query.proto", fileDescriptor_f1bdb66850244231) } + +var fileDescriptor_f1bdb66850244231 = []byte{ + // 439 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x3f, 0x8f, 0xd3, 0x30, + 0x18, 0xc6, 0xe3, 0x22, 0xfe, 0xd4, 0x5d, 0xc0, 0x42, 0xa2, 0xaa, 0x8a, 0x29, 0x91, 0xe0, 0xee, + 0x7a, 0x92, 0xad, 0x1c, 0x0b, 0x2b, 0x20, 0x71, 0x62, 0x83, 0x8c, 0x2c, 0xc8, 0x49, 0x2c, 0x13, + 0x29, 0xb1, 0x73, 0xb1, 0x1b, 0x38, 0x21, 0x16, 0x16, 0x56, 0x24, 0xc4, 0xc6, 0x07, 0xe0, 0x53, + 0x30, 0xdf, 0x78, 0x12, 0x0b, 0x23, 0xa4, 0x7c, 0x10, 0x14, 0x3b, 0x6d, 0x53, 0xa0, 0xb4, 0x5b, + 0xe2, 0xf7, 0x79, 0x9f, 0xe7, 0xf7, 0xfa, 0x4d, 0xe0, 0x8d, 0x2c, 0xca, 0xe9, 0x2b, 0xa6, 0x73, + 0x5a, 0x05, 0xf4, 0x64, 0xc6, 0xcb, 0x53, 0x52, 0x94, 0xca, 0x28, 0x34, 0xc8, 0xa2, 0x9c, 0x34, + 0x05, 0x52, 0x05, 0xa3, 0xeb, 0x42, 0x09, 0x65, 0xcf, 0x69, 0xf3, 0xe4, 0x24, 0xa3, 0xb1, 0x50, + 0x4a, 0x64, 0x9c, 0xb2, 0x22, 0xa5, 0x4c, 0x4a, 0x65, 0x98, 0x49, 0x95, 0xd4, 0x6d, 0x75, 0x1a, + 0x2b, 0x9d, 0x2b, 0x4d, 0x23, 0xa6, 0xb9, 0x73, 0xa6, 0x55, 0x10, 0x71, 0xc3, 0x02, 0x5a, 0x30, + 0x91, 0x4a, 0x2b, 0x76, 0x5a, 0x5f, 0xc0, 0x9b, 0xcf, 0x1a, 0xc5, 0x13, 0xc9, 0x62, 0x93, 0x56, + 0xfc, 0x91, 0x92, 0xa6, 0x64, 0xb1, 0xd1, 0x21, 0x3f, 0x99, 0x71, 0x6d, 0xd0, 0x63, 0x08, 0x57, + 0x4d, 0x43, 0x30, 0x01, 0xfb, 0x83, 0xa3, 0xbb, 0xc4, 0x25, 0x90, 0x26, 0x81, 0x38, 0xf6, 0x36, + 0x81, 0x3c, 0x65, 0x82, 0xb7, 0xbd, 0x61, 0xa7, 0xd3, 0x7f, 0x0f, 0x20, 0xde, 0x94, 0xa4, 0x0b, + 0x25, 0x35, 0x47, 0x63, 0xd8, 0x67, 0x49, 0x52, 0x72, 0xad, 0xb9, 0x1e, 0x82, 0xc9, 0x85, 0xfd, + 0x7e, 0xb8, 0x3a, 0x40, 0xc7, 0x6b, 0x20, 0x3d, 0x0b, 0xb2, 0xb7, 0x15, 0xc4, 0x59, 0xaf, 0x91, + 0xdc, 0x87, 0xe3, 0x7f, 0x82, 0x2c, 0x26, 0x1e, 0xc2, 0xcb, 0x6d, 0xaa, 0x1d, 0xb7, 0x1f, 0x2e, + 0x5e, 0xfd, 0x07, 0x1b, 0x2e, 0x6b, 0x39, 0xc1, 0x04, 0x0e, 0x52, 0x57, 0x63, 0x86, 0x27, 0xb6, + 0xfd, 0x4a, 0xd8, 0x3d, 0x3a, 0xfa, 0xda, 0x83, 0x17, 0xad, 0x07, 0xfa, 0x04, 0xe0, 0xb5, 0xbf, + 0xee, 0x02, 0x4d, 0x49, 0x67, 0xfb, 0xe4, 0xbf, 0xab, 0x19, 0x1d, 0xee, 0xa4, 0x75, 0x68, 0xfe, + 0xde, 0xbb, 0x6f, 0xbf, 0x3e, 0xf6, 0x6e, 0xa3, 0x5b, 0xb4, 0xfb, 0xdd, 0xb5, 0x68, 0xfc, 0x45, + 0xbc, 0x24, 0xf8, 0x0c, 0xe0, 0xd5, 0x3f, 0x6d, 0xd0, 0xc1, 0xf6, 0xa8, 0x05, 0xd5, 0x74, 0x17, + 0x69, 0x0b, 0x15, 0x58, 0xa8, 0x43, 0x74, 0xb0, 0x05, 0x8a, 0xbe, 0x69, 0x57, 0xf0, 0xf6, 0xe1, + 0xf1, 0xd9, 0x4f, 0xec, 0x7d, 0xa9, 0xb1, 0x77, 0x56, 0x63, 0x70, 0x5e, 0x63, 0xf0, 0xa3, 0xc6, + 0xe0, 0xc3, 0x1c, 0x7b, 0xe7, 0x73, 0xec, 0x7d, 0x9f, 0x63, 0xef, 0xf9, 0x1d, 0x91, 0x9a, 0x97, + 0xb3, 0x88, 0xc4, 0x2a, 0xa7, 0x59, 0x2a, 0xb9, 0xf5, 0x4d, 0xe8, 0x6b, 0xe7, 0x9f, 0x45, 0xb9, + 0x39, 0x2d, 0xb8, 0x8e, 0x2e, 0xd9, 0x1f, 0xe0, 0xde, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x60, + 0xc8, 0xe6, 0x11, 0x88, 0x03, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // InactiveContracts queries all inactive contracts + InactiveContracts(ctx context.Context, in *QueryInactiveContractsRequest, opts ...grpc.CallOption) (*QueryInactiveContractsResponse, error) + InactiveContract(ctx context.Context, in *QueryInactiveContractRequest, opts ...grpc.CallOption) (*QueryInactiveContractResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) InactiveContracts(ctx context.Context, in *QueryInactiveContractsRequest, opts ...grpc.CallOption) (*QueryInactiveContractsResponse, error) { + out := new(QueryInactiveContractsResponse) + err := c.cc.Invoke(ctx, "/lbm.wasm.v1.Query/InactiveContracts", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) InactiveContract(ctx context.Context, in *QueryInactiveContractRequest, opts ...grpc.CallOption) (*QueryInactiveContractResponse, error) { + out := new(QueryInactiveContractResponse) + err := c.cc.Invoke(ctx, "/lbm.wasm.v1.Query/InactiveContract", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + // InactiveContracts queries all inactive contracts + InactiveContracts(context.Context, *QueryInactiveContractsRequest) (*QueryInactiveContractsResponse, error) + InactiveContract(context.Context, *QueryInactiveContractRequest) (*QueryInactiveContractResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) InactiveContracts(ctx context.Context, req *QueryInactiveContractsRequest) (*QueryInactiveContractsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InactiveContracts not implemented") +} +func (*UnimplementedQueryServer) InactiveContract(ctx context.Context, req *QueryInactiveContractRequest) (*QueryInactiveContractResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InactiveContract not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_InactiveContracts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryInactiveContractsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).InactiveContracts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lbm.wasm.v1.Query/InactiveContracts", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).InactiveContracts(ctx, req.(*QueryInactiveContractsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_InactiveContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryInactiveContractRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).InactiveContract(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lbm.wasm.v1.Query/InactiveContract", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).InactiveContract(ctx, req.(*QueryInactiveContractRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "lbm.wasm.v1.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "InactiveContracts", + Handler: _Query_InactiveContracts_Handler, + }, + { + MethodName: "InactiveContract", + Handler: _Query_InactiveContract_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "lbm/wasm/v1/query.proto", +} + +func (m *QueryInactiveContractsRequest) 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 *QueryInactiveContractsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryInactiveContractsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryInactiveContractsResponse) 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 *QueryInactiveContractsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryInactiveContractsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + 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 = encodeVarintQuery(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryInactiveContractRequest) 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 *QueryInactiveContractRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryInactiveContractRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryInactiveContractResponse) 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 *QueryInactiveContractResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryInactiveContractResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Inactivated { + i-- + if m.Inactivated { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryInactiveContractsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryInactiveContractsResponse) 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 + sovQuery(uint64(l)) + } + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryInactiveContractRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryInactiveContractResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Inactivated { + n += 2 + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryInactiveContractsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryInactiveContractsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryInactiveContractsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryInactiveContractsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryInactiveContractsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryInactiveContractsResponse: 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 ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageResponse{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryInactiveContractRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryInactiveContractRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryInactiveContractRequest: 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 ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryInactiveContractResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryInactiveContractResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryInactiveContractResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Inactivated", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Inactivated = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/wasm/lbmtypes/query.pb.gw.go b/x/wasm/lbmtypes/query.pb.gw.go new file mode 100644 index 0000000000..e3c64cb7f2 --- /dev/null +++ b/x/wasm/lbmtypes/query.pb.gw.go @@ -0,0 +1,264 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: lbm/wasm/v1/query.proto + +/* +Package lbmtypes is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package lbmtypes + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +var ( + filter_Query_InactiveContracts_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_InactiveContracts_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryInactiveContractsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_InactiveContracts_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.InactiveContracts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_InactiveContracts_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryInactiveContractsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_InactiveContracts_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.InactiveContracts(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_InactiveContract_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryInactiveContractRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := client.InactiveContract(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_InactiveContract_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryInactiveContractRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := server.InactiveContract(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_InactiveContracts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_InactiveContracts_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_InactiveContracts_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_InactiveContract_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_InactiveContract_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_InactiveContract_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_InactiveContracts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_InactiveContracts_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_InactiveContracts_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_InactiveContract_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_InactiveContract_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_InactiveContract_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_InactiveContracts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"lbm", "wasm", "v1", "inactive_contracts"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_InactiveContract_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"lbm", "wasm", "v1", "inactive_contracts", "address"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Query_InactiveContracts_0 = runtime.ForwardResponseMessage + + forward_Query_InactiveContract_0 = runtime.ForwardResponseMessage +) diff --git a/x/wasm/lbmtypes/tx.go b/x/wasm/lbmtypes/tx.go new file mode 100644 index 0000000000..fa9089de80 --- /dev/null +++ b/x/wasm/lbmtypes/tx.go @@ -0,0 +1,60 @@ +package lbmtypes + +import ( + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + + wasmtypes "github.com/line/wasmd/x/wasm/types" +) + +func (msg MsgStoreCodeAndInstantiateContract) Route() string { + return wasmtypes.RouterKey +} + +func (msg MsgStoreCodeAndInstantiateContract) Type() string { + return "store-code-and-instantiate" +} + +func (msg MsgStoreCodeAndInstantiateContract) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(msg.Sender); err != nil { + return err + } + + if err := validateWasmCode(msg.WASMByteCode); err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "code bytes %s", err.Error()) + } + + if msg.InstantiatePermission != nil { + if err := msg.InstantiatePermission.ValidateBasic(); err != nil { + return sdkerrors.Wrap(err, "instantiate permission") + } + } + + if err := validateLabel(msg.Label); err != nil { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "label is required") + } + + if !msg.Funds.IsValid() { + return sdkerrors.ErrInvalidCoins + } + + if len(msg.Admin) != 0 { + if _, err := sdk.AccAddressFromBech32(msg.Admin); err != nil { + return sdkerrors.Wrap(err, "admin") + } + } + + if err := msg.Msg.ValidateBasic(); err != nil { + return sdkerrors.Wrap(err, "payload msg") + } + return nil +} + +func (msg MsgStoreCodeAndInstantiateContract) GetSignBytes() []byte { + return sdk.MustSortJSON(wasmtypes.ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgStoreCodeAndInstantiateContract) GetSigners() []sdk.AccAddress { + senderAddr := sdk.MustAccAddressFromBech32(msg.Sender) + return []sdk.AccAddress{senderAddr} +} diff --git a/x/wasm/lbmtypes/tx.pb.go b/x/wasm/lbmtypes/tx.pb.go new file mode 100644 index 0000000000..f4e4a54ab0 --- /dev/null +++ b/x/wasm/lbmtypes/tx.pb.go @@ -0,0 +1,963 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: lbm/wasm/v1/tx.proto + +package lbmtypes + +import ( + context "context" + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + github_com_line_lbm_sdk_types "github.com/line/lbm-sdk/types" + types1 "github.com/line/lbm-sdk/types" + github_com_line_wasmd_x_wasm_types "github.com/line/wasmd/x/wasm/types" + types "github.com/line/wasmd/x/wasm/types" + 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 + +// MsgStoreCodeAndInstantiateContract submit Wasm code to the system and instantiate a contract using it. +type MsgStoreCodeAndInstantiateContract struct { + // Sender is the that actor that signed the messages + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` + // WASMByteCode can be raw or gzip compressed + WASMByteCode []byte `protobuf:"bytes,2,opt,name=wasm_byte_code,json=wasmByteCode,proto3" json:"wasm_byte_code,omitempty"` + InstantiatePermission *types.AccessConfig `protobuf:"bytes,5,opt,name=instantiate_permission,json=instantiatePermission,proto3" json:"instantiate_permission,omitempty"` + // Admin is an optional address that can execute migrations + Admin string `protobuf:"bytes,6,opt,name=admin,proto3" json:"admin,omitempty"` + // Label is optional metadata to be stored with a contract instance. + Label string `protobuf:"bytes,7,opt,name=label,proto3" json:"label,omitempty"` + // Msg json encoded message to be passed to the contract on instantiation + Msg github_com_line_wasmd_x_wasm_types.RawContractMessage `protobuf:"bytes,8,opt,name=msg,proto3,casttype=github.com/line/wasmd/x/wasm/types.RawContractMessage" json:"msg,omitempty"` + // Funds coins that are transferred to the contract on instantiation + Funds github_com_line_lbm_sdk_types.Coins `protobuf:"bytes,9,rep,name=funds,proto3,castrepeated=github.com/line/lbm-sdk/types.Coins" json:"funds"` +} + +func (m *MsgStoreCodeAndInstantiateContract) Reset() { *m = MsgStoreCodeAndInstantiateContract{} } +func (m *MsgStoreCodeAndInstantiateContract) String() string { return proto.CompactTextString(m) } +func (*MsgStoreCodeAndInstantiateContract) ProtoMessage() {} +func (*MsgStoreCodeAndInstantiateContract) Descriptor() ([]byte, []int) { + return fileDescriptor_751e1d2b9f9bf9e8, []int{0} +} +func (m *MsgStoreCodeAndInstantiateContract) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgStoreCodeAndInstantiateContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgStoreCodeAndInstantiateContract.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 *MsgStoreCodeAndInstantiateContract) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgStoreCodeAndInstantiateContract.Merge(m, src) +} +func (m *MsgStoreCodeAndInstantiateContract) XXX_Size() int { + return m.Size() +} +func (m *MsgStoreCodeAndInstantiateContract) XXX_DiscardUnknown() { + xxx_messageInfo_MsgStoreCodeAndInstantiateContract.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgStoreCodeAndInstantiateContract proto.InternalMessageInfo + +// MsgStoreCodeAndInstantiateContractResponse returns store and instantiate result data. +type MsgStoreCodeAndInstantiateContractResponse struct { + // CodeID is the reference to the stored WASM code + CodeID uint64 `protobuf:"varint,1,opt,name=code_id,json=codeId,proto3" json:"code_id,omitempty"` + // Address is the bech32 address of the new contract instance + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + // Data contains base64-encoded bytes to returned from the contract + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *MsgStoreCodeAndInstantiateContractResponse) Reset() { + *m = MsgStoreCodeAndInstantiateContractResponse{} +} +func (m *MsgStoreCodeAndInstantiateContractResponse) String() string { + return proto.CompactTextString(m) +} +func (*MsgStoreCodeAndInstantiateContractResponse) ProtoMessage() {} +func (*MsgStoreCodeAndInstantiateContractResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_751e1d2b9f9bf9e8, []int{1} +} +func (m *MsgStoreCodeAndInstantiateContractResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgStoreCodeAndInstantiateContractResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgStoreCodeAndInstantiateContractResponse.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 *MsgStoreCodeAndInstantiateContractResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgStoreCodeAndInstantiateContractResponse.Merge(m, src) +} +func (m *MsgStoreCodeAndInstantiateContractResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgStoreCodeAndInstantiateContractResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgStoreCodeAndInstantiateContractResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgStoreCodeAndInstantiateContractResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgStoreCodeAndInstantiateContract)(nil), "lbm.wasm.v1.MsgStoreCodeAndInstantiateContract") + proto.RegisterType((*MsgStoreCodeAndInstantiateContractResponse)(nil), "lbm.wasm.v1.MsgStoreCodeAndInstantiateContractResponse") +} + +func init() { proto.RegisterFile("lbm/wasm/v1/tx.proto", fileDescriptor_751e1d2b9f9bf9e8) } + +var fileDescriptor_751e1d2b9f9bf9e8 = []byte{ + // 540 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x4f, 0x8b, 0xd3, 0x4e, + 0x18, 0x6e, 0x7e, 0x49, 0xff, 0x4d, 0xcb, 0x8f, 0x32, 0xd4, 0x25, 0x16, 0x49, 0x4a, 0x17, 0xa1, + 0x28, 0x4e, 0x68, 0x45, 0xc5, 0x63, 0x5b, 0x2f, 0x5d, 0x29, 0x48, 0x16, 0x11, 0x44, 0x28, 0x93, + 0xcc, 0x6c, 0x0c, 0x26, 0x33, 0x25, 0x33, 0xdb, 0xdd, 0x9e, 0xfc, 0x00, 0x5e, 0x04, 0xbf, 0x85, + 0x07, 0x3f, 0x47, 0x8f, 0x7b, 0xf4, 0x54, 0xb5, 0xfd, 0x16, 0x9e, 0x64, 0x26, 0xcd, 0xba, 0x78, + 0xb0, 0x78, 0x9b, 0xe7, 0xfd, 0xf3, 0xbc, 0xef, 0x3c, 0xcf, 0x0c, 0x68, 0x27, 0x41, 0xea, 0x5d, + 0x60, 0x91, 0x7a, 0xcb, 0x81, 0x27, 0x2f, 0xd1, 0x22, 0xe3, 0x92, 0xc3, 0x46, 0x12, 0xa4, 0x48, + 0x45, 0xd1, 0x72, 0xd0, 0x69, 0x47, 0x3c, 0xe2, 0x3a, 0xee, 0xa9, 0x53, 0x5e, 0xd2, 0x71, 0x42, + 0x2e, 0x52, 0x2e, 0xbc, 0x00, 0x0b, 0xea, 0x2d, 0x07, 0x01, 0x95, 0x78, 0xe0, 0x85, 0x3c, 0x66, + 0xfb, 0xfc, 0x1d, 0x95, 0xd7, 0xc4, 0xd7, 0xec, 0xab, 0x05, 0x15, 0x79, 0xb6, 0xf7, 0xc5, 0x04, + 0xbd, 0x99, 0x88, 0x4e, 0x25, 0xcf, 0xe8, 0x84, 0x13, 0x3a, 0x62, 0x64, 0xca, 0x84, 0xc4, 0x4c, + 0xc6, 0x58, 0xd2, 0x09, 0x67, 0x32, 0xc3, 0xa1, 0x84, 0x47, 0xa0, 0x22, 0x28, 0x23, 0x34, 0xb3, + 0x8d, 0xae, 0xd1, 0xaf, 0xfb, 0x7b, 0x04, 0x1f, 0x83, 0xff, 0x15, 0xeb, 0x3c, 0x58, 0x49, 0x3a, + 0x0f, 0x39, 0xa1, 0xf6, 0x7f, 0x5d, 0xa3, 0xdf, 0x1c, 0xb7, 0xb6, 0x1b, 0xb7, 0xf9, 0x6a, 0x74, + 0x3a, 0x1b, 0xaf, 0xa4, 0xe6, 0xf5, 0x9b, 0xaa, 0xae, 0x40, 0xf0, 0x25, 0x38, 0x8a, 0x7f, 0x8f, + 0x99, 0x2f, 0x68, 0x96, 0xc6, 0x42, 0xc4, 0x9c, 0xd9, 0xe5, 0xae, 0xd1, 0x6f, 0x0c, 0x1d, 0x54, + 0x6c, 0x5d, 0xdc, 0x1e, 0x8d, 0xc2, 0x90, 0x0a, 0x31, 0xe1, 0xec, 0x2c, 0x8e, 0xfc, 0x5b, 0x37, + 0xba, 0x5f, 0x5c, 0x37, 0xc3, 0x36, 0x28, 0x63, 0x92, 0xc6, 0xcc, 0xae, 0xe8, 0x2d, 0x73, 0xa0, + 0xa2, 0x09, 0x0e, 0x68, 0x62, 0x57, 0xf3, 0xa8, 0x06, 0xf0, 0x39, 0x30, 0x53, 0x11, 0xd9, 0x35, + 0xbd, 0xef, 0xd3, 0x9f, 0x1b, 0xf7, 0x51, 0x14, 0xcb, 0xb7, 0xe7, 0x01, 0x0a, 0x79, 0xea, 0x25, + 0x31, 0xa3, 0x5a, 0x2f, 0xe2, 0x5d, 0xe6, 0xba, 0xe5, 0xa2, 0xf9, 0xf8, 0xa2, 0xd0, 0x64, 0x46, + 0x85, 0xc0, 0x11, 0xf5, 0x15, 0x0b, 0x7c, 0x03, 0xca, 0x67, 0xe7, 0x8c, 0x08, 0xbb, 0xde, 0x35, + 0xfb, 0x8d, 0xe1, 0x6d, 0x94, 0x9b, 0x82, 0x94, 0x29, 0x68, 0x6f, 0x0a, 0x9a, 0xf0, 0x98, 0x8d, + 0xef, 0xaf, 0x37, 0x6e, 0xe9, 0xf3, 0x37, 0xf7, 0xf8, 0xcf, 0x69, 0x49, 0x90, 0x3e, 0x10, 0xe4, + 0xdd, 0x7e, 0x90, 0xaa, 0x15, 0x7e, 0x4e, 0x7a, 0x62, 0xd5, 0xcc, 0x96, 0x75, 0x62, 0xd5, 0xac, + 0x56, 0xb9, 0xf7, 0x1e, 0xdc, 0x3b, 0xec, 0x97, 0x4f, 0xc5, 0x82, 0x33, 0x41, 0xe1, 0x31, 0xa8, + 0x2a, 0x57, 0xe6, 0x31, 0xd1, 0xc6, 0x59, 0x63, 0xb0, 0xdd, 0xb8, 0x15, 0xd5, 0x38, 0x7d, 0xe6, + 0x57, 0x54, 0x6a, 0x4a, 0xa0, 0x0d, 0xaa, 0x98, 0x90, 0x8c, 0x0a, 0xa1, 0xdd, 0xab, 0xfb, 0x05, + 0x84, 0x10, 0x58, 0x04, 0x4b, 0x6c, 0x9b, 0x4a, 0x24, 0x5f, 0x9f, 0x87, 0x9f, 0x0c, 0x60, 0xce, + 0x44, 0x04, 0x3f, 0x18, 0xc0, 0x3d, 0xf4, 0x6c, 0x3c, 0x74, 0xe3, 0xfd, 0xa2, 0xc3, 0x7b, 0x77, + 0x9e, 0xfc, 0x63, 0x43, 0x71, 0xd1, 0xf1, 0x64, 0xfd, 0xc3, 0x29, 0xad, 0xb7, 0x8e, 0x71, 0xb5, + 0x75, 0x8c, 0xef, 0x5b, 0xc7, 0xf8, 0xb8, 0x73, 0x4a, 0x57, 0x3b, 0xa7, 0xf4, 0x75, 0xe7, 0x94, + 0x5e, 0xdf, 0xfd, 0xab, 0xb5, 0x49, 0x90, 0x6a, 0xd1, 0x83, 0x8a, 0xfe, 0x13, 0x0f, 0x7f, 0x05, + 0x00, 0x00, 0xff, 0xff, 0xca, 0xf8, 0xad, 0x18, 0x8c, 0x03, 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 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + // StoreCodeAndInstantiateContract upload code and instantiate a contract using it + StoreCodeAndInstantiateContract(ctx context.Context, in *MsgStoreCodeAndInstantiateContract, opts ...grpc.CallOption) (*MsgStoreCodeAndInstantiateContractResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) StoreCodeAndInstantiateContract(ctx context.Context, in *MsgStoreCodeAndInstantiateContract, opts ...grpc.CallOption) (*MsgStoreCodeAndInstantiateContractResponse, error) { + out := new(MsgStoreCodeAndInstantiateContractResponse) + err := c.cc.Invoke(ctx, "/lbm.wasm.v1.Msg/StoreCodeAndInstantiateContract", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + // StoreCodeAndInstantiateContract upload code and instantiate a contract using it + StoreCodeAndInstantiateContract(context.Context, *MsgStoreCodeAndInstantiateContract) (*MsgStoreCodeAndInstantiateContractResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) StoreCodeAndInstantiateContract(ctx context.Context, req *MsgStoreCodeAndInstantiateContract) (*MsgStoreCodeAndInstantiateContractResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StoreCodeAndInstantiateContract not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_StoreCodeAndInstantiateContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgStoreCodeAndInstantiateContract) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).StoreCodeAndInstantiateContract(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lbm.wasm.v1.Msg/StoreCodeAndInstantiateContract", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).StoreCodeAndInstantiateContract(ctx, req.(*MsgStoreCodeAndInstantiateContract)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "lbm.wasm.v1.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "StoreCodeAndInstantiateContract", + Handler: _Msg_StoreCodeAndInstantiateContract_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "lbm/wasm/v1/tx.proto", +} + +func (m *MsgStoreCodeAndInstantiateContract) 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 *MsgStoreCodeAndInstantiateContract) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgStoreCodeAndInstantiateContract) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Funds) > 0 { + for iNdEx := len(m.Funds) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Funds[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + } + if len(m.Msg) > 0 { + i -= len(m.Msg) + copy(dAtA[i:], m.Msg) + i = encodeVarintTx(dAtA, i, uint64(len(m.Msg))) + i-- + dAtA[i] = 0x42 + } + if len(m.Label) > 0 { + i -= len(m.Label) + copy(dAtA[i:], m.Label) + i = encodeVarintTx(dAtA, i, uint64(len(m.Label))) + i-- + dAtA[i] = 0x3a + } + if len(m.Admin) > 0 { + i -= len(m.Admin) + copy(dAtA[i:], m.Admin) + i = encodeVarintTx(dAtA, i, uint64(len(m.Admin))) + i-- + dAtA[i] = 0x32 + } + if m.InstantiatePermission != nil { + { + size, err := m.InstantiatePermission.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.WASMByteCode) > 0 { + i -= len(m.WASMByteCode) + copy(dAtA[i:], m.WASMByteCode) + i = encodeVarintTx(dAtA, i, uint64(len(m.WASMByteCode))) + i-- + dAtA[i] = 0x12 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgStoreCodeAndInstantiateContractResponse) 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 *MsgStoreCodeAndInstantiateContractResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgStoreCodeAndInstantiateContractResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTx(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x1a + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTx(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x12 + } + if m.CodeID != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.CodeID)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgStoreCodeAndInstantiateContract) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.WASMByteCode) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.InstantiatePermission != nil { + l = m.InstantiatePermission.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Admin) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Label) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Msg) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Funds) > 0 { + for _, e := range m.Funds { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgStoreCodeAndInstantiateContractResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CodeID != 0 { + n += 1 + sovTx(uint64(m.CodeID)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgStoreCodeAndInstantiateContract) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgStoreCodeAndInstantiateContract: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgStoreCodeAndInstantiateContract: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WASMByteCode", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WASMByteCode = append(m.WASMByteCode[:0], dAtA[iNdEx:postIndex]...) + if m.WASMByteCode == nil { + m.WASMByteCode = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InstantiatePermission", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.InstantiatePermission == nil { + m.InstantiatePermission = &types.AccessConfig{} + } + if err := m.InstantiatePermission.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Admin", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Admin = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Label", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Label = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Msg = append(m.Msg[:0], dAtA[iNdEx:postIndex]...) + if m.Msg == nil { + m.Msg = []byte{} + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Funds", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Funds = append(m.Funds, types1.Coin{}) + if err := m.Funds[len(m.Funds)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgStoreCodeAndInstantiateContractResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgStoreCodeAndInstantiateContractResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgStoreCodeAndInstantiateContractResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CodeID", wireType) + } + m.CodeID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CodeID |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(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, ErrIntOverflowTx + } + 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, ErrIntOverflowTx + } + 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, ErrIntOverflowTx + } + 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, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/wasm/lbmtypes/tx_test.go b/x/wasm/lbmtypes/tx_test.go new file mode 100644 index 0000000000..2f91297b3e --- /dev/null +++ b/x/wasm/lbmtypes/tx_test.go @@ -0,0 +1,137 @@ +package lbmtypes + +import ( + "encoding/hex" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + sdk "github.com/line/lbm-sdk/types" + + wasmTypes "github.com/line/wasmd/x/wasm/types" +) + +func NewMsgStoreCodeAndInstantiateContract(fromAddr sdk.AccAddress) *MsgStoreCodeAndInstantiateContract { + return &MsgStoreCodeAndInstantiateContract{Sender: fromAddr.String()} +} + +func TestStoreCodeAndInstantiateContractValidation(t *testing.T) { + bad, err := sdk.AccAddressFromHex("012345") + require.NoError(t, err) + badAddress := bad.String() + require.NoError(t, err) + // proper address size + goodAddress := sdk.AccAddress(make([]byte, wasmTypes.ContractAddrLen)).String() + sdk.GetConfig().SetAddressVerifier(wasmTypes.VerifyAddressLen()) + + cases := map[string]struct { + msg MsgStoreCodeAndInstantiateContract + valid bool + }{ + "empty": { + msg: MsgStoreCodeAndInstantiateContract{}, + valid: false, + }, + "correct minimal": { + msg: MsgStoreCodeAndInstantiateContract{ + Sender: goodAddress, + WASMByteCode: []byte("foo"), + Label: "foo", + Msg: []byte("{}"), + }, + valid: true, + }, + "missing code": { + msg: MsgStoreCodeAndInstantiateContract{ + Sender: goodAddress, + Label: "foo", + Msg: []byte("{}"), + }, + valid: false, + }, + "missing label": { + msg: MsgStoreCodeAndInstantiateContract{ + Sender: goodAddress, + WASMByteCode: []byte("foo"), + Msg: []byte("{}"), + }, + valid: false, + }, + "missing init message": { + msg: MsgStoreCodeAndInstantiateContract{ + Sender: goodAddress, + WASMByteCode: []byte("foo"), + Label: "foo", + }, + valid: false, + }, + "correct maximal": { + msg: MsgStoreCodeAndInstantiateContract{ + Sender: goodAddress, + WASMByteCode: []byte("foo"), + Label: "foo", + Msg: []byte(`{"some": "data"}`), + Funds: sdk.Coins{sdk.Coin{Denom: "foobar", Amount: sdk.NewInt(200)}}, + }, + valid: true, + }, + "invalid InstantiatePermission": { + msg: MsgStoreCodeAndInstantiateContract{ + Sender: goodAddress, + WASMByteCode: []byte("foo"), + InstantiatePermission: &wasmTypes.AccessConfig{Permission: wasmTypes.AccessTypeOnlyAddress, Address: badAddress}, + Label: "foo", + Msg: []byte(`{"some": "data"}`), + Funds: sdk.Coins{sdk.Coin{Denom: "foobar", Amount: sdk.NewInt(200)}}, + }, + valid: false, + }, + "negative funds": { + msg: MsgStoreCodeAndInstantiateContract{ + Sender: goodAddress, + WASMByteCode: []byte("foo"), + Msg: []byte(`{"some": "data"}`), + // we cannot use sdk.NewCoin() constructors as they panic on creating invalid data (before we can test) + Funds: sdk.Coins{sdk.Coin{Denom: "foobar", Amount: sdk.NewInt(-200)}}, + }, + valid: false, + }, + "non json init msg": { + msg: MsgStoreCodeAndInstantiateContract{ + Sender: goodAddress, + WASMByteCode: []byte("foo"), + Label: "foo", + Msg: []byte("invalid-json"), + }, + valid: false, + }, + "bad sender minimal": { + msg: MsgStoreCodeAndInstantiateContract{ + Sender: badAddress, + WASMByteCode: []byte("foo"), + Label: "foo", + Msg: []byte("{}"), + }, + valid: false, + }, + } + + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + err := tc.msg.ValidateBasic() + if tc.valid { + assert.NoError(t, err) + } else { + assert.Error(t, err) + } + }) + } +} + +func TestNewMsgStoreCodeAndInstantiateContractGetSigners(t *testing.T) { + res := NewMsgStoreCodeAndInstantiateContract(sdk.AccAddress([]byte("input111111111111111"))).GetSigners() + bytes := sdk.MustAccAddressFromBech32(res[0].String()) + require.Equal(t, "696e707574313131313131313131313131313131", fmt.Sprintf("%v", hex.EncodeToString(bytes))) +} diff --git a/x/wasm/lbmtypes/validation.go b/x/wasm/lbmtypes/validation.go new file mode 100644 index 0000000000..0d3465209c --- /dev/null +++ b/x/wasm/lbmtypes/validation.go @@ -0,0 +1,27 @@ +package lbmtypes + +import ( + sdkerrors "github.com/line/lbm-sdk/types/errors" + + wasmtypes "github.com/line/wasmd/x/wasm/types" +) + +func validateWasmCode(s []byte) error { + if len(s) == 0 { + return sdkerrors.Wrap(wasmtypes.ErrEmpty, "is required") + } + if len(s) > wasmtypes.MaxWasmSize { + return sdkerrors.Wrapf(wasmtypes.ErrLimit, "cannot be longer than %d bytes", wasmtypes.MaxWasmSize) + } + return nil +} + +func validateLabel(label string) error { + if label == "" { + return sdkerrors.Wrap(wasmtypes.ErrEmpty, "is required") + } + if len(label) > wasmtypes.MaxLabelSize { + return sdkerrors.Wrapf(wasmtypes.ErrLimit, "cannot be longer than %d characters", wasmtypes.MaxWasmSize) + } + return nil +} diff --git a/x/wasm/module.go b/x/wasm/module.go index 9f078bb12f..636e9dda8d 100644 --- a/x/wasm/module.go +++ b/x/wasm/module.go @@ -5,26 +5,26 @@ import ( "encoding/json" "math/rand" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - cdctypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/server" - servertypes "github.com/cosmos/cosmos-sdk/server/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - simKeeper "github.com/cosmos/cosmos-sdk/x/simulation" - "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cast" "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/CosmWasm/wasmd/x/wasm/client/cli" - "github.com/CosmWasm/wasmd/x/wasm/client/rest" - "github.com/CosmWasm/wasmd/x/wasm/keeper" - "github.com/CosmWasm/wasmd/x/wasm/simulation" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/client" + "github.com/line/lbm-sdk/codec" + cdctypes "github.com/line/lbm-sdk/codec/types" + "github.com/line/lbm-sdk/server" + servertypes "github.com/line/lbm-sdk/server/types" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/types/module" + simtypes "github.com/line/lbm-sdk/types/simulation" + simKeeper "github.com/line/lbm-sdk/x/simulation" + abci "github.com/line/ostracon/abci/types" + + "github.com/line/wasmd/x/wasm/client/cli" + "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/lbmtypes" + "github.com/line/wasmd/x/wasm/simulation" + "github.com/line/wasmd/x/wasm/types" ) var ( @@ -76,11 +76,6 @@ func (b AppModuleBasic) ValidateGenesis(marshaler codec.JSONCodec, config client return ValidateGenesis(data) } -// RegisterRESTRoutes registers the REST routes for the wasm module. -func (AppModuleBasic) RegisterRESTRoutes(cliCtx client.Context, rtr *mux.Router) { - rest.RegisterRoutes(cliCtx, rtr) -} - // GetTxCmd returns the root tx command for the wasm module. func (b AppModuleBasic) GetTxCmd() *cobra.Command { return cli.GetTxCmd() @@ -93,7 +88,7 @@ func (b AppModuleBasic) GetQueryCmd() *cobra.Command { // RegisterInterfaces implements InterfaceModule func (b AppModuleBasic) RegisterInterfaces(registry cdctypes.InterfaceRegistry) { - types.RegisterInterfaces(registry) + lbmtypes.RegisterInterfaces(registry) } // ____________________________________________________________________________ @@ -135,6 +130,12 @@ func NewAppModule( func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(keeper.NewDefaultPermissionKeeper(am.keeper))) types.RegisterQueryServer(cfg.QueryServer(), NewQuerier(am.keeper)) + lbmtypes.RegisterQueryServer(cfg.QueryServer(), NewQuerier(am.keeper)) + + // m := keeper.NewMigrator(*am.keeper) + // if err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2); err != nil { + // panic(fmt.Sprintf("failed to migrate x/distribution from version 1 to 2: %v", err)) + // } } func (am AppModule) LegacyQuerierHandler(amino *codec.LegacyAmino) sdk.Querier { //nolint:staticcheck @@ -157,7 +158,7 @@ func (AppModule) QuerierRoute() string { // InitGenesis performs genesis initialization for the wasm module. It returns // no validator updates. func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate { - var genesisState GenesisState + var genesisState types.GenesisState cdc.MustUnmarshalJSON(data, &genesisState) validators, err := InitGenesis(ctx, am.keeper, genesisState, am.validatorSetSource, am.Route().Handler()) if err != nil { diff --git a/x/wasm/module_test.go b/x/wasm/module_test.go index 5c68cb2c94..e7d609da1d 100644 --- a/x/wasm/module_test.go +++ b/x/wasm/module_test.go @@ -3,23 +3,24 @@ package wasm import ( "encoding/json" "fmt" - "io/ioutil" + "os" "testing" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/dvsekhvalnov/jose2go/base64url" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/CosmWasm/wasmd/x/wasm/keeper" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/types/module" + authkeeper "github.com/line/lbm-sdk/x/auth/keeper" + bankkeeper "github.com/line/lbm-sdk/x/bank/keeper" + stakingkeeper "github.com/line/lbm-sdk/x/staking/keeper" + abci "github.com/line/ostracon/abci/types" + "github.com/line/ostracon/crypto" + "github.com/line/ostracon/crypto/ed25519" + + "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/types" ) type testData struct { @@ -33,7 +34,7 @@ type testData struct { } func setupTest(t *testing.T) testData { - ctx, keepers := CreateTestInput(t, false, "iterator,staking,stargate") + ctx, keepers := CreateTestInput(t, false, "iterator,staking,stargate", nil, nil) cdc := keeper.MakeTestCodec(t) data := testData{ module: NewAppModule(cdc, keepers.WasmKeeper, keepers.StakingKeeper, keepers.AccountKeeper, keepers.BankKeeper), @@ -55,7 +56,7 @@ func keyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { } func mustLoad(path string) []byte { - bz, err := ioutil.ReadFile(path) + bz, err := os.ReadFile(path) if err != nil { panic(err) } @@ -135,6 +136,8 @@ type initMsg struct { Beneficiary sdk.AccAddress `json:"beneficiary"` } +type emptyMsg struct{} + type state struct { Verifier string `json:"verifier"` Beneficiary string `json:"beneficiary"` @@ -177,14 +180,69 @@ func TestHandleInstantiate(t *testing.T) { require.NoError(t, err) contractBech32Addr := parseInitResponse(t, res.Data) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", contractBech32Addr) + assert.Equal(t, "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8", contractBech32Addr) // this should be standard x/wasm init event, nothing from contract - require.Equal(t, 3, len(res.Events), prettyEvents(res.Events)) - require.Equal(t, "message", res.Events[0].Type) + assert.Equal(t, 3, len(res.Events), prettyEvents(res.Events)) + assert.Equal(t, "message", res.Events[0].Type) assertAttribute(t, "module", "wasm", res.Events[0].Attributes[0]) - require.Equal(t, "instantiate", res.Events[1].Type) - require.Equal(t, "wasm", res.Events[2].Type) + assert.Equal(t, "instantiate", res.Events[1].Type) + assert.Equal(t, "wasm", res.Events[2].Type) + assertAttribute(t, "_contract_address", contractBech32Addr, res.Events[2].Attributes[0]) + + assertCodeList(t, q, data.ctx, 1) + assertCodeBytes(t, q, data.ctx, 1, testContract) + + assertContractList(t, q, data.ctx, 1, []string{contractBech32Addr}) + assertContractInfo(t, q, data.ctx, contractBech32Addr, 1, creator) + assertContractState(t, q, data.ctx, contractBech32Addr, state{ + Verifier: fred.String(), + Beneficiary: bob.String(), + Funder: creator.String(), + }) +} + +func TestHandleStoreAndInstantiate(t *testing.T) { + data := setupTest(t) + creator := data.faucet.NewFundedAccount(data.ctx, sdk.NewInt64Coin("denom", 100000)) + + h := data.module.Route().Handler() + q := data.module.LegacyQuerierHandler(nil) + + _, _, bob := keyPubAddr() + _, _, fred := keyPubAddr() + + initMsg := initMsg{ + Verifier: fred, + Beneficiary: bob, + } + msgBz, err := json.Marshal(initMsg) + require.NoError(t, err) + + // create with no balance is legal + msg := &MsgStoreCodeAndInstantiateContract{ + Sender: creator.String(), + WASMByteCode: testContract, + Msg: msgBz, + Label: "contract for test", + Funds: nil, + } + res, err := h(data.ctx, msg) + require.NoError(t, err) + codeID, contractBech32Addr := parseStoreAndInitResponse(t, res.Data) + + require.Equal(t, uint64(1), codeID) + require.Equal(t, "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8", contractBech32Addr) + // this should be standard x/wasm init event, nothing from contract + require.Equal(t, 4, len(res.Events), prettyEvents(res.Events)) + assert.Equal(t, "store_code", res.Events[0].Type) + assertAttribute(t, "code_id", "1", res.Events[0].Attributes[0]) + assert.Equal(t, "message", res.Events[1].Type) + assertAttribute(t, "module", "wasm", res.Events[1].Attributes[0]) + assert.Equal(t, "instantiate", res.Events[2].Type) assertAttribute(t, "_contract_address", contractBech32Addr, res.Events[2].Attributes[0]) + assertAttribute(t, "code_id", "1", res.Events[2].Attributes[1]) + assert.Equal(t, "wasm", res.Events[3].Type) + assertAttribute(t, "_contract_address", contractBech32Addr, res.Events[3].Attributes[0]) assertCodeList(t, q, data.ctx, 1) assertCodeBytes(t, q, data.ctx, 1, testContract) @@ -198,6 +256,124 @@ func TestHandleInstantiate(t *testing.T) { }) } +func TestErrorsCreateAndInstantiate(t *testing.T) { + // init messages + _, _, bob := keyPubAddr() + _, _, fred := keyPubAddr() + initMsg := initMsg{ + Verifier: fred, + Beneficiary: bob, + } + validInitMsgBz, err := json.Marshal(initMsg) + require.NoError(t, err) + + invalidInitMsgBz, err := json.Marshal(emptyMsg{}) + + expectedContractBech32Addr := "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8" + + // test cases + cases := map[string]struct { + msg sdk.Msg + isValid bool + expectedCodes int + expectedBytes []byte + }{ + "empty": { + msg: &MsgStoreCodeAndInstantiateContract{}, + isValid: false, + expectedCodes: 0, + expectedBytes: nil, + }, + "valid one": { + msg: &MsgStoreCodeAndInstantiateContract{ + Sender: addr1, + WASMByteCode: testContract, + Msg: validInitMsgBz, + Label: "foo", + Funds: nil, + }, + isValid: true, + expectedCodes: 1, + expectedBytes: testContract, + }, + "invalid wasm": { + msg: &MsgStoreCodeAndInstantiateContract{ + Sender: addr1, + WASMByteCode: []byte("foobar"), + Msg: validInitMsgBz, + Label: "foo", + Funds: nil, + }, + isValid: false, + expectedCodes: 0, + expectedBytes: nil, + }, + "old wasm (0.7)": { + msg: &MsgStoreCodeAndInstantiateContract{ + Sender: addr1, + WASMByteCode: oldContract, + Msg: validInitMsgBz, + Label: "foo", + Funds: nil, + }, + isValid: false, + expectedCodes: 0, + expectedBytes: nil, + }, + "invalid init message": { + msg: &MsgStoreCodeAndInstantiateContract{ + Sender: addr1, + WASMByteCode: testContract, + Msg: invalidInitMsgBz, + Label: "foo", + Funds: nil, + }, + isValid: false, + expectedCodes: 1, + expectedBytes: testContract, + }, + } + + for name, tc := range cases { + tc := tc + t.Run(name, func(t *testing.T) { + data := setupTest(t) + + h := data.module.Route().Handler() + q := data.module.LegacyQuerierHandler(nil) + + // asserting response + res, err := h(data.ctx, tc.msg) + if tc.isValid { + require.NoError(t, err) + codeID, contractBech32Addr := parseStoreAndInitResponse(t, res.Data) + require.Equal(t, uint64(1), codeID) + require.Equal(t, expectedContractBech32Addr, contractBech32Addr) + + } else { + require.Error(t, err, "%#v", res) + } + + // asserting code state + assertCodeList(t, q, data.ctx, tc.expectedCodes) + assertCodeBytes(t, q, data.ctx, 1, tc.expectedBytes) + + // asserting contract state + if tc.isValid { + assertContractList(t, q, data.ctx, 1, []string{expectedContractBech32Addr}) + assertContractInfo(t, q, data.ctx, expectedContractBech32Addr, 1, addrAcc1) + assertContractState(t, q, data.ctx, expectedContractBech32Addr, state{ + Verifier: fred.String(), + Beneficiary: bob.String(), + Funder: addrAcc1.String(), + }) + } else { + assertContractList(t, q, data.ctx, 0, []string{}) + } + }) + } +} + func TestHandleExecute(t *testing.T) { data := setupTest(t) @@ -236,16 +412,16 @@ func TestHandleExecute(t *testing.T) { require.NoError(t, err) contractBech32Addr := parseInitResponse(t, res.Data) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", contractBech32Addr) - // this should be standard x/wasm message event, init event, plus a bank send event (2), with no custom contract events - require.Equal(t, 6, len(res.Events), prettyEvents(res.Events)) - require.Equal(t, "message", res.Events[0].Type) + assert.Equal(t, "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8", contractBech32Addr) + // this should be standard x/wasm init event, plus a bank send event (2), with no custom contract events + assert.Equal(t, 6, len(res.Events), prettyEvents(res.Events)) + assert.Equal(t, "message", res.Events[0].Type) assertAttribute(t, "module", "wasm", res.Events[0].Attributes[0]) - require.Equal(t, "coin_spent", res.Events[1].Type) - require.Equal(t, "coin_received", res.Events[2].Type) - require.Equal(t, "transfer", res.Events[3].Type) - require.Equal(t, "instantiate", res.Events[4].Type) - require.Equal(t, "wasm", res.Events[5].Type) + assert.Equal(t, "coin_spent", res.Events[1].Type) + assert.Equal(t, "coin_received", res.Events[2].Type) + assert.Equal(t, "transfer", res.Events[3].Type) + assert.Equal(t, "instantiate", res.Events[4].Type) + assert.Equal(t, "wasm", res.Events[5].Type) assertAttribute(t, "_contract_address", contractBech32Addr, res.Events[5].Attributes[0]) // ensure bob doesn't exist @@ -272,7 +448,7 @@ func TestHandleExecute(t *testing.T) { } res, err = h(data.ctx, &execCmd) require.NoError(t, err) - // from https://github.com/CosmWasm/cosmwasm/blob/master/contracts/hackatom/src/contract.rs#L167 + // executing https://github.com/line/cosmwasm/blob/main/contracts/hackatom/src/contract.rs do_release assertExecuteResponse(t, res.Data, []byte{0xf0, 0x0b, 0xaa}) // this should be standard message event, plus x/wasm init event, plus 2 bank send event, plus a special event from the contract @@ -283,6 +459,10 @@ func TestHandleExecute(t *testing.T) { assert.Equal(t, "coin_spent", res.Events[1].Type) assert.Equal(t, "coin_received", res.Events[2].Type) + assert.Equal(t, "coin_spent", res.Events[1].Type) + assertAttribute(t, "spender", fred.String(), res.Events[1].Attributes[0]) + assert.Equal(t, "coin_received", res.Events[2].Type) + assertAttribute(t, "receiver", contractBech32Addr, res.Events[2].Attributes[0]) require.Equal(t, "transfer", res.Events[3].Type) require.Len(t, res.Events[3].Attributes, 3) assertAttribute(t, "recipient", contractBech32Addr, res.Events[3].Attributes[0]) @@ -299,10 +479,12 @@ func TestHandleExecute(t *testing.T) { assert.Equal(t, "wasm-hackatom", res.Events[6].Type) assertAttribute(t, "_contract_address", contractBech32Addr, res.Events[6].Attributes[0]) assertAttribute(t, "action", "release", res.Events[6].Attributes[1]) + // second transfer (this without conflicting message) assert.Equal(t, "coin_spent", res.Events[7].Type) + assertAttribute(t, "spender", contractBech32Addr, res.Events[7].Attributes[0]) assert.Equal(t, "coin_received", res.Events[8].Type) - + assertAttribute(t, "receiver", bob.String(), res.Events[8].Attributes[0]) assert.Equal(t, "transfer", res.Events[9].Type) assertAttribute(t, "recipient", bob.String(), res.Events[9].Attributes[0]) assertAttribute(t, "sender", contractBech32Addr, res.Events[9].Attributes[1]) @@ -368,7 +550,7 @@ func TestHandleExecuteEscrow(t *testing.T) { res, err = h(data.ctx, &initCmd) require.NoError(t, err) contractBech32Addr := parseInitResponse(t, res.Data) - require.Equal(t, "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", contractBech32Addr) + require.Equal(t, "link14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sgf2vn8", contractBech32Addr) handleMsg := map[string]interface{}{ "release": map[string]interface{}{}, @@ -384,7 +566,7 @@ func TestHandleExecuteEscrow(t *testing.T) { } res, err = h(data.ctx, &execCmd) require.NoError(t, err) - // from https://github.com/CosmWasm/cosmwasm/blob/master/contracts/hackatom/src/contract.rs#L167 + // executing https://github.com/line/cosmwasm/blob/main/contracts/hackatom/src/contract.rs do_release assertExecuteResponse(t, res.Data, []byte{0xf0, 0x0b, 0xaa}) // ensure bob now exists and got both payments released diff --git a/x/wasm/relay_pingpong_test.go b/x/wasm/relay_pingpong_test.go index 46c32497b3..4f0191d2c6 100644 --- a/x/wasm/relay_pingpong_test.go +++ b/x/wasm/relay_pingpong_test.go @@ -5,22 +5,22 @@ import ( "fmt" "testing" - ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - ibctesting "github.com/cosmos/ibc-go/v3/testing" - - wasmvm "github.com/CosmWasm/wasmvm" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - wasmibctesting "github.com/CosmWasm/wasmd/x/wasm/ibctesting" - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/store/prefix" + sdk "github.com/line/lbm-sdk/types" + ibctransfertypes "github.com/line/lbm-sdk/x/ibc/applications/transfer/types" + clienttypes "github.com/line/lbm-sdk/x/ibc/core/02-client/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + ibctesting "github.com/line/lbm-sdk/x/ibc/testing" + wasmvm "github.com/line/wasmvm" + wasmvmtypes "github.com/line/wasmvm/types" + + wasmibctesting "github.com/line/wasmd/x/wasm/ibctesting" + wasmkeeper "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + wasmtypes "github.com/line/wasmd/x/wasm/types" ) const ( diff --git a/x/wasm/relay_test.go b/x/wasm/relay_test.go index 5edd182d59..eb0d3bcf5d 100644 --- a/x/wasm/relay_test.go +++ b/x/wasm/relay_test.go @@ -6,21 +6,22 @@ import ( "testing" "time" - wasmvm "github.com/CosmWasm/wasmvm" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - ibctesting "github.com/cosmos/ibc-go/v3/testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - wasmibctesting "github.com/CosmWasm/wasmd/x/wasm/ibctesting" - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - wasmtesting "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" - "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + ibctransfertypes "github.com/line/lbm-sdk/x/ibc/applications/transfer/types" + clienttypes "github.com/line/lbm-sdk/x/ibc/core/02-client/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + ibctesting "github.com/line/lbm-sdk/x/ibc/testing" + wasmvm "github.com/line/wasmvm" + wasmvmtypes "github.com/line/wasmvm/types" + + wasmibctesting "github.com/line/wasmd/x/wasm/ibctesting" + wasmkeeper "github.com/line/wasmd/x/wasm/keeper" + wasmtesting "github.com/line/wasmd/x/wasm/keeper/wasmtesting" + "github.com/line/wasmd/x/wasm/types" ) func TestFromIBCTransferToContract(t *testing.T) { @@ -146,6 +147,7 @@ func TestContractCanInitiateIBCTransferMsg(t *testing.T) { chainA = coordinator.GetChain(wasmibctesting.GetChainID(0)) chainB = coordinator.GetChain(wasmibctesting.GetChainID(1)) ) + myContractAddr := chainA.SeedNewContractInstance() coordinator.CommitBlock(chainA, chainB) @@ -160,6 +162,7 @@ func TestContractCanInitiateIBCTransferMsg(t *testing.T) { Version: ibctransfertypes.Version, Order: channeltypes.UNORDERED, } + coordinator.SetupConnections(path) coordinator.CreateChannels(path) diff --git a/x/wasm/simulation/genesis.go b/x/wasm/simulation/genesis.go index c9bd60e700..4981401687 100644 --- a/x/wasm/simulation/genesis.go +++ b/x/wasm/simulation/genesis.go @@ -1,29 +1,33 @@ package simulation import ( - "github.com/cosmos/cosmos-sdk/types/module" + "encoding/json" + "fmt" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/lbm-sdk/types/module" + + "github.com/line/wasmd/x/wasm/types" ) -// RandomizeGenState generates a random GenesisState for wasm -func RandomizedGenState(simstate *module.SimulationState) { - params := RandomParams(simstate.Rand) +// RandomizedGenState RandomizeGenState generates a random GenesisState for wasm +func RandomizedGenState(simState *module.SimulationState) { + params := RandomParams(simState.Rand) wasmGenesis := types.GenesisState{ Params: params, Codes: nil, Contracts: nil, Sequences: []types.Sequence{ - {IDKey: types.KeyLastCodeID, Value: simstate.Rand.Uint64()}, - {IDKey: types.KeyLastInstanceID, Value: simstate.Rand.Uint64()}, + {IDKey: types.KeyLastCodeID, Value: simState.Rand.Uint64()}, + {IDKey: types.KeyLastInstanceID, Value: simState.Rand.Uint64()}, }, GenMsgs: nil, } - _, err := simstate.Cdc.MarshalJSON(&wasmGenesis) + bz, err := json.MarshalIndent(&wasmGenesis.Params, "", " ") if err != nil { panic(err) } - simstate.GenState[types.ModuleName] = simstate.Cdc.MustMarshalJSON(&wasmGenesis) + fmt.Printf("Selected randomly generated wasm parameters:\n%s\n", bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&wasmGenesis) } diff --git a/x/wasm/simulation/operations.go b/x/wasm/simulation/operations.go index 40de06a520..5f2f0eedac 100644 --- a/x/wasm/simulation/operations.go +++ b/x/wasm/simulation/operations.go @@ -1,26 +1,24 @@ package simulation import ( - "io/ioutil" "math/rand" - "github.com/cosmos/cosmos-sdk/baseapp" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - "github.com/cosmos/cosmos-sdk/x/simulation" + "github.com/line/lbm-sdk/baseapp" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/types/module" + simtypes "github.com/line/lbm-sdk/types/simulation" + "github.com/line/lbm-sdk/x/simulation" - "github.com/CosmWasm/wasmd/app/params" - "github.com/CosmWasm/wasmd/x/wasm/types" + wasmappparams "github.com/line/wasmd/app/params" + "github.com/line/wasmd/x/wasm/keeper/testdata" + "github.com/line/wasmd/x/wasm/types" ) // Simulation operation weights constants -//nolint:gosec const ( - OpWeightMsgStoreCode = "op_weight_msg_store_code" - OpWeightMsgInstantiateContract = "op_weight_msg_instantiate_contract" - OpReflectContractPath = "op_reflect_contract_path" + OpWeightMsgStoreCode = "op_weight_msg_store_code" //nolint:gosec + OpWeightMsgInstantiateContract = "op_weight_msg_instantiate_contract" //nolint:gosec + OpReflectContractPath = "op_reflect_contract_path" //nolint:gosec ) // WasmKeeper is a subset of the wasm keeper used by simulations @@ -39,31 +37,21 @@ func WeightedOperations( var ( weightMsgStoreCode int weightMsgInstantiateContract int - wasmContractPath string ) simstate.AppParams.GetOrGenerate(simstate.Cdc, OpWeightMsgStoreCode, &weightMsgStoreCode, nil, func(_ *rand.Rand) { - weightMsgStoreCode = params.DefaultWeightMsgStoreCode + weightMsgStoreCode = wasmappparams.DefaultWeightMsgStoreCode }, ) simstate.AppParams.GetOrGenerate(simstate.Cdc, OpWeightMsgInstantiateContract, &weightMsgInstantiateContract, nil, func(_ *rand.Rand) { - weightMsgInstantiateContract = params.DefaultWeightMsgInstantiateContract - }, - ) - simstate.AppParams.GetOrGenerate(simstate.Cdc, OpReflectContractPath, &wasmContractPath, nil, - func(_ *rand.Rand) { - // simulations are run from the `app` folder - wasmContractPath = "../x/wasm/keeper/testdata/reflect.wasm" + weightMsgInstantiateContract = wasmappparams.DefaultWeightMsgInstantiateContract }, ) - wasmBz, err := ioutil.ReadFile(wasmContractPath) - if err != nil { - panic(err) - } + wasmBz := testdata.ReflectContractWasm() return simulation.WeightedOperations{ simulation.NewWeightedOperation( @@ -104,7 +92,7 @@ func SimulateMsgStoreCode(ak types.AccountKeeper, bk simulation.BankKeeper, wasm txCtx := simulation.OperationInput{ R: r, App: app, - TxGen: simappparams.MakeTestEncodingConfig().TxConfig, + TxGen: wasmappparams.MakeEncodingConfig().TxConfig, Cdc: nil, Msg: &msg, MsgType: msg.Type(), @@ -157,7 +145,7 @@ func SimulateMsgInstantiateContract(ak types.AccountKeeper, bk simulation.BankKe txCtx := simulation.OperationInput{ R: r, App: app, - TxGen: simappparams.MakeTestEncodingConfig().TxConfig, + TxGen: wasmappparams.MakeEncodingConfig().TxConfig, Cdc: nil, Msg: &msg, MsgType: msg.Type(), diff --git a/x/wasm/simulation/operations_test.go b/x/wasm/simulation/operations_test.go new file mode 100644 index 0000000000..47981a8e45 --- /dev/null +++ b/x/wasm/simulation/operations_test.go @@ -0,0 +1,74 @@ +package simulation + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/line/lbm-sdk/types/module" + "github.com/line/lbm-sdk/x/simulation" + + wasmappparams "github.com/line/wasmd/app/params" + "github.com/line/wasmd/x/wasm/keeper" + "github.com/line/wasmd/x/wasm/types" +) + +func TestWeightedOperations(t *testing.T) { + type args struct { + simstate *module.SimulationState + ak types.AccountKeeper + bk simulation.BankKeeper + wasmKeeper WasmKeeper + wasmBz []byte + } + + params := args{ + simstate: &module.SimulationState{}, + wasmKeeper: makeKeeper(t).WasmKeeper, + } + + tests := []struct { + name string + args args + want simulation.WeightedOperations + }{ + { + name: "execute success", + args: args{ + simstate: &module.SimulationState{}, + }, + want: simulation.WeightedOperations{ + simulation.NewWeightedOperation( + wasmappparams.DefaultWeightMsgStoreCode, + SimulateMsgStoreCode(params.ak, params.bk, params.wasmKeeper, params.wasmBz)), + simulation.NewWeightedOperation( + wasmappparams.DefaultWeightMsgInstantiateContract, + SimulateMsgInstantiateContract(params.ak, params.bk, params.wasmKeeper)), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := WeightedOperations(tt.args.simstate, tt.args.ak, tt.args.bk, tt.args.wasmKeeper) + for i := range got { + require.Equal(t, tt.want[i].Weight(), got[i].Weight(), "WeightedOperations().Weight()") + + expected := reflect.TypeOf(tt.want[i].Op()).String() + actual := reflect.TypeOf(got[i].Op()).String() + + require.Equal(t, expected, actual, "return value type should be the same") + } + }) + } +} + +// Copy from keeper_test.go +const SupportedFeatures = "iterator,staking,stargate" + +// Copy from keeper_test.go +func makeKeeper(t *testing.T) keeper.TestKeepers { + _, keepers := keeper.CreateTestInput(t, false, SupportedFeatures, nil, nil) + return keepers +} diff --git a/x/wasm/simulation/params.go b/x/wasm/simulation/params.go index 0de0d0b4ad..dcac18af09 100644 --- a/x/wasm/simulation/params.go +++ b/x/wasm/simulation/params.go @@ -4,11 +4,11 @@ import ( "fmt" "math/rand" - "github.com/cosmos/cosmos-sdk/codec" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - "github.com/cosmos/cosmos-sdk/x/simulation" + "github.com/line/lbm-sdk/codec" + simtypes "github.com/line/lbm-sdk/types/simulation" + "github.com/line/lbm-sdk/x/simulation" - "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/line/wasmd/x/wasm/types" ) func ParamChanges(r *rand.Rand, cdc codec.Codec) []simtypes.ParamChange { @@ -38,5 +38,8 @@ func RandomParams(r *rand.Rand) types.Params { return types.Params{ CodeUploadAccess: accessConfig, InstantiateDefaultPermission: accessConfig.Permission, + GasMultiplier: types.DefaultGasMultiplier, + InstanceCost: types.DefaultInstanceCost, + CompileCost: types.DefaultCompileCost, } } diff --git a/x/wasm/types/ante.go b/x/wasm/types/ante.go index 4c76efdf45..3ee74d2cca 100644 --- a/x/wasm/types/ante.go +++ b/x/wasm/types/ante.go @@ -1,7 +1,7 @@ package types import ( - sdk "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/line/lbm-sdk/types" ) type contextKey int diff --git a/x/wasm/types/codec.go b/x/wasm/types/codec.go index e7e578b7f8..a7012c26c6 100644 --- a/x/wasm/types/codec.go +++ b/x/wasm/types/codec.go @@ -1,22 +1,27 @@ package types import ( - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/codec/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/msgservice" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/codec/legacy" + "github.com/line/lbm-sdk/codec/types" + cryptocodec "github.com/line/lbm-sdk/crypto/codec" + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/types/msgservice" + authzcodec "github.com/line/lbm-sdk/x/authz/codec" + govcodec "github.com/line/lbm-sdk/x/gov/codec" + govtypes "github.com/line/lbm-sdk/x/gov/types" ) // RegisterLegacyAminoCodec registers the account types and interface func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { //nolint:staticcheck - cdc.RegisterConcrete(&MsgStoreCode{}, "wasm/MsgStoreCode", nil) - cdc.RegisterConcrete(&MsgInstantiateContract{}, "wasm/MsgInstantiateContract", nil) - cdc.RegisterConcrete(&MsgExecuteContract{}, "wasm/MsgExecuteContract", nil) - cdc.RegisterConcrete(&MsgMigrateContract{}, "wasm/MsgMigrateContract", nil) - cdc.RegisterConcrete(&MsgUpdateAdmin{}, "wasm/MsgUpdateAdmin", nil) - cdc.RegisterConcrete(&MsgClearAdmin{}, "wasm/MsgClearAdmin", nil) + legacy.RegisterAminoMsg(cdc, &MsgStoreCode{}, "wasm/MsgStoreCode") + legacy.RegisterAminoMsg(cdc, &MsgInstantiateContract{}, "wasm/MsgInstantiateContract") + legacy.RegisterAminoMsg(cdc, &MsgExecuteContract{}, "wasm/MsgExecuteContract") + legacy.RegisterAminoMsg(cdc, &MsgMigrateContract{}, "wasm/MsgMigrateContract") + legacy.RegisterAminoMsg(cdc, &MsgUpdateAdmin{}, "wasm/MsgUpdateAdmin") + legacy.RegisterAminoMsg(cdc, &MsgClearAdmin{}, "wasm/MsgClearAdmin") + legacy.RegisterAminoMsg(cdc, &MsgIBCSend{}, "wasm/MsgIBCSend") + legacy.RegisterAminoMsg(cdc, &MsgIBCCloseChannel{}, "wasm/MsgIBCCloseChannel") cdc.RegisterConcrete(&PinCodesProposal{}, "wasm/PinCodesProposal", nil) cdc.RegisterConcrete(&UnpinCodesProposal{}, "wasm/UnpinCodesProposal", nil) @@ -62,15 +67,17 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { } var ( - amino = codec.NewLegacyAmino() - - // ModuleCdc references the global x/wasm module codec. - + amino = codec.NewLegacyAmino() ModuleCdc = codec.NewAminoCodec(amino) ) func init() { RegisterLegacyAminoCodec(amino) cryptocodec.RegisterCrypto(amino) - amino.Seal() + sdk.RegisterLegacyAminoCodec(amino) + + // Register all Amino interfaces and concrete types on the authz Amino codec so that this can later be + // used to properly serialize MsgGrant, MsgExec and MsgSubmitProposal instances + RegisterLegacyAminoCodec(authzcodec.Amino) + RegisterLegacyAminoCodec(govcodec.Amino) } diff --git a/x/wasm/types/encoder.go b/x/wasm/types/encoder.go new file mode 100644 index 0000000000..209cc7c1dc --- /dev/null +++ b/x/wasm/types/encoder.go @@ -0,0 +1,22 @@ +package types + +import ( + "encoding/json" +) + +type EncodingModule string + +const ( + TokenM = EncodingModule("token") + CollectionM = EncodingModule("collection") +) + +type LinkMsgWrapper struct { + Module string `json:"module"` + MsgData json.RawMessage `json:"msg_data"` +} + +type LinkQueryWrapper struct { + Path string `json:"path"` + Data []byte `json:"data"` +} diff --git a/x/wasm/types/errors.go b/x/wasm/types/errors.go index 50814f8131..5eafb527ad 100644 --- a/x/wasm/types/errors.go +++ b/x/wasm/types/errors.go @@ -1,7 +1,7 @@ package types import ( - sdkErrors "github.com/cosmos/cosmos-sdk/types/errors" + sdkErrors "github.com/line/lbm-sdk/types/errors" ) // Codes for wasm contract errors @@ -87,6 +87,9 @@ var ( // ErrExceedMaxQueryStackSize error if max query stack size is exceeded ErrExceedMaxQueryStackSize = sdkErrors.Register(DefaultCodespace, 27, "max query stack size exceeded") + + // ErrInactiveContract error if the contract set inactive + ErrInactiveContract = sdkErrors.Register(DefaultCodespace, 101, "inactive contract") ) type ErrNoSuchContract struct { diff --git a/x/wasm/types/events.go b/x/wasm/types/events.go index 0c32476f54..5213ed143b 100644 --- a/x/wasm/types/events.go +++ b/x/wasm/types/events.go @@ -10,6 +10,8 @@ const ( EventTypeInstantiate = "instantiate" EventTypeExecute = "execute" EventTypeMigrate = "migrate" + EventTypeUpdateAdmin = "update_admin" + EventTypeClearAdmin = "clear_admin" EventTypePinCode = "pin_code" EventTypeUnpinCode = "unpin_code" EventTypeSudo = "sudo" @@ -23,6 +25,7 @@ const ( AttributeKeyContractAddr = "_contract_address" AttributeKeyCodeID = "code_id" + AttributeKeyCodeIDs = "code_ids" AttributeKeyResultDataHex = "result" AttributeKeyFeature = "feature" ) diff --git a/x/wasm/types/expected_keepers.go b/x/wasm/types/expected_keepers.go index 0cdd4d80e0..20e5f0e13a 100644 --- a/x/wasm/types/expected_keepers.go +++ b/x/wasm/types/expected_keepers.go @@ -3,14 +3,14 @@ package types import ( "context" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - "github.com/cosmos/cosmos-sdk/x/distribution/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - ibcexported "github.com/cosmos/ibc-go/v3/modules/core/exported" + sdk "github.com/line/lbm-sdk/types" + authtypes "github.com/line/lbm-sdk/x/auth/types" + capabilitytypes "github.com/line/lbm-sdk/x/capability/types" + "github.com/line/lbm-sdk/x/distribution/types" + connectiontypes "github.com/line/lbm-sdk/x/ibc/core/03-connection/types" + channeltypes "github.com/line/lbm-sdk/x/ibc/core/04-channel/types" + ibcexported "github.com/line/lbm-sdk/x/ibc/core/exported" + stakingtypes "github.com/line/lbm-sdk/x/staking/types" ) // BankViewKeeper defines a subset of methods implemented by the cosmos-sdk bank keeper diff --git a/x/wasm/types/exported_keepers.go b/x/wasm/types/exported_keepers.go index bb919a3189..1a8a0f4328 100644 --- a/x/wasm/types/exported_keepers.go +++ b/x/wasm/types/exported_keepers.go @@ -1,9 +1,9 @@ package types import ( - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + sdk "github.com/line/lbm-sdk/types" + capabilitytypes "github.com/line/lbm-sdk/x/capability/types" + wasmvmtypes "github.com/line/wasmvm/types" ) // ViewKeeper provides read only operations @@ -20,6 +20,8 @@ type ViewKeeper interface { IterateCodeInfos(ctx sdk.Context, cb func(uint64, CodeInfo) bool) GetByteCode(ctx sdk.Context, codeID uint64) ([]byte, error) IsPinnedCode(ctx sdk.Context, codeID uint64) bool + IterateInactiveContracts(ctx sdk.Context, fn func(contractAddress sdk.AccAddress) bool) + IsInactiveContract(ctx sdk.Context, contractAddress sdk.AccAddress) bool } // ContractOpsKeeper contains mutable operations on a contract. @@ -56,6 +58,12 @@ type ContractOpsKeeper interface { // SetAccessConfig updates the access config of a code id. SetAccessConfig(ctx sdk.Context, codeID uint64, config AccessConfig) error + + // DeactivateContract add the contract address to inactive contract list. + DeactivateContract(ctx sdk.Context, contractAddress sdk.AccAddress) error + + // ActivateContract remove the contract address from inactive contract list. + ActivateContract(ctx sdk.Context, contractAddress sdk.AccAddress) error } // IBCContractKeeper IBC lifecycle event handler diff --git a/x/wasm/types/genesis.go b/x/wasm/types/genesis.go index ba973c6f02..b8b08b3d61 100644 --- a/x/wasm/types/genesis.go +++ b/x/wasm/types/genesis.go @@ -1,9 +1,9 @@ package types import ( - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + codectypes "github.com/line/lbm-sdk/codec/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" ) func (s Sequence) ValidateBasic() error { @@ -37,6 +37,11 @@ func (s GenesisState) ValidateBasic() error { return sdkerrors.Wrapf(err, "gen message: %d", i) } } + for i, addr := range s.InactiveContractAddresses { + if _, err := sdk.AccAddressFromBech32(addr); err != nil { + return sdkerrors.Wrapf(err, "inactive contract address: %d", i) + } + } return nil } diff --git a/x/wasm/types/genesis.pb.go b/x/wasm/types/genesis.pb.go index 17970ef90b..ad5b145923 100644 --- a/x/wasm/types/genesis.pb.go +++ b/x/wasm/types/genesis.pb.go @@ -5,21 +5,17 @@ package types import ( fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = math.Inf -) +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. @@ -34,6 +30,8 @@ type GenesisState struct { Contracts []Contract `protobuf:"bytes,3,rep,name=contracts,proto3" json:"contracts,omitempty"` Sequences []Sequence `protobuf:"bytes,4,rep,name=sequences,proto3" json:"sequences,omitempty"` GenMsgs []GenesisState_GenMsgs `protobuf:"bytes,5,rep,name=gen_msgs,json=genMsgs,proto3" json:"gen_msgs,omitempty"` + // InactiveContractAddresses is a list of contract address that set inactive + InactiveContractAddresses []string `protobuf:"bytes,6,rep,name=inactive_contract_addresses,json=inactiveContractAddresses,proto3" json:"inactive_contract_address, omitempty"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -42,11 +40,9 @@ func (*GenesisState) ProtoMessage() {} func (*GenesisState) Descriptor() ([]byte, []int) { return fileDescriptor_2ab3f539b23472a6, []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) @@ -59,15 +55,12 @@ func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) 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) } @@ -109,6 +102,13 @@ func (m *GenesisState) GetGenMsgs() []GenesisState_GenMsgs { return nil } +func (m *GenesisState) GetInactiveContractAddresses() []string { + if m != nil { + return m.InactiveContractAddresses + } + return nil +} + // GenMsgs define the messages that can be executed during genesis phase in // order. The intention is to have more human readable data that is auditable. type GenesisState_GenMsgs struct { @@ -127,11 +127,9 @@ func (*GenesisState_GenMsgs) ProtoMessage() {} func (*GenesisState_GenMsgs) Descriptor() ([]byte, []int) { return fileDescriptor_2ab3f539b23472a6, []int{0, 0} } - func (m *GenesisState_GenMsgs) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *GenesisState_GenMsgs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_GenesisState_GenMsgs.Marshal(b, m, deterministic) @@ -144,15 +142,12 @@ func (m *GenesisState_GenMsgs) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } - func (m *GenesisState_GenMsgs) XXX_Merge(src proto.Message) { xxx_messageInfo_GenesisState_GenMsgs.Merge(m, src) } - func (m *GenesisState_GenMsgs) XXX_Size() int { return m.Size() } - func (m *GenesisState_GenMsgs) XXX_DiscardUnknown() { xxx_messageInfo_GenesisState_GenMsgs.DiscardUnknown(m) } @@ -231,11 +226,9 @@ func (*Code) ProtoMessage() {} func (*Code) Descriptor() ([]byte, []int) { return fileDescriptor_2ab3f539b23472a6, []int{1} } - func (m *Code) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *Code) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_Code.Marshal(b, m, deterministic) @@ -248,15 +241,12 @@ func (m *Code) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } - func (m *Code) XXX_Merge(src proto.Message) { xxx_messageInfo_Code.Merge(m, src) } - func (m *Code) XXX_Size() int { return m.Size() } - func (m *Code) XXX_DiscardUnknown() { xxx_messageInfo_Code.DiscardUnknown(m) } @@ -304,11 +294,9 @@ func (*Contract) ProtoMessage() {} func (*Contract) Descriptor() ([]byte, []int) { return fileDescriptor_2ab3f539b23472a6, []int{2} } - func (m *Contract) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *Contract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_Contract.Marshal(b, m, deterministic) @@ -321,15 +309,12 @@ func (m *Contract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } - func (m *Contract) XXX_Merge(src proto.Message) { xxx_messageInfo_Contract.Merge(m, src) } - func (m *Contract) XXX_Size() int { return m.Size() } - func (m *Contract) XXX_DiscardUnknown() { xxx_messageInfo_Contract.DiscardUnknown(m) } @@ -369,11 +354,9 @@ func (*Sequence) ProtoMessage() {} func (*Sequence) Descriptor() ([]byte, []int) { return fileDescriptor_2ab3f539b23472a6, []int{3} } - func (m *Sequence) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *Sequence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_Sequence.Marshal(b, m, deterministic) @@ -386,15 +369,12 @@ func (m *Sequence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } - func (m *Sequence) XXX_Merge(src proto.Message) { xxx_messageInfo_Sequence.Merge(m, src) } - func (m *Sequence) XXX_Size() int { return m.Size() } - func (m *Sequence) XXX_DiscardUnknown() { xxx_messageInfo_Sequence.DiscardUnknown(m) } @@ -426,48 +406,50 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/genesis.proto", fileDescriptor_2ab3f539b23472a6) } var fileDescriptor_2ab3f539b23472a6 = []byte{ - // 646 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x94, 0xcf, 0x6e, 0xd3, 0x4e, - 0x10, 0xc7, 0xe3, 0x26, 0x4e, 0x93, 0x69, 0x7e, 0xbf, 0x56, 0xdb, 0xaa, 0x35, 0x06, 0x9c, 0x28, - 0xa0, 0x2a, 0x48, 0x28, 0x51, 0x8b, 0xc4, 0x0d, 0x01, 0x6e, 0x2b, 0x6a, 0x55, 0x95, 0xc0, 0x15, - 0x42, 0x42, 0xaa, 0x22, 0xd7, 0xde, 0x1a, 0x8b, 0xda, 0x1b, 0xb2, 0x9b, 0x52, 0x9f, 0x79, 0x01, - 0x1e, 0x01, 0x5e, 0x06, 0xf5, 0xd8, 0x23, 0xa7, 0x08, 0xa5, 0x37, 0x9e, 0x02, 0xed, 0x1f, 0xbb, - 0x06, 0xa7, 0x17, 0x2b, 0x3b, 0xf3, 0x9d, 0xcf, 0xfc, 0xc9, 0xec, 0x82, 0xe5, 0x13, 0x1a, 0x7f, - 0xf6, 0x68, 0x3c, 0x10, 0x9f, 0xf3, 0xad, 0x41, 0x88, 0x13, 0x4c, 0x23, 0xda, 0x1f, 0x8d, 0x09, - 0x23, 0x68, 0x25, 0xf3, 0xf7, 0xc5, 0xe7, 0x7c, 0xcb, 0x5c, 0x0b, 0x49, 0x48, 0x84, 0x73, 0xc0, - 0x7f, 0x49, 0x9d, 0x79, 0xaf, 0xc4, 0x61, 0xe9, 0x08, 0x2b, 0x8a, 0x79, 0xa7, 0xec, 0xbd, 0x90, - 0xae, 0xee, 0x37, 0x1d, 0x5a, 0xaf, 0x64, 0xca, 0x23, 0xe6, 0x31, 0x8c, 0x9e, 0x42, 0x7d, 0xe4, - 0x8d, 0xbd, 0x98, 0x1a, 0x5a, 0x47, 0xeb, 0x2d, 0x6d, 0x1b, 0xfd, 0x7f, 0x4b, 0xe8, 0xbf, 0x16, - 0x7e, 0xbb, 0x76, 0x39, 0x6d, 0x57, 0x5c, 0xa5, 0x46, 0x7b, 0xa0, 0xfb, 0x24, 0xc0, 0xd4, 0x58, - 0xe8, 0x54, 0x7b, 0x4b, 0xdb, 0xeb, 0xe5, 0xb0, 0x1d, 0x12, 0x60, 0x7b, 0x83, 0x07, 0xfd, 0x9e, - 0xb6, 0x97, 0x85, 0xf8, 0x31, 0x89, 0x23, 0x86, 0xe3, 0x11, 0x4b, 0x5d, 0x19, 0x8d, 0xde, 0x42, - 0xd3, 0x27, 0x09, 0x1b, 0x7b, 0x3e, 0xa3, 0x46, 0x55, 0xa0, 0xcc, 0x79, 0x28, 0x29, 0xb1, 0xef, - 0x2a, 0xdc, 0x6a, 0x1e, 0x54, 0x40, 0xde, 0x90, 0x38, 0x96, 0xe2, 0x4f, 0x13, 0x9c, 0xf8, 0x98, - 0x1a, 0xb5, 0xdb, 0xb0, 0x47, 0x4a, 0x72, 0x83, 0xcd, 0x83, 0x8a, 0xd8, 0xdc, 0x88, 0x8e, 0xa1, - 0x11, 0xe2, 0x64, 0x18, 0xd3, 0x90, 0x1a, 0xba, 0xa0, 0x6e, 0x96, 0xa9, 0xc5, 0xf1, 0xf2, 0xc3, - 0x21, 0x0d, 0xa9, 0x6d, 0xaa, 0x0c, 0x28, 0x8b, 0x2f, 0x24, 0x58, 0x0c, 0xa5, 0xc8, 0xfc, 0xb2, - 0x00, 0x8b, 0x2a, 0x00, 0x3d, 0x07, 0xa0, 0x8c, 0x8c, 0xf1, 0x90, 0xcf, 0x49, 0xfd, 0x37, 0x56, - 0x39, 0xd9, 0x21, 0x0d, 0x8f, 0xb8, 0x8c, 0x0f, 0x7b, 0xbf, 0xe2, 0x36, 0x69, 0x76, 0x40, 0xc7, - 0xb0, 0x16, 0x25, 0x94, 0x79, 0x09, 0x8b, 0x3c, 0xc6, 0x31, 0x72, 0x36, 0xc6, 0x82, 0x40, 0xf5, - 0xe6, 0xa2, 0x9c, 0x9b, 0x80, 0x6c, 0xe4, 0xfb, 0x15, 0x77, 0x35, 0x2a, 0x9b, 0xd1, 0x1b, 0x58, - 0xc1, 0x17, 0xd8, 0x9f, 0x14, 0xd1, 0x55, 0x81, 0x7e, 0x38, 0x17, 0xbd, 0x27, 0xc5, 0x05, 0xec, - 0x32, 0xfe, 0xdb, 0x64, 0xeb, 0x50, 0xa5, 0x93, 0xb8, 0xfb, 0x5d, 0x83, 0x9a, 0xe8, 0xe0, 0x01, - 0x2c, 0xf2, 0xe6, 0x87, 0x51, 0x20, 0xfa, 0xaf, 0xd9, 0x30, 0x9b, 0xb6, 0xeb, 0xdc, 0xe5, 0xec, - 0xba, 0x75, 0xee, 0x72, 0x02, 0xf4, 0x8c, 0x2f, 0x10, 0x17, 0x25, 0xa7, 0x44, 0xf5, 0x66, 0xce, - 0xdf, 0x45, 0x27, 0x39, 0x25, 0x6a, 0x89, 0x1b, 0xbe, 0x3a, 0xa3, 0xfb, 0x00, 0x22, 0xfc, 0x24, - 0x65, 0x98, 0x8a, 0x06, 0x5a, 0xae, 0x00, 0xda, 0xdc, 0x80, 0xd6, 0xa1, 0x3e, 0x8a, 0x92, 0x04, - 0x07, 0x46, 0xad, 0xa3, 0xf5, 0x1a, 0xae, 0x3a, 0x75, 0x7f, 0x68, 0xd0, 0xc8, 0x47, 0xf1, 0x08, - 0x56, 0xb2, 0x11, 0x0c, 0xbd, 0x20, 0x18, 0x63, 0x2a, 0x2f, 0x53, 0xd3, 0x5d, 0xce, 0xec, 0x2f, - 0xa5, 0x19, 0x39, 0xf0, 0x5f, 0x2e, 0x2d, 0x54, 0x6c, 0xdd, 0xbe, 0xf2, 0x85, 0xaa, 0x5b, 0x7e, - 0xc1, 0x86, 0x76, 0xe1, 0xff, 0x1c, 0x45, 0xf9, 0xae, 0xa9, 0xeb, 0xb3, 0x31, 0x67, 0xfc, 0x24, - 0xc0, 0x67, 0x0a, 0x92, 0xe7, 0x17, 0xfb, 0xd9, 0xb5, 0xa1, 0x91, 0xdd, 0x02, 0xd4, 0x81, 0x7a, - 0x14, 0x0c, 0x3f, 0xe2, 0x54, 0x54, 0xdf, 0xb2, 0x9b, 0xb3, 0x69, 0x5b, 0x77, 0x76, 0x0f, 0x70, - 0xea, 0xea, 0x51, 0x70, 0x80, 0x53, 0xb4, 0x06, 0xfa, 0xb9, 0x77, 0x36, 0xc1, 0xa2, 0xec, 0x9a, - 0x2b, 0x0f, 0xf6, 0x8b, 0xcb, 0x99, 0xa5, 0x5d, 0xcd, 0x2c, 0xed, 0xd7, 0xcc, 0xd2, 0xbe, 0x5e, - 0x5b, 0x95, 0xab, 0x6b, 0xab, 0xf2, 0xf3, 0xda, 0xaa, 0xbc, 0xdf, 0x0c, 0x23, 0xf6, 0x61, 0x72, - 0xd2, 0xf7, 0x49, 0x3c, 0xd8, 0x21, 0x34, 0x7e, 0x97, 0xbd, 0x49, 0xc1, 0xe0, 0x42, 0xbe, 0x4d, - 0xe2, 0xd9, 0x3a, 0xa9, 0x8b, 0xc7, 0xe9, 0xc9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7c, 0x05, - 0x87, 0xde, 0x1f, 0x05, 0x00, 0x00, + // 679 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x94, 0xcd, 0x4e, 0xdb, 0x40, + 0x10, 0xc7, 0x63, 0x92, 0x98, 0x64, 0x48, 0x0b, 0x5a, 0x10, 0x18, 0xd3, 0x3a, 0x51, 0x8a, 0xaa, + 0x54, 0x42, 0x89, 0xa0, 0x52, 0x4f, 0xad, 0xaa, 0xba, 0xa0, 0x12, 0x21, 0xa4, 0xd6, 0xa8, 0x97, + 0x4a, 0x28, 0x32, 0xf6, 0x60, 0xac, 0x62, 0x6f, 0x9a, 0xdd, 0xa4, 0xe4, 0xdc, 0x5b, 0x4f, 0x7d, + 0x85, 0xbe, 0x4c, 0xc5, 0x91, 0x63, 0x4f, 0x51, 0x15, 0x6e, 0x3c, 0x45, 0xb5, 0xeb, 0x8f, 0x18, + 0x92, 0x5c, 0x2c, 0xcf, 0xcc, 0x7f, 0x7e, 0x3b, 0xb3, 0xbb, 0xb3, 0x60, 0x38, 0x94, 0x05, 0xdf, + 0x6d, 0x16, 0xb4, 0xe4, 0x67, 0xb0, 0xdb, 0xf2, 0x30, 0x44, 0xe6, 0xb3, 0x66, 0xb7, 0x47, 0x39, + 0x25, 0x2b, 0x49, 0xbc, 0x29, 0x3f, 0x83, 0x5d, 0x7d, 0xcd, 0xa3, 0x1e, 0x95, 0xc1, 0x96, 0xf8, + 0x8b, 0x74, 0xfa, 0x93, 0x29, 0x0e, 0x1f, 0x76, 0x31, 0xa6, 0xe8, 0x9b, 0xd3, 0xd1, 0xab, 0x28, + 0x54, 0xff, 0xa9, 0x42, 0xe5, 0x43, 0xb4, 0xe4, 0x09, 0xb7, 0x39, 0x92, 0x57, 0xa0, 0x76, 0xed, + 0x9e, 0x1d, 0x30, 0x4d, 0xa9, 0x29, 0x8d, 0xa5, 0x3d, 0xad, 0xf9, 0xb0, 0x84, 0xe6, 0x47, 0x19, + 0x37, 0x0b, 0xd7, 0xa3, 0x6a, 0xce, 0x8a, 0xd5, 0xe4, 0x00, 0x8a, 0x0e, 0x75, 0x91, 0x69, 0x0b, + 0xb5, 0x7c, 0x63, 0x69, 0x6f, 0x7d, 0x3a, 0xed, 0x3d, 0x75, 0xd1, 0xdc, 0x10, 0x49, 0x77, 0xa3, + 0xea, 0xb2, 0x14, 0xef, 0xd0, 0xc0, 0xe7, 0x18, 0x74, 0xf9, 0xd0, 0x8a, 0xb2, 0xc9, 0x67, 0x28, + 0x3b, 0x34, 0xe4, 0x3d, 0xdb, 0xe1, 0x4c, 0xcb, 0x4b, 0x94, 0x3e, 0x0b, 0x15, 0x49, 0xcc, 0xad, + 0x18, 0xb7, 0x9a, 0x26, 0x65, 0x90, 0x13, 0x92, 0xc0, 0x32, 0xfc, 0xd6, 0xc7, 0xd0, 0x41, 0xa6, + 0x15, 0xe6, 0x61, 0x4f, 0x62, 0xc9, 0x04, 0x9b, 0x26, 0x65, 0xb1, 0xa9, 0x93, 0x9c, 0x42, 0xc9, + 0xc3, 0xb0, 0x13, 0x30, 0x8f, 0x69, 0x45, 0x49, 0x7d, 0x3e, 0x4d, 0xcd, 0x6e, 0xaf, 0x30, 0x8e, + 0x99, 0xc7, 0x4c, 0x3d, 0x5e, 0x81, 0x24, 0xf9, 0x99, 0x05, 0x16, 0xbd, 0x48, 0x44, 0x2e, 0x60, + 0xcb, 0x0f, 0x6d, 0x87, 0xfb, 0x03, 0xec, 0x24, 0xbd, 0x74, 0x6c, 0xd7, 0xed, 0x21, 0x63, 0xc8, + 0x34, 0xb5, 0x96, 0x6f, 0x94, 0xcd, 0xc6, 0xdd, 0xa8, 0xba, 0x3d, 0x57, 0xb6, 0x53, 0x9b, 0x70, + 0x37, 0x13, 0x55, 0xb2, 0x7d, 0xef, 0x12, 0x94, 0xfe, 0x63, 0x01, 0x16, 0xe3, 0xd2, 0xc8, 0x5b, + 0x00, 0xc6, 0x69, 0x4f, 0xb0, 0x5c, 0x8c, 0x6f, 0x81, 0x31, 0xdd, 0xd6, 0x31, 0xf3, 0x4e, 0x84, + 0x4c, 0x1c, 0xeb, 0x61, 0xce, 0x2a, 0xb3, 0xc4, 0x20, 0xa7, 0xb0, 0xe6, 0x87, 0x8c, 0xdb, 0x21, + 0xf7, 0x6d, 0x3e, 0x29, 0x49, 0x5b, 0x90, 0xa8, 0xc6, 0x4c, 0x54, 0x7b, 0x92, 0x90, 0x54, 0x77, + 0x98, 0xb3, 0x56, 0xfd, 0x69, 0x37, 0xf9, 0x04, 0x2b, 0x78, 0x85, 0x4e, 0x3f, 0x8b, 0xce, 0x4b, + 0xf4, 0xf6, 0x4c, 0xf4, 0x41, 0x24, 0xce, 0x60, 0x97, 0xf1, 0xbe, 0xcb, 0x2c, 0x42, 0x9e, 0xf5, + 0x83, 0xfa, 0x6f, 0x05, 0x0a, 0xb2, 0x83, 0x67, 0xb0, 0x28, 0x9a, 0xef, 0xf8, 0xae, 0xec, 0xbf, + 0x60, 0xc2, 0x78, 0x54, 0x55, 0x45, 0xa8, 0xbd, 0x6f, 0xa9, 0x22, 0xd4, 0x76, 0xc9, 0x1b, 0x71, + 0x55, 0x85, 0x28, 0x3c, 0xa7, 0x71, 0x6f, 0xfa, 0xec, 0x5b, 0xdf, 0x0e, 0xcf, 0x69, 0x3c, 0x2e, + 0x25, 0x27, 0xb6, 0xc9, 0x53, 0x00, 0x99, 0x7e, 0x36, 0xe4, 0xc8, 0x64, 0x03, 0x15, 0x4b, 0x02, + 0x4d, 0xe1, 0x20, 0xeb, 0xa0, 0x76, 0xfd, 0x30, 0x44, 0x57, 0x2b, 0xd4, 0x94, 0x46, 0xc9, 0x8a, + 0xad, 0xfa, 0x1f, 0x05, 0x4a, 0xe9, 0x56, 0xbc, 0x80, 0x95, 0x87, 0x07, 0x2e, 0x0b, 0x2e, 0x5b, + 0xcb, 0xce, 0xfd, 0x33, 0x26, 0x6d, 0x78, 0x94, 0x4a, 0x33, 0x15, 0x1b, 0xf3, 0x87, 0x2b, 0x53, + 0x75, 0xc5, 0xc9, 0xf8, 0xc8, 0x3e, 0x3c, 0x4e, 0x51, 0x4c, 0xdc, 0xea, 0x78, 0x50, 0x37, 0x66, + 0x6c, 0x3f, 0x75, 0xf1, 0x32, 0x86, 0xa4, 0xeb, 0xcb, 0x49, 0xa8, 0x9b, 0x50, 0x4a, 0xe6, 0x8d, + 0xd4, 0x40, 0xf5, 0xdd, 0xce, 0x57, 0x1c, 0xca, 0xea, 0x2b, 0x66, 0x79, 0x3c, 0xaa, 0x16, 0xdb, + 0xfb, 0x47, 0x38, 0xb4, 0x8a, 0xbe, 0x7b, 0x84, 0x43, 0xb2, 0x06, 0xc5, 0x81, 0x7d, 0xd9, 0x47, + 0x59, 0x76, 0xc1, 0x8a, 0x0c, 0xf3, 0xf5, 0xf5, 0xd8, 0x50, 0x6e, 0xc6, 0x86, 0xf2, 0x6f, 0x6c, + 0x28, 0xbf, 0x6e, 0x8d, 0xdc, 0xcd, 0xad, 0x91, 0xfb, 0x7b, 0x6b, 0xe4, 0xbe, 0xd4, 0x3d, 0x9f, + 0x5f, 0xf4, 0xcf, 0x9a, 0x0e, 0x0d, 0x5a, 0x97, 0x7e, 0x88, 0xf2, 0xe5, 0x73, 0x5b, 0x57, 0xd1, + 0x0b, 0x28, 0x1f, 0xc7, 0x33, 0x55, 0x3e, 0x81, 0x2f, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x3b, + 0x04, 0x85, 0xd1, 0x85, 0x05, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -490,6 +472,15 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.InactiveContractAddresses) > 0 { + for iNdEx := len(m.InactiveContractAddresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.InactiveContractAddresses[iNdEx]) + copy(dAtA[i:], m.InactiveContractAddresses[iNdEx]) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.InactiveContractAddresses[iNdEx]))) + i-- + dAtA[i] = 0x32 + } + } if len(m.GenMsgs) > 0 { for iNdEx := len(m.GenMsgs) - 1; iNdEx >= 0; iNdEx-- { { @@ -612,7 +603,6 @@ func (m *GenesisState_GenMsgs_StoreCode) MarshalToSizedBuffer(dAtA []byte) (int, } return len(dAtA) - i, nil } - func (m *GenesisState_GenMsgs_InstantiateContract) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) @@ -634,7 +624,6 @@ func (m *GenesisState_GenMsgs_InstantiateContract) MarshalToSizedBuffer(dAtA []b } return len(dAtA) - i, nil } - func (m *GenesisState_GenMsgs_ExecuteContract) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) @@ -656,7 +645,6 @@ func (m *GenesisState_GenMsgs_ExecuteContract) MarshalToSizedBuffer(dAtA []byte) } return len(dAtA) - i, nil } - func (m *Code) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -812,7 +800,6 @@ func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } - func (m *GenesisState) Size() (n int) { if m == nil { return 0 @@ -845,6 +832,12 @@ func (m *GenesisState) Size() (n int) { n += 1 + l + sovGenesis(uint64(l)) } } + if len(m.InactiveContractAddresses) > 0 { + for _, s := range m.InactiveContractAddresses { + l = len(s) + n += 1 + l + sovGenesis(uint64(l)) + } + } return n } @@ -872,7 +865,6 @@ func (m *GenesisState_GenMsgs_StoreCode) Size() (n int) { } return n } - func (m *GenesisState_GenMsgs_InstantiateContract) Size() (n int) { if m == nil { return 0 @@ -885,7 +877,6 @@ func (m *GenesisState_GenMsgs_InstantiateContract) Size() (n int) { } return n } - func (m *GenesisState_GenMsgs_ExecuteContract) Size() (n int) { if m == nil { return 0 @@ -898,7 +889,6 @@ func (m *GenesisState_GenMsgs_ExecuteContract) Size() (n int) { } return n } - func (m *Code) Size() (n int) { if m == nil { return 0 @@ -960,11 +950,9 @@ func (m *Sequence) Size() (n int) { 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 @@ -1163,6 +1151,38 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InactiveContractAddresses", 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.InactiveContractAddresses = append(m.InactiveContractAddresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) @@ -1184,7 +1204,6 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { } return nil } - func (m *GenesisState_GenMsgs) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1340,7 +1359,6 @@ func (m *GenesisState_GenMsgs) Unmarshal(dAtA []byte) error { } return nil } - func (m *Code) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1497,7 +1515,6 @@ func (m *Code) Unmarshal(dAtA []byte) error { } return nil } - func (m *Contract) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1647,7 +1664,6 @@ func (m *Contract) Unmarshal(dAtA []byte) error { } return nil } - func (m *Sequence) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1751,7 +1767,6 @@ func (m *Sequence) Unmarshal(dAtA []byte) error { } return nil } - func skipGenesis(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/wasm/types/genesis_test.go b/x/wasm/types/genesis_test.go index 3ef424e7e5..fa7f9e356d 100644 --- a/x/wasm/types/genesis_test.go +++ b/x/wasm/types/genesis_test.go @@ -5,14 +5,14 @@ import ( "testing" "time" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/stretchr/testify/assert" - "github.com/tendermint/tendermint/libs/rand" - "github.com/stretchr/testify/require" + + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/codec/types" + sdk "github.com/line/lbm-sdk/types" + govtypes "github.com/line/lbm-sdk/x/gov/types" + "github.com/line/ostracon/libs/rand" ) func TestValidateGenesisState(t *testing.T) { diff --git a/x/wasm/types/iavl_range_test.go b/x/wasm/types/iavl_range_test.go index 1e5bdc92ab..69e3f92bf7 100644 --- a/x/wasm/types/iavl_range_test.go +++ b/x/wasm/types/iavl_range_test.go @@ -3,19 +3,20 @@ package types import ( "testing" - "github.com/cosmos/cosmos-sdk/store" - "github.com/cosmos/cosmos-sdk/store/iavl" - iavl2 "github.com/cosmos/iavl" + iavltree "github.com/cosmos/iavl" "github.com/stretchr/testify/require" dbm "github.com/tendermint/tm-db" + + "github.com/line/lbm-sdk/store" + "github.com/line/lbm-sdk/store/iavl" ) // This is modeled close to // https://github.com/CosmWasm/cosmwasm-plus/blob/f97a7de44b6a930fd1d5179ee6f95b786a532f32/packages/storage-plus/src/prefix.rs#L183 // and designed to ensure the IAVL store handles bounds the same way as the mock storage we use in Rust contract tests func TestIavlRangeBounds(t *testing.T) { - memdb := dbm.NewMemDB() - tree, err := iavl2.NewMutableTree(memdb, 50) + db := dbm.NewMemDB() + tree, err := iavltree.NewMutableTree(db, 50, false) require.NoError(t, err) kvstore := iavl.UnsafeNewStore(tree) diff --git a/x/wasm/types/ibc.pb.go b/x/wasm/types/ibc.pb.go index 64d22ee35b..8c76c607ca 100644 --- a/x/wasm/types/ibc.pb.go +++ b/x/wasm/types/ibc.pb.go @@ -5,21 +5,17 @@ package types import ( fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = math.Inf -) +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. @@ -48,11 +44,9 @@ func (*MsgIBCSend) ProtoMessage() {} func (*MsgIBCSend) Descriptor() ([]byte, []int) { return fileDescriptor_af0d1c43ea53c4b9, []int{0} } - func (m *MsgIBCSend) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgIBCSend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgIBCSend.Marshal(b, m, deterministic) @@ -65,15 +59,12 @@ func (m *MsgIBCSend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } - func (m *MsgIBCSend) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgIBCSend.Merge(m, src) } - func (m *MsgIBCSend) XXX_Size() int { return m.Size() } - func (m *MsgIBCSend) XXX_DiscardUnknown() { xxx_messageInfo_MsgIBCSend.DiscardUnknown(m) } @@ -91,11 +82,9 @@ func (*MsgIBCCloseChannel) ProtoMessage() {} func (*MsgIBCCloseChannel) Descriptor() ([]byte, []int) { return fileDescriptor_af0d1c43ea53c4b9, []int{1} } - func (m *MsgIBCCloseChannel) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgIBCCloseChannel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgIBCCloseChannel.Marshal(b, m, deterministic) @@ -108,15 +97,12 @@ func (m *MsgIBCCloseChannel) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } - func (m *MsgIBCCloseChannel) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgIBCCloseChannel.Merge(m, src) } - func (m *MsgIBCCloseChannel) XXX_Size() int { return m.Size() } - func (m *MsgIBCCloseChannel) XXX_DiscardUnknown() { xxx_messageInfo_MsgIBCCloseChannel.DiscardUnknown(m) } @@ -131,7 +117,7 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/ibc.proto", fileDescriptor_af0d1c43ea53c4b9) } var fileDescriptor_af0d1c43ea53c4b9 = []byte{ - // 299 bytes of a gzipped FileDescriptorProto + // 298 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xce, 0x2f, 0xce, 0x2d, 0x4f, 0x2c, 0xce, 0xd5, 0x07, 0x13, 0x65, 0x86, 0xfa, 0x99, 0x49, 0xc9, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x02, 0x30, 0x39, 0x3d, 0x30, 0x51, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, @@ -145,12 +131,12 @@ var fileDescriptor_af0d1c43ea53c4b9 = []byte{ 0x6e, 0x81, 0x04, 0x2b, 0xd8, 0x10, 0x99, 0x4f, 0xf7, 0xe4, 0x25, 0x50, 0x0d, 0x81, 0x2b, 0x51, 0x0a, 0x12, 0x80, 0x8a, 0x85, 0xc0, 0x84, 0x84, 0x84, 0xb8, 0x58, 0x52, 0x12, 0x4b, 0x12, 0x25, 0xd8, 0x14, 0x18, 0x35, 0x78, 0x82, 0xc0, 0x6c, 0x25, 0x4f, 0x2e, 0x21, 0x88, 0x1f, 0x9d, 0x73, - 0xf2, 0x8b, 0x53, 0x9d, 0xa1, 0xce, 0x26, 0xc7, 0xaf, 0x4e, 0x2e, 0x27, 0x1e, 0xca, 0x31, 0x9c, + 0xf2, 0x8b, 0x53, 0x9d, 0xa1, 0xce, 0x26, 0xc7, 0xaf, 0x4e, 0x0e, 0x27, 0x1e, 0xca, 0x31, 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, - 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x5a, 0x7a, 0x66, 0x49, 0x46, 0x69, - 0x92, 0x5e, 0x72, 0x7e, 0xae, 0xbe, 0x73, 0x7e, 0x71, 0x6e, 0x38, 0x2c, 0x72, 0x52, 0xf4, 0x2b, - 0x20, 0x91, 0x54, 0x52, 0x59, 0x90, 0x5a, 0x9c, 0xc4, 0x06, 0x0e, 0x7c, 0x63, 0x40, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x4d, 0x60, 0x95, 0x31, 0xc2, 0x01, 0x00, 0x00, + 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x52, 0x7a, 0x66, 0x49, 0x46, 0x69, + 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x4e, 0x66, 0x5e, 0x2a, 0x38, 0x62, 0x52, 0xf4, 0x2b, 0x20, + 0x11, 0x54, 0x52, 0x59, 0x90, 0x5a, 0x9c, 0xc4, 0x06, 0x0e, 0x78, 0x63, 0x40, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xd6, 0xf6, 0x62, 0x74, 0xbe, 0x01, 0x00, 0x00, } func (m *MsgIBCSend) Marshal() (dAtA []byte, err error) { @@ -241,7 +227,6 @@ func encodeVarintIbc(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } - func (m *MsgIBCSend) Size() (n int) { if m == nil { return 0 @@ -281,11 +266,9 @@ func (m *MsgIBCCloseChannel) Size() (n int) { func sovIbc(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } - func sozIbc(x uint64) (n int) { return sovIbc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } - func (m *MsgIBCSend) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -440,7 +423,6 @@ func (m *MsgIBCSend) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgIBCCloseChannel) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -523,7 +505,6 @@ func (m *MsgIBCCloseChannel) Unmarshal(dAtA []byte) error { } return nil } - func skipIbc(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/wasm/types/json_matching.go b/x/wasm/types/json_matching.go index cfa8522650..b6cee553d4 100644 --- a/x/wasm/types/json_matching.go +++ b/x/wasm/types/json_matching.go @@ -3,7 +3,7 @@ package types import ( "encoding/json" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdkerrors "github.com/line/lbm-sdk/types/errors" ) // IsJSONObjectWithTopLevelKey checks if the given bytes are a valid JSON object diff --git a/x/wasm/types/json_matching_test.go b/x/wasm/types/json_matching_test.go index 17f7684872..ec57aaabc2 100644 --- a/x/wasm/types/json_matching_test.go +++ b/x/wasm/types/json_matching_test.go @@ -3,7 +3,6 @@ package types import ( "testing" - // sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/stretchr/testify/require" ) diff --git a/x/wasm/types/keys.go b/x/wasm/types/keys.go index fb636ef4f3..bbf35094a9 100644 --- a/x/wasm/types/keys.go +++ b/x/wasm/types/keys.go @@ -1,7 +1,7 @@ package types import ( - sdk "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/line/lbm-sdk/types" ) const ( @@ -32,6 +32,8 @@ var ( PinnedCodeIndexPrefix = []byte{0x07} TXCounterPrefix = []byte{0x08} + InactiveContractPrefix = []byte{0x90} + KeyLastCodeID = append(SequenceKeyPrefix, []byte("lastCodeId")...) KeyLastInstanceID = append(SequenceKeyPrefix, []byte("lastContractId")...) ) @@ -61,7 +63,7 @@ func GetContractByCreatedSecondaryIndexKey(contractAddr sdk.AccAddress, c Contra r := make([]byte, prefixLen+AbsoluteTxPositionLen+contractAddrLen) copy(r[0:], prefix) copy(r[prefixLen:], c.Updated.Bytes()) - copy(r[prefixLen+AbsoluteTxPositionLen:], contractAddr) + copy(r[prefixLen+AbsoluteTxPositionLen:], contractAddr.Bytes()) return r } @@ -87,11 +89,8 @@ func GetContractCodeHistoryElementKey(contractAddr sdk.AccAddress, pos uint64) [ // GetContractCodeHistoryElementPrefix returns the key prefix for a contract code history entry: `` func GetContractCodeHistoryElementPrefix(contractAddr sdk.AccAddress) []byte { - prefixLen := len(ContractCodeHistoryElementPrefix) - contractAddrLen := len(contractAddr) - r := make([]byte, prefixLen+contractAddrLen) - copy(r[0:], ContractCodeHistoryElementPrefix) - copy(r[prefixLen:], contractAddr) + r := sdk.CopyBytes(ContractCodeHistoryElementPrefix) + r = append(r, contractAddr.Bytes()...) return r } @@ -108,3 +107,10 @@ func GetPinnedCodeIndexPrefix(codeID uint64) []byte { func ParsePinnedCodeIndex(s []byte) uint64 { return sdk.BigEndianToUint64(s) } + +func GetInactiveContractKey(contractAddress sdk.AccAddress) []byte { + key := make([]byte, len(InactiveContractPrefix)+len(contractAddress)) + copy(key, InactiveContractPrefix) + copy(key[len(InactiveContractPrefix):], contractAddress) + return key +} diff --git a/x/wasm/types/keys_test.go b/x/wasm/types/keys_test.go index 552703fea0..84c6e5e2f4 100644 --- a/x/wasm/types/keys_test.go +++ b/x/wasm/types/keys_test.go @@ -30,11 +30,11 @@ func TestGetContractByCodeIDSecondaryIndexPrefix(t *testing.T) { } func TestGetContractCodeHistoryElementPrefix(t *testing.T) { + // test that contract addresses of 20 length are still supported addr := bytes.Repeat([]byte{4}, 20) got := GetContractCodeHistoryElementPrefix(addr) - exp := []byte{ - 5, // prefix + exp := []byte{5, // prefix 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // address 20 bytes 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, } @@ -42,8 +42,7 @@ func TestGetContractCodeHistoryElementPrefix(t *testing.T) { addr = bytes.Repeat([]byte{4}, ContractAddrLen) got = GetContractCodeHistoryElementPrefix(addr) - exp = []byte{ - 5, // prefix + exp = []byte{5, // prefix 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // address 32 bytes 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, @@ -70,18 +69,14 @@ func TestGetContractByCreatedSecondaryIndexKey(t *testing.T) { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, } assert.Equal(t, exp, got) +} - addr = bytes.Repeat([]byte{4}, ContractAddrLen) - got = GetContractByCreatedSecondaryIndexKey(addr, e) - exp = []byte{ - 6, // prefix - 0, 0, 0, 0, 0, 0, 0, 1, // codeID - 1, 0, 0, 0, 0, 0, 0, 2, // height - 1, 0, 0, 0, 0, 0, 0, 3, // index - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // address 32 bytes - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +func TestGetInactiveContractKey(t *testing.T) { + addr := bytes.Repeat([]byte{4}, 20) + got := GetInactiveContractKey(addr) + exp := []byte{0x90, // prefix + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // address 20 bytes 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, } assert.Equal(t, exp, got) } diff --git a/x/wasm/types/params.go b/x/wasm/types/params.go index ea8046cf3d..7a7378cdb8 100644 --- a/x/wasm/types/params.go +++ b/x/wasm/types/params.go @@ -4,19 +4,51 @@ import ( "encoding/json" "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/gogo/protobuf/jsonpb" "github.com/pkg/errors" "gopkg.in/yaml.v2" + + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + paramtypes "github.com/line/lbm-sdk/x/params/types" ) -var ( - ParamStoreKeyUploadAccess = []byte("uploadAccess") - ParamStoreKeyInstantiateAccess = []byte("instantiateAccess") +const ( + // DefaultGasMultiplier is how many CosmWasm gas points = 1 Cosmos SDK gas point. + // + // CosmWasm gas strategy is documented in https://https://github.com/line/cosmwasm/blob/v1.0.0-0.6.0/docs/GAS.md. + // LBM SDK reference costs can be found here: https://github.com/line/lbm-sdk/blob/main/store/types/gas.go#L199-L209. + // + // The original multiplier of 100 up to CosmWasm 0.16 was based on + // "A write at ~3000 gas and ~200us = 10 gas per us (microsecond) cpu/io + // Rough timing have 88k gas at 90us, which is equal to 1k sdk gas... (one read)" + // as well as manual Wasmer benchmarks from 2019. This was then multiplied by 150_000 + // in the 0.16 -> 1.0 upgrade (https://github.com/CosmWasm/cosmwasm/pull/1120). + // + // The multiplier deserves more reproducible benchmarking and a strategy that allows easy adjustments. + // This is tracked in https://github.com/CosmWasm/wasmd/issues/566 and https://github.com/CosmWasm/wasmd/issues/631. + // Gas adjustments are consensus breaking but may happen in any release marked as consensus breaking. + // Do not make assumptions on how much gas an operation will consume in places that are hard to adjust, + // such as hardcoding them in contracts. + // + // Please note that all gas prices returned to wasmvm should have this multiplied. + DefaultGasMultiplier uint64 = 140_000_000 + // DefaultInstanceCost is how much SDK gas we charge each time we load a WASM instance. + // Creating a new instance is costly, and this helps put a recursion limit to contract calling contracts. + DefaultInstanceCost = 60_000 + // DefaultCompileCost is how much SDK gas we charge *per byte* for compiling WASM code. + DefaultCompileCost = 3 ) +var ParamStoreKeyUploadAccess = []byte("uploadAccess") +var ParamStoreKeyInstantiateAccess = []byte("instantiateAccess") + +// TODO: detach below params because these are lbm-sdk custom params + +var ParamStoreKeyGasMultiplier = []byte("gasMultiplier") +var ParamStoreKeyInstanceCost = []byte("instanceCost") +var ParamStoreKeyCompileCost = []byte("compileCost") + var AllAccessTypes = []AccessType{ AccessTypeNobody, AccessTypeOnlyAddress, @@ -93,6 +125,9 @@ func DefaultParams() Params { return Params{ CodeUploadAccess: AllowEverybody, InstantiateDefaultPermission: AccessTypeEverybody, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, } } @@ -109,6 +144,9 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { return paramtypes.ParamSetPairs{ paramtypes.NewParamSetPair(ParamStoreKeyUploadAccess, &p.CodeUploadAccess, validateAccessConfig), paramtypes.NewParamSetPair(ParamStoreKeyInstantiateAccess, &p.InstantiateDefaultPermission, validateAccessType), + paramtypes.NewParamSetPair(ParamStoreKeyGasMultiplier, &p.GasMultiplier, validateGasMultiplier), + paramtypes.NewParamSetPair(ParamStoreKeyInstanceCost, &p.InstanceCost, validateInstanceCost), + paramtypes.NewParamSetPair(ParamStoreKeyCompileCost, &p.CompileCost, validateCompileCost), } } @@ -163,6 +201,39 @@ func (a AccessConfig) ValidateBasic() error { return sdkerrors.Wrapf(ErrInvalid, "unknown type: %q", a.Permission) } +func validateGasMultiplier(i interface{}) error { + a, ok := i.(uint64) + if !ok { + return sdkerrors.Wrapf(ErrInvalid, "type: %T", i) + } + if a == 0 { + return sdkerrors.Wrap(ErrInvalid, "must be greater than 0") + } + return nil +} + +func validateInstanceCost(i interface{}) error { + a, ok := i.(uint64) + if !ok { + return sdkerrors.Wrapf(ErrInvalid, "type: %T", i) + } + if a == 0 { + return sdkerrors.Wrap(ErrInvalid, "must be greater than 0") + } + return nil +} + +func validateCompileCost(i interface{}) error { + a, ok := i.(uint64) + if !ok { + return sdkerrors.Wrapf(ErrInvalid, "type: %T", i) + } + if a == 0 { + return sdkerrors.Wrap(ErrInvalid, "must be greater than 0") + } + return nil +} + func (a AccessConfig) Allowed(actor sdk.AccAddress) bool { switch a.Permission { case AccessTypeNobody: diff --git a/x/wasm/types/params_test.go b/x/wasm/types/params_test.go index 35799cb48b..f5a35f2c65 100644 --- a/x/wasm/types/params_test.go +++ b/x/wasm/types/params_test.go @@ -4,11 +4,12 @@ import ( "encoding/json" "testing" - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/line/lbm-sdk/codec" + codectypes "github.com/line/lbm-sdk/codec/types" + sdk "github.com/line/lbm-sdk/types" ) func TestValidateParams(t *testing.T) { @@ -28,23 +29,35 @@ func TestValidateParams(t *testing.T) { src: Params{ CodeUploadAccess: AllowNobody, InstantiateDefaultPermission: AccessTypeNobody, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, }, }, "all good with everybody": { src: Params{ CodeUploadAccess: AllowEverybody, InstantiateDefaultPermission: AccessTypeEverybody, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, }, }, "all good with only address": { src: Params{ CodeUploadAccess: AccessTypeOnlyAddress.With(anyAddress), InstantiateDefaultPermission: AccessTypeOnlyAddress, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, }, }, "reject empty type in instantiate permission": { src: Params{ CodeUploadAccess: AllowNobody, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, }, expErr: true, }, @@ -52,13 +65,19 @@ func TestValidateParams(t *testing.T) { src: Params{ CodeUploadAccess: AllowNobody, InstantiateDefaultPermission: 1111, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, }, expErr: true, }, - "reject invalid address in only address": { + "reject CodeUploadAccess invalid address in only address": { src: Params{ CodeUploadAccess: AccessConfig{Permission: AccessTypeOnlyAddress, Address: invalidAddress}, InstantiateDefaultPermission: AccessTypeOnlyAddress, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, }, expErr: true, }, @@ -66,6 +85,9 @@ func TestValidateParams(t *testing.T) { src: Params{ CodeUploadAccess: AccessConfig{Permission: AccessTypeEverybody, Address: anyAddress.String()}, InstantiateDefaultPermission: AccessTypeOnlyAddress, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, }, expErr: true, }, @@ -73,12 +95,18 @@ func TestValidateParams(t *testing.T) { src: Params{ CodeUploadAccess: AccessConfig{Permission: AccessTypeNobody, Address: anyAddress.String()}, InstantiateDefaultPermission: AccessTypeOnlyAddress, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, }, expErr: true, }, "reject empty CodeUploadAccess": { src: Params{ InstantiateDefaultPermission: AccessTypeOnlyAddress, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, }, expErr: true, }, @@ -86,6 +114,9 @@ func TestValidateParams(t *testing.T) { src: Params{ CodeUploadAccess: AccessConfig{Permission: AccessTypeUnspecified}, InstantiateDefaultPermission: AccessTypeOnlyAddress, + GasMultiplier: DefaultGasMultiplier, + InstanceCost: DefaultInstanceCost, + CompileCost: DefaultCompileCost, }, expErr: true, }, @@ -150,7 +181,10 @@ func TestParamsUnmarshalJson(t *testing.T) { }{ "defaults": { src: `{"code_upload_access": {"permission": "Everybody"}, - "instantiate_default_permission": "Everybody"}`, + "instantiate_default_permission": "Everybody", + "gas_multiplier": 140000000, + "instance_cost": 60000, + "compile_cost": 3}`, exp: DefaultParams(), }, } diff --git a/x/wasm/types/proposal.go b/x/wasm/types/proposal.go index 748a03895b..2c8bdfe7df 100644 --- a/x/wasm/types/proposal.go +++ b/x/wasm/types/proposal.go @@ -5,9 +5,9 @@ import ( "fmt" "strings" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + govtypes "github.com/line/lbm-sdk/x/gov/types" ) type ProposalType string @@ -71,16 +71,6 @@ func init() { // register new content types with the sdk govtypes.RegisterProposalType(string(ProposalTypePinCodes)) govtypes.RegisterProposalType(string(ProposalTypeUnpinCodes)) govtypes.RegisterProposalType(string(ProposalTypeUpdateInstantiateConfig)) - govtypes.RegisterProposalTypeCodec(&StoreCodeProposal{}, "wasm/StoreCodeProposal") - govtypes.RegisterProposalTypeCodec(&InstantiateContractProposal{}, "wasm/InstantiateContractProposal") - govtypes.RegisterProposalTypeCodec(&MigrateContractProposal{}, "wasm/MigrateContractProposal") - govtypes.RegisterProposalTypeCodec(&SudoContractProposal{}, "wasm/SudoContractProposal") - govtypes.RegisterProposalTypeCodec(&ExecuteContractProposal{}, "wasm/ExecuteContractProposal") - govtypes.RegisterProposalTypeCodec(&UpdateAdminProposal{}, "wasm/UpdateAdminProposal") - govtypes.RegisterProposalTypeCodec(&ClearAdminProposal{}, "wasm/ClearAdminProposal") - govtypes.RegisterProposalTypeCodec(&PinCodesProposal{}, "wasm/PinCodesProposal") - govtypes.RegisterProposalTypeCodec(&UnpinCodesProposal{}, "wasm/UnpinCodesProposal") - govtypes.RegisterProposalTypeCodec(&UpdateInstantiateConfigProposal{}, "wasm/UpdateInstantiateConfigProposal") } // ProposalRoute returns the routing key of a parameter change proposal. diff --git a/x/wasm/types/proposal.pb.go b/x/wasm/types/proposal.pb.go index c4b1d977a8..21d9bcb216 100644 --- a/x/wasm/types/proposal.pb.go +++ b/x/wasm/types/proposal.pb.go @@ -6,23 +6,19 @@ package types import ( bytes "bytes" fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + github_com_line_lbm_sdk_types "github.com/line/lbm-sdk/types" + types "github.com/line/lbm-sdk/types" io "io" math "math" math_bits "math/bits" - - 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" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = math.Inf -) +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. @@ -49,11 +45,9 @@ func (*StoreCodeProposal) ProtoMessage() {} func (*StoreCodeProposal) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{0} } - func (m *StoreCodeProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *StoreCodeProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_StoreCodeProposal.Marshal(b, m, deterministic) @@ -66,15 +60,12 @@ func (m *StoreCodeProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } - func (m *StoreCodeProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_StoreCodeProposal.Merge(m, src) } - func (m *StoreCodeProposal) XXX_Size() int { return m.Size() } - func (m *StoreCodeProposal) XXX_DiscardUnknown() { xxx_messageInfo_StoreCodeProposal.DiscardUnknown(m) } @@ -99,7 +90,7 @@ type InstantiateContractProposal struct { // Msg json encoded message to be passed to the contract on instantiation Msg RawContractMessage `protobuf:"bytes,7,opt,name=msg,proto3,casttype=RawContractMessage" json:"msg,omitempty"` // Funds coins that are transferred to the contract on instantiation - Funds github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,8,rep,name=funds,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"funds"` + Funds github_com_line_lbm_sdk_types.Coins `protobuf:"bytes,8,rep,name=funds,proto3,castrepeated=github.com/line/lbm-sdk/types.Coins" json:"funds"` } func (m *InstantiateContractProposal) Reset() { *m = InstantiateContractProposal{} } @@ -107,11 +98,9 @@ func (*InstantiateContractProposal) ProtoMessage() {} func (*InstantiateContractProposal) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{1} } - func (m *InstantiateContractProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *InstantiateContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_InstantiateContractProposal.Marshal(b, m, deterministic) @@ -124,15 +113,12 @@ func (m *InstantiateContractProposal) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } - func (m *InstantiateContractProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_InstantiateContractProposal.Merge(m, src) } - func (m *InstantiateContractProposal) XXX_Size() int { return m.Size() } - func (m *InstantiateContractProposal) XXX_DiscardUnknown() { xxx_messageInfo_InstantiateContractProposal.DiscardUnknown(m) } @@ -158,11 +144,9 @@ func (*MigrateContractProposal) ProtoMessage() {} func (*MigrateContractProposal) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{2} } - func (m *MigrateContractProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MigrateContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MigrateContractProposal.Marshal(b, m, deterministic) @@ -175,15 +159,12 @@ func (m *MigrateContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } - func (m *MigrateContractProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_MigrateContractProposal.Merge(m, src) } - func (m *MigrateContractProposal) XXX_Size() int { return m.Size() } - func (m *MigrateContractProposal) XXX_DiscardUnknown() { xxx_messageInfo_MigrateContractProposal.DiscardUnknown(m) } @@ -207,11 +188,9 @@ func (*SudoContractProposal) ProtoMessage() {} func (*SudoContractProposal) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{3} } - func (m *SudoContractProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *SudoContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_SudoContractProposal.Marshal(b, m, deterministic) @@ -224,15 +203,12 @@ func (m *SudoContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } - func (m *SudoContractProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_SudoContractProposal.Merge(m, src) } - func (m *SudoContractProposal) XXX_Size() int { return m.Size() } - func (m *SudoContractProposal) XXX_DiscardUnknown() { xxx_messageInfo_SudoContractProposal.DiscardUnknown(m) } @@ -253,7 +229,7 @@ type ExecuteContractProposal struct { // Msg json encoded message to be passed to the contract as execute Msg RawContractMessage `protobuf:"bytes,5,opt,name=msg,proto3,casttype=RawContractMessage" json:"msg,omitempty"` // Funds coins that are transferred to the contract on instantiation - Funds github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,6,rep,name=funds,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"funds"` + Funds github_com_line_lbm_sdk_types.Coins `protobuf:"bytes,6,rep,name=funds,proto3,castrepeated=github.com/line/lbm-sdk/types.Coins" json:"funds"` } func (m *ExecuteContractProposal) Reset() { *m = ExecuteContractProposal{} } @@ -261,11 +237,9 @@ func (*ExecuteContractProposal) ProtoMessage() {} func (*ExecuteContractProposal) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{4} } - func (m *ExecuteContractProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *ExecuteContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_ExecuteContractProposal.Marshal(b, m, deterministic) @@ -278,15 +252,12 @@ func (m *ExecuteContractProposal) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } - func (m *ExecuteContractProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_ExecuteContractProposal.Merge(m, src) } - func (m *ExecuteContractProposal) XXX_Size() int { return m.Size() } - func (m *ExecuteContractProposal) XXX_DiscardUnknown() { xxx_messageInfo_ExecuteContractProposal.DiscardUnknown(m) } @@ -310,11 +281,9 @@ func (*UpdateAdminProposal) ProtoMessage() {} func (*UpdateAdminProposal) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{5} } - func (m *UpdateAdminProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *UpdateAdminProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_UpdateAdminProposal.Marshal(b, m, deterministic) @@ -327,15 +296,12 @@ func (m *UpdateAdminProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } - func (m *UpdateAdminProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_UpdateAdminProposal.Merge(m, src) } - func (m *UpdateAdminProposal) XXX_Size() int { return m.Size() } - func (m *UpdateAdminProposal) XXX_DiscardUnknown() { xxx_messageInfo_UpdateAdminProposal.DiscardUnknown(m) } @@ -358,11 +324,9 @@ func (*ClearAdminProposal) ProtoMessage() {} func (*ClearAdminProposal) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{6} } - func (m *ClearAdminProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *ClearAdminProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_ClearAdminProposal.Marshal(b, m, deterministic) @@ -375,15 +339,12 @@ func (m *ClearAdminProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } - func (m *ClearAdminProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_ClearAdminProposal.Merge(m, src) } - func (m *ClearAdminProposal) XXX_Size() int { return m.Size() } - func (m *ClearAdminProposal) XXX_DiscardUnknown() { xxx_messageInfo_ClearAdminProposal.DiscardUnknown(m) } @@ -406,11 +367,9 @@ func (*PinCodesProposal) ProtoMessage() {} func (*PinCodesProposal) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{7} } - func (m *PinCodesProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *PinCodesProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_PinCodesProposal.Marshal(b, m, deterministic) @@ -423,15 +382,12 @@ func (m *PinCodesProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } - func (m *PinCodesProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_PinCodesProposal.Merge(m, src) } - func (m *PinCodesProposal) XXX_Size() int { return m.Size() } - func (m *PinCodesProposal) XXX_DiscardUnknown() { xxx_messageInfo_PinCodesProposal.DiscardUnknown(m) } @@ -454,11 +410,9 @@ func (*UnpinCodesProposal) ProtoMessage() {} func (*UnpinCodesProposal) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{8} } - func (m *UnpinCodesProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *UnpinCodesProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_UnpinCodesProposal.Marshal(b, m, deterministic) @@ -471,15 +425,12 @@ func (m *UnpinCodesProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } - func (m *UnpinCodesProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_UnpinCodesProposal.Merge(m, src) } - func (m *UnpinCodesProposal) XXX_Size() int { return m.Size() } - func (m *UnpinCodesProposal) XXX_DiscardUnknown() { xxx_messageInfo_UnpinCodesProposal.DiscardUnknown(m) } @@ -500,11 +451,9 @@ func (*AccessConfigUpdate) ProtoMessage() {} func (*AccessConfigUpdate) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{9} } - func (m *AccessConfigUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *AccessConfigUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_AccessConfigUpdate.Marshal(b, m, deterministic) @@ -517,15 +466,12 @@ func (m *AccessConfigUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } - func (m *AccessConfigUpdate) XXX_Merge(src proto.Message) { xxx_messageInfo_AccessConfigUpdate.Merge(m, src) } - func (m *AccessConfigUpdate) XXX_Size() int { return m.Size() } - func (m *AccessConfigUpdate) XXX_DiscardUnknown() { xxx_messageInfo_AccessConfigUpdate.DiscardUnknown(m) } @@ -549,11 +495,9 @@ func (*UpdateInstantiateConfigProposal) ProtoMessage() {} func (*UpdateInstantiateConfigProposal) Descriptor() ([]byte, []int) { return fileDescriptor_be6422d717c730cb, []int{10} } - func (m *UpdateInstantiateConfigProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *UpdateInstantiateConfigProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_UpdateInstantiateConfigProposal.Marshal(b, m, deterministic) @@ -566,15 +510,12 @@ func (m *UpdateInstantiateConfigProposal) XXX_Marshal(b []byte, deterministic bo return b[:n], nil } } - func (m *UpdateInstantiateConfigProposal) XXX_Merge(src proto.Message) { xxx_messageInfo_UpdateInstantiateConfigProposal.Merge(m, src) } - func (m *UpdateInstantiateConfigProposal) XXX_Size() int { return m.Size() } - func (m *UpdateInstantiateConfigProposal) XXX_DiscardUnknown() { xxx_messageInfo_UpdateInstantiateConfigProposal.DiscardUnknown(m) } @@ -598,59 +539,58 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/proposal.proto", fileDescriptor_be6422d717c730cb) } var fileDescriptor_be6422d717c730cb = []byte{ - // 817 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4f, 0x6f, 0xe3, 0x44, - 0x14, 0xcf, 0xe4, 0x8f, 0x93, 0x4e, 0x22, 0x08, 0xde, 0xb4, 0x1b, 0x0a, 0xb2, 0x23, 0x83, 0x56, - 0xbe, 0x60, 0x93, 0x22, 0x21, 0xe0, 0x16, 0x07, 0x0e, 0x5d, 0x51, 0xa9, 0x72, 0x55, 0xad, 0x04, - 0x12, 0xd6, 0xc4, 0x9e, 0x7a, 0x2d, 0x62, 0x8f, 0xe5, 0x99, 0x34, 0x9b, 0x6f, 0x01, 0x12, 0xe2, - 0xc4, 0x07, 0x40, 0x5c, 0x10, 0x77, 0x3e, 0x40, 0xc5, 0x69, 0x8f, 0x7b, 0x32, 0x6c, 0xf2, 0x0d, - 0x72, 0x44, 0x42, 0x42, 0x33, 0xe3, 0x84, 0x74, 0x97, 0x66, 0x17, 0xd1, 0x20, 0x71, 0x71, 0xf2, - 0xe6, 0xbd, 0x37, 0xef, 0x37, 0x3f, 0xfd, 0xde, 0xbc, 0x81, 0xba, 0x4f, 0x68, 0x3c, 0x45, 0x34, - 0xb6, 0xc5, 0xe7, 0xb2, 0x6f, 0xa7, 0x19, 0x49, 0x09, 0x45, 0x63, 0x2b, 0xcd, 0x08, 0x23, 0x6a, - 0x7b, 0x15, 0x60, 0x89, 0xcf, 0x65, 0xff, 0xb0, 0x13, 0x92, 0x90, 0x08, 0xa7, 0xcd, 0xff, 0xc9, - 0xb8, 0x43, 0x8d, 0xc7, 0x11, 0x6a, 0x8f, 0x10, 0xc5, 0xf6, 0x65, 0x7f, 0x84, 0x19, 0xea, 0xdb, - 0x3e, 0x89, 0x92, 0xc2, 0xff, 0xe6, 0x73, 0x85, 0xd8, 0x2c, 0xc5, 0x54, 0x7a, 0x8d, 0x3f, 0x00, - 0x7c, 0xed, 0x8c, 0x91, 0x0c, 0x0f, 0x49, 0x80, 0x4f, 0x0b, 0x04, 0x6a, 0x07, 0xd6, 0x58, 0xc4, - 0xc6, 0xb8, 0x0b, 0x7a, 0xc0, 0xdc, 0x73, 0xa5, 0xa1, 0xf6, 0x60, 0x33, 0xc0, 0xd4, 0xcf, 0xa2, - 0x94, 0x45, 0x24, 0xe9, 0x96, 0x85, 0x6f, 0x73, 0x49, 0xdd, 0x87, 0x4a, 0x36, 0x49, 0x3c, 0x44, - 0xbb, 0x15, 0x99, 0x98, 0x4d, 0x92, 0x01, 0x55, 0xdf, 0x87, 0xaf, 0xf0, 0xda, 0xde, 0x68, 0xc6, - 0xb0, 0xe7, 0x93, 0x00, 0x77, 0xab, 0x3d, 0x60, 0xb6, 0x9c, 0xf6, 0x3c, 0xd7, 0x5b, 0x0f, 0x06, - 0x67, 0x27, 0xce, 0x8c, 0x09, 0x00, 0x6e, 0x8b, 0xc7, 0xad, 0x2c, 0xf5, 0x1c, 0x1e, 0x44, 0x09, - 0x65, 0x28, 0x61, 0x11, 0x62, 0xd8, 0x4b, 0x71, 0x16, 0x47, 0x94, 0xf2, 0xda, 0xf5, 0x1e, 0x30, - 0x9b, 0x47, 0x9a, 0xf5, 0x2c, 0x47, 0xd6, 0xc0, 0xf7, 0x31, 0xa5, 0x43, 0x92, 0x5c, 0x44, 0xa1, - 0xbb, 0xbf, 0x91, 0x7d, 0xba, 0x4e, 0xbe, 0x5f, 0x6d, 0xd4, 0xda, 0xca, 0xfd, 0x6a, 0x43, 0x69, - 0xd7, 0x8d, 0x5f, 0xca, 0xf0, 0x8d, 0xe3, 0xbf, 0xa2, 0x86, 0x24, 0x61, 0x19, 0xf2, 0xd9, 0xae, - 0x98, 0xe8, 0xc0, 0x1a, 0x0a, 0xe2, 0x28, 0x11, 0x04, 0xec, 0xb9, 0xd2, 0x50, 0xdf, 0x82, 0x75, - 0xce, 0x8a, 0x17, 0x05, 0xdd, 0x5a, 0x0f, 0x98, 0x55, 0x07, 0xce, 0x73, 0x5d, 0xe1, 0x14, 0x1c, - 0x7f, 0xec, 0x2a, 0xdc, 0x75, 0x1c, 0xf0, 0xd4, 0x31, 0x1a, 0xe1, 0x71, 0x57, 0x91, 0xa9, 0xc2, - 0x50, 0x4d, 0x58, 0x89, 0x69, 0x28, 0xf8, 0x68, 0x39, 0x07, 0xbf, 0xe7, 0xba, 0xea, 0xa2, 0xe9, - 0xea, 0x14, 0x27, 0x98, 0x52, 0x14, 0x62, 0x97, 0x87, 0xa8, 0x08, 0xd6, 0x2e, 0x26, 0x49, 0x40, - 0xbb, 0x8d, 0x5e, 0xc5, 0x6c, 0x1e, 0xbd, 0x6e, 0x49, 0xdd, 0x58, 0x5c, 0x37, 0x56, 0xa1, 0x1b, - 0x6b, 0x48, 0xa2, 0xc4, 0x79, 0xf7, 0x2a, 0xd7, 0x4b, 0x3f, 0xfc, 0xaa, 0x9b, 0x61, 0xc4, 0x1e, - 0x4e, 0x46, 0x96, 0x4f, 0x62, 0xbb, 0x10, 0x99, 0xfc, 0x79, 0x87, 0x06, 0x5f, 0x16, 0x2a, 0xe2, - 0x09, 0xd4, 0x95, 0x3b, 0x1b, 0x3f, 0x03, 0x78, 0xf7, 0x24, 0x0a, 0xb3, 0xdb, 0x24, 0xf2, 0x10, - 0x36, 0xfc, 0x62, 0xaf, 0x82, 0xb4, 0xb5, 0xfd, 0x72, 0xbc, 0x15, 0x0c, 0x29, 0x2f, 0x64, 0xc8, - 0xf8, 0x06, 0xc0, 0xce, 0xd9, 0x24, 0x20, 0x3b, 0xc1, 0x5e, 0x79, 0x06, 0x7b, 0x01, 0xab, 0xfa, - 0x62, 0x58, 0x5f, 0x97, 0xe1, 0xdd, 0x4f, 0x1e, 0x61, 0x7f, 0xb2, 0x7b, 0x79, 0x6e, 0x23, 0xbb, - 0x00, 0x5c, 0xfb, 0x07, 0x4a, 0x53, 0x76, 0xa6, 0xb4, 0xef, 0x00, 0xbc, 0x73, 0x9e, 0x06, 0x88, - 0xe1, 0x01, 0xef, 0xa0, 0x7f, 0xcd, 0x47, 0x1f, 0xee, 0x25, 0x78, 0xea, 0xc9, 0xde, 0x14, 0x94, - 0x38, 0x9d, 0x65, 0xae, 0xb7, 0x67, 0x28, 0x1e, 0x7f, 0x64, 0xac, 0x5d, 0x86, 0xdb, 0x48, 0xf0, - 0x54, 0x94, 0xdc, 0xc6, 0x95, 0xf1, 0x10, 0xaa, 0xc3, 0x31, 0x46, 0xd9, 0xed, 0x80, 0xdb, 0x22, - 0x23, 0xe3, 0x47, 0x00, 0xdb, 0xa7, 0x51, 0xc2, 0x35, 0x4f, 0xd7, 0x85, 0xee, 0x5d, 0x2b, 0xe4, - 0xb4, 0x97, 0xb9, 0xde, 0x92, 0x27, 0x11, 0xcb, 0xc6, 0xaa, 0xf4, 0x07, 0x7f, 0x53, 0xda, 0x39, - 0x58, 0xe6, 0xba, 0x2a, 0xa3, 0x37, 0x9c, 0xc6, 0x75, 0x48, 0x1f, 0x72, 0x48, 0xa2, 0xf3, 0xb8, - 0x82, 0x2a, 0x66, 0xd5, 0xd1, 0xe6, 0xb9, 0x5e, 0x97, 0xad, 0x47, 0x97, 0xb9, 0xfe, 0xaa, 0xdc, - 0x61, 0x15, 0x64, 0xb8, 0x75, 0xd9, 0x8e, 0xd4, 0xf8, 0x09, 0x40, 0xf5, 0x3c, 0x49, 0xff, 0x57, - 0x98, 0xbf, 0x05, 0x50, 0xdd, 0x9c, 0x2c, 0x52, 0x7a, 0x9b, 0xf7, 0x0f, 0xb8, 0xf1, 0xfe, 0xf9, - 0xfc, 0xc6, 0x21, 0x56, 0x7e, 0x99, 0x21, 0xe6, 0x54, 0x79, 0x8f, 0xdc, 0x30, 0xca, 0x8c, 0x05, - 0x80, 0xba, 0x04, 0x73, 0x7d, 0x88, 0x5d, 0x44, 0xe1, 0x7f, 0xc8, 0xec, 0x17, 0x70, 0x1f, 0x09, - 0xc8, 0x9e, 0x2f, 0x4a, 0x7b, 0x13, 0x01, 0x49, 0xd2, 0xdc, 0x3c, 0x7a, 0x7b, 0xfb, 0x09, 0x25, - 0xfe, 0xe2, 0x9c, 0x77, 0xd0, 0x73, 0x1e, 0xea, 0x7c, 0x7a, 0xf5, 0x54, 0x2b, 0x3d, 0x79, 0xaa, - 0x95, 0xbe, 0x9f, 0x6b, 0xe0, 0x6a, 0xae, 0x81, 0xc7, 0x73, 0x0d, 0xfc, 0x36, 0xd7, 0xc0, 0x57, - 0x0b, 0xad, 0xf4, 0x78, 0xa1, 0x95, 0x9e, 0x2c, 0xb4, 0xd2, 0x67, 0xf7, 0x36, 0x2e, 0x91, 0x21, - 0xa1, 0xf1, 0x83, 0xd5, 0x9b, 0x27, 0xb0, 0x1f, 0xc9, 0xb7, 0x8f, 0xb8, 0x48, 0x46, 0x8a, 0x78, - 0xf9, 0xbc, 0xf7, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x70, 0x3f, 0xe6, 0xf2, 0x82, 0x09, 0x00, - 0x00, + // 815 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x41, 0x6f, 0xe3, 0x44, + 0x14, 0xce, 0x34, 0x89, 0x93, 0x4e, 0x23, 0x08, 0xde, 0xb4, 0x1b, 0x0a, 0xb2, 0x23, 0x2f, 0x42, + 0x91, 0x10, 0xb6, 0x52, 0x24, 0x04, 0xdc, 0xea, 0x80, 0x44, 0x57, 0xaa, 0x54, 0xb9, 0xaa, 0x90, + 0x00, 0x61, 0x4d, 0xec, 0xa9, 0x77, 0x84, 0x3d, 0x63, 0x79, 0x26, 0xed, 0xf6, 0x3f, 0x70, 0xe0, + 0x80, 0x38, 0xf1, 0x03, 0x10, 0x17, 0xc4, 0x9d, 0x2b, 0x52, 0x8f, 0x7b, 0xdc, 0x93, 0x61, 0xd3, + 0x7f, 0xd0, 0x23, 0x12, 0x12, 0x9a, 0x19, 0xa7, 0xa4, 0x5d, 0x9a, 0x5d, 0xc4, 0x06, 0x89, 0x8b, + 0xe5, 0xf1, 0x7b, 0x6f, 0xbe, 0x6f, 0x3e, 0x7d, 0x6f, 0x9e, 0xa1, 0x1d, 0x31, 0x9e, 0x9d, 0x22, + 0x9e, 0x79, 0xea, 0x71, 0x32, 0xf2, 0xf2, 0x82, 0xe5, 0x8c, 0xa3, 0xd4, 0xcd, 0x0b, 0x26, 0x98, + 0xd9, 0x9d, 0x27, 0xb8, 0xea, 0x71, 0x32, 0xda, 0xee, 0x25, 0x2c, 0x61, 0x2a, 0xe8, 0xc9, 0x37, + 0x9d, 0xb7, 0x6d, 0xc9, 0x3c, 0xc6, 0xbd, 0x09, 0xe2, 0xd8, 0x3b, 0x19, 0x4d, 0xb0, 0x40, 0x23, + 0x2f, 0x62, 0x84, 0x56, 0xf1, 0xd7, 0x9f, 0x02, 0x12, 0x67, 0x39, 0xe6, 0x3a, 0xea, 0xfc, 0x01, + 0xe0, 0x2b, 0x87, 0x82, 0x15, 0x78, 0xcc, 0x62, 0x7c, 0x50, 0x31, 0x30, 0x7b, 0xb0, 0x29, 0x88, + 0x48, 0x71, 0x1f, 0x0c, 0xc0, 0x70, 0x3d, 0xd0, 0x0b, 0x73, 0x00, 0x37, 0x62, 0xcc, 0xa3, 0x82, + 0xe4, 0x82, 0x30, 0xda, 0x5f, 0x53, 0xb1, 0xc5, 0x4f, 0xe6, 0x26, 0x34, 0x8a, 0x29, 0x0d, 0x11, + 0xef, 0xd7, 0x75, 0x61, 0x31, 0xa5, 0xbb, 0xdc, 0x7c, 0x17, 0xbe, 0x24, 0xb1, 0xc3, 0xc9, 0x99, + 0xc0, 0x61, 0xc4, 0x62, 0xdc, 0x6f, 0x0c, 0xc0, 0xb0, 0xe3, 0x77, 0x67, 0xa5, 0xdd, 0xf9, 0x64, + 0xf7, 0x70, 0xdf, 0x3f, 0x13, 0x8a, 0x40, 0xd0, 0x91, 0x79, 0xf3, 0x95, 0x79, 0x04, 0xb7, 0x08, + 0xe5, 0x02, 0x51, 0x41, 0x90, 0xc0, 0x61, 0x8e, 0x8b, 0x8c, 0x70, 0x2e, 0xb1, 0x5b, 0x03, 0x30, + 0xdc, 0xd8, 0xb1, 0xdc, 0x9b, 0x1a, 0xb9, 0xbb, 0x51, 0x84, 0x39, 0x1f, 0x33, 0x7a, 0x4c, 0x92, + 0x60, 0x73, 0xa1, 0xfa, 0xe0, 0xaa, 0xf8, 0x7e, 0xa3, 0xdd, 0xec, 0x1a, 0xf7, 0x1b, 0x6d, 0xa3, + 0xdb, 0x72, 0x7e, 0x59, 0x83, 0xaf, 0xed, 0xfd, 0x95, 0x35, 0x66, 0x54, 0x14, 0x28, 0x12, 0xab, + 0x52, 0xa2, 0x07, 0x9b, 0x28, 0xce, 0x08, 0x55, 0x02, 0xac, 0x07, 0x7a, 0x61, 0xde, 0x83, 0x2d, + 0xa9, 0x4a, 0x48, 0xe2, 0x7e, 0x73, 0x00, 0x86, 0x0d, 0x1f, 0xce, 0x4a, 0xdb, 0x90, 0x12, 0xec, + 0x7d, 0x18, 0x18, 0x32, 0xb4, 0x17, 0xcb, 0xd2, 0x14, 0x4d, 0x70, 0xda, 0x37, 0x74, 0xa9, 0x5a, + 0x98, 0x43, 0x58, 0xcf, 0x78, 0xa2, 0xf4, 0xe8, 0xf8, 0x5b, 0xbf, 0x97, 0xb6, 0x19, 0xa0, 0xd3, + 0xf9, 0x29, 0xf6, 0x31, 0xe7, 0x28, 0xc1, 0x81, 0x4c, 0x31, 0x3f, 0x87, 0xcd, 0xe3, 0x29, 0x8d, + 0x79, 0xbf, 0x3d, 0xa8, 0x0f, 0x37, 0x76, 0x5e, 0x75, 0xb5, 0x6f, 0x5c, 0xe9, 0x1b, 0xb7, 0xf2, + 0x8d, 0x3b, 0x66, 0x84, 0xfa, 0x6f, 0x9d, 0x97, 0x76, 0xed, 0x87, 0x5f, 0xed, 0x7b, 0x09, 0x11, + 0x0f, 0xa6, 0x13, 0x37, 0x62, 0x99, 0x97, 0x12, 0x8a, 0xbd, 0x74, 0x92, 0xbd, 0xcd, 0xe3, 0x2f, + 0x2b, 0x03, 0xc9, 0x5c, 0x1e, 0xe8, 0x4d, 0x9d, 0x9f, 0x01, 0xbc, 0xbb, 0x4f, 0x92, 0xe2, 0x45, + 0x6a, 0xb8, 0x0d, 0xdb, 0x51, 0xb5, 0x57, 0xa5, 0xd7, 0xd5, 0xfa, 0xf9, 0x24, 0xab, 0xc4, 0x31, + 0x9e, 0x29, 0x8e, 0xf3, 0x0d, 0x80, 0xbd, 0xc3, 0x69, 0xcc, 0x56, 0xc2, 0xbd, 0x7e, 0x83, 0x7b, + 0x45, 0xab, 0xf1, 0x6c, 0x5a, 0x5f, 0xad, 0xc1, 0xbb, 0x1f, 0x3d, 0xc4, 0xd1, 0x74, 0xf5, 0xce, + 0x5c, 0x26, 0x76, 0x45, 0xb8, 0xf9, 0x0f, 0x4c, 0x66, 0xac, 0xc2, 0x64, 0xdf, 0x01, 0x78, 0xe7, + 0x28, 0x8f, 0x91, 0xc0, 0xbb, 0xb2, 0x6f, 0xfe, 0xb5, 0x14, 0x23, 0xb8, 0x4e, 0xf1, 0x69, 0xa8, + 0x3b, 0x52, 0xa9, 0xe1, 0xf7, 0x2e, 0x4b, 0xbb, 0x7b, 0x86, 0xb2, 0xf4, 0x03, 0xe7, 0x2a, 0xe4, + 0x04, 0x6d, 0x8a, 0x4f, 0x15, 0xe4, 0x32, 0x99, 0x9c, 0x07, 0xd0, 0x1c, 0xa7, 0x18, 0x15, 0x2f, + 0x86, 0xdc, 0x12, 0x07, 0x39, 0x3f, 0x02, 0xd8, 0x3d, 0x20, 0x54, 0xda, 0x9d, 0x5f, 0x01, 0xbd, + 0x79, 0x0d, 0xc8, 0xef, 0x5e, 0x96, 0x76, 0x47, 0x9f, 0x44, 0x7d, 0x76, 0xe6, 0xd0, 0xef, 0xfd, + 0x0d, 0xb4, 0xbf, 0x75, 0x59, 0xda, 0xa6, 0xce, 0x5e, 0x08, 0x3a, 0xd7, 0x29, 0xbd, 0x2f, 0x29, + 0xa9, 0xa6, 0x93, 0xe6, 0xa9, 0x0f, 0x1b, 0xbe, 0x35, 0x2b, 0xed, 0x96, 0xee, 0x3a, 0x7e, 0x59, + 0xda, 0x2f, 0xeb, 0x1d, 0xe6, 0x49, 0x4e, 0xd0, 0xd2, 0x9d, 0xc8, 0x9d, 0x9f, 0x00, 0x34, 0x8f, + 0x68, 0xfe, 0xbf, 0xe2, 0xfc, 0x2d, 0x80, 0xe6, 0xe2, 0x3c, 0xd1, 0xd6, 0x5b, 0xbc, 0x7a, 0xc0, + 0xad, 0x57, 0xcf, 0x67, 0xb7, 0x8e, 0xae, 0xb5, 0xe7, 0x19, 0x5d, 0x7e, 0x43, 0xb6, 0xc7, 0x2d, + 0x03, 0xcc, 0xb9, 0x00, 0xd0, 0xd6, 0x64, 0xae, 0x8f, 0xae, 0x63, 0x92, 0xfc, 0x87, 0xca, 0x7e, + 0x01, 0x37, 0x91, 0xa2, 0x1c, 0x46, 0x0a, 0x3a, 0x9c, 0x2a, 0x4a, 0x5a, 0xe6, 0x8d, 0x9d, 0x37, + 0x96, 0x9f, 0x50, 0xf3, 0xaf, 0xce, 0x79, 0x07, 0x3d, 0x15, 0xe1, 0xfe, 0xc7, 0xe7, 0x4f, 0xac, + 0xda, 0xe3, 0x27, 0x56, 0xed, 0xfb, 0x99, 0x05, 0xce, 0x67, 0x16, 0x78, 0x34, 0xb3, 0xc0, 0x6f, + 0x33, 0x0b, 0x7c, 0x7d, 0x61, 0xd5, 0x1e, 0x5d, 0x58, 0xb5, 0xc7, 0x17, 0x56, 0xed, 0x53, 0xe7, + 0xe6, 0xfd, 0x21, 0xc1, 0x62, 0xef, 0xa1, 0xfe, 0xdb, 0x51, 0x97, 0xc8, 0xc4, 0x50, 0xff, 0x3a, + 0xef, 0xfc, 0x19, 0x00, 0x00, 0xff, 0xff, 0x64, 0x4e, 0x2a, 0x98, 0x74, 0x09, 0x00, 0x00, } func (this *StoreCodeProposal) Equal(that interface{}) bool { @@ -689,7 +629,6 @@ func (this *StoreCodeProposal) Equal(that interface{}) bool { } return true } - func (this *InstantiateContractProposal) Equal(that interface{}) bool { if that == nil { return this == nil @@ -740,7 +679,6 @@ func (this *InstantiateContractProposal) Equal(that interface{}) bool { } return true } - func (this *MigrateContractProposal) Equal(that interface{}) bool { if that == nil { return this == nil @@ -777,7 +715,6 @@ func (this *MigrateContractProposal) Equal(that interface{}) bool { } return true } - func (this *SudoContractProposal) Equal(that interface{}) bool { if that == nil { return this == nil @@ -811,7 +748,6 @@ func (this *SudoContractProposal) Equal(that interface{}) bool { } return true } - func (this *ExecuteContractProposal) Equal(that interface{}) bool { if that == nil { return this == nil @@ -856,7 +792,6 @@ func (this *ExecuteContractProposal) Equal(that interface{}) bool { } return true } - func (this *UpdateAdminProposal) Equal(that interface{}) bool { if that == nil { return this == nil @@ -890,7 +825,6 @@ func (this *UpdateAdminProposal) Equal(that interface{}) bool { } return true } - func (this *ClearAdminProposal) Equal(that interface{}) bool { if that == nil { return this == nil @@ -921,7 +855,6 @@ func (this *ClearAdminProposal) Equal(that interface{}) bool { } return true } - func (this *PinCodesProposal) Equal(that interface{}) bool { if that == nil { return this == nil @@ -957,7 +890,6 @@ func (this *PinCodesProposal) Equal(that interface{}) bool { } return true } - func (this *UnpinCodesProposal) Equal(that interface{}) bool { if that == nil { return this == nil @@ -993,7 +925,6 @@ func (this *UnpinCodesProposal) Equal(that interface{}) bool { } return true } - func (this *AccessConfigUpdate) Equal(that interface{}) bool { if that == nil { return this == nil @@ -1021,7 +952,6 @@ func (this *AccessConfigUpdate) Equal(that interface{}) bool { } return true } - func (this *UpdateInstantiateConfigProposal) Equal(that interface{}) bool { if that == nil { return this == nil @@ -1057,7 +987,6 @@ func (this *UpdateInstantiateConfigProposal) Equal(that interface{}) bool { } return true } - func (m *StoreCodeProposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1689,7 +1618,6 @@ func encodeVarintProposal(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } - func (m *StoreCodeProposal) Size() (n int) { if m == nil { return 0 @@ -1983,11 +1911,9 @@ func (m *UpdateInstantiateConfigProposal) Size() (n int) { func sovProposal(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } - func sozProposal(x uint64) (n int) { return sovProposal(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } - func (m *StoreCodeProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2204,7 +2130,6 @@ func (m *StoreCodeProposal) Unmarshal(dAtA []byte) error { } return nil } - func (m *InstantiateContractProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2502,7 +2427,6 @@ func (m *InstantiateContractProposal) Unmarshal(dAtA []byte) error { } return nil } - func (m *MigrateContractProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2702,7 +2626,6 @@ func (m *MigrateContractProposal) Unmarshal(dAtA []byte) error { } return nil } - func (m *SudoContractProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2883,7 +2806,6 @@ func (m *SudoContractProposal) Unmarshal(dAtA []byte) error { } return nil } - func (m *ExecuteContractProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3130,7 +3052,6 @@ func (m *ExecuteContractProposal) Unmarshal(dAtA []byte) error { } return nil } - func (m *UpdateAdminProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3309,7 +3230,6 @@ func (m *UpdateAdminProposal) Unmarshal(dAtA []byte) error { } return nil } - func (m *ClearAdminProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3456,7 +3376,6 @@ func (m *ClearAdminProposal) Unmarshal(dAtA []byte) error { } return nil } - func (m *PinCodesProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3647,7 +3566,6 @@ func (m *PinCodesProposal) Unmarshal(dAtA []byte) error { } return nil } - func (m *UnpinCodesProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3838,7 +3756,6 @@ func (m *UnpinCodesProposal) Unmarshal(dAtA []byte) error { } return nil } - func (m *AccessConfigUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3941,7 +3858,6 @@ func (m *AccessConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } - func (m *UpdateInstantiateConfigProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4090,7 +4006,6 @@ func (m *UpdateInstantiateConfigProposal) Unmarshal(dAtA []byte) error { } return nil } - func skipProposal(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/wasm/types/proposal_test.go b/x/wasm/types/proposal_test.go index fcc378d390..50070590f2 100644 --- a/x/wasm/types/proposal_test.go +++ b/x/wasm/types/proposal_test.go @@ -6,11 +6,12 @@ import ( "strings" "testing" - sdk "github.com/cosmos/cosmos-sdk/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gopkg.in/yaml.v2" + + sdk "github.com/line/lbm-sdk/types" + govtypes "github.com/line/lbm-sdk/x/gov/types" ) func TestValidateProposalCommons(t *testing.T) { @@ -162,7 +163,9 @@ func TestValidateStoreCodeProposal(t *testing.T) { } func TestValidateInstantiateContractProposal(t *testing.T) { - invalidAddress := "invalid address" + var ( + invalidAddress = "invalid address" + ) specs := map[string]struct { src *InstantiateContractProposal @@ -255,7 +258,9 @@ func TestValidateInstantiateContractProposal(t *testing.T) { } func TestValidateMigrateContractProposal(t *testing.T) { - invalidAddress := "invalid address2" + var ( + invalidAddress = "invalid address2" + ) specs := map[string]struct { src *MigrateContractProposal @@ -314,7 +319,9 @@ func TestValidateMigrateContractProposal(t *testing.T) { } func TestValidateSudoContractProposal(t *testing.T) { - invalidAddress := "invalid address" + var ( + invalidAddress = "invalid address" + ) specs := map[string]struct { src *SudoContractProposal @@ -367,7 +374,9 @@ func TestValidateSudoContractProposal(t *testing.T) { } func TestValidateExecuteContractProposal(t *testing.T) { - invalidAddress := "invalid address" + var ( + invalidAddress = "invalid address" + ) specs := map[string]struct { src *ExecuteContractProposal @@ -426,7 +435,9 @@ func TestValidateExecuteContractProposal(t *testing.T) { } func TestValidateUpdateAdminProposal(t *testing.T) { - invalidAddress := "invalid address" + var ( + invalidAddress = "invalid address" + ) specs := map[string]struct { src *UpdateAdminProposal @@ -479,7 +490,9 @@ func TestValidateUpdateAdminProposal(t *testing.T) { } func TestValidateClearAdminProposal(t *testing.T) { - invalidAddress := "invalid address" + var ( + invalidAddress = "invalid address" + ) specs := map[string]struct { src *ClearAdminProposal @@ -526,12 +539,12 @@ func TestProposalStrings(t *testing.T) { }{ "store code": { src: StoreCodeProposalFixture(func(p *StoreCodeProposal) { - p.WASMByteCode = []byte{0o1, 0o2, 0o3, 0o4, 0o5, 0o6, 0o7, 0x08, 0x09, 0x0a} + p.WASMByteCode = []byte{01, 02, 03, 04, 05, 06, 07, 0x08, 0x09, 0x0a} }), exp: `Store Code Proposal: Title: Foo Description: Bar - Run as: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 + Run as: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 WasmCode: 0102030405060708090A `, }, @@ -542,11 +555,11 @@ func TestProposalStrings(t *testing.T) { exp: `Instantiate Code Proposal: Title: Foo Description: Bar - Run as: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 - Admin: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 + Run as: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 + Admin: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 Code id: 1 Label: testing - Msg: "{\"verifier\":\"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4\",\"beneficiary\":\"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4\"}" + Msg: "{\"verifier\":\"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23\",\"beneficiary\":\"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23\"}" Funds: 1foo,2bar `, }, @@ -555,11 +568,11 @@ func TestProposalStrings(t *testing.T) { exp: `Instantiate Code Proposal: Title: Foo Description: Bar - Run as: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 - Admin: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 + Run as: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 + Admin: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 Code id: 1 Label: testing - Msg: "{\"verifier\":\"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4\",\"beneficiary\":\"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4\"}" + Msg: "{\"verifier\":\"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23\",\"beneficiary\":\"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23\"}" Funds: `, }, @@ -568,11 +581,11 @@ func TestProposalStrings(t *testing.T) { exp: `Instantiate Code Proposal: Title: Foo Description: Bar - Run as: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 + Run as: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 Admin: Code id: 1 Label: testing - Msg: "{\"verifier\":\"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4\",\"beneficiary\":\"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4\"}" + Msg: "{\"verifier\":\"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23\",\"beneficiary\":\"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23\"}" Funds: `, }, @@ -581,9 +594,9 @@ func TestProposalStrings(t *testing.T) { exp: `Migrate Contract Proposal: Title: Foo Description: Bar - Contract: cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr + Contract: link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8 Code id: 1 - Msg: "{\"verifier\":\"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4\"}" + Msg: "{\"verifier\":\"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23\"}" `, }, "update admin": { @@ -591,8 +604,8 @@ func TestProposalStrings(t *testing.T) { exp: `Update Contract Admin Proposal: Title: Foo Description: Bar - Contract: cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr - New Admin: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 + Contract: link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8 + New Admin: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 `, }, "clear admin": { @@ -600,7 +613,7 @@ func TestProposalStrings(t *testing.T) { exp: `Clear Contract Admin Proposal: Title: Foo Description: Bar - Contract: cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr + Contract: link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8 `, }, "pin codes": { @@ -642,11 +655,11 @@ func TestProposalYaml(t *testing.T) { }{ "store code": { src: StoreCodeProposalFixture(func(p *StoreCodeProposal) { - p.WASMByteCode = []byte{0o1, 0o2, 0o3, 0o4, 0o5, 0o6, 0o7, 0x08, 0x09, 0x0a} + p.WASMByteCode = []byte{01, 02, 03, 04, 05, 06, 07, 0x08, 0x09, 0x0a} }), exp: `title: Foo description: Bar -run_as: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 +run_as: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 wasm_byte_code: AQIDBAUGBwgJCg== instantiate_permission: null `, @@ -657,11 +670,11 @@ instantiate_permission: null }), exp: `title: Foo description: Bar -run_as: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 -admin: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 +run_as: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 +admin: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 code_id: 1 label: testing -msg: '{"verifier":"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4","beneficiary":"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"}' +msg: '{"verifier":"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23","beneficiary":"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23"}' funds: - denom: foo amount: "1" @@ -673,11 +686,11 @@ funds: src: InstantiateContractProposalFixture(func(p *InstantiateContractProposal) { p.Funds = nil }), exp: `title: Foo description: Bar -run_as: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 -admin: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 +run_as: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 +admin: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 code_id: 1 label: testing -msg: '{"verifier":"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4","beneficiary":"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"}' +msg: '{"verifier":"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23","beneficiary":"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23"}' funds: [] `, }, @@ -685,11 +698,11 @@ funds: [] src: InstantiateContractProposalFixture(func(p *InstantiateContractProposal) { p.Admin = "" }), exp: `title: Foo description: Bar -run_as: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 +run_as: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 admin: "" code_id: 1 label: testing -msg: '{"verifier":"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4","beneficiary":"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"}' +msg: '{"verifier":"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23","beneficiary":"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23"}' funds: [] `, }, @@ -697,24 +710,24 @@ funds: [] src: MigrateContractProposalFixture(), exp: `title: Foo description: Bar -contract: cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr +contract: link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8 code_id: 1 -msg: '{"verifier":"cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4"}' +msg: '{"verifier":"link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23"}' `, }, "update admin": { src: UpdateAdminProposalFixture(), exp: `title: Foo description: Bar -new_admin: cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4 -contract: cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr +new_admin: link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23 +contract: link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8 `, }, "clear admin": { src: ClearAdminProposalFixture(), exp: `title: Foo description: Bar -contract: cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr +contract: link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8 `, }, "pin codes": { @@ -846,18 +859,18 @@ func TestProposalJsonSignBytes(t *testing.T) { "instantiate contract": { src: &InstantiateContractProposal{Msg: RawContractMessage(myInnerMsg)}, exp: ` -{ - "type":"cosmos-sdk/MsgSubmitProposal", - "value":{"content":{"type":"wasm/InstantiateContractProposal","value":{"funds":[],"msg":{"foo":"bar"}}},"initial_deposit":[]} -}`, + { + "type":"cosmos-sdk/MsgSubmitProposal", + "value":{"content":{"type":"wasm/InstantiateContractProposal","value":{"funds":[],"msg":{"foo":"bar"}}},"initial_deposit":[]} + }`, }, "migrate contract": { src: &MigrateContractProposal{Msg: RawContractMessage(myInnerMsg)}, exp: ` -{ - "type":"cosmos-sdk/MsgSubmitProposal", - "value":{"content":{"type":"wasm/MigrateContractProposal","value":{"msg":{"foo":"bar"}}},"initial_deposit":[]} -}`, + { + "type":"cosmos-sdk/MsgSubmitProposal", + "value":{"content":{"type":"wasm/MigrateContractProposal","value":{"msg":{"foo":"bar"}}},"initial_deposit":[]} + }`, }, } for name, spec := range specs { diff --git a/x/wasm/types/query.pb.go b/x/wasm/types/query.pb.go index 51aead5aa1..ba70d57d94 100644 --- a/x/wasm/types/query.pb.go +++ b/x/wasm/types/query.pb.go @@ -7,28 +7,24 @@ import ( bytes "bytes" context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - 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_tendermint_tendermint_libs_bytes "github.com/tendermint/tendermint/libs/bytes" + query "github.com/line/lbm-sdk/types/query" + github_com_line_ostracon_libs_bytes "github.com/line/ostracon/libs/bytes" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal - -var ( - _ = fmt.Errorf - _ = math.Inf -) +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. @@ -49,11 +45,9 @@ func (*QueryContractInfoRequest) ProtoMessage() {} func (*QueryContractInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{0} } - func (m *QueryContractInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryContractInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryContractInfoRequest.Marshal(b, m, deterministic) @@ -66,15 +60,12 @@ func (m *QueryContractInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } - func (m *QueryContractInfoRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryContractInfoRequest.Merge(m, src) } - func (m *QueryContractInfoRequest) XXX_Size() int { return m.Size() } - func (m *QueryContractInfoRequest) XXX_DiscardUnknown() { xxx_messageInfo_QueryContractInfoRequest.DiscardUnknown(m) } @@ -95,11 +86,9 @@ func (*QueryContractInfoResponse) ProtoMessage() {} func (*QueryContractInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{1} } - func (m *QueryContractInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryContractInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryContractInfoResponse.Marshal(b, m, deterministic) @@ -112,15 +101,12 @@ func (m *QueryContractInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([ return b[:n], nil } } - func (m *QueryContractInfoResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryContractInfoResponse.Merge(m, src) } - func (m *QueryContractInfoResponse) XXX_Size() int { return m.Size() } - func (m *QueryContractInfoResponse) XXX_DiscardUnknown() { xxx_messageInfo_QueryContractInfoResponse.DiscardUnknown(m) } @@ -142,11 +128,9 @@ func (*QueryContractHistoryRequest) ProtoMessage() {} func (*QueryContractHistoryRequest) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{2} } - func (m *QueryContractHistoryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryContractHistoryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryContractHistoryRequest.Marshal(b, m, deterministic) @@ -159,15 +143,12 @@ func (m *QueryContractHistoryRequest) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } - func (m *QueryContractHistoryRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryContractHistoryRequest.Merge(m, src) } - func (m *QueryContractHistoryRequest) XXX_Size() int { return m.Size() } - func (m *QueryContractHistoryRequest) XXX_DiscardUnknown() { xxx_messageInfo_QueryContractHistoryRequest.DiscardUnknown(m) } @@ -188,11 +169,9 @@ func (*QueryContractHistoryResponse) ProtoMessage() {} func (*QueryContractHistoryResponse) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{3} } - func (m *QueryContractHistoryResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryContractHistoryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryContractHistoryResponse.Marshal(b, m, deterministic) @@ -205,15 +184,12 @@ func (m *QueryContractHistoryResponse) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } - func (m *QueryContractHistoryResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryContractHistoryResponse.Merge(m, src) } - func (m *QueryContractHistoryResponse) XXX_Size() int { return m.Size() } - func (m *QueryContractHistoryResponse) XXX_DiscardUnknown() { xxx_messageInfo_QueryContractHistoryResponse.DiscardUnknown(m) } @@ -234,11 +210,9 @@ func (*QueryContractsByCodeRequest) ProtoMessage() {} func (*QueryContractsByCodeRequest) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{4} } - func (m *QueryContractsByCodeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryContractsByCodeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryContractsByCodeRequest.Marshal(b, m, deterministic) @@ -251,15 +225,12 @@ func (m *QueryContractsByCodeRequest) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } - func (m *QueryContractsByCodeRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryContractsByCodeRequest.Merge(m, src) } - func (m *QueryContractsByCodeRequest) XXX_Size() int { return m.Size() } - func (m *QueryContractsByCodeRequest) XXX_DiscardUnknown() { xxx_messageInfo_QueryContractsByCodeRequest.DiscardUnknown(m) } @@ -281,11 +252,9 @@ func (*QueryContractsByCodeResponse) ProtoMessage() {} func (*QueryContractsByCodeResponse) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{5} } - func (m *QueryContractsByCodeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryContractsByCodeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryContractsByCodeResponse.Marshal(b, m, deterministic) @@ -298,15 +267,12 @@ func (m *QueryContractsByCodeResponse) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } - func (m *QueryContractsByCodeResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryContractsByCodeResponse.Merge(m, src) } - func (m *QueryContractsByCodeResponse) XXX_Size() int { return m.Size() } - func (m *QueryContractsByCodeResponse) XXX_DiscardUnknown() { xxx_messageInfo_QueryContractsByCodeResponse.DiscardUnknown(m) } @@ -328,11 +294,9 @@ func (*QueryAllContractStateRequest) ProtoMessage() {} func (*QueryAllContractStateRequest) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{6} } - func (m *QueryAllContractStateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryAllContractStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryAllContractStateRequest.Marshal(b, m, deterministic) @@ -345,15 +309,12 @@ func (m *QueryAllContractStateRequest) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } - func (m *QueryAllContractStateRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryAllContractStateRequest.Merge(m, src) } - func (m *QueryAllContractStateRequest) XXX_Size() int { return m.Size() } - func (m *QueryAllContractStateRequest) XXX_DiscardUnknown() { xxx_messageInfo_QueryAllContractStateRequest.DiscardUnknown(m) } @@ -374,11 +335,9 @@ func (*QueryAllContractStateResponse) ProtoMessage() {} func (*QueryAllContractStateResponse) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{7} } - func (m *QueryAllContractStateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryAllContractStateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryAllContractStateResponse.Marshal(b, m, deterministic) @@ -391,15 +350,12 @@ func (m *QueryAllContractStateResponse) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } - func (m *QueryAllContractStateResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryAllContractStateResponse.Merge(m, src) } - func (m *QueryAllContractStateResponse) XXX_Size() int { return m.Size() } - func (m *QueryAllContractStateResponse) XXX_DiscardUnknown() { xxx_messageInfo_QueryAllContractStateResponse.DiscardUnknown(m) } @@ -420,11 +376,9 @@ func (*QueryRawContractStateRequest) ProtoMessage() {} func (*QueryRawContractStateRequest) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{8} } - func (m *QueryRawContractStateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryRawContractStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryRawContractStateRequest.Marshal(b, m, deterministic) @@ -437,15 +391,12 @@ func (m *QueryRawContractStateRequest) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } - func (m *QueryRawContractStateRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryRawContractStateRequest.Merge(m, src) } - func (m *QueryRawContractStateRequest) XXX_Size() int { return m.Size() } - func (m *QueryRawContractStateRequest) XXX_DiscardUnknown() { xxx_messageInfo_QueryRawContractStateRequest.DiscardUnknown(m) } @@ -465,11 +416,9 @@ func (*QueryRawContractStateResponse) ProtoMessage() {} func (*QueryRawContractStateResponse) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{9} } - func (m *QueryRawContractStateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryRawContractStateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryRawContractStateResponse.Marshal(b, m, deterministic) @@ -482,15 +431,12 @@ func (m *QueryRawContractStateResponse) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } - func (m *QueryRawContractStateResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryRawContractStateResponse.Merge(m, src) } - func (m *QueryRawContractStateResponse) XXX_Size() int { return m.Size() } - func (m *QueryRawContractStateResponse) XXX_DiscardUnknown() { xxx_messageInfo_QueryRawContractStateResponse.DiscardUnknown(m) } @@ -512,11 +458,9 @@ func (*QuerySmartContractStateRequest) ProtoMessage() {} func (*QuerySmartContractStateRequest) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{10} } - func (m *QuerySmartContractStateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QuerySmartContractStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QuerySmartContractStateRequest.Marshal(b, m, deterministic) @@ -529,15 +473,12 @@ func (m *QuerySmartContractStateRequest) XXX_Marshal(b []byte, deterministic boo return b[:n], nil } } - func (m *QuerySmartContractStateRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_QuerySmartContractStateRequest.Merge(m, src) } - func (m *QuerySmartContractStateRequest) XXX_Size() int { return m.Size() } - func (m *QuerySmartContractStateRequest) XXX_DiscardUnknown() { xxx_messageInfo_QuerySmartContractStateRequest.DiscardUnknown(m) } @@ -557,11 +498,9 @@ func (*QuerySmartContractStateResponse) ProtoMessage() {} func (*QuerySmartContractStateResponse) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{11} } - func (m *QuerySmartContractStateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QuerySmartContractStateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QuerySmartContractStateResponse.Marshal(b, m, deterministic) @@ -574,15 +513,12 @@ func (m *QuerySmartContractStateResponse) XXX_Marshal(b []byte, deterministic bo return b[:n], nil } } - func (m *QuerySmartContractStateResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_QuerySmartContractStateResponse.Merge(m, src) } - func (m *QuerySmartContractStateResponse) XXX_Size() int { return m.Size() } - func (m *QuerySmartContractStateResponse) XXX_DiscardUnknown() { xxx_messageInfo_QuerySmartContractStateResponse.DiscardUnknown(m) } @@ -600,11 +536,9 @@ func (*QueryCodeRequest) ProtoMessage() {} func (*QueryCodeRequest) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{12} } - func (m *QueryCodeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryCodeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryCodeRequest.Marshal(b, m, deterministic) @@ -617,15 +551,12 @@ func (m *QueryCodeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } - func (m *QueryCodeRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryCodeRequest.Merge(m, src) } - func (m *QueryCodeRequest) XXX_Size() int { return m.Size() } - func (m *QueryCodeRequest) XXX_DiscardUnknown() { xxx_messageInfo_QueryCodeRequest.DiscardUnknown(m) } @@ -634,10 +565,10 @@ var xxx_messageInfo_QueryCodeRequest proto.InternalMessageInfo // CodeInfoResponse contains code meta data from CodeInfo type CodeInfoResponse struct { - CodeID uint64 `protobuf:"varint,1,opt,name=code_id,json=codeId,proto3" json:"id"` - Creator string `protobuf:"bytes,2,opt,name=creator,proto3" json:"creator,omitempty"` - DataHash github_com_tendermint_tendermint_libs_bytes.HexBytes `protobuf:"bytes,3,opt,name=data_hash,json=dataHash,proto3,casttype=github.com/tendermint/tendermint/libs/bytes.HexBytes" json:"data_hash,omitempty"` - InstantiatePermission AccessConfig `protobuf:"bytes,6,opt,name=instantiate_permission,json=instantiatePermission,proto3" json:"instantiate_permission"` + CodeID uint64 `protobuf:"varint,1,opt,name=code_id,json=codeId,proto3" json:"id"` + Creator string `protobuf:"bytes,2,opt,name=creator,proto3" json:"creator,omitempty"` + DataHash github_com_line_ostracon_libs_bytes.HexBytes `protobuf:"bytes,3,opt,name=data_hash,json=dataHash,proto3,casttype=github.com/line/ostracon/libs/bytes.HexBytes" json:"data_hash,omitempty"` + InstantiatePermission AccessConfig `protobuf:"bytes,6,opt,name=instantiate_permission,json=instantiatePermission,proto3" json:"instantiate_permission"` } func (m *CodeInfoResponse) Reset() { *m = CodeInfoResponse{} } @@ -646,11 +577,9 @@ func (*CodeInfoResponse) ProtoMessage() {} func (*CodeInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{13} } - func (m *CodeInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *CodeInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_CodeInfoResponse.Marshal(b, m, deterministic) @@ -663,15 +592,12 @@ func (m *CodeInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } - func (m *CodeInfoResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_CodeInfoResponse.Merge(m, src) } - func (m *CodeInfoResponse) XXX_Size() int { return m.Size() } - func (m *CodeInfoResponse) XXX_DiscardUnknown() { xxx_messageInfo_CodeInfoResponse.DiscardUnknown(m) } @@ -690,11 +616,9 @@ func (*QueryCodeResponse) ProtoMessage() {} func (*QueryCodeResponse) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{14} } - func (m *QueryCodeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryCodeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryCodeResponse.Marshal(b, m, deterministic) @@ -707,15 +631,12 @@ func (m *QueryCodeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } - func (m *QueryCodeResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryCodeResponse.Merge(m, src) } - func (m *QueryCodeResponse) XXX_Size() int { return m.Size() } - func (m *QueryCodeResponse) XXX_DiscardUnknown() { xxx_messageInfo_QueryCodeResponse.DiscardUnknown(m) } @@ -734,11 +655,9 @@ func (*QueryCodesRequest) ProtoMessage() {} func (*QueryCodesRequest) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{15} } - func (m *QueryCodesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryCodesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryCodesRequest.Marshal(b, m, deterministic) @@ -751,15 +670,12 @@ func (m *QueryCodesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } - func (m *QueryCodesRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryCodesRequest.Merge(m, src) } - func (m *QueryCodesRequest) XXX_Size() int { return m.Size() } - func (m *QueryCodesRequest) XXX_DiscardUnknown() { xxx_messageInfo_QueryCodesRequest.DiscardUnknown(m) } @@ -779,11 +695,9 @@ func (*QueryCodesResponse) ProtoMessage() {} func (*QueryCodesResponse) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{16} } - func (m *QueryCodesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryCodesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryCodesResponse.Marshal(b, m, deterministic) @@ -796,15 +710,12 @@ func (m *QueryCodesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } - func (m *QueryCodesResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryCodesResponse.Merge(m, src) } - func (m *QueryCodesResponse) XXX_Size() int { return m.Size() } - func (m *QueryCodesResponse) XXX_DiscardUnknown() { xxx_messageInfo_QueryCodesResponse.DiscardUnknown(m) } @@ -824,11 +735,9 @@ func (*QueryPinnedCodesRequest) ProtoMessage() {} func (*QueryPinnedCodesRequest) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{17} } - func (m *QueryPinnedCodesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryPinnedCodesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryPinnedCodesRequest.Marshal(b, m, deterministic) @@ -841,15 +750,12 @@ func (m *QueryPinnedCodesRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } - func (m *QueryPinnedCodesRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryPinnedCodesRequest.Merge(m, src) } - func (m *QueryPinnedCodesRequest) XXX_Size() int { return m.Size() } - func (m *QueryPinnedCodesRequest) XXX_DiscardUnknown() { xxx_messageInfo_QueryPinnedCodesRequest.DiscardUnknown(m) } @@ -870,11 +776,9 @@ func (*QueryPinnedCodesResponse) ProtoMessage() {} func (*QueryPinnedCodesResponse) Descriptor() ([]byte, []int) { return fileDescriptor_9677c207036b9f2b, []int{18} } - func (m *QueryPinnedCodesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *QueryPinnedCodesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_QueryPinnedCodesResponse.Marshal(b, m, deterministic) @@ -887,15 +791,12 @@ func (m *QueryPinnedCodesResponse) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } - func (m *QueryPinnedCodesResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryPinnedCodesResponse.Merge(m, src) } - func (m *QueryPinnedCodesResponse) XXX_Size() int { return m.Size() } - func (m *QueryPinnedCodesResponse) XXX_DiscardUnknown() { xxx_messageInfo_QueryPinnedCodesResponse.DiscardUnknown(m) } @@ -927,82 +828,82 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/query.proto", fileDescriptor_9677c207036b9f2b) } var fileDescriptor_9677c207036b9f2b = []byte{ - // 1191 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x97, 0xcf, 0x4f, 0x24, 0x45, - 0x14, 0xc7, 0xa7, 0xd8, 0x61, 0x7e, 0x14, 0x98, 0x1d, 0x2b, 0x0a, 0xe3, 0xc8, 0x76, 0x93, 0x76, - 0x83, 0x2c, 0x8b, 0xdd, 0xc2, 0x42, 0x56, 0x4d, 0x8c, 0xd9, 0x61, 0x75, 0x81, 0x84, 0x84, 0xed, - 0x8d, 0xd9, 0xc4, 0x3d, 0x90, 0x9a, 0xe9, 0x62, 0xe8, 0x84, 0xe9, 0x1a, 0xba, 0x0a, 0xd8, 0x09, - 0x41, 0xcd, 0x26, 0x1e, 0x4c, 0x8c, 0x9a, 0x18, 0x8f, 0x46, 0x0f, 0x66, 0xf5, 0xac, 0x37, 0xff, - 0x02, 0x8e, 0x24, 0x5e, 0x3c, 0x4d, 0x74, 0xf0, 0x60, 0xf8, 0x13, 0xf6, 0x64, 0xaa, 0xba, 0x7a, - 0xe8, 0xf9, 0xd1, 0xcc, 0xb0, 0x21, 0x7b, 0x21, 0xdd, 0xd4, 0xab, 0x57, 0x9f, 0xf7, 0xed, 0x57, - 0xef, 0xbd, 0x81, 0x13, 0x65, 0xca, 0xaa, 0xfb, 0x98, 0x55, 0x2d, 0xf9, 0x67, 0x6f, 0xce, 0xda, - 0xd9, 0x25, 0x7e, 0xdd, 0xac, 0xf9, 0x94, 0x53, 0x94, 0x0b, 0x57, 0x4d, 0xf9, 0x67, 0x6f, 0xae, - 0xf0, 0x4a, 0x85, 0x56, 0xa8, 0x5c, 0xb4, 0xc4, 0x53, 0x60, 0x57, 0xe8, 0xf6, 0xc2, 0xeb, 0x35, - 0xc2, 0xc2, 0xd5, 0x0a, 0xa5, 0x95, 0x6d, 0x62, 0xe1, 0x9a, 0x6b, 0x61, 0xcf, 0xa3, 0x1c, 0x73, - 0x97, 0x7a, 0xe1, 0xea, 0x8c, 0xd8, 0x4b, 0x99, 0x55, 0xc2, 0x8c, 0x04, 0x87, 0x5b, 0x7b, 0x73, - 0x25, 0xc2, 0xf1, 0x9c, 0x55, 0xc3, 0x15, 0xd7, 0x93, 0xc6, 0x81, 0xad, 0xb1, 0x00, 0xf3, 0xf7, - 0x85, 0xc5, 0x12, 0xf5, 0xb8, 0x8f, 0xcb, 0x7c, 0xc5, 0xdb, 0xa4, 0x36, 0xd9, 0xd9, 0x25, 0x8c, - 0xa3, 0x3c, 0x4c, 0x63, 0xc7, 0xf1, 0x09, 0x63, 0x79, 0x30, 0x09, 0xa6, 0xb3, 0x76, 0xf8, 0x6a, - 0x7c, 0x0d, 0xe0, 0x6b, 0x3d, 0xb6, 0xb1, 0x1a, 0xf5, 0x18, 0x89, 0xdf, 0x87, 0xee, 0xc3, 0x97, - 0xca, 0x6a, 0xc7, 0x86, 0xeb, 0x6d, 0xd2, 0xfc, 0xd0, 0x24, 0x98, 0x1e, 0x99, 0xd7, 0xcc, 0x4e, - 0x55, 0xcc, 0xa8, 0xe3, 0xe2, 0xe8, 0x51, 0x43, 0x4f, 0x1c, 0x37, 0x74, 0x70, 0xda, 0xd0, 0x13, - 0xf6, 0x68, 0x39, 0xb2, 0xf6, 0x5e, 0xf2, 0xbf, 0x9f, 0x74, 0x60, 0x7c, 0x06, 0x5f, 0x6f, 0xe3, - 0x59, 0x76, 0x19, 0xa7, 0x7e, 0xbd, 0x6f, 0x24, 0xe8, 0x23, 0x08, 0xcf, 0x34, 0x51, 0x38, 0x53, - 0x66, 0x20, 0xa0, 0x29, 0x04, 0x34, 0x83, 0xaf, 0xa7, 0x04, 0x34, 0xd7, 0x71, 0x85, 0x28, 0xaf, - 0x76, 0x64, 0xa7, 0xf1, 0x3b, 0x80, 0x13, 0xbd, 0x09, 0x94, 0x28, 0xab, 0x30, 0x4d, 0x3c, 0xee, - 0xbb, 0x44, 0x20, 0x5c, 0x99, 0x1e, 0x99, 0x9f, 0x89, 0x0f, 0x7a, 0x89, 0x3a, 0x44, 0xed, 0xff, - 0xd0, 0xe3, 0x7e, 0xbd, 0x98, 0x14, 0x02, 0xd8, 0xa1, 0x03, 0x74, 0xaf, 0x07, 0xf4, 0x9b, 0x7d, - 0xa1, 0x03, 0x90, 0x36, 0xea, 0x4f, 0x3b, 0x64, 0x63, 0xc5, 0xba, 0x38, 0x3b, 0x94, 0x6d, 0x1c, - 0xa6, 0xcb, 0xd4, 0x21, 0x1b, 0xae, 0x23, 0x65, 0x4b, 0xda, 0x29, 0xf1, 0xba, 0xe2, 0x5c, 0x9a, - 0x6a, 0x5f, 0x74, 0xaa, 0xd6, 0x02, 0x50, 0xaa, 0x4d, 0xc0, 0x6c, 0xf8, 0xb5, 0x03, 0xdd, 0xb2, - 0xf6, 0xd9, 0x3f, 0x2e, 0x4f, 0x87, 0xcf, 0x43, 0x8e, 0x3b, 0xdb, 0xdb, 0x21, 0xca, 0x03, 0x8e, - 0x39, 0x79, 0x71, 0x09, 0xf4, 0x23, 0x80, 0xd7, 0x62, 0x10, 0x94, 0x16, 0x8b, 0x30, 0x55, 0xa5, - 0x0e, 0xd9, 0x0e, 0x13, 0x68, 0xbc, 0x3b, 0x81, 0xd6, 0xc4, 0xba, 0xca, 0x16, 0x65, 0x7c, 0x79, - 0x22, 0x3d, 0x54, 0x1a, 0xd9, 0x78, 0xff, 0x82, 0x1a, 0x5d, 0x83, 0x50, 0x9e, 0xb1, 0xe1, 0x60, - 0x8e, 0x25, 0xc2, 0xa8, 0x9d, 0x95, 0xff, 0xb9, 0x8b, 0x39, 0x36, 0x6e, 0xa9, 0xc8, 0xbb, 0x1d, - 0xab, 0xc8, 0x11, 0x4c, 0xca, 0x9d, 0x40, 0xee, 0x94, 0xcf, 0xc6, 0x0e, 0xd4, 0xe4, 0xa6, 0x07, - 0x55, 0xec, 0xf3, 0x0b, 0xf2, 0x2c, 0x76, 0xf3, 0x14, 0xc7, 0x9e, 0x35, 0x74, 0x14, 0x21, 0x58, - 0x23, 0x8c, 0x09, 0x25, 0x22, 0x9c, 0x6b, 0x50, 0x8f, 0x3d, 0x52, 0x91, 0xce, 0x44, 0x49, 0x63, - 0x7d, 0x06, 0x11, 0xdc, 0x84, 0x39, 0x95, 0xfb, 0xfd, 0x6f, 0x9c, 0xf1, 0xc3, 0x10, 0xcc, 0x09, - 0xc3, 0xb6, 0x42, 0x7b, 0xa3, 0xc3, 0xba, 0x98, 0x6b, 0x36, 0xf4, 0x94, 0x34, 0xbb, 0x7b, 0xda, - 0xd0, 0x87, 0x5c, 0xa7, 0x75, 0x63, 0xf3, 0x30, 0x5d, 0xf6, 0x09, 0xe6, 0xd4, 0x97, 0xf1, 0x66, - 0xed, 0xf0, 0x15, 0x7d, 0x0c, 0xb3, 0x02, 0x67, 0x63, 0x0b, 0xb3, 0xad, 0xfc, 0x15, 0xc9, 0xfd, - 0xce, 0xb3, 0x86, 0xbe, 0x50, 0x71, 0xf9, 0xd6, 0x6e, 0xc9, 0x2c, 0xd3, 0xaa, 0xc5, 0x89, 0xe7, - 0x10, 0xbf, 0xea, 0x7a, 0x3c, 0xfa, 0xb8, 0xed, 0x96, 0x98, 0x55, 0xaa, 0x73, 0xc2, 0xcc, 0x65, - 0xf2, 0xb8, 0x28, 0x1e, 0xec, 0x8c, 0x70, 0xb5, 0x8c, 0xd9, 0x16, 0x7a, 0x04, 0xc7, 0x5c, 0x8f, - 0x71, 0xec, 0x71, 0x17, 0x73, 0xb2, 0x51, 0x13, 0x9b, 0x18, 0x13, 0x29, 0x98, 0x8a, 0xab, 0xf9, - 0x77, 0xca, 0x65, 0xc2, 0xd8, 0x12, 0xf5, 0x36, 0xdd, 0x8a, 0x4a, 0xe2, 0x57, 0x23, 0x3e, 0xd6, - 0x5b, 0x2e, 0x82, 0xa2, 0xbf, 0x9a, 0xcc, 0x24, 0x73, 0xc3, 0xab, 0xc9, 0xcc, 0x70, 0x2e, 0x65, - 0x3c, 0x01, 0xf0, 0xe5, 0x88, 0x9a, 0x4a, 0xa0, 0x15, 0x51, 0x3e, 0x84, 0x40, 0xa2, 0xd7, 0x00, - 0x79, 0xae, 0xd1, 0xab, 0xec, 0xb6, 0xeb, 0x5a, 0xcc, 0xb4, 0x7a, 0x4d, 0xa6, 0xac, 0xd6, 0xd0, - 0x84, 0xfa, 0xb2, 0x41, 0xb6, 0x64, 0x4e, 0x1b, 0xba, 0x7c, 0x0f, 0xbe, 0xa5, 0xea, 0x42, 0x8f, - 0x22, 0x0c, 0x2c, 0xfc, 0xa4, 0xed, 0x05, 0x02, 0x3c, 0x77, 0x81, 0x78, 0x0a, 0x20, 0x8a, 0x7a, - 0x57, 0x21, 0xde, 0x83, 0xb0, 0x15, 0x62, 0x58, 0x19, 0x06, 0x89, 0x31, 0xd0, 0x37, 0x1b, 0xc6, - 0x77, 0x89, 0x75, 0x02, 0xc3, 0x71, 0xc9, 0xb9, 0xee, 0x7a, 0x1e, 0x71, 0xce, 0xd1, 0xe2, 0xf9, - 0x8b, 0xe5, 0x37, 0x40, 0x8d, 0x2d, 0x6d, 0x67, 0xb4, 0xee, 0x60, 0x46, 0xdd, 0x8a, 0x40, 0x8f, - 0x64, 0xf1, 0xaa, 0x88, 0xb5, 0xd9, 0xd0, 0xd3, 0xc1, 0xd5, 0x60, 0x76, 0x3a, 0xb8, 0x15, 0x97, - 0x17, 0xf4, 0xfc, 0x97, 0x23, 0x70, 0x58, 0x12, 0xa1, 0xef, 0x01, 0x1c, 0x8d, 0x4e, 0x2f, 0xa8, - 0x47, 0xa3, 0x8f, 0x1b, 0xb9, 0x0a, 0x37, 0x07, 0xb2, 0x0d, 0xce, 0x37, 0x66, 0x9f, 0xfc, 0xf9, - 0xef, 0x77, 0x43, 0x53, 0xe8, 0xba, 0xd5, 0x35, 0x2c, 0x86, 0x3d, 0xd2, 0x3a, 0x50, 0x35, 0xef, - 0x10, 0x3d, 0x05, 0xf0, 0x6a, 0xc7, 0x70, 0x82, 0xde, 0xea, 0x73, 0x5c, 0xfb, 0x18, 0x55, 0x30, - 0x07, 0x35, 0x57, 0x80, 0x0b, 0x12, 0xd0, 0x44, 0xb3, 0x83, 0x00, 0x5a, 0x5b, 0x0a, 0xea, 0xe7, - 0x08, 0xa8, 0x9a, 0x07, 0xfa, 0x82, 0xb6, 0x0f, 0x2e, 0x7d, 0x41, 0x3b, 0xc6, 0x0c, 0x63, 0x5e, - 0x82, 0xce, 0xa2, 0x99, 0x5e, 0xa0, 0x0e, 0xb1, 0x0e, 0x54, 0x42, 0x1d, 0x5a, 0x67, 0xc3, 0xc7, - 0x2f, 0x00, 0xe6, 0x3a, 0x7b, 0x35, 0x8a, 0x3b, 0x38, 0x66, 0xae, 0x28, 0x58, 0x03, 0xdb, 0x0f, - 0x42, 0xda, 0x25, 0x29, 0x93, 0x50, 0xbf, 0x01, 0x98, 0xeb, 0xec, 0xad, 0xb1, 0xa4, 0x31, 0xdd, - 0x3d, 0x96, 0x34, 0xae, 0x69, 0x1b, 0xef, 0x4b, 0xd2, 0xdb, 0x68, 0x71, 0x20, 0x52, 0x1f, 0xef, - 0x5b, 0x07, 0x67, 0x4d, 0xf9, 0x10, 0xfd, 0x01, 0x20, 0xea, 0x6e, 0xb4, 0xe8, 0xed, 0x18, 0x8c, - 0xd8, 0x31, 0xa0, 0x30, 0x77, 0x81, 0x1d, 0x0a, 0xfd, 0x03, 0x89, 0xfe, 0x2e, 0xba, 0x3d, 0x98, - 0xc8, 0xc2, 0x51, 0x3b, 0x7c, 0x1d, 0x26, 0x65, 0xda, 0x1a, 0xb1, 0x79, 0x78, 0x96, 0xab, 0x6f, - 0x9c, 0x6b, 0xa3, 0x88, 0xa6, 0x25, 0x91, 0x81, 0x26, 0xfb, 0x25, 0x28, 0xf2, 0xe1, 0xb0, 0x2c, - 0x87, 0xe8, 0x3c, 0xbf, 0x61, 0x41, 0x2e, 0x5c, 0x3f, 0xdf, 0x48, 0x9d, 0xae, 0xc9, 0xd3, 0xf3, - 0x68, 0xac, 0xf7, 0xe9, 0xe8, 0x2b, 0x00, 0x47, 0x22, 0x95, 0x18, 0xdd, 0x88, 0xf1, 0xda, 0xdd, - 0x11, 0x0a, 0x33, 0x83, 0x98, 0x2a, 0x8c, 0x29, 0x89, 0x31, 0x89, 0xb4, 0xde, 0x18, 0xcc, 0xaa, - 0xc9, 0x4d, 0xc5, 0xe5, 0xa3, 0x7f, 0xb4, 0xc4, 0xaf, 0x4d, 0x2d, 0x71, 0xd4, 0xd4, 0xc0, 0x71, - 0x53, 0x03, 0x7f, 0x37, 0x35, 0xf0, 0xed, 0x89, 0x96, 0x38, 0x3e, 0xd1, 0x12, 0x7f, 0x9d, 0x68, - 0x89, 0x4f, 0xa6, 0x22, 0xc3, 0xcd, 0x12, 0x65, 0xd5, 0x87, 0xa1, 0x2f, 0xc7, 0x7a, 0x1c, 0xf8, - 0x94, 0xbf, 0xb6, 0x4b, 0x29, 0xf9, 0x23, 0xf9, 0xd6, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe8, - 0x7b, 0x25, 0x05, 0xd4, 0x0f, 0x00, 0x00, + // 1188 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x97, 0x4f, 0x6f, 0x1b, 0xc5, + 0x1b, 0xc7, 0x3d, 0xa9, 0xe3, 0x3f, 0x93, 0xfc, 0x54, 0xff, 0x46, 0x90, 0x18, 0x93, 0xee, 0x46, + 0x4b, 0x15, 0xd2, 0x34, 0xec, 0x36, 0x69, 0xa3, 0x0a, 0x24, 0x84, 0xea, 0x04, 0x9a, 0x44, 0x8a, + 0x94, 0x6e, 0x0f, 0x48, 0xf4, 0x10, 0x8d, 0xbd, 0x13, 0x67, 0x25, 0x7b, 0xc7, 0xd9, 0x99, 0x24, + 0xb5, 0xa2, 0x00, 0xaa, 0xc4, 0x01, 0x09, 0x01, 0x12, 0xea, 0x19, 0x0e, 0xa8, 0x70, 0x86, 0x1b, + 0xaf, 0x20, 0xc7, 0x48, 0x5c, 0x38, 0x59, 0xe0, 0x70, 0x40, 0x79, 0x09, 0x3d, 0xa1, 0x99, 0x9d, + 0x75, 0xd6, 0x7f, 0x36, 0x76, 0xaa, 0x88, 0x8b, 0xe5, 0xf5, 0x3c, 0xf3, 0xcc, 0xe7, 0xf9, 0xee, + 0x33, 0xcf, 0xf3, 0x18, 0x4e, 0x95, 0x29, 0xab, 0x1d, 0x60, 0x56, 0xb3, 0xe4, 0xc7, 0xfe, 0x82, + 0xb5, 0xbb, 0x47, 0xfc, 0x86, 0x59, 0xf7, 0x29, 0xa7, 0x28, 0x17, 0xae, 0x9a, 0xf2, 0x63, 0x7f, + 0xa1, 0xf0, 0x5a, 0x85, 0x56, 0xa8, 0x5c, 0xb4, 0xc4, 0xb7, 0xc0, 0xae, 0xd0, 0xeb, 0x85, 0x37, + 0xea, 0x84, 0x85, 0xab, 0x15, 0x4a, 0x2b, 0x55, 0x62, 0xe1, 0xba, 0x6b, 0x61, 0xcf, 0xa3, 0x1c, + 0x73, 0x97, 0x7a, 0xe1, 0xea, 0x9c, 0xd8, 0x4b, 0x99, 0x55, 0xc2, 0x8c, 0x04, 0x87, 0x5b, 0xfb, + 0x0b, 0x25, 0xc2, 0xf1, 0x82, 0x55, 0xc7, 0x15, 0xd7, 0x93, 0xc6, 0x81, 0xad, 0x71, 0x0f, 0xe6, + 0x1f, 0x09, 0x8b, 0x65, 0xea, 0x71, 0x1f, 0x97, 0xf9, 0x9a, 0xb7, 0x4d, 0x6d, 0xb2, 0xbb, 0x47, + 0x18, 0x47, 0x79, 0x98, 0xc6, 0x8e, 0xe3, 0x13, 0xc6, 0xf2, 0x60, 0x1a, 0xcc, 0x66, 0xed, 0xf0, + 0xd1, 0xf8, 0x1a, 0xc0, 0x37, 0xfa, 0x6c, 0x63, 0x75, 0xea, 0x31, 0x12, 0xbf, 0x0f, 0x3d, 0x82, + 0xff, 0x2b, 0xab, 0x1d, 0x5b, 0xae, 0xb7, 0x4d, 0xf3, 0x23, 0xd3, 0x60, 0x76, 0x6c, 0x51, 0x33, + 0xbb, 0x55, 0x31, 0xa3, 0x8e, 0x8b, 0xe3, 0xc7, 0x4d, 0x3d, 0x71, 0xd2, 0xd4, 0xc1, 0x59, 0x53, + 0x4f, 0xd8, 0xe3, 0xe5, 0xc8, 0xda, 0x7b, 0xc9, 0x7f, 0x7e, 0xd0, 0x81, 0xf1, 0x19, 0x7c, 0xb3, + 0x83, 0x67, 0xd5, 0x65, 0x9c, 0xfa, 0x8d, 0x81, 0x91, 0xa0, 0x8f, 0x20, 0x3c, 0xd7, 0x44, 0xe1, + 0xcc, 0x98, 0x81, 0x80, 0xa6, 0x10, 0xd0, 0x0c, 0xde, 0x9e, 0x12, 0xd0, 0xdc, 0xc4, 0x15, 0xa2, + 0xbc, 0xda, 0x91, 0x9d, 0xc6, 0xaf, 0x00, 0x4e, 0xf5, 0x27, 0x50, 0xa2, 0xac, 0xc3, 0x34, 0xf1, + 0xb8, 0xef, 0x12, 0x81, 0x70, 0x6d, 0x76, 0x6c, 0x71, 0x2e, 0x3e, 0xe8, 0x65, 0xea, 0x10, 0xb5, + 0xff, 0x43, 0x8f, 0xfb, 0x8d, 0x62, 0x52, 0x08, 0x60, 0x87, 0x0e, 0xd0, 0xc3, 0x3e, 0xd0, 0x6f, + 0x0f, 0x84, 0x0e, 0x40, 0x3a, 0xa8, 0x3f, 0xed, 0x92, 0x8d, 0x15, 0x1b, 0xe2, 0xec, 0x50, 0xb6, + 0x49, 0x98, 0x2e, 0x53, 0x87, 0x6c, 0xb9, 0x8e, 0x94, 0x2d, 0x69, 0xa7, 0xc4, 0xe3, 0x9a, 0x73, + 0x65, 0xaa, 0x7d, 0xd1, 0xad, 0x5a, 0x1b, 0x40, 0xa9, 0x36, 0x05, 0xb3, 0xe1, 0xdb, 0x0e, 0x74, + 0xcb, 0xda, 0xe7, 0x3f, 0x5c, 0x9d, 0x0e, 0x9f, 0x87, 0x1c, 0x0f, 0xaa, 0xd5, 0x10, 0xe5, 0x31, + 0xc7, 0x9c, 0xfc, 0x77, 0x09, 0xf4, 0x3d, 0x80, 0x37, 0x62, 0x10, 0x94, 0x16, 0x4b, 0x30, 0x55, + 0xa3, 0x0e, 0xa9, 0x86, 0x09, 0x34, 0xd9, 0x9b, 0x40, 0x1b, 0x62, 0x5d, 0x65, 0x8b, 0x32, 0xbe, + 0x3a, 0x91, 0x3e, 0x56, 0x1a, 0xd9, 0xf8, 0xe0, 0x92, 0x1a, 0xdd, 0x80, 0x50, 0x9e, 0xb1, 0xe5, + 0x60, 0x8e, 0x25, 0xc2, 0xb8, 0x9d, 0x95, 0xbf, 0xac, 0x60, 0x8e, 0x8d, 0xbb, 0x2a, 0xf2, 0x5e, + 0xc7, 0x2a, 0x72, 0x04, 0x93, 0x72, 0x27, 0x90, 0x3b, 0xe5, 0x77, 0x63, 0x17, 0x6a, 0x72, 0xd3, + 0xe3, 0x1a, 0xf6, 0xf9, 0x25, 0x79, 0x96, 0x7a, 0x79, 0x8a, 0x13, 0x2f, 0x9b, 0x3a, 0x8a, 0x10, + 0x6c, 0x10, 0xc6, 0x84, 0x12, 0x11, 0xce, 0x0d, 0xa8, 0xc7, 0x1e, 0xa9, 0x48, 0xe7, 0xa2, 0xa4, + 0xb1, 0x3e, 0x83, 0x08, 0x6e, 0xc3, 0x9c, 0xca, 0xfd, 0xc1, 0x37, 0xce, 0x78, 0x3e, 0x02, 0x73, + 0xc2, 0xb0, 0xa3, 0xd0, 0xde, 0xea, 0xb2, 0x2e, 0xe6, 0x5a, 0x4d, 0x3d, 0x25, 0xcd, 0x56, 0xce, + 0x9a, 0xfa, 0x88, 0xeb, 0xb4, 0x6f, 0x6c, 0x1e, 0xa6, 0xcb, 0x3e, 0xc1, 0x9c, 0xfa, 0x32, 0xde, + 0xac, 0x1d, 0x3e, 0xa2, 0x0d, 0x98, 0x15, 0x38, 0x5b, 0x3b, 0x98, 0xed, 0xe4, 0xaf, 0x49, 0xee, + 0x3b, 0x2f, 0x9b, 0xfa, 0x7c, 0xc5, 0xe5, 0x3b, 0x7b, 0x25, 0xb3, 0x4c, 0x6b, 0x56, 0xd5, 0xf5, + 0x88, 0x45, 0x99, 0x88, 0x81, 0x7a, 0x56, 0xd5, 0x2d, 0x31, 0xab, 0xd4, 0xe0, 0x84, 0x99, 0xab, + 0xe4, 0x69, 0x51, 0x7c, 0xb1, 0x33, 0xc2, 0xc5, 0x2a, 0x66, 0x3b, 0xe8, 0x09, 0x9c, 0x70, 0x3d, + 0xc6, 0xb1, 0xc7, 0x5d, 0xcc, 0xc9, 0x56, 0x9d, 0xf8, 0x35, 0x97, 0x31, 0x91, 0x7a, 0xa9, 0xb8, + 0x5a, 0xff, 0xa0, 0x5c, 0x26, 0x8c, 0x2d, 0x53, 0x6f, 0xdb, 0xad, 0xa8, 0xe4, 0x7d, 0x3d, 0xe2, + 0x63, 0xb3, 0xed, 0x22, 0x28, 0xf6, 0xeb, 0xc9, 0x4c, 0x32, 0x37, 0xba, 0x9e, 0xcc, 0x8c, 0xe6, + 0x52, 0xc6, 0x33, 0x00, 0xff, 0x1f, 0x51, 0x51, 0x09, 0xb3, 0x26, 0xca, 0x86, 0x10, 0x46, 0xf4, + 0x18, 0x20, 0xcf, 0x35, 0xfa, 0x95, 0xdb, 0x4e, 0x3d, 0x8b, 0x99, 0x76, 0x8f, 0xc9, 0x94, 0xd5, + 0x1a, 0x9a, 0x52, 0x6f, 0x34, 0xc8, 0x92, 0xcc, 0x59, 0x53, 0x97, 0xcf, 0xc1, 0x3b, 0x54, 0xdd, + 0xe7, 0x49, 0x84, 0x81, 0x85, 0xaf, 0xb2, 0xb3, 0x30, 0x80, 0x57, 0x2e, 0x0c, 0x2f, 0x00, 0x44, + 0x51, 0xef, 0x2a, 0xc4, 0x87, 0x10, 0xb6, 0x43, 0x0c, 0x2b, 0xc2, 0x30, 0x31, 0x06, 0xfa, 0x66, + 0xc3, 0xf8, 0xae, 0xb0, 0x3e, 0x60, 0x38, 0x29, 0x39, 0x37, 0x5d, 0xcf, 0x23, 0xce, 0x05, 0x5a, + 0xbc, 0x7a, 0x91, 0xfc, 0x06, 0xa8, 0x71, 0xa5, 0xe3, 0x8c, 0xf6, 0xdd, 0xcb, 0xa8, 0xdb, 0x10, + 0xe8, 0x91, 0x2c, 0x5e, 0x17, 0xb1, 0xb6, 0x9a, 0x7a, 0x3a, 0xb8, 0x12, 0xcc, 0x4e, 0x07, 0xb7, + 0xe1, 0xea, 0x82, 0x5e, 0xfc, 0x72, 0x0c, 0x8e, 0x4a, 0x22, 0xf4, 0x1c, 0xc0, 0xf1, 0xe8, 0xd4, + 0x82, 0xfa, 0x34, 0xf8, 0xb8, 0x51, 0xab, 0x70, 0x7b, 0x28, 0xdb, 0xe0, 0x7c, 0x63, 0xfe, 0xd9, + 0xef, 0x7f, 0x7f, 0x37, 0x32, 0x83, 0x6e, 0x5a, 0x3d, 0x43, 0x62, 0xd8, 0x1b, 0xad, 0x43, 0x55, + 0xeb, 0x8e, 0xd0, 0x0b, 0x00, 0xaf, 0x77, 0x0d, 0x25, 0xe8, 0x9d, 0x01, 0xc7, 0x75, 0x8e, 0x4f, + 0x05, 0x73, 0x58, 0x73, 0x05, 0x78, 0x4f, 0x02, 0x9a, 0x68, 0x7e, 0x18, 0x40, 0x6b, 0x47, 0x41, + 0xfd, 0x18, 0x01, 0x55, 0x73, 0xc0, 0x40, 0xd0, 0xce, 0x81, 0x65, 0x20, 0x68, 0xd7, 0x78, 0x61, + 0x2c, 0x4a, 0xd0, 0x79, 0x34, 0xd7, 0x0f, 0xd4, 0x21, 0xd6, 0xa1, 0x4a, 0xa8, 0x23, 0xeb, 0x7c, + 0xe8, 0xf8, 0x09, 0xc0, 0x5c, 0x77, 0x8f, 0x46, 0x71, 0x07, 0xc7, 0xcc, 0x13, 0x05, 0x6b, 0x68, + 0xfb, 0x61, 0x48, 0x7b, 0x24, 0x65, 0x12, 0xea, 0x17, 0x00, 0x73, 0xdd, 0x3d, 0x35, 0x96, 0x34, + 0xa6, 0xab, 0xc7, 0x92, 0xc6, 0x35, 0x6b, 0xe3, 0x7d, 0x49, 0x7a, 0x1f, 0x2d, 0x0d, 0x45, 0xea, + 0xe3, 0x03, 0xeb, 0xf0, 0xbc, 0x19, 0x1f, 0xa1, 0xdf, 0x00, 0x44, 0xbd, 0x0d, 0x16, 0xdd, 0x89, + 0xc1, 0x88, 0x6d, 0xff, 0x85, 0x85, 0x4b, 0xec, 0x50, 0xe8, 0x1f, 0x48, 0xf4, 0x77, 0xd1, 0xfd, + 0xe1, 0x44, 0x16, 0x8e, 0x3a, 0xe1, 0x1b, 0x30, 0x29, 0xd3, 0xd6, 0x88, 0xcd, 0xc3, 0xf3, 0x5c, + 0x7d, 0xeb, 0x42, 0x1b, 0x45, 0x34, 0x2b, 0x89, 0x0c, 0x34, 0x3d, 0x28, 0x41, 0x91, 0x0f, 0x47, + 0x65, 0x39, 0x44, 0x17, 0xf9, 0x0d, 0x0b, 0x72, 0xe1, 0xe6, 0xc5, 0x46, 0xea, 0x74, 0x4d, 0x9e, + 0x9e, 0x47, 0x13, 0xfd, 0x4f, 0x47, 0x5f, 0x01, 0x38, 0x16, 0xa9, 0xc4, 0xe8, 0x56, 0x8c, 0xd7, + 0xde, 0x8e, 0x50, 0x98, 0x1b, 0xc6, 0x54, 0x61, 0xcc, 0x48, 0x8c, 0x69, 0xa4, 0xf5, 0xc7, 0x60, + 0x56, 0x5d, 0x6e, 0x2a, 0xae, 0x1c, 0xff, 0xa5, 0x25, 0x7e, 0x6e, 0x69, 0x89, 0xe3, 0x96, 0x06, + 0x4e, 0x5a, 0x1a, 0xf8, 0xb3, 0xa5, 0x81, 0x6f, 0x4f, 0xb5, 0xc4, 0xc9, 0xa9, 0x96, 0xf8, 0xe3, + 0x54, 0x4b, 0x7c, 0x62, 0x74, 0x0f, 0x35, 0xc2, 0x8f, 0x63, 0x3d, 0x0d, 0xfc, 0xc9, 0x7f, 0xd8, + 0xa5, 0x94, 0xfc, 0x63, 0x7c, 0xf7, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3a, 0x66, 0x16, 0x91, + 0xc8, 0x0f, 0x00, 0x00, } func (this *QueryContractInfoResponse) Equal(that interface{}) bool { @@ -1032,7 +933,6 @@ func (this *QueryContractInfoResponse) Equal(that interface{}) bool { } return true } - func (this *CodeInfoResponse) Equal(that interface{}) bool { if that == nil { return this == nil @@ -1066,7 +966,6 @@ func (this *CodeInfoResponse) Equal(that interface{}) bool { } return true } - func (this *QueryCodeResponse) Equal(that interface{}) bool { if that == nil { return this == nil @@ -1239,40 +1138,33 @@ type QueryServer interface { } // UnimplementedQueryServer can be embedded to have forward compatible implementations. -type UnimplementedQueryServer struct{} +type UnimplementedQueryServer struct { +} func (*UnimplementedQueryServer) ContractInfo(ctx context.Context, req *QueryContractInfoRequest) (*QueryContractInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ContractInfo not implemented") } - func (*UnimplementedQueryServer) ContractHistory(ctx context.Context, req *QueryContractHistoryRequest) (*QueryContractHistoryResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ContractHistory not implemented") } - func (*UnimplementedQueryServer) ContractsByCode(ctx context.Context, req *QueryContractsByCodeRequest) (*QueryContractsByCodeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ContractsByCode not implemented") } - func (*UnimplementedQueryServer) AllContractState(ctx context.Context, req *QueryAllContractStateRequest) (*QueryAllContractStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AllContractState not implemented") } - func (*UnimplementedQueryServer) RawContractState(ctx context.Context, req *QueryRawContractStateRequest) (*QueryRawContractStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RawContractState not implemented") } - func (*UnimplementedQueryServer) SmartContractState(ctx context.Context, req *QuerySmartContractStateRequest) (*QuerySmartContractStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SmartContractState not implemented") } - func (*UnimplementedQueryServer) Code(ctx context.Context, req *QueryCodeRequest) (*QueryCodeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Code not implemented") } - func (*UnimplementedQueryServer) Codes(ctx context.Context, req *QueryCodesRequest) (*QueryCodesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Codes not implemented") } - func (*UnimplementedQueryServer) PinnedCodes(ctx context.Context, req *QueryPinnedCodesRequest) (*QueryPinnedCodesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PinnedCodes not implemented") } @@ -2263,7 +2155,6 @@ func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } - func (m *QueryContractInfoRequest) Size() (n int) { if m == nil { return 0 @@ -2578,11 +2469,9 @@ func (m *QueryPinnedCodesResponse) Size() (n int) { func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } - func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } - func (m *QueryContractInfoRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2665,7 +2554,6 @@ func (m *QueryContractInfoRequest) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryContractInfoResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2781,7 +2669,6 @@ func (m *QueryContractInfoResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryContractHistoryRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2900,7 +2787,6 @@ func (m *QueryContractHistoryRequest) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryContractHistoryResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3021,7 +2907,6 @@ func (m *QueryContractHistoryResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryContractsByCodeRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3127,7 +3012,6 @@ func (m *QueryContractsByCodeRequest) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryContractsByCodeResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3246,7 +3130,6 @@ func (m *QueryContractsByCodeResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryAllContractStateRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3365,7 +3248,6 @@ func (m *QueryAllContractStateRequest) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryAllContractStateResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3486,7 +3368,6 @@ func (m *QueryAllContractStateResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryRawContractStateRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3603,7 +3484,6 @@ func (m *QueryRawContractStateRequest) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryRawContractStateResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3688,7 +3568,6 @@ func (m *QueryRawContractStateResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *QuerySmartContractStateRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3805,7 +3684,6 @@ func (m *QuerySmartContractStateRequest) Unmarshal(dAtA []byte) error { } return nil } - func (m *QuerySmartContractStateResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3890,7 +3768,6 @@ func (m *QuerySmartContractStateResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryCodeRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3960,7 +3837,6 @@ func (m *QueryCodeRequest) Unmarshal(dAtA []byte) error { } return nil } - func (m *CodeInfoResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4129,7 +4005,6 @@ func (m *CodeInfoResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryCodeResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4250,7 +4125,6 @@ func (m *QueryCodeResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryCodesRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4337,7 +4211,6 @@ func (m *QueryCodesRequest) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryCodesResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4458,7 +4331,6 @@ func (m *QueryCodesResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryPinnedCodesRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4545,7 +4417,6 @@ func (m *QueryPinnedCodesRequest) Unmarshal(dAtA []byte) error { } return nil } - func (m *QueryPinnedCodesResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4708,7 +4579,6 @@ func (m *QueryPinnedCodesResponse) Unmarshal(dAtA []byte) error { } return nil } - func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/wasm/types/query.pb.gw.go b/x/wasm/types/query.pb.gw.go index b382baf774..f91f21ccf6 100644 --- a/x/wasm/types/query.pb.gw.go +++ b/x/wasm/types/query.pb.gw.go @@ -25,14 +25,11 @@ import ( // Suppress "imported and not used" errors var _ codes.Code - -var ( - _ io.Reader - _ status.Status - _ = runtime.String - _ = utilities.NewDoubleArray - _ = descriptor.ForMessage -) +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_ContractInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryContractInfoRequest @@ -58,6 +55,7 @@ func request_Query_ContractInfo_0(ctx context.Context, marshaler runtime.Marshal msg, err := client.ContractInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_ContractInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -84,9 +82,12 @@ func local_request_Query_ContractInfo_0(ctx context.Context, marshaler runtime.M msg, err := server.ContractInfo(ctx, &protoReq) return msg, metadata, err + } -var filter_Query_ContractHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +var ( + filter_Query_ContractHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) func request_Query_ContractHistory_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryContractHistoryRequest @@ -119,6 +120,7 @@ func request_Query_ContractHistory_0(ctx context.Context, marshaler runtime.Mars msg, err := client.ContractHistory(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_ContractHistory_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -152,9 +154,12 @@ func local_request_Query_ContractHistory_0(ctx context.Context, marshaler runtim msg, err := server.ContractHistory(ctx, &protoReq) return msg, metadata, err + } -var filter_Query_ContractsByCode_0 = &utilities.DoubleArray{Encoding: map[string]int{"code_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +var ( + filter_Query_ContractsByCode_0 = &utilities.DoubleArray{Encoding: map[string]int{"code_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) func request_Query_ContractsByCode_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryContractsByCodeRequest @@ -187,6 +192,7 @@ func request_Query_ContractsByCode_0(ctx context.Context, marshaler runtime.Mars msg, err := client.ContractsByCode(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_ContractsByCode_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -220,9 +226,12 @@ func local_request_Query_ContractsByCode_0(ctx context.Context, marshaler runtim msg, err := server.ContractsByCode(ctx, &protoReq) return msg, metadata, err + } -var filter_Query_AllContractState_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +var ( + filter_Query_AllContractState_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) func request_Query_AllContractState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryAllContractStateRequest @@ -255,6 +264,7 @@ func request_Query_AllContractState_0(ctx context.Context, marshaler runtime.Mar msg, err := client.AllContractState(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_AllContractState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -288,6 +298,7 @@ func local_request_Query_AllContractState_0(ctx context.Context, marshaler runti msg, err := server.AllContractState(ctx, &protoReq) return msg, metadata, err + } func request_Query_RawContractState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -325,6 +336,7 @@ func request_Query_RawContractState_0(ctx context.Context, marshaler runtime.Mar msg, err := client.RawContractState(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_RawContractState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -362,6 +374,7 @@ func local_request_Query_RawContractState_0(ctx context.Context, marshaler runti msg, err := server.RawContractState(ctx, &protoReq) return msg, metadata, err + } func request_Query_SmartContractState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -399,6 +412,7 @@ func request_Query_SmartContractState_0(ctx context.Context, marshaler runtime.M msg, err := client.SmartContractState(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_SmartContractState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -436,6 +450,7 @@ func local_request_Query_SmartContractState_0(ctx context.Context, marshaler run msg, err := server.SmartContractState(ctx, &protoReq) return msg, metadata, err + } func request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -462,6 +477,7 @@ func request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler, clie msg, err := client.Code(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -488,9 +504,12 @@ func local_request_Query_Code_0(ctx context.Context, marshaler runtime.Marshaler msg, err := server.Code(ctx, &protoReq) return msg, metadata, err + } -var filter_Query_Codes_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +var ( + filter_Query_Codes_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) func request_Query_Codes_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryCodesRequest @@ -505,6 +524,7 @@ func request_Query_Codes_0(ctx context.Context, marshaler runtime.Marshaler, cli msg, err := client.Codes(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_Codes_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -520,9 +540,12 @@ func local_request_Query_Codes_0(ctx context.Context, marshaler runtime.Marshale msg, err := server.Codes(ctx, &protoReq) return msg, metadata, err + } -var filter_Query_PinnedCodes_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +var ( + filter_Query_PinnedCodes_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) func request_Query_PinnedCodes_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryPinnedCodesRequest @@ -537,6 +560,7 @@ func request_Query_PinnedCodes_0(ctx context.Context, marshaler runtime.Marshale msg, err := client.PinnedCodes(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err + } func local_request_Query_PinnedCodes_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -552,6 +576,7 @@ func local_request_Query_PinnedCodes_0(ctx context.Context, marshaler runtime.Ma msg, err := server.PinnedCodes(ctx, &protoReq) return msg, metadata, err + } // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". @@ -559,6 +584,7 @@ func local_request_Query_PinnedCodes_0(ctx context.Context, marshaler runtime.Ma // 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. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + mux.Handle("GET", pattern_Query_ContractInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -576,6 +602,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_ContractInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_ContractHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -595,6 +622,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_ContractHistory_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_ContractsByCode_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -614,6 +642,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_ContractsByCode_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_AllContractState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -633,6 +662,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_AllContractState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_RawContractState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -652,6 +682,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_RawContractState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_SmartContractState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -671,6 +702,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_SmartContractState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Code_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -690,6 +722,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Code_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Codes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -709,6 +742,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_Codes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_PinnedCodes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -728,6 +762,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv } forward_Query_PinnedCodes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) return nil @@ -770,6 +805,7 @@ func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "QueryClient" to call the correct interceptors. func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + mux.Handle("GET", pattern_Query_ContractInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -787,6 +823,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_ContractInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_ContractHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -806,6 +843,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_ContractHistory_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_ContractsByCode_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -825,6 +863,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_ContractsByCode_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_AllContractState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -844,6 +883,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_AllContractState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_RawContractState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -863,6 +903,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_RawContractState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_SmartContractState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -882,6 +923,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_SmartContractState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Code_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -901,6 +943,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Code_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_Codes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -920,6 +963,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_Codes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle("GET", pattern_Query_PinnedCodes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -939,6 +983,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } forward_Query_PinnedCodes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) return nil diff --git a/x/wasm/types/store.go b/x/wasm/types/store.go new file mode 100644 index 0000000000..64b0eab4b8 --- /dev/null +++ b/x/wasm/types/store.go @@ -0,0 +1,30 @@ +package types + +import ( + storetypes "github.com/line/lbm-sdk/store/types" + wasmvm "github.com/line/wasmvm" +) + +var _ wasmvm.KVStore = (*WasmStore)(nil) + +// WasmStore is a wrapper struct of `KVStore` +// It translates from cosmos KVStore to wasmvm-defined KVStore. +// The spec of interface `Iterator` is a bit different so we cannot use cosmos KVStore directly. +type WasmStore struct { + storetypes.KVStore +} + +// Iterator re-define for wasmvm's `Iterator` +func (s WasmStore) Iterator(start, end []byte) wasmvm.Iterator { + return s.KVStore.Iterator(start, end) +} + +// ReverseIterator re-define for wasmvm's `Iterator` +func (s WasmStore) ReverseIterator(start, end []byte) wasmvm.Iterator { + return s.KVStore.ReverseIterator(start, end) +} + +// NewWasmStore creates a instance of WasmStore +func NewWasmStore(kvStore storetypes.KVStore) WasmStore { + return WasmStore{kvStore} +} diff --git a/x/wasm/types/test_fixtures.go b/x/wasm/types/test_fixtures.go index de07f175de..0f09ce78f8 100644 --- a/x/wasm/types/test_fixtures.go +++ b/x/wasm/types/test_fixtures.go @@ -6,7 +6,7 @@ import ( "encoding/json" "math/rand" - sdk "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/line/lbm-sdk/types" ) func GenesisFixture(mutators ...func(*GenesisState)) GenesisState { @@ -70,7 +70,7 @@ func CodeFixture(mutators ...func(*Code)) Code { func CodeInfoFixture(mutators ...func(*CodeInfo)) CodeInfo { wasmCode := bytes.Repeat([]byte{0x1}, 10) codeHash := sha256.Sum256(wasmCode) - const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" + const anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" fixture := CodeInfo{ CodeHash: codeHash[:], Creator: anyAddress, @@ -83,7 +83,7 @@ func CodeInfoFixture(mutators ...func(*CodeInfo)) CodeInfo { } func ContractFixture(mutators ...func(*Contract)) Contract { - const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" + const anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" fixture := Contract{ ContractAddress: anyAddress, @@ -102,7 +102,7 @@ func OnlyGenesisFields(info *ContractInfo) { } func ContractInfoFixture(mutators ...func(*ContractInfo)) ContractInfo { - const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" + const anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" fixture := ContractInfo{ CodeID: 1, @@ -125,8 +125,8 @@ func WithSHA256CodeHash(wasmCode []byte) func(info *CodeInfo) { } func MsgStoreCodeFixture(mutators ...func(*MsgStoreCode)) *MsgStoreCode { - wasmIdent := []byte("\x00\x61\x73\x6D") - const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" + var wasmIdent = []byte("\x00\x61\x73\x6D") + const anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" r := &MsgStoreCode{ Sender: anyAddress, WASMByteCode: wasmIdent, @@ -139,7 +139,7 @@ func MsgStoreCodeFixture(mutators ...func(*MsgStoreCode)) *MsgStoreCode { } func MsgInstantiateContractFixture(mutators ...func(*MsgInstantiateContract)) *MsgInstantiateContract { - const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" + const anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" r := &MsgInstantiateContract{ Sender: anyAddress, Admin: anyAddress, @@ -159,8 +159,8 @@ func MsgInstantiateContractFixture(mutators ...func(*MsgInstantiateContract)) *M func MsgExecuteContractFixture(mutators ...func(*MsgExecuteContract)) *MsgExecuteContract { const ( - anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" - firstContractAddress = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" + anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" + firstContractAddress = "link1ghekyjucln7y67ntx7cf27m9dpuxxemnqk82wt" ) r := &MsgExecuteContract{ Sender: anyAddress, @@ -178,7 +178,7 @@ func MsgExecuteContractFixture(mutators ...func(*MsgExecuteContract)) *MsgExecut } func StoreCodeProposalFixture(mutators ...func(*StoreCodeProposal)) *StoreCodeProposal { - const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" + const anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" p := &StoreCodeProposal{ Title: "Foo", Description: "Bar", @@ -203,7 +203,7 @@ func InstantiateContractProposalFixture(mutators ...func(p *InstantiateContractP Beneficiary: anyValidAddress, } ) - const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" + const anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" initMsgBz, err := json.Marshal(initMsg) if err != nil { @@ -240,8 +240,8 @@ func MigrateContractProposalFixture(mutators ...func(p *MigrateContractProposal) panic(err) } const ( - contractAddr = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" - anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" + contractAddr = "link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8" + anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" ) p := &MigrateContractProposal{ Title: "Foo", @@ -259,7 +259,7 @@ func MigrateContractProposalFixture(mutators ...func(p *MigrateContractProposal) func SudoContractProposalFixture(mutators ...func(p *SudoContractProposal)) *SudoContractProposal { const ( - contractAddr = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" + contractAddr = "link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8" ) p := &SudoContractProposal{ @@ -277,8 +277,8 @@ func SudoContractProposalFixture(mutators ...func(p *SudoContractProposal)) *Sud func ExecuteContractProposalFixture(mutators ...func(p *ExecuteContractProposal)) *ExecuteContractProposal { const ( - contractAddr = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" - anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" + contractAddr = "link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8" + anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" ) p := &ExecuteContractProposal{ @@ -301,8 +301,8 @@ func ExecuteContractProposalFixture(mutators ...func(p *ExecuteContractProposal) func UpdateAdminProposalFixture(mutators ...func(p *UpdateAdminProposal)) *UpdateAdminProposal { const ( - contractAddr = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" - anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" + contractAddr = "link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8" + anyAddress = "link1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsh9tp23" ) p := &UpdateAdminProposal{ @@ -318,7 +318,7 @@ func UpdateAdminProposalFixture(mutators ...func(p *UpdateAdminProposal)) *Updat } func ClearAdminProposalFixture(mutators ...func(p *ClearAdminProposal)) *ClearAdminProposal { - const contractAddr = "cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr" + const contractAddr = "link1hcttwju93d5m39467gjcq63p5kc4fdcn30dgd8" p := &ClearAdminProposal{ Title: "Foo", Description: "Bar", diff --git a/x/wasm/types/tx.go b/x/wasm/types/tx.go index 498dc28266..818b6e79b2 100644 --- a/x/wasm/types/tx.go +++ b/x/wasm/types/tx.go @@ -5,8 +5,8 @@ import ( "errors" "strings" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" ) // RawContractMessage defines a json message that is sent or returned by a wasm contract. diff --git a/x/wasm/types/tx.pb.go b/x/wasm/types/tx.pb.go index 7976d9e8f0..c6fbdaf895 100644 --- a/x/wasm/types/tx.pb.go +++ b/x/wasm/types/tx.pb.go @@ -6,27 +6,23 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - 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_line_lbm_sdk_types "github.com/line/lbm-sdk/types" + types "github.com/line/lbm-sdk/types" 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 - _ = math.Inf -) +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. @@ -51,11 +47,9 @@ func (*MsgStoreCode) ProtoMessage() {} func (*MsgStoreCode) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{0} } - func (m *MsgStoreCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgStoreCode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgStoreCode.Marshal(b, m, deterministic) @@ -68,15 +62,12 @@ func (m *MsgStoreCode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } - func (m *MsgStoreCode) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgStoreCode.Merge(m, src) } - func (m *MsgStoreCode) XXX_Size() int { return m.Size() } - func (m *MsgStoreCode) XXX_DiscardUnknown() { xxx_messageInfo_MsgStoreCode.DiscardUnknown(m) } @@ -95,11 +86,9 @@ func (*MsgStoreCodeResponse) ProtoMessage() {} func (*MsgStoreCodeResponse) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{1} } - func (m *MsgStoreCodeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgStoreCodeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgStoreCodeResponse.Marshal(b, m, deterministic) @@ -112,15 +101,12 @@ func (m *MsgStoreCodeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } - func (m *MsgStoreCodeResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgStoreCodeResponse.Merge(m, src) } - func (m *MsgStoreCodeResponse) XXX_Size() int { return m.Size() } - func (m *MsgStoreCodeResponse) XXX_DiscardUnknown() { xxx_messageInfo_MsgStoreCodeResponse.DiscardUnknown(m) } @@ -141,7 +127,7 @@ type MsgInstantiateContract struct { // Msg json encoded message to be passed to the contract on instantiation Msg RawContractMessage `protobuf:"bytes,5,opt,name=msg,proto3,casttype=RawContractMessage" json:"msg,omitempty"` // Funds coins that are transferred to the contract on instantiation - Funds github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,6,rep,name=funds,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"funds"` + Funds github_com_line_lbm_sdk_types.Coins `protobuf:"bytes,6,rep,name=funds,proto3,castrepeated=github.com/line/lbm-sdk/types.Coins" json:"funds"` } func (m *MsgInstantiateContract) Reset() { *m = MsgInstantiateContract{} } @@ -150,11 +136,9 @@ func (*MsgInstantiateContract) ProtoMessage() {} func (*MsgInstantiateContract) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{2} } - func (m *MsgInstantiateContract) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgInstantiateContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgInstantiateContract.Marshal(b, m, deterministic) @@ -167,15 +151,12 @@ func (m *MsgInstantiateContract) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } - func (m *MsgInstantiateContract) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgInstantiateContract.Merge(m, src) } - func (m *MsgInstantiateContract) XXX_Size() int { return m.Size() } - func (m *MsgInstantiateContract) XXX_DiscardUnknown() { xxx_messageInfo_MsgInstantiateContract.DiscardUnknown(m) } @@ -196,11 +177,9 @@ func (*MsgInstantiateContractResponse) ProtoMessage() {} func (*MsgInstantiateContractResponse) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{3} } - func (m *MsgInstantiateContractResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgInstantiateContractResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgInstantiateContractResponse.Marshal(b, m, deterministic) @@ -213,15 +192,12 @@ func (m *MsgInstantiateContractResponse) XXX_Marshal(b []byte, deterministic boo return b[:n], nil } } - func (m *MsgInstantiateContractResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgInstantiateContractResponse.Merge(m, src) } - func (m *MsgInstantiateContractResponse) XXX_Size() int { return m.Size() } - func (m *MsgInstantiateContractResponse) XXX_DiscardUnknown() { xxx_messageInfo_MsgInstantiateContractResponse.DiscardUnknown(m) } @@ -237,7 +213,7 @@ type MsgExecuteContract struct { // Msg json encoded message to be passed to the contract Msg RawContractMessage `protobuf:"bytes,3,opt,name=msg,proto3,casttype=RawContractMessage" json:"msg,omitempty"` // Funds coins that are transferred to the contract on execution - Funds github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,5,rep,name=funds,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"funds"` + Funds github_com_line_lbm_sdk_types.Coins `protobuf:"bytes,5,rep,name=funds,proto3,castrepeated=github.com/line/lbm-sdk/types.Coins" json:"funds"` } func (m *MsgExecuteContract) Reset() { *m = MsgExecuteContract{} } @@ -246,11 +222,9 @@ func (*MsgExecuteContract) ProtoMessage() {} func (*MsgExecuteContract) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{4} } - func (m *MsgExecuteContract) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgExecuteContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgExecuteContract.Marshal(b, m, deterministic) @@ -263,15 +237,12 @@ func (m *MsgExecuteContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } - func (m *MsgExecuteContract) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgExecuteContract.Merge(m, src) } - func (m *MsgExecuteContract) XXX_Size() int { return m.Size() } - func (m *MsgExecuteContract) XXX_DiscardUnknown() { xxx_messageInfo_MsgExecuteContract.DiscardUnknown(m) } @@ -290,11 +261,9 @@ func (*MsgExecuteContractResponse) ProtoMessage() {} func (*MsgExecuteContractResponse) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{5} } - func (m *MsgExecuteContractResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgExecuteContractResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgExecuteContractResponse.Marshal(b, m, deterministic) @@ -307,15 +276,12 @@ func (m *MsgExecuteContractResponse) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } - func (m *MsgExecuteContractResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgExecuteContractResponse.Merge(m, src) } - func (m *MsgExecuteContractResponse) XXX_Size() int { return m.Size() } - func (m *MsgExecuteContractResponse) XXX_DiscardUnknown() { xxx_messageInfo_MsgExecuteContractResponse.DiscardUnknown(m) } @@ -340,11 +306,9 @@ func (*MsgMigrateContract) ProtoMessage() {} func (*MsgMigrateContract) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{6} } - func (m *MsgMigrateContract) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgMigrateContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgMigrateContract.Marshal(b, m, deterministic) @@ -357,15 +321,12 @@ func (m *MsgMigrateContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } - func (m *MsgMigrateContract) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgMigrateContract.Merge(m, src) } - func (m *MsgMigrateContract) XXX_Size() int { return m.Size() } - func (m *MsgMigrateContract) XXX_DiscardUnknown() { xxx_messageInfo_MsgMigrateContract.DiscardUnknown(m) } @@ -385,11 +346,9 @@ func (*MsgMigrateContractResponse) ProtoMessage() {} func (*MsgMigrateContractResponse) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{7} } - func (m *MsgMigrateContractResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgMigrateContractResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgMigrateContractResponse.Marshal(b, m, deterministic) @@ -402,15 +361,12 @@ func (m *MsgMigrateContractResponse) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } - func (m *MsgMigrateContractResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgMigrateContractResponse.Merge(m, src) } - func (m *MsgMigrateContractResponse) XXX_Size() int { return m.Size() } - func (m *MsgMigrateContractResponse) XXX_DiscardUnknown() { xxx_messageInfo_MsgMigrateContractResponse.DiscardUnknown(m) } @@ -433,11 +389,9 @@ func (*MsgUpdateAdmin) ProtoMessage() {} func (*MsgUpdateAdmin) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{8} } - func (m *MsgUpdateAdmin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgUpdateAdmin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgUpdateAdmin.Marshal(b, m, deterministic) @@ -450,15 +404,12 @@ func (m *MsgUpdateAdmin) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } - func (m *MsgUpdateAdmin) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgUpdateAdmin.Merge(m, src) } - func (m *MsgUpdateAdmin) XXX_Size() int { return m.Size() } - func (m *MsgUpdateAdmin) XXX_DiscardUnknown() { xxx_messageInfo_MsgUpdateAdmin.DiscardUnknown(m) } @@ -466,7 +417,8 @@ func (m *MsgUpdateAdmin) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateAdmin proto.InternalMessageInfo // MsgUpdateAdminResponse returns empty data -type MsgUpdateAdminResponse struct{} +type MsgUpdateAdminResponse struct { +} func (m *MsgUpdateAdminResponse) Reset() { *m = MsgUpdateAdminResponse{} } func (m *MsgUpdateAdminResponse) String() string { return proto.CompactTextString(m) } @@ -474,11 +426,9 @@ func (*MsgUpdateAdminResponse) ProtoMessage() {} func (*MsgUpdateAdminResponse) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{9} } - func (m *MsgUpdateAdminResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgUpdateAdminResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgUpdateAdminResponse.Marshal(b, m, deterministic) @@ -491,15 +441,12 @@ func (m *MsgUpdateAdminResponse) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } - func (m *MsgUpdateAdminResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgUpdateAdminResponse.Merge(m, src) } - func (m *MsgUpdateAdminResponse) XXX_Size() int { return m.Size() } - func (m *MsgUpdateAdminResponse) XXX_DiscardUnknown() { xxx_messageInfo_MsgUpdateAdminResponse.DiscardUnknown(m) } @@ -520,11 +467,9 @@ func (*MsgClearAdmin) ProtoMessage() {} func (*MsgClearAdmin) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{10} } - func (m *MsgClearAdmin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgClearAdmin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgClearAdmin.Marshal(b, m, deterministic) @@ -537,15 +482,12 @@ func (m *MsgClearAdmin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } - func (m *MsgClearAdmin) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgClearAdmin.Merge(m, src) } - func (m *MsgClearAdmin) XXX_Size() int { return m.Size() } - func (m *MsgClearAdmin) XXX_DiscardUnknown() { xxx_messageInfo_MsgClearAdmin.DiscardUnknown(m) } @@ -553,7 +495,8 @@ func (m *MsgClearAdmin) XXX_DiscardUnknown() { var xxx_messageInfo_MsgClearAdmin proto.InternalMessageInfo // MsgClearAdminResponse returns empty data -type MsgClearAdminResponse struct{} +type MsgClearAdminResponse struct { +} func (m *MsgClearAdminResponse) Reset() { *m = MsgClearAdminResponse{} } func (m *MsgClearAdminResponse) String() string { return proto.CompactTextString(m) } @@ -561,11 +504,9 @@ func (*MsgClearAdminResponse) ProtoMessage() {} func (*MsgClearAdminResponse) Descriptor() ([]byte, []int) { return fileDescriptor_4f74d82755520264, []int{11} } - func (m *MsgClearAdminResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *MsgClearAdminResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_MsgClearAdminResponse.Marshal(b, m, deterministic) @@ -578,15 +519,12 @@ func (m *MsgClearAdminResponse) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } - func (m *MsgClearAdminResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_MsgClearAdminResponse.Merge(m, src) } - func (m *MsgClearAdminResponse) XXX_Size() int { return m.Size() } - func (m *MsgClearAdminResponse) XXX_DiscardUnknown() { xxx_messageInfo_MsgClearAdminResponse.DiscardUnknown(m) } @@ -611,55 +549,55 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/tx.proto", fileDescriptor_4f74d82755520264) } var fileDescriptor_4f74d82755520264 = []byte{ - // 759 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0xcd, 0x6e, 0xd3, 0x4a, - 0x14, 0x8e, 0x1b, 0x27, 0x4d, 0x4e, 0x73, 0x7b, 0x23, 0xdf, 0x36, 0x37, 0xf5, 0xbd, 0x72, 0xa2, - 0x80, 0x8a, 0x17, 0x60, 0x37, 0x45, 0x62, 0xc3, 0xaa, 0x49, 0x59, 0xb4, 0x92, 0x11, 0x72, 0x55, - 0x2a, 0xd8, 0x44, 0x13, 0x7b, 0x6a, 0x2c, 0x1a, 0x4f, 0xf0, 0x71, 0x9b, 0xf6, 0x25, 0x10, 0x3b, - 0xde, 0x81, 0xb7, 0x60, 0xd7, 0x15, 0xea, 0x06, 0x89, 0x55, 0x80, 0xf4, 0x2d, 0x58, 0x21, 0xff, - 0xa5, 0x6e, 0xea, 0xa4, 0x41, 0x88, 0x4d, 0x32, 0xc7, 0xf3, 0x7d, 0xe7, 0xcc, 0xf9, 0xf4, 0xcd, - 0x19, 0x58, 0x33, 0x18, 0xf6, 0x06, 0x04, 0x7b, 0x6a, 0xf0, 0x73, 0xd2, 0x54, 0xbd, 0x53, 0xa5, - 0xef, 0x32, 0x8f, 0x09, 0xe5, 0x78, 0x4b, 0x09, 0x7e, 0x4e, 0x9a, 0xa2, 0xe4, 0x7f, 0x61, 0xa8, - 0x76, 0x09, 0x52, 0xf5, 0xa4, 0xd9, 0xa5, 0x1e, 0x69, 0xaa, 0x06, 0xb3, 0x9d, 0x90, 0x21, 0xae, - 0x58, 0xcc, 0x62, 0xc1, 0x52, 0xf5, 0x57, 0xd1, 0xd7, 0xff, 0x6f, 0x96, 0x38, 0xeb, 0x53, 0x0c, - 0x77, 0x1b, 0x1f, 0x39, 0x28, 0x69, 0x68, 0xed, 0x79, 0xcc, 0xa5, 0x6d, 0x66, 0x52, 0xa1, 0x02, - 0x79, 0xa4, 0x8e, 0x49, 0xdd, 0x2a, 0x57, 0xe7, 0xe4, 0xa2, 0x1e, 0x45, 0xc2, 0x23, 0x58, 0xf6, - 0xf9, 0x9d, 0xee, 0x99, 0x47, 0x3b, 0x06, 0x33, 0x69, 0x75, 0xa1, 0xce, 0xc9, 0xa5, 0x56, 0x79, - 0x34, 0xac, 0x95, 0x0e, 0xb6, 0xf6, 0xb4, 0xd6, 0x99, 0x17, 0x64, 0xd0, 0x4b, 0x3e, 0x2e, 0x8e, - 0x84, 0x7d, 0xa8, 0xd8, 0x0e, 0x7a, 0xc4, 0xf1, 0x6c, 0xe2, 0xd1, 0x4e, 0x9f, 0xba, 0x3d, 0x1b, - 0xd1, 0x66, 0x4e, 0x35, 0x57, 0xe7, 0xe4, 0xa5, 0x4d, 0x49, 0x99, 0xec, 0x53, 0xd9, 0x32, 0x0c, - 0x8a, 0xd8, 0x66, 0xce, 0xa1, 0x6d, 0xe9, 0xab, 0x09, 0xf6, 0xb3, 0x31, 0x79, 0x97, 0x2f, 0x64, - 0xcb, 0xfc, 0x2e, 0x5f, 0xe0, 0xcb, 0xb9, 0xc6, 0x63, 0x58, 0x49, 0xb6, 0xa0, 0x53, 0xec, 0x33, - 0x07, 0xa9, 0x70, 0x07, 0x16, 0xfd, 0x83, 0x76, 0x6c, 0x33, 0xe8, 0x85, 0x6f, 0xc1, 0x68, 0x58, - 0xcb, 0xfb, 0x90, 0x9d, 0x6d, 0x3d, 0xef, 0x6f, 0xed, 0x98, 0x8d, 0xb7, 0x0b, 0x50, 0xd1, 0xd0, - 0xda, 0xb9, 0xaa, 0xd2, 0x66, 0x8e, 0xe7, 0x12, 0xc3, 0x9b, 0x2a, 0xc5, 0x0a, 0xe4, 0x88, 0xd9, - 0xb3, 0x9d, 0x40, 0x81, 0xa2, 0x1e, 0x06, 0xc9, 0x6a, 0xd9, 0x69, 0xd5, 0x7c, 0xea, 0x11, 0xe9, - 0xd2, 0xa3, 0x2a, 0x1f, 0x52, 0x83, 0x40, 0x90, 0x21, 0xdb, 0x43, 0x2b, 0x10, 0xa4, 0xd4, 0xaa, - 0xfc, 0x18, 0xd6, 0x04, 0x9d, 0x0c, 0xe2, 0x63, 0x68, 0x14, 0x91, 0x58, 0x54, 0xf7, 0x21, 0x02, - 0x81, 0xdc, 0xe1, 0xb1, 0x63, 0x62, 0x35, 0x5f, 0xcf, 0xca, 0x4b, 0x9b, 0x6b, 0x4a, 0x68, 0x09, - 0xc5, 0xb7, 0x84, 0x12, 0x59, 0x42, 0x69, 0x33, 0xdb, 0x69, 0x6d, 0x9c, 0x0f, 0x6b, 0x99, 0x0f, - 0x5f, 0x6b, 0xb2, 0x65, 0x7b, 0xaf, 0x8e, 0xbb, 0x8a, 0xc1, 0x7a, 0x6a, 0xe4, 0x9f, 0xf0, 0xef, - 0x01, 0x9a, 0xaf, 0x23, 0x2b, 0xf8, 0x04, 0xd4, 0xc3, 0xcc, 0x8d, 0xa7, 0x20, 0xa5, 0xeb, 0x31, - 0xd6, 0xb5, 0x0a, 0x8b, 0xc4, 0x34, 0x5d, 0x8a, 0x18, 0x09, 0x13, 0x87, 0x82, 0x00, 0xbc, 0x49, - 0x3c, 0x12, 0x5a, 0x43, 0x0f, 0xd6, 0x8d, 0xcf, 0x1c, 0x08, 0x1a, 0x5a, 0x4f, 0x4e, 0xa9, 0x71, - 0x3c, 0x87, 0xb8, 0x22, 0x14, 0x8c, 0x08, 0x13, 0xe9, 0x3b, 0x8e, 0x63, 0x9d, 0xb2, 0xbf, 0xa0, - 0x53, 0xee, 0x8f, 0xe9, 0xb4, 0x01, 0xe2, 0xcd, 0xb6, 0xc6, 0x1a, 0xc5, 0x4a, 0x70, 0x09, 0x25, - 0xde, 0x87, 0x4a, 0x68, 0xb6, 0xe5, 0x92, 0xdf, 0x54, 0x62, 0x2e, 0xb3, 0x45, 0x72, 0xf1, 0xb7, - 0xca, 0x15, 0xf5, 0x32, 0x71, 0xb0, 0x99, 0xbd, 0x10, 0x58, 0xd6, 0xd0, 0xda, 0xef, 0x9b, 0xc4, - 0xa3, 0x5b, 0x81, 0xff, 0xa7, 0xb5, 0xf1, 0x1f, 0x14, 0x1d, 0x3a, 0xe8, 0x24, 0x6f, 0x4c, 0xc1, - 0xa1, 0x83, 0x90, 0x94, 0xec, 0x31, 0x7b, 0xbd, 0xc7, 0x46, 0x35, 0xb8, 0x98, 0x89, 0x12, 0xf1, - 0x81, 0x1a, 0x6d, 0xf8, 0x4b, 0x43, 0xab, 0x7d, 0x44, 0x89, 0x3b, 0xbb, 0xf6, 0xac, 0xf4, 0xff, - 0xc2, 0xea, 0xb5, 0x24, 0x71, 0xf6, 0xcd, 0x4f, 0x3c, 0x64, 0x35, 0xb4, 0x84, 0x3d, 0x28, 0x5e, - 0x8d, 0xc5, 0x94, 0x31, 0x95, 0x9c, 0x39, 0xe2, 0xfa, 0xec, 0xfd, 0xb1, 0x96, 0x6f, 0xe0, 0x9f, - 0xb4, 0x51, 0x23, 0xa7, 0xd2, 0x53, 0x90, 0xe2, 0xc6, 0xbc, 0xc8, 0x71, 0x49, 0x0a, 0x7f, 0x4f, - 0x5e, 0xbe, 0xbb, 0xa9, 0x49, 0x26, 0x50, 0xe2, 0xfd, 0x79, 0x50, 0xc9, 0x32, 0x93, 0xce, 0x4e, - 0x2f, 0x33, 0x81, 0x9a, 0x52, 0x66, 0x9a, 0x19, 0x5f, 0xc0, 0x52, 0xd2, 0x75, 0xf5, 0x54, 0x72, - 0x02, 0x21, 0xca, 0xb7, 0x21, 0xc6, 0xa9, 0x9f, 0x03, 0x24, 0x3c, 0x55, 0x4b, 0xe5, 0x5d, 0x01, - 0xc4, 0x7b, 0xb7, 0x00, 0xe2, 0xbc, 0xad, 0xed, 0xf3, 0xef, 0x52, 0xe6, 0x7c, 0x24, 0x71, 0x17, - 0x23, 0x89, 0xfb, 0x36, 0x92, 0xb8, 0x77, 0x97, 0x52, 0xe6, 0xe2, 0x52, 0xca, 0x7c, 0xb9, 0x94, - 0x32, 0x2f, 0xd7, 0x13, 0x83, 0xa7, 0xcd, 0xb0, 0x77, 0x10, 0x3f, 0xd5, 0xa6, 0x7a, 0x1a, 0x3e, - 0xd9, 0xc1, 0xf0, 0xe9, 0xe6, 0x83, 0x07, 0xfb, 0xe1, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x56, - 0xd2, 0x4b, 0x17, 0x33, 0x08, 0x00, 0x00, + // 756 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0xcd, 0x6e, 0xd3, 0x4c, + 0x14, 0x8d, 0x1b, 0x27, 0x4d, 0x6e, 0xf3, 0xf5, 0x8b, 0x4c, 0x1b, 0x52, 0x83, 0x9c, 0xc8, 0x45, + 0x10, 0x09, 0xb0, 0x9b, 0x22, 0xb1, 0x61, 0x43, 0x13, 0x58, 0xb4, 0x92, 0x11, 0x72, 0x55, 0x10, + 0x08, 0x29, 0x9a, 0xd8, 0x53, 0x63, 0x91, 0x78, 0x82, 0x67, 0xda, 0xb4, 0x8f, 0xc0, 0x8e, 0x1d, + 0xef, 0xc0, 0x5b, 0xb0, 0xeb, 0x0a, 0x75, 0xc9, 0x2a, 0x40, 0xfa, 0x16, 0xac, 0x90, 0xff, 0x52, + 0xd7, 0x75, 0xd2, 0x20, 0xc4, 0xc6, 0x9a, 0xeb, 0x39, 0xf7, 0x9e, 0xb9, 0x47, 0x67, 0xee, 0xc0, + 0x9a, 0x41, 0x68, 0x7f, 0x88, 0x68, 0x5f, 0xf5, 0x3f, 0x87, 0x4d, 0x95, 0x1d, 0x29, 0x03, 0x97, + 0x30, 0x22, 0x94, 0xa3, 0x2d, 0xc5, 0xff, 0x1c, 0x36, 0x45, 0xc9, 0xfb, 0x43, 0xa8, 0xda, 0x45, + 0x14, 0xab, 0x87, 0xcd, 0x2e, 0x66, 0xa8, 0xa9, 0x1a, 0xc4, 0x76, 0x82, 0x0c, 0x71, 0xc5, 0x22, + 0x16, 0xf1, 0x97, 0xaa, 0xb7, 0x0a, 0xff, 0xde, 0xbc, 0x4c, 0x71, 0x3c, 0xc0, 0x34, 0xd8, 0x95, + 0xbf, 0x70, 0x50, 0xd2, 0xa8, 0xb5, 0xcb, 0x88, 0x8b, 0xdb, 0xc4, 0xc4, 0x42, 0x05, 0xf2, 0x14, + 0x3b, 0x26, 0x76, 0xab, 0x5c, 0x9d, 0x6b, 0x14, 0xf5, 0x30, 0x12, 0x1e, 0xc2, 0xb2, 0x97, 0xdf, + 0xe9, 0x1e, 0x33, 0xdc, 0x31, 0x88, 0x89, 0xab, 0x0b, 0x75, 0xae, 0x51, 0x6a, 0x95, 0xc7, 0xa3, + 0x5a, 0xe9, 0xe5, 0xd6, 0xae, 0xd6, 0x3a, 0x66, 0x7e, 0x05, 0xbd, 0xe4, 0xe1, 0xa2, 0x48, 0xd8, + 0x83, 0x8a, 0xed, 0x50, 0x86, 0x1c, 0x66, 0x23, 0x86, 0x3b, 0x03, 0xec, 0xf6, 0x6d, 0x4a, 0x6d, + 0xe2, 0x54, 0x73, 0x75, 0xae, 0xb1, 0xb4, 0x29, 0x29, 0xc9, 0x3e, 0x95, 0x2d, 0xc3, 0xc0, 0x94, + 0xb6, 0x89, 0xb3, 0x6f, 0x5b, 0xfa, 0x6a, 0x2c, 0xfb, 0xf9, 0x24, 0x79, 0x87, 0x2f, 0x64, 0xcb, + 0xfc, 0x0e, 0x5f, 0xe0, 0xcb, 0x39, 0xf9, 0x11, 0xac, 0xc4, 0x5b, 0xd0, 0x31, 0x1d, 0x10, 0x87, + 0x62, 0x61, 0x1d, 0x16, 0xbd, 0x83, 0x76, 0x6c, 0xd3, 0xef, 0x85, 0x6f, 0xc1, 0x78, 0x54, 0xcb, + 0x7b, 0x90, 0xed, 0x27, 0x7a, 0xde, 0xdb, 0xda, 0x36, 0xe5, 0x0f, 0x0b, 0x50, 0xd1, 0xa8, 0xb5, + 0x7d, 0xce, 0xd2, 0x26, 0x0e, 0x73, 0x91, 0xc1, 0xa6, 0x4a, 0xb1, 0x02, 0x39, 0x64, 0xf6, 0x6d, + 0xc7, 0x57, 0xa0, 0xa8, 0x07, 0x41, 0x9c, 0x2d, 0x3b, 0x8d, 0xcd, 0x4b, 0xed, 0xa1, 0x2e, 0xee, + 0x55, 0xf9, 0x20, 0xd5, 0x0f, 0x84, 0x06, 0x64, 0xfb, 0xd4, 0xf2, 0x05, 0x29, 0xb5, 0x2a, 0xbf, + 0x46, 0x35, 0x41, 0x47, 0xc3, 0xe8, 0x18, 0x1a, 0xa6, 0x14, 0x59, 0x58, 0xf7, 0x20, 0xc2, 0x1b, + 0xc8, 0xed, 0x1f, 0x38, 0x26, 0xad, 0xe6, 0xeb, 0xd9, 0xc6, 0xd2, 0xe6, 0x9a, 0x12, 0x58, 0x42, + 0xf1, 0x2c, 0xa1, 0x84, 0x96, 0x50, 0xda, 0xc4, 0x76, 0x5a, 0x77, 0x4f, 0x46, 0xb5, 0xcc, 0xe7, + 0xef, 0xb5, 0x75, 0xcb, 0x66, 0x6f, 0x0f, 0xba, 0x8a, 0x41, 0xfa, 0x6a, 0xcf, 0x76, 0xb0, 0xda, + 0xeb, 0xf6, 0xef, 0x53, 0xf3, 0x5d, 0xe8, 0x02, 0x0f, 0x4b, 0xf5, 0xa0, 0xa8, 0xfc, 0x0c, 0xa4, + 0x74, 0x29, 0x26, 0x92, 0x56, 0x61, 0x11, 0x99, 0xa6, 0x8b, 0x29, 0x0d, 0x35, 0x89, 0x42, 0x41, + 0x00, 0xde, 0x44, 0x0c, 0x05, 0xae, 0xd0, 0xfd, 0xb5, 0x7c, 0xca, 0x81, 0xa0, 0x51, 0xeb, 0xe9, + 0x11, 0x36, 0x0e, 0xe6, 0xd0, 0x55, 0x84, 0x82, 0x11, 0x62, 0x42, 0x69, 0x27, 0x71, 0x24, 0x51, + 0xf6, 0x0f, 0x24, 0xca, 0xfd, 0x0b, 0x89, 0x36, 0x40, 0xbc, 0xdc, 0xd1, 0x44, 0x9e, 0x48, 0x04, + 0x2e, 0x26, 0xc2, 0xa7, 0x40, 0x04, 0xcd, 0xb6, 0x5c, 0xf4, 0x97, 0x22, 0xcc, 0x65, 0xb1, 0x50, + 0x29, 0xfe, 0x4a, 0xa5, 0xc2, 0x5e, 0x12, 0x07, 0x9b, 0xd9, 0x0b, 0x82, 0x65, 0x8d, 0x5a, 0x7b, + 0x03, 0x13, 0x31, 0xbc, 0xe5, 0xbb, 0x7e, 0x5a, 0x1b, 0x37, 0xa0, 0xe8, 0xe0, 0x61, 0x27, 0x7e, + 0x4f, 0x0a, 0x0e, 0x1e, 0x06, 0x49, 0xf1, 0x1e, 0xb3, 0x17, 0x7b, 0x94, 0xab, 0xfe, 0x75, 0x8c, + 0x51, 0x44, 0x07, 0x92, 0xdb, 0xf0, 0x9f, 0x46, 0xad, 0x76, 0x0f, 0x23, 0x77, 0x36, 0xf7, 0xac, + 0xf2, 0xd7, 0x61, 0xf5, 0x42, 0x91, 0xa8, 0xfa, 0xe6, 0x57, 0x1e, 0xb2, 0x1a, 0xb5, 0x84, 0x5d, + 0x28, 0x9e, 0x0f, 0xc3, 0x94, 0xe1, 0x14, 0x9f, 0x34, 0xe2, 0xed, 0xd9, 0xfb, 0x13, 0x2d, 0xdf, + 0xc3, 0xb5, 0xb4, 0x01, 0xd3, 0x48, 0x4d, 0x4f, 0x41, 0x8a, 0x1b, 0xf3, 0x22, 0x27, 0x94, 0x18, + 0xfe, 0x4f, 0xde, 0xbb, 0x5b, 0xa9, 0x45, 0x12, 0x28, 0xf1, 0xde, 0x3c, 0xa8, 0x38, 0x4d, 0xd2, + 0xd9, 0xe9, 0x34, 0x09, 0xd4, 0x14, 0x9a, 0x69, 0x66, 0x7c, 0x05, 0x4b, 0x71, 0xd7, 0xd5, 0x53, + 0x93, 0x63, 0x08, 0xb1, 0x71, 0x15, 0x62, 0x52, 0xfa, 0x05, 0x40, 0xcc, 0x53, 0xb5, 0xd4, 0xbc, + 0x73, 0x80, 0x78, 0xe7, 0x0a, 0x40, 0x54, 0xb7, 0xf5, 0xf8, 0xe4, 0xa7, 0x94, 0x39, 0x19, 0x4b, + 0xdc, 0xe9, 0x58, 0xe2, 0x7e, 0x8c, 0x25, 0xee, 0xe3, 0x99, 0x94, 0x39, 0x3d, 0x93, 0x32, 0xdf, + 0xce, 0xa4, 0xcc, 0x6b, 0x39, 0x39, 0x73, 0xbc, 0x62, 0xa6, 0x7a, 0x14, 0x3c, 0xd2, 0xfe, 0xe0, + 0xe9, 0xe6, 0xfd, 0x27, 0xfa, 0xc1, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x26, 0x87, 0x1c, 0xe3, + 0x25, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -767,28 +705,24 @@ type MsgServer interface { } // UnimplementedMsgServer can be embedded to have forward compatible implementations. -type UnimplementedMsgServer struct{} +type UnimplementedMsgServer struct { +} func (*UnimplementedMsgServer) StoreCode(ctx context.Context, req *MsgStoreCode) (*MsgStoreCodeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method StoreCode not implemented") } - func (*UnimplementedMsgServer) InstantiateContract(ctx context.Context, req *MsgInstantiateContract) (*MsgInstantiateContractResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method InstantiateContract not implemented") } - func (*UnimplementedMsgServer) ExecuteContract(ctx context.Context, req *MsgExecuteContract) (*MsgExecuteContractResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ExecuteContract not implemented") } - func (*UnimplementedMsgServer) MigrateContract(ctx context.Context, req *MsgMigrateContract) (*MsgMigrateContractResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method MigrateContract not implemented") } - func (*UnimplementedMsgServer) UpdateAdmin(ctx context.Context, req *MsgUpdateAdmin) (*MsgUpdateAdminResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateAdmin not implemented") } - func (*UnimplementedMsgServer) ClearAdmin(ctx context.Context, req *MsgClearAdmin) (*MsgClearAdminResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ClearAdmin not implemented") } @@ -1427,7 +1361,6 @@ func encodeVarintTx(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } - func (m *MsgStoreCode) Size() (n int) { if m == nil { return 0 @@ -1648,11 +1581,9 @@ func (m *MsgClearAdminResponse) Size() (n int) { func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } - func sozTx(x uint64) (n int) { return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } - func (m *MsgStoreCode) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1805,7 +1736,6 @@ func (m *MsgStoreCode) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgStoreCodeResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1875,7 +1805,6 @@ func (m *MsgStoreCodeResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgInstantiateContract) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2109,7 +2038,6 @@ func (m *MsgInstantiateContract) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgInstantiateContractResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2226,7 +2154,6 @@ func (m *MsgInstantiateContractResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgExecuteContract) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2409,7 +2336,6 @@ func (m *MsgExecuteContract) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgExecuteContractResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2494,7 +2420,6 @@ func (m *MsgExecuteContractResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgMigrateContract) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2662,7 +2587,6 @@ func (m *MsgMigrateContract) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgMigrateContractResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2747,7 +2671,6 @@ func (m *MsgMigrateContractResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgUpdateAdmin) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2894,7 +2817,6 @@ func (m *MsgUpdateAdmin) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgUpdateAdminResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2945,7 +2867,6 @@ func (m *MsgUpdateAdminResponse) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgClearAdmin) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3060,7 +2981,6 @@ func (m *MsgClearAdmin) Unmarshal(dAtA []byte) error { } return nil } - func (m *MsgClearAdminResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3111,7 +3031,6 @@ func (m *MsgClearAdminResponse) Unmarshal(dAtA []byte) error { } return nil } - func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/wasm/types/tx_test.go b/x/wasm/types/tx_test.go index b0ea43e969..d6e818306f 100644 --- a/x/wasm/types/tx_test.go +++ b/x/wasm/types/tx_test.go @@ -5,11 +5,11 @@ import ( "strings" "testing" - "github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx" - - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + sdk "github.com/line/lbm-sdk/types" + "github.com/line/lbm-sdk/x/auth/legacy/legacytx" ) const firstCodeID = 1 @@ -532,6 +532,37 @@ func TestMsgJsonSignBytes(t *testing.T) { { "type":"wasm/MsgMigrateContract", "value": {"msg": {"foo":"bar"}} +}`, + }, + "MsgUpdateAdmin": { + src: &MsgUpdateAdmin{ + Sender: "sender", + NewAdmin: "newAdmin", + Contract: "contract_address", + }, + exp: ` +{ + "type":"wasm/MsgUpdateAdmin", + "value":{"contract":"contract_address","new_admin":"newAdmin","sender":"sender"} +}`, + }, + "MsgClearAdmin": { + src: &MsgClearAdmin{ + Sender: "sender", + Contract: "contract_address", + }, + exp: ` +{ + "type":"wasm/MsgClearAdmin", + "value":{"contract":"contract_address","sender":"sender"} +}`, + }, + "MsgIBCSend": { + src: &MsgIBCCloseChannel{Channel: "channel"}, + exp: ` +{ + "type":"wasm/MsgIBCCloseChannel", + "value":{"channel":"channel"} }`, }, } diff --git a/x/wasm/types/types.go b/x/wasm/types/types.go index 7c9e14e64e..8b04e0958a 100644 --- a/x/wasm/types/types.go +++ b/x/wasm/types/types.go @@ -4,11 +4,12 @@ import ( "fmt" "reflect" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/gogo/protobuf/proto" + + codectypes "github.com/line/lbm-sdk/codec/types" + sdk "github.com/line/lbm-sdk/types" + sdkerrors "github.com/line/lbm-sdk/types/errors" + wasmvmtypes "github.com/line/wasmvm/types" ) const ( @@ -128,10 +129,11 @@ func (c *ContractInfo) SetExtension(ext ContractInfoExtension) error { // ReadExtension copies the extension value to the pointer passed as argument so that there is no need to cast // For example with a custom extension of type `MyContractDetails` it will look as following: -// var d MyContractDetails -// if err := info.ReadExtension(&d); err != nil { -// return nil, sdkerrors.Wrap(err, "extension") -// } +// +// var d MyContractDetails +// if err := info.ReadExtension(&d); err != nil { +// return nil, sdkerrors.Wrap(err, "extension") +// } func (c *ContractInfo) ReadExtension(e ContractInfoExtension) error { rv := reflect.ValueOf(e) if rv.Kind() != reflect.Ptr || rv.IsNil() { diff --git a/x/wasm/types/types.pb.go b/x/wasm/types/types.pb.go index 05ff057a0d..f0764b5b23 100644 --- a/x/wasm/types/types.pb.go +++ b/x/wasm/types/types.pb.go @@ -6,24 +6,20 @@ package types import ( bytes "bytes" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - types "github.com/cosmos/cosmos-sdk/codec/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" + types "github.com/line/lbm-sdk/codec/types" + github_com_line_ostracon_libs_bytes "github.com/line/ostracon/libs/bytes" _ "github.com/regen-network/cosmos-proto" - github_com_tendermint_tendermint_libs_bytes "github.com/tendermint/tendermint/libs/bytes" + 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 - _ = math.Inf -) +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. @@ -110,11 +106,9 @@ func (*AccessTypeParam) ProtoMessage() {} func (*AccessTypeParam) Descriptor() ([]byte, []int) { return fileDescriptor_e6155d98fa173e02, []int{0} } - func (m *AccessTypeParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *AccessTypeParam) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_AccessTypeParam.Marshal(b, m, deterministic) @@ -127,15 +121,12 @@ func (m *AccessTypeParam) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } - func (m *AccessTypeParam) XXX_Merge(src proto.Message) { xxx_messageInfo_AccessTypeParam.Merge(m, src) } - func (m *AccessTypeParam) XXX_Size() int { return m.Size() } - func (m *AccessTypeParam) XXX_DiscardUnknown() { xxx_messageInfo_AccessTypeParam.DiscardUnknown(m) } @@ -154,11 +145,9 @@ func (*AccessConfig) ProtoMessage() {} func (*AccessConfig) Descriptor() ([]byte, []int) { return fileDescriptor_e6155d98fa173e02, []int{1} } - func (m *AccessConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *AccessConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_AccessConfig.Marshal(b, m, deterministic) @@ -171,15 +160,12 @@ func (m *AccessConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } - func (m *AccessConfig) XXX_Merge(src proto.Message) { xxx_messageInfo_AccessConfig.Merge(m, src) } - func (m *AccessConfig) XXX_Size() int { return m.Size() } - func (m *AccessConfig) XXX_DiscardUnknown() { xxx_messageInfo_AccessConfig.DiscardUnknown(m) } @@ -190,6 +176,9 @@ var xxx_messageInfo_AccessConfig proto.InternalMessageInfo type Params struct { CodeUploadAccess AccessConfig `protobuf:"bytes,1,opt,name=code_upload_access,json=codeUploadAccess,proto3" json:"code_upload_access" yaml:"code_upload_access"` InstantiateDefaultPermission AccessType `protobuf:"varint,2,opt,name=instantiate_default_permission,json=instantiateDefaultPermission,proto3,enum=cosmwasm.wasm.v1.AccessType" json:"instantiate_default_permission,omitempty" yaml:"instantiate_default_permission"` + GasMultiplier uint64 `protobuf:"varint,3,opt,name=gas_multiplier,json=gasMultiplier,proto3" json:"gas_multiplier,omitempty" yaml:"gas_multiplier"` + InstanceCost uint64 `protobuf:"varint,4,opt,name=instance_cost,json=instanceCost,proto3" json:"instance_cost,omitempty" yaml:"instance_cost"` + CompileCost uint64 `protobuf:"varint,5,opt,name=compile_cost,json=compileCost,proto3" json:"compile_cost,omitempty" yaml:"compile_cost"` } func (m *Params) Reset() { *m = Params{} } @@ -197,11 +186,9 @@ func (*Params) ProtoMessage() {} func (*Params) Descriptor() ([]byte, []int) { return fileDescriptor_e6155d98fa173e02, []int{2} } - 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) @@ -214,15 +201,12 @@ func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { 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) } @@ -245,11 +229,9 @@ func (*CodeInfo) ProtoMessage() {} func (*CodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor_e6155d98fa173e02, []int{3} } - func (m *CodeInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *CodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_CodeInfo.Marshal(b, m, deterministic) @@ -262,15 +244,12 @@ func (m *CodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } - func (m *CodeInfo) XXX_Merge(src proto.Message) { xxx_messageInfo_CodeInfo.Merge(m, src) } - func (m *CodeInfo) XXX_Size() int { return m.Size() } - func (m *CodeInfo) XXX_DiscardUnknown() { xxx_messageInfo_CodeInfo.DiscardUnknown(m) } @@ -303,11 +282,9 @@ func (*ContractInfo) ProtoMessage() {} func (*ContractInfo) Descriptor() ([]byte, []int) { return fileDescriptor_e6155d98fa173e02, []int{4} } - func (m *ContractInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *ContractInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_ContractInfo.Marshal(b, m, deterministic) @@ -320,15 +297,12 @@ func (m *ContractInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } - func (m *ContractInfo) XXX_Merge(src proto.Message) { xxx_messageInfo_ContractInfo.Merge(m, src) } - func (m *ContractInfo) XXX_Size() int { return m.Size() } - func (m *ContractInfo) XXX_DiscardUnknown() { xxx_messageInfo_ContractInfo.DiscardUnknown(m) } @@ -351,11 +325,9 @@ func (*ContractCodeHistoryEntry) ProtoMessage() {} func (*ContractCodeHistoryEntry) Descriptor() ([]byte, []int) { return fileDescriptor_e6155d98fa173e02, []int{5} } - func (m *ContractCodeHistoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *ContractCodeHistoryEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_ContractCodeHistoryEntry.Marshal(b, m, deterministic) @@ -368,15 +340,12 @@ func (m *ContractCodeHistoryEntry) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } - func (m *ContractCodeHistoryEntry) XXX_Merge(src proto.Message) { xxx_messageInfo_ContractCodeHistoryEntry.Merge(m, src) } - func (m *ContractCodeHistoryEntry) XXX_Size() int { return m.Size() } - func (m *ContractCodeHistoryEntry) XXX_DiscardUnknown() { xxx_messageInfo_ContractCodeHistoryEntry.DiscardUnknown(m) } @@ -399,11 +368,9 @@ func (*AbsoluteTxPosition) ProtoMessage() {} func (*AbsoluteTxPosition) Descriptor() ([]byte, []int) { return fileDescriptor_e6155d98fa173e02, []int{6} } - func (m *AbsoluteTxPosition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *AbsoluteTxPosition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_AbsoluteTxPosition.Marshal(b, m, deterministic) @@ -416,15 +383,12 @@ func (m *AbsoluteTxPosition) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } - func (m *AbsoluteTxPosition) XXX_Merge(src proto.Message) { xxx_messageInfo_AbsoluteTxPosition.Merge(m, src) } - func (m *AbsoluteTxPosition) XXX_Size() int { return m.Size() } - func (m *AbsoluteTxPosition) XXX_DiscardUnknown() { xxx_messageInfo_AbsoluteTxPosition.DiscardUnknown(m) } @@ -434,7 +398,7 @@ var xxx_messageInfo_AbsoluteTxPosition proto.InternalMessageInfo // Model is a struct that holds a KV pair type Model struct { // hex-encode key to read it better (this is often ascii) - Key github_com_tendermint_tendermint_libs_bytes.HexBytes `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/tendermint/tendermint/libs/bytes.HexBytes" json:"key,omitempty"` + Key github_com_line_ostracon_libs_bytes.HexBytes `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/line/ostracon/libs/bytes.HexBytes" json:"key,omitempty"` // base64-encode raw value Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } @@ -445,11 +409,9 @@ func (*Model) ProtoMessage() {} func (*Model) Descriptor() ([]byte, []int) { return fileDescriptor_e6155d98fa173e02, []int{7} } - func (m *Model) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } - func (m *Model) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_Model.Marshal(b, m, deterministic) @@ -462,15 +424,12 @@ func (m *Model) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } - func (m *Model) XXX_Merge(src proto.Message) { xxx_messageInfo_Model.Merge(m, src) } - func (m *Model) XXX_Size() int { return m.Size() } - func (m *Model) XXX_DiscardUnknown() { xxx_messageInfo_Model.DiscardUnknown(m) } @@ -493,78 +452,83 @@ func init() { func init() { proto.RegisterFile("cosmwasm/wasm/v1/types.proto", fileDescriptor_e6155d98fa173e02) } var fileDescriptor_e6155d98fa173e02 = []byte{ - // 1123 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xcd, 0x8f, 0xdb, 0x44, - 0x14, 0x8f, 0x93, 0xec, 0xd7, 0x34, 0x14, 0x77, 0xd8, 0xa5, 0x49, 0xa8, 0x9c, 0xd4, 0x14, 0xd8, - 0x7e, 0x25, 0x74, 0x41, 0x80, 0x7a, 0xa8, 0x94, 0x0f, 0xd3, 0xb8, 0x62, 0x93, 0x68, 0x92, 0x52, - 0x2d, 0x52, 0x65, 0x39, 0xf6, 0x6c, 0x62, 0xd5, 0xf1, 0x44, 0x9e, 0xc9, 0x36, 0xfe, 0x0f, 0x50, - 0x24, 0x04, 0x37, 0xb8, 0x44, 0x42, 0x80, 0x50, 0xff, 0x00, 0xae, 0xdc, 0x2b, 0x4e, 0x3d, 0x72, - 0x8a, 0x20, 0xbd, 0xc0, 0x75, 0x8f, 0xe5, 0x82, 0x3c, 0x93, 0x10, 0xab, 0xdd, 0x76, 0xc3, 0xc5, - 0xf2, 0xbc, 0xf7, 0x7e, 0xbf, 0xf7, 0xde, 0x6f, 0xde, 0xb3, 0x0c, 0x2e, 0x58, 0x84, 0xf6, 0x1f, - 0x9a, 0xb4, 0x5f, 0xe4, 0x8f, 0xa3, 0x1b, 0x45, 0x16, 0x0c, 0x30, 0x2d, 0x0c, 0x7c, 0xc2, 0x08, - 0x94, 0x17, 0xde, 0x02, 0x7f, 0x1c, 0xdd, 0xc8, 0x66, 0x42, 0x0b, 0xa1, 0x06, 0xf7, 0x17, 0xc5, - 0x41, 0x04, 0x67, 0xb7, 0xbb, 0xa4, 0x4b, 0x84, 0x3d, 0x7c, 0x9b, 0x5b, 0x33, 0x5d, 0x42, 0xba, - 0x2e, 0x2e, 0xf2, 0x53, 0x67, 0x78, 0x58, 0x34, 0xbd, 0x40, 0xb8, 0xd4, 0xfb, 0xe0, 0xf5, 0x92, - 0x65, 0x61, 0x4a, 0xdb, 0xc1, 0x00, 0x37, 0x4d, 0xdf, 0xec, 0xc3, 0x2a, 0x58, 0x3b, 0x32, 0xdd, - 0x21, 0x4e, 0x4b, 0x79, 0x69, 0xf7, 0xec, 0xde, 0x85, 0xc2, 0xf3, 0x05, 0x14, 0x96, 0x88, 0xb2, - 0x7c, 0x3c, 0xcd, 0xa5, 0x02, 0xb3, 0xef, 0xde, 0x54, 0x39, 0x48, 0x45, 0x02, 0x7c, 0x33, 0xf9, - 0xdd, 0xf7, 0x39, 0x49, 0xfd, 0x56, 0x02, 0x29, 0x11, 0x5d, 0x21, 0xde, 0xa1, 0xd3, 0x85, 0x2d, - 0x00, 0x06, 0xd8, 0xef, 0x3b, 0x94, 0x3a, 0xc4, 0x5b, 0x29, 0xc3, 0xce, 0xf1, 0x34, 0x77, 0x4e, - 0x64, 0x58, 0x22, 0x55, 0x14, 0xa1, 0x81, 0xd7, 0xc0, 0x86, 0x69, 0xdb, 0x3e, 0xa6, 0x34, 0x1d, - 0xcf, 0x4b, 0xbb, 0x5b, 0x65, 0x78, 0x3c, 0xcd, 0x9d, 0x15, 0x98, 0xb9, 0x43, 0x45, 0x8b, 0x90, - 0x79, 0x65, 0x5f, 0xc7, 0xc1, 0x3a, 0xef, 0x97, 0x42, 0x02, 0xa0, 0x45, 0x6c, 0x6c, 0x0c, 0x07, - 0x2e, 0x31, 0x6d, 0xc3, 0xe4, 0xb9, 0x79, 0x6d, 0x67, 0xf6, 0x94, 0x97, 0xd5, 0x26, 0xfa, 0x29, - 0x5f, 0x7c, 0x3c, 0xcd, 0xc5, 0x8e, 0xa7, 0xb9, 0x8c, 0xc8, 0xf6, 0x22, 0x8f, 0x8a, 0xe4, 0xd0, - 0x78, 0x97, 0xdb, 0x04, 0x14, 0x7e, 0x25, 0x01, 0xc5, 0xf1, 0x28, 0x33, 0x3d, 0xe6, 0x98, 0x0c, - 0x1b, 0x36, 0x3e, 0x34, 0x87, 0x2e, 0x33, 0x22, 0xca, 0xc4, 0x57, 0x50, 0xe6, 0xf2, 0xf1, 0x34, - 0xf7, 0x8e, 0xc8, 0xfb, 0x6a, 0x36, 0x15, 0x5d, 0x88, 0x04, 0x54, 0x85, 0xbf, 0xf9, 0x9f, 0x9b, - 0x2b, 0x12, 0x53, 0x7f, 0x90, 0xc0, 0x66, 0x85, 0xd8, 0x58, 0xf7, 0x0e, 0x09, 0x7c, 0x0b, 0x6c, - 0xf1, 0x5e, 0x7a, 0x26, 0xed, 0x71, 0x29, 0x52, 0x68, 0x33, 0x34, 0xd4, 0x4c, 0xda, 0x83, 0x69, - 0xb0, 0x61, 0xf9, 0xd8, 0x64, 0xc4, 0x17, 0x7a, 0xa3, 0xc5, 0x11, 0xb6, 0x00, 0x8c, 0x96, 0x62, - 0x71, 0x91, 0xd2, 0x6b, 0x2b, 0x49, 0x99, 0x0c, 0xa5, 0x44, 0xe7, 0x22, 0x78, 0xe1, 0xb8, 0x93, - 0xdc, 0x4c, 0xc8, 0xc9, 0x3b, 0xc9, 0xcd, 0xa4, 0xbc, 0xa6, 0xfe, 0x1a, 0x07, 0xa9, 0x0a, 0xf1, - 0x98, 0x6f, 0x5a, 0x8c, 0x17, 0xfa, 0x36, 0xd8, 0xe0, 0x85, 0x3a, 0x36, 0x2f, 0x33, 0x59, 0x06, - 0xb3, 0x69, 0x6e, 0x9d, 0xf7, 0x51, 0x45, 0xeb, 0xa1, 0x4b, 0xb7, 0x5f, 0x51, 0xf0, 0x36, 0x58, - 0x33, 0xed, 0xbe, 0xe3, 0xa5, 0x13, 0xdc, 0x2e, 0x0e, 0xa1, 0xd5, 0x35, 0x3b, 0xd8, 0x4d, 0x27, - 0x85, 0x95, 0x1f, 0xe0, 0xad, 0x39, 0x0b, 0xb6, 0xe7, 0x1d, 0x5d, 0x3a, 0xa1, 0xa3, 0x0e, 0x25, - 0xee, 0x90, 0xe1, 0xf6, 0xa8, 0x49, 0xa8, 0xc3, 0x1c, 0xe2, 0xa1, 0x05, 0x08, 0x5e, 0x07, 0x67, - 0x9c, 0x8e, 0x65, 0x0c, 0x88, 0xcf, 0xc2, 0x72, 0xd7, 0xf9, 0xa8, 0xbe, 0x36, 0x9b, 0xe6, 0xb6, - 0xf4, 0x72, 0xa5, 0x49, 0x7c, 0xa6, 0x57, 0xd1, 0x96, 0xd3, 0xb1, 0xf8, 0xab, 0x0d, 0xf7, 0xc1, - 0x16, 0x1e, 0x31, 0xec, 0xf1, 0x79, 0xd8, 0xe0, 0x09, 0xb7, 0x0b, 0x62, 0x93, 0x0b, 0x8b, 0x4d, - 0x2e, 0x94, 0xbc, 0xa0, 0x9c, 0xf9, 0xed, 0x97, 0xeb, 0x3b, 0x51, 0x51, 0xb4, 0x05, 0x0c, 0x2d, - 0x19, 0x6e, 0x26, 0xff, 0x0a, 0xc7, 0xfe, 0x1f, 0x09, 0xa4, 0x17, 0xa1, 0xa1, 0x48, 0x35, 0x87, - 0x32, 0xe2, 0x07, 0x9a, 0xc7, 0xfc, 0x00, 0x36, 0xc1, 0x16, 0x19, 0x60, 0xdf, 0x64, 0xcb, 0xdd, - 0xdc, 0x7b, 0xb1, 0xc5, 0x13, 0xe0, 0x8d, 0x05, 0x2a, 0x9c, 0x4b, 0xb4, 0x24, 0x89, 0xde, 0x4e, - 0xfc, 0xa5, 0xb7, 0x73, 0x0b, 0x6c, 0x0c, 0x07, 0x36, 0xd7, 0x35, 0xf1, 0x7f, 0x74, 0x9d, 0x83, - 0xe0, 0x2e, 0x48, 0xf4, 0x69, 0x97, 0xdf, 0x55, 0xaa, 0xfc, 0xe6, 0xb3, 0x69, 0x0e, 0x22, 0xf3, - 0xe1, 0xa2, 0xca, 0x7d, 0x4c, 0xa9, 0xd9, 0xc5, 0x28, 0x0c, 0x51, 0x11, 0x80, 0x2f, 0x12, 0xc1, - 0x8b, 0x20, 0xd5, 0x71, 0x89, 0xf5, 0xc0, 0xe8, 0x61, 0xa7, 0xdb, 0x63, 0x62, 0x8e, 0xd0, 0x19, - 0x6e, 0xab, 0x71, 0x13, 0xcc, 0x80, 0x4d, 0x36, 0x32, 0x1c, 0xcf, 0xc6, 0x23, 0xd1, 0x08, 0xda, - 0x60, 0x23, 0x3d, 0x3c, 0xaa, 0x0e, 0x58, 0xdb, 0x27, 0x36, 0x76, 0xe1, 0x1d, 0x90, 0x78, 0x80, - 0x03, 0xb1, 0x2c, 0xe5, 0x4f, 0x9e, 0x4d, 0x73, 0x1f, 0x76, 0x1d, 0xd6, 0x1b, 0x76, 0x0a, 0x16, - 0xe9, 0x17, 0x19, 0xf6, 0xec, 0x70, 0xe1, 0x3c, 0x16, 0x7d, 0x75, 0x9d, 0x0e, 0x2d, 0x76, 0x02, - 0x86, 0x69, 0xa1, 0x86, 0x47, 0xe5, 0xf0, 0x05, 0x85, 0x24, 0xe1, 0x00, 0x8a, 0x6f, 0x70, 0x9c, - 0xaf, 0x9e, 0x38, 0x5c, 0xf9, 0x5b, 0x02, 0x60, 0xb9, 0xff, 0xf0, 0x23, 0x70, 0xbe, 0x54, 0xa9, - 0x68, 0xad, 0x96, 0xd1, 0x3e, 0x68, 0x6a, 0xc6, 0xdd, 0x7a, 0xab, 0xa9, 0x55, 0xf4, 0x4f, 0x75, - 0xad, 0x2a, 0xc7, 0xb2, 0x99, 0xf1, 0x24, 0xbf, 0xb3, 0x0c, 0xbe, 0xeb, 0xd1, 0x01, 0xb6, 0x9c, - 0x43, 0x07, 0xdb, 0xf0, 0x1a, 0x80, 0x51, 0x5c, 0xbd, 0x51, 0x6e, 0x54, 0x0f, 0x64, 0x29, 0xbb, - 0x3d, 0x9e, 0xe4, 0xe5, 0x25, 0xa4, 0x4e, 0x3a, 0xc4, 0x0e, 0xe0, 0xc7, 0x20, 0x1d, 0x8d, 0x6e, - 0xd4, 0x3f, 0x3b, 0x30, 0x4a, 0xd5, 0x2a, 0xd2, 0x5a, 0x2d, 0x39, 0xfe, 0x7c, 0x9a, 0x86, 0xe7, - 0x06, 0x25, 0xf1, 0x9d, 0x85, 0x7b, 0x60, 0x27, 0x0a, 0xd4, 0x3e, 0xd7, 0xd0, 0x01, 0xcf, 0x94, - 0xc8, 0x9e, 0x1f, 0x4f, 0xf2, 0x6f, 0x2c, 0x51, 0xda, 0x11, 0xf6, 0x83, 0x30, 0x59, 0x76, 0xf3, - 0xcb, 0x1f, 0x95, 0xd8, 0xa3, 0x9f, 0x94, 0xd8, 0x95, 0x9f, 0x13, 0x20, 0x7f, 0xda, 0xa4, 0x41, - 0x0c, 0xde, 0xaf, 0x34, 0xea, 0x6d, 0x54, 0xaa, 0xb4, 0x8d, 0x4a, 0xa3, 0xaa, 0x19, 0x35, 0xbd, - 0xd5, 0x6e, 0xa0, 0x03, 0xa3, 0xd1, 0xd4, 0x50, 0xa9, 0xad, 0x37, 0xea, 0x27, 0x49, 0x53, 0x1c, - 0x4f, 0xf2, 0x57, 0x4f, 0xe3, 0x8e, 0x0a, 0x76, 0x0f, 0x5c, 0x5e, 0x29, 0x8d, 0x5e, 0xd7, 0xdb, - 0xb2, 0x94, 0xdd, 0x1d, 0x4f, 0xf2, 0x97, 0x4e, 0xe3, 0xd7, 0x3d, 0x87, 0xc1, 0xfb, 0xe0, 0xda, - 0x4a, 0xc4, 0xfb, 0xfa, 0x6d, 0x54, 0x6a, 0x6b, 0x72, 0x3c, 0x7b, 0x75, 0x3c, 0xc9, 0xbf, 0x77, - 0x1a, 0xf7, 0xbe, 0xd3, 0xf5, 0x4d, 0x86, 0x57, 0xa6, 0xbf, 0xad, 0xd5, 0xb5, 0x96, 0xde, 0x92, - 0x13, 0xab, 0xd1, 0xdf, 0xc6, 0x1e, 0xa6, 0x0e, 0xcd, 0x26, 0xc3, 0xcb, 0x2a, 0xd7, 0x1e, 0xff, - 0xa9, 0xc4, 0x1e, 0xcd, 0x14, 0xe9, 0xf1, 0x4c, 0x91, 0x9e, 0xcc, 0x14, 0xe9, 0x8f, 0x99, 0x22, - 0x7d, 0xf3, 0x54, 0x89, 0x3d, 0x79, 0xaa, 0xc4, 0x7e, 0x7f, 0xaa, 0xc4, 0xbe, 0x78, 0x37, 0xb2, - 0x07, 0x15, 0x42, 0xfb, 0xf7, 0x16, 0xbf, 0x3a, 0x76, 0x71, 0x24, 0x7e, 0x79, 0xf8, 0xff, 0x4e, - 0x67, 0x9d, 0x7f, 0xd5, 0x3e, 0xf8, 0x37, 0x00, 0x00, 0xff, 0xff, 0x21, 0x8c, 0xa0, 0x70, 0x10, - 0x09, 0x00, 0x00, + // 1213 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x4d, 0x6f, 0x1b, 0x45, + 0x18, 0xf6, 0xda, 0xce, 0x87, 0x27, 0x6e, 0x71, 0xa7, 0x09, 0xb5, 0x4d, 0xe5, 0x75, 0x97, 0x22, + 0xd2, 0x36, 0xb5, 0xdb, 0x20, 0x81, 0x14, 0x89, 0x0a, 0xaf, 0xbd, 0x34, 0x5b, 0x11, 0xdb, 0x1a, + 0xbb, 0xa0, 0x20, 0x55, 0xab, 0xf5, 0xee, 0xc4, 0x19, 0x75, 0xbd, 0x63, 0xed, 0x8c, 0x53, 0xfb, + 0x1f, 0xa0, 0x48, 0x48, 0xdc, 0xe0, 0x12, 0x09, 0x01, 0x42, 0xfd, 0x01, 0x5c, 0xb9, 0x57, 0x88, + 0x43, 0x8f, 0x9c, 0x56, 0x90, 0x5e, 0xe0, 0xea, 0x63, 0xb9, 0xa0, 0x9d, 0xb1, 0xb1, 0x69, 0xd3, + 0x26, 0x5c, 0x56, 0xfb, 0x7e, 0x3c, 0xcf, 0xfb, 0x39, 0xb3, 0x0b, 0x2e, 0x3b, 0x94, 0xf5, 0x1e, + 0xd9, 0xac, 0x57, 0x16, 0x8f, 0x83, 0xdb, 0x65, 0x3e, 0xea, 0x63, 0x56, 0xea, 0x07, 0x94, 0x53, + 0x98, 0x99, 0x5a, 0x4b, 0xe2, 0x71, 0x70, 0x3b, 0x9f, 0x8b, 0x34, 0x94, 0x59, 0xc2, 0x5e, 0x96, + 0x82, 0x74, 0xce, 0xaf, 0x76, 0x69, 0x97, 0x4a, 0x7d, 0xf4, 0x36, 0xd1, 0xe6, 0xba, 0x94, 0x76, + 0x3d, 0x5c, 0x16, 0x52, 0x67, 0xb0, 0x57, 0xb6, 0xfd, 0x91, 0x34, 0x69, 0x0f, 0xc0, 0x1b, 0x15, + 0xc7, 0xc1, 0x8c, 0xb5, 0x47, 0x7d, 0xdc, 0xb4, 0x03, 0xbb, 0x07, 0x6b, 0x60, 0xe1, 0xc0, 0xf6, + 0x06, 0x38, 0xab, 0x14, 0x95, 0xf5, 0xf3, 0x9b, 0x97, 0x4b, 0x2f, 0x26, 0x50, 0x9a, 0x21, 0xf4, + 0xcc, 0x38, 0x54, 0xd3, 0x23, 0xbb, 0xe7, 0x6d, 0x69, 0x02, 0xa4, 0x21, 0x09, 0xde, 0x4a, 0x7e, + 0xf3, 0xad, 0xaa, 0x68, 0x5f, 0x2b, 0x20, 0x2d, 0xbd, 0xab, 0xd4, 0xdf, 0x23, 0x5d, 0xd8, 0x02, + 0xa0, 0x8f, 0x83, 0x1e, 0x61, 0x8c, 0x50, 0xff, 0x4c, 0x11, 0xd6, 0xc6, 0xa1, 0x7a, 0x41, 0x46, + 0x98, 0x21, 0x35, 0x34, 0x47, 0x03, 0x37, 0xc0, 0x92, 0xed, 0xba, 0x01, 0x66, 0x2c, 0x1b, 0x2f, + 0x2a, 0xeb, 0x29, 0x1d, 0x8e, 0x43, 0xf5, 0xbc, 0xc4, 0x4c, 0x0c, 0x1a, 0x9a, 0xba, 0x4c, 0x32, + 0xfb, 0x35, 0x01, 0x16, 0x45, 0xbd, 0x0c, 0x52, 0x00, 0x1d, 0xea, 0x62, 0x6b, 0xd0, 0xf7, 0xa8, + 0xed, 0x5a, 0xb6, 0x88, 0x2d, 0x72, 0x5b, 0xd9, 0x2c, 0xbc, 0x2a, 0x37, 0x59, 0x8f, 0x7e, 0xe5, + 0x49, 0xa8, 0xc6, 0xc6, 0xa1, 0x9a, 0x93, 0xd1, 0x5e, 0xe6, 0xd1, 0x50, 0x26, 0x52, 0xde, 0x17, + 0x3a, 0x09, 0x85, 0x5f, 0x2a, 0xa0, 0x40, 0x7c, 0xc6, 0x6d, 0x9f, 0x13, 0x9b, 0x63, 0xcb, 0xc5, + 0x7b, 0xf6, 0xc0, 0xe3, 0xd6, 0x5c, 0x67, 0xe2, 0x67, 0xe8, 0xcc, 0xb5, 0x71, 0xa8, 0xbe, 0x23, + 0xe3, 0xbe, 0x9e, 0x4d, 0x43, 0x97, 0xe7, 0x1c, 0x6a, 0xd2, 0xde, 0x9c, 0xf5, 0xef, 0x23, 0x70, + 0xbe, 0x6b, 0x33, 0xab, 0x37, 0xf0, 0x38, 0xe9, 0x7b, 0x04, 0x07, 0xd9, 0x44, 0x51, 0x59, 0x4f, + 0xea, 0xb9, 0x71, 0xa8, 0xae, 0xc9, 0x00, 0xff, 0xb5, 0x6b, 0xe8, 0x5c, 0xd7, 0x66, 0x3b, 0xff, + 0xca, 0xf0, 0x43, 0x70, 0x4e, 0x46, 0x70, 0xb0, 0xe5, 0x50, 0xc6, 0xb3, 0x49, 0x41, 0x90, 0x1d, + 0x87, 0xea, 0xea, 0x7c, 0x86, 0x13, 0xb3, 0x86, 0xd2, 0x53, 0xb9, 0x4a, 0x19, 0x87, 0x5b, 0x20, + 0xed, 0xd0, 0x5e, 0x9f, 0x78, 0x13, 0xf4, 0x82, 0x40, 0x5f, 0x1a, 0x87, 0xea, 0xc5, 0x69, 0x5f, + 0x67, 0x56, 0x0d, 0xad, 0x4c, 0xc4, 0x08, 0x2b, 0xc6, 0x19, 0xd3, 0xbe, 0x53, 0xc0, 0x72, 0x95, + 0xba, 0xd8, 0xf4, 0xf7, 0x28, 0x7c, 0x0b, 0xa4, 0xc4, 0x20, 0xf6, 0x6d, 0xb6, 0x2f, 0xe6, 0x98, + 0x46, 0xcb, 0x91, 0x62, 0xdb, 0x66, 0xfb, 0x30, 0x0b, 0x96, 0x9c, 0x00, 0xdb, 0x9c, 0x06, 0x72, + 0x59, 0xd0, 0x54, 0x84, 0x2d, 0x00, 0xe7, 0xfb, 0xe8, 0x88, 0x09, 0x8b, 0x5c, 0x4e, 0xdf, 0x83, + 0x64, 0xb4, 0x07, 0xe8, 0xc2, 0x1c, 0x5e, 0x1a, 0xee, 0x25, 0x97, 0x13, 0x99, 0xe4, 0xbd, 0xe4, + 0x72, 0x32, 0xb3, 0xa0, 0xfd, 0x1c, 0x07, 0xe9, 0x2a, 0xf5, 0x79, 0x60, 0x3b, 0x5c, 0x24, 0xfa, + 0x36, 0x58, 0x12, 0x89, 0x12, 0x57, 0xa4, 0x99, 0xd4, 0xc1, 0x71, 0xa8, 0x2e, 0x8a, 0x3a, 0x6a, + 0x68, 0x31, 0x32, 0x99, 0xee, 0x6b, 0x12, 0x5e, 0x05, 0x0b, 0xb6, 0xdb, 0x23, 0xbe, 0x18, 0x57, + 0x0a, 0x49, 0x21, 0xd2, 0x7a, 0x76, 0x07, 0x7b, 0x62, 0x06, 0x29, 0x24, 0x05, 0x78, 0x67, 0xc2, + 0x82, 0xdd, 0x49, 0x45, 0x57, 0x4f, 0xa8, 0xa8, 0xc3, 0xa8, 0x37, 0xe0, 0xb8, 0x3d, 0x6c, 0x52, + 0x46, 0x38, 0xa1, 0x3e, 0x9a, 0x82, 0xe0, 0x4d, 0xb0, 0x42, 0x3a, 0x8e, 0xd5, 0xa7, 0x01, 0x8f, + 0xd2, 0x5d, 0x14, 0xe7, 0xec, 0xdc, 0x71, 0xa8, 0xa6, 0x4c, 0xbd, 0xda, 0xa4, 0x01, 0x37, 0x6b, + 0x28, 0x45, 0x3a, 0x8e, 0x78, 0x75, 0xe1, 0x0e, 0x48, 0xe1, 0x21, 0xc7, 0xbe, 0x58, 0xe6, 0x25, + 0x11, 0x70, 0xb5, 0x24, 0xaf, 0xa1, 0xd2, 0xf4, 0x1a, 0x2a, 0x55, 0xfc, 0x91, 0x9e, 0xfb, 0xe5, + 0xa7, 0x9b, 0x6b, 0xf3, 0x4d, 0x31, 0xa6, 0x30, 0x34, 0x63, 0xd8, 0x4a, 0xfe, 0x19, 0x9d, 0xd9, + 0xbf, 0x15, 0x90, 0x9d, 0xba, 0x46, 0x4d, 0xda, 0x26, 0x8c, 0xd3, 0x60, 0x64, 0xf8, 0x3c, 0x18, + 0xc1, 0x26, 0x48, 0xd1, 0x3e, 0x0e, 0x6c, 0x3e, 0xbb, 0x58, 0x36, 0x5f, 0x2e, 0xf1, 0x04, 0x78, + 0x63, 0x8a, 0x8a, 0x0e, 0x15, 0x9a, 0x91, 0xcc, 0x4f, 0x27, 0xfe, 0xca, 0xe9, 0xdc, 0x01, 0x4b, + 0x83, 0xbe, 0x2b, 0xfa, 0x9a, 0xf8, 0x3f, 0x7d, 0x9d, 0x80, 0xe0, 0x3a, 0x48, 0xf4, 0x58, 0x57, + 0xcc, 0x2a, 0xad, 0xbf, 0xf9, 0x3c, 0x54, 0x21, 0xb2, 0x1f, 0x4d, 0xb3, 0xdc, 0xc1, 0x8c, 0xd9, + 0x5d, 0x8c, 0x22, 0x17, 0x0d, 0x01, 0xf8, 0x32, 0x11, 0xbc, 0x02, 0xd2, 0x1d, 0x8f, 0x3a, 0x0f, + 0xad, 0x7d, 0x4c, 0xba, 0xfb, 0x5c, 0xee, 0x11, 0x5a, 0x11, 0xba, 0x6d, 0xa1, 0x82, 0x39, 0xb0, + 0xcc, 0x87, 0x16, 0xf1, 0x5d, 0x3c, 0x94, 0x85, 0xa0, 0x25, 0x3e, 0x34, 0x23, 0x51, 0xb3, 0xc1, + 0xc2, 0x0e, 0x75, 0xb1, 0x07, 0x75, 0x90, 0x78, 0x88, 0x47, 0xf2, 0xb0, 0xe8, 0xb7, 0x9e, 0x87, + 0xea, 0x46, 0x97, 0xf0, 0xfd, 0x41, 0xa7, 0xe4, 0xd0, 0x5e, 0xd9, 0x23, 0x3e, 0x2e, 0x53, 0x16, + 0xa5, 0x44, 0xfd, 0xb2, 0x47, 0x3a, 0xac, 0xdc, 0x19, 0x71, 0xcc, 0x4a, 0xdb, 0x78, 0xa8, 0x47, + 0x2f, 0x28, 0x02, 0x47, 0x8b, 0x27, 0x3f, 0x1c, 0x71, 0x71, 0xe4, 0xa4, 0x70, 0xfd, 0x2f, 0x05, + 0x80, 0xd9, 0xa5, 0x05, 0xdf, 0x07, 0x97, 0x2a, 0xd5, 0xaa, 0xd1, 0x6a, 0x59, 0xed, 0xdd, 0xa6, + 0x61, 0xdd, 0xaf, 0xb7, 0x9a, 0x46, 0xd5, 0xfc, 0xd8, 0x34, 0x6a, 0x99, 0x58, 0x3e, 0x77, 0x78, + 0x54, 0x5c, 0x9b, 0x39, 0xdf, 0xf7, 0x59, 0x1f, 0x3b, 0x64, 0x8f, 0x60, 0x17, 0x6e, 0x00, 0x38, + 0x8f, 0xab, 0x37, 0xf4, 0x46, 0x6d, 0x37, 0xa3, 0xe4, 0x57, 0x0f, 0x8f, 0x8a, 0x99, 0x19, 0xa4, + 0x4e, 0x3b, 0xd4, 0x1d, 0xc1, 0x0f, 0x40, 0x76, 0xde, 0xbb, 0x51, 0xff, 0x64, 0xd7, 0xaa, 0xd4, + 0x6a, 0xc8, 0x68, 0xb5, 0x32, 0xf1, 0x17, 0xc3, 0x34, 0x7c, 0x6f, 0x54, 0x91, 0x1f, 0x07, 0xb8, + 0x09, 0xd6, 0xe6, 0x81, 0xc6, 0xa7, 0x06, 0xda, 0x15, 0x91, 0x12, 0xf9, 0x4b, 0x87, 0x47, 0xc5, + 0x8b, 0x33, 0x94, 0x71, 0x80, 0x83, 0x51, 0x14, 0x2c, 0xbf, 0xfc, 0xc5, 0xf7, 0x85, 0xd8, 0xe3, + 0x1f, 0x0a, 0xb1, 0xeb, 0x3f, 0x26, 0x40, 0xf1, 0xb4, 0x0d, 0x83, 0x18, 0xdc, 0xaa, 0x36, 0xea, + 0x6d, 0x54, 0xa9, 0xb6, 0xad, 0x6a, 0xa3, 0x66, 0x58, 0xdb, 0x66, 0xab, 0xdd, 0x40, 0xbb, 0x56, + 0xa3, 0x69, 0xa0, 0x4a, 0xdb, 0x6c, 0xd4, 0x4f, 0x6a, 0x4d, 0xf9, 0xf0, 0xa8, 0x78, 0xe3, 0x34, + 0xee, 0xf9, 0x86, 0x7d, 0x06, 0xae, 0x9d, 0x29, 0x8c, 0x59, 0x37, 0xdb, 0x19, 0x25, 0xbf, 0x7e, + 0x78, 0x54, 0xbc, 0x7a, 0x1a, 0xbf, 0xe9, 0x13, 0x0e, 0x1f, 0x80, 0x8d, 0x33, 0x11, 0xef, 0x98, + 0x77, 0x51, 0xa5, 0x6d, 0x64, 0xe2, 0xf9, 0x1b, 0x87, 0x47, 0xc5, 0x77, 0x4f, 0xe3, 0xde, 0x21, + 0xdd, 0xc0, 0xe6, 0xf8, 0xcc, 0xf4, 0x77, 0x8d, 0xba, 0xd1, 0x32, 0x5b, 0x99, 0xc4, 0xd9, 0xe8, + 0xef, 0x62, 0x1f, 0x33, 0xc2, 0xf2, 0xc9, 0x68, 0x58, 0x7a, 0xed, 0xc9, 0x1f, 0x85, 0xd8, 0xe3, + 0xe3, 0x82, 0xf2, 0xe4, 0xb8, 0xa0, 0x3c, 0x3d, 0x2e, 0x28, 0xbf, 0x1f, 0x17, 0x94, 0xaf, 0x9e, + 0x15, 0x62, 0x4f, 0x9f, 0x15, 0x62, 0xbf, 0x3d, 0x2b, 0xc4, 0x3e, 0xd7, 0x5e, 0xdc, 0xff, 0xe8, + 0x30, 0xbb, 0xe5, 0xa1, 0xfc, 0x47, 0x13, 0x3f, 0x68, 0x9d, 0x45, 0x71, 0x93, 0xbd, 0xf7, 0x4f, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xc4, 0xff, 0xd0, 0xc1, 0xc1, 0x09, 0x00, 0x00, } func (this *AccessTypeParam) Equal(that interface{}) bool { @@ -591,7 +555,6 @@ func (this *AccessTypeParam) Equal(that interface{}) bool { } return true } - func (this *AccessConfig) Equal(that interface{}) bool { if that == nil { return this == nil @@ -619,7 +582,6 @@ func (this *AccessConfig) Equal(that interface{}) bool { } return true } - func (this *Params) Equal(that interface{}) bool { if that == nil { return this == nil @@ -645,9 +607,17 @@ func (this *Params) Equal(that interface{}) bool { if this.InstantiateDefaultPermission != that1.InstantiateDefaultPermission { return false } + if this.GasMultiplier != that1.GasMultiplier { + return false + } + if this.InstanceCost != that1.InstanceCost { + return false + } + if this.CompileCost != that1.CompileCost { + return false + } return true } - func (this *CodeInfo) Equal(that interface{}) bool { if that == nil { return this == nil @@ -678,7 +648,6 @@ func (this *CodeInfo) Equal(that interface{}) bool { } return true } - func (this *ContractInfo) Equal(that interface{}) bool { if that == nil { return this == nil @@ -721,7 +690,6 @@ func (this *ContractInfo) Equal(that interface{}) bool { } return true } - func (this *ContractCodeHistoryEntry) Equal(that interface{}) bool { if that == nil { return this == nil @@ -755,7 +723,6 @@ func (this *ContractCodeHistoryEntry) Equal(that interface{}) bool { } return true } - func (this *AbsoluteTxPosition) Equal(that interface{}) bool { if that == nil { return this == nil @@ -783,7 +750,6 @@ func (this *AbsoluteTxPosition) Equal(that interface{}) bool { } return true } - func (this *Model) Equal(that interface{}) bool { if that == nil { return this == nil @@ -811,7 +777,6 @@ func (this *Model) Equal(that interface{}) bool { } return true } - func (m *AccessTypeParam) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -895,6 +860,21 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.CompileCost != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.CompileCost)) + i-- + dAtA[i] = 0x28 + } + if m.InstanceCost != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.InstanceCost)) + i-- + dAtA[i] = 0x20 + } + if m.GasMultiplier != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.GasMultiplier)) + i-- + dAtA[i] = 0x18 + } if m.InstantiateDefaultPermission != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.InstantiateDefaultPermission)) i-- @@ -1173,7 +1153,6 @@ func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } - func (m *AccessTypeParam) Size() (n int) { if m == nil { return 0 @@ -1213,6 +1192,15 @@ func (m *Params) Size() (n int) { if m.InstantiateDefaultPermission != 0 { n += 1 + sovTypes(uint64(m.InstantiateDefaultPermission)) } + if m.GasMultiplier != 0 { + n += 1 + sovTypes(uint64(m.GasMultiplier)) + } + if m.InstanceCost != 0 { + n += 1 + sovTypes(uint64(m.InstanceCost)) + } + if m.CompileCost != 0 { + n += 1 + sovTypes(uint64(m.CompileCost)) + } return n } @@ -1329,11 +1317,9 @@ func (m *Model) Size() (n int) { func sovTypes(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } - func sozTypes(x uint64) (n int) { return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } - func (m *AccessTypeParam) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1403,7 +1389,6 @@ func (m *AccessTypeParam) Unmarshal(dAtA []byte) error { } return nil } - func (m *AccessConfig) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1505,7 +1490,6 @@ func (m *AccessConfig) Unmarshal(dAtA []byte) error { } return nil } - func (m *Params) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1587,6 +1571,63 @@ func (m *Params) Unmarshal(dAtA []byte) error { break } } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasMultiplier", wireType) + } + m.GasMultiplier = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasMultiplier |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InstanceCost", wireType) + } + m.InstanceCost = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.InstanceCost |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CompileCost", wireType) + } + m.CompileCost = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CompileCost |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -1608,7 +1649,6 @@ func (m *Params) Unmarshal(dAtA []byte) error { } return nil } - func (m *CodeInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1758,7 +1798,6 @@ func (m *CodeInfo) Unmarshal(dAtA []byte) error { } return nil } - func (m *ContractInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2028,7 +2067,6 @@ func (m *ContractInfo) Unmarshal(dAtA []byte) error { } return nil } - func (m *ContractCodeHistoryEntry) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2187,7 +2225,6 @@ func (m *ContractCodeHistoryEntry) Unmarshal(dAtA []byte) error { } return nil } - func (m *AbsoluteTxPosition) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2276,7 +2313,6 @@ func (m *AbsoluteTxPosition) Unmarshal(dAtA []byte) error { } return nil } - func (m *Model) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2395,7 +2431,6 @@ func (m *Model) Unmarshal(dAtA []byte) error { } return nil } - func skipTypes(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/wasm/types/types_test.go b/x/wasm/types/types_test.go index 117415930d..4add3c670d 100644 --- a/x/wasm/types/types_test.go +++ b/x/wasm/types/types_test.go @@ -7,15 +7,16 @@ import ( "testing" "time" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/codec/types" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/rand" + + "github.com/line/lbm-sdk/codec" + "github.com/line/lbm-sdk/codec/types" + codectypes "github.com/line/lbm-sdk/codec/types" + sdk "github.com/line/lbm-sdk/types" + govtypes "github.com/line/lbm-sdk/x/gov/types" + "github.com/line/ostracon/libs/rand" + wasmvmtypes "github.com/line/wasmvm/types" ) func TestContractInfoValidateBasic(t *testing.T) { diff --git a/x/wasm/types/validation.go b/x/wasm/types/validation.go index 4984fa28dd..539c8d8a3b 100644 --- a/x/wasm/types/validation.go +++ b/x/wasm/types/validation.go @@ -1,7 +1,7 @@ package types import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdkerrors "github.com/line/lbm-sdk/types/errors" ) var ( diff --git a/x/wasm/types/wasmer_engine.go b/x/wasm/types/wasmer_engine.go index 9b3cf71aac..f32789b5a6 100644 --- a/x/wasm/types/wasmer_engine.go +++ b/x/wasm/types/wasmer_engine.go @@ -1,8 +1,8 @@ package types import ( - wasmvm "github.com/CosmWasm/wasmvm" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" + wasmvm "github.com/line/wasmvm" + wasmvmtypes "github.com/line/wasmvm/types" ) // DefaultMaxQueryStackSize maximum size of the stack of contract instances doing queries @@ -10,6 +10,7 @@ const DefaultMaxQueryStackSize uint32 = 10 // WasmerEngine defines the WASM contract runtime engine. type WasmerEngine interface { + // Create will compile the wasm code, and store the resulting pre-compile // as well as the original code. Both can be referenced later via CodeID // This must be done one time for given code, after which it can be

ls2GW{U$d76guE!hp4jR91OHVKW5A|#{XSl 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 literal 274438 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 NoL3wwdRrzB{l5yzH~jzr literal 278731 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