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+IwBBoAFrIgIkACACEMgBIAACfwJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCAEEBRwRAIAIoAggiAyACKAIERgRAIAIgA0EBEA8gAigCCCEDCyACKAIAIANqQfsAOgAAIAIgA0EBajYCCCACQZABaiACQaGFwABBAhDLAQJAIAIoApABQQFHBEAgAigCCCIDIAIoAgRGBEAgAiADQQEQDyACKAIIIQMLIAIoAgAgA2pBOjoAACACIANBAWo2AgggAkGQAWogAhDPASACKAKQAUEBRg0BIAIgAigClAEiAzYCMCACQZgBai0AAARAIANBCGooAgAhBAwECyADKAIIIgUgA0EEaigCAEYEQCADIAVBARAPIAMoAgghBQsgAyAFQQFqIgQ2AgggAygCACAFakEsOgAADAMLIAJBHGogAkGcAWooAgA2AgAgAiACKQKUATcCFAwMCyACQSxqIAJBkAFqQQRyIgFBCGooAgA2AgAgAiABKQIANwIkDAoLIAJBEGogAiABQQRqECEgAigCEEEBRw0BDAoLIAJBADoANCADQQRqIgYoAgAgBEYEQCADIARBARAPIANBCGooAgAhBAsgAygCACAE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lAE2AkggAkGQAWogAkHIAGpBrYXAAEEEIAQQEyACKAKQAUEBRg0GIAJBkAFqIAJByABqIARBDGoiBBAjIAIoApABQQFGBEAgAkGMAWogAkGcAWooAgA2AgAgAiACKQKUATcChAEMCQsgAkGAAWogAigCSCACLQBMEMYBIAIoAoABQQFGDQhBASEGIARBDGoiBCAJRw0AC0EABSAIC0H/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/IwBBsAFrIgIkACACQQhqIAFBDGopAgA3AwAgAkEQaiABQRRqKQIANwMAIAJBGGogAUEcaikCADcDACACQSBqIAFBJGopAgA3AwAgAkEoaiABQSxqKQIANwMAIAIgASkCBDcDAAJAAkAgASgCAEEBRwRAIABBADYCACAAIAFBBGoiASkCADcCBCAAQSxqIAFBKGopAgA3AgAgAEEkaiABQSBqKQIANwIAIABBHGogAUEYaikCADcCACAAQRRqIAFBEGopAgA3AgAgAEEMaiABQQhqKQIANwIADAELIAJByABqIAJBHGopAgA3AwAgAkFAayACQRRqKQIANwMAIAJBOGogAkEMaikCADcDACACIAIpAgQ3AzAgAkIANwJUIAJBlI3AACgCADYCUCACQeAAaiACQdAAakHYhcAAEMACAkAgAigCMEENRgRAIAJBrAFqQQA2AgAgAkGEjcAANgKoASACQgE3ApwBIAJB/JLAADYCmAEgAkHgAGogAkGYAWoQwwJFDQEMAwsgAkGsAWpBATYCACACQgE3ApwBIAJBhJPAADYCmAEgAkEGNgKMASACIAJBiAFqNgKoASACIAJBlAFqNgKIASACIAJBMGo2ApQBIAJB4ABqIAJBmAFqEMMCDQIgAigCMCAAQQxqIAJB2ABqKAIANgIAIAAgAikDUDcCBCAAQQE2AgBBDUYNASACQTBqECgMAQsgACACKQNQNwIEIABBATYCACAAQQxqIAJB2ABqKAIANgIACyACQbABaiQADwtB8IXAAEE3IAJBmAFqQbiMwABB9IbAABCvAgALSgECfyACIABBBGooAgAgAEEIaiIEKAIAIgNrSwRAIAAgAyACEA8gBCgCACEDCyAAKAIAIANqIAEgAhDdAhogBCACIANqNgIAQQALmwEBAn8CQAJ/AkACQAJAAn8gAgRAQQEiBCABQQBIDQEaIAMoAgAiBUUNAyADKAIEIgMNAiABDQQgAgwFCyAAIAE2AgRBAQshBEEAIQEMBAsgBSADIAIgARBMDAILIAENACACDAELIAEgAhBLCyIDBEAgACADNgIEQQAhBAwBCyAAIAE2AgQgAiEBCyAAIAQ2AgAgAEEIaiABNgIAC+EBAQN/IwBBIGsiAiQAAkAgASABQQFqIgFLDQAgAEEEaigCACIEQQF0IgMgASABIANJGyIBQQQgAUEESxsiAUH/////A3EgAUZBAnQhAyABQQJ0IQECQCAEBEAgAkEYakEENgIAIAIgBEECdDYCFCACIAAoAgA2AhAMAQsgAkEANgIQCyACIAEgAyACQRBqEDkgAigCAEEBRgRAIAJBCGooAgAiAEUNASACKAIEIAAQkgIACyACKAIEIQEgAEEEaiACQQhqKAIAQQJ2NgIAIAAgATYCACACQSBqJAAPCxCTAgAL4gECA38BfiMAQSBrIgIkAAJAIAEgAUEBaiIBSw0AIABBBGooAgAiBEEBdCIDIAEgASADSRsiAUEEIAFBBEsbrULoAH4iBUIgiFBBA3QhASAFpyEDAkAgBARAIAJBGGpBCDYCACACIARB6ABsNgIUIAIgACgCADYCEAwBCyACQQA2AhALIAIgAyABIAJBEGoQOSACKAIAQQFGBEAgAkEIaigCACIARQ0BIAIoAgQgABCSAgALIAIoAgQhASAAQQRqIAJBCGooAgBB6ABuNgIAIAAgATYCACACQSBqJAAPCxCTAgAL7wEBAX8jAEGAAWsiBSQAIAUgAjYCDCAFIAE2AgggBUEkakECNgIAIAVBNGpBBzYCACAFQgI3AhQgBUGAjsAANgIQIAVBATYCLCAFIAQ2AjwgBSADNgI4IAUgBUEoajYCICAFIAVBOGo2AjAgBSAFQQhqNgIoIAVCADcCRCAFQZSNwAAoAgA2AkAgBUHQAGoiASAFQUBrQdiFwAAQwAIgBUEQaiABEK4CBEBB8IXAAEE3IAVB+ABqQbiMwABB9IbAABCvAgALIAAgBSkDQDcCBCAAQRQ2AgAgAEEMaiAFQcgAaigCADYCACAFQYABaiQAC7YEAgV/BH4jAEHgAGsiAyQAIAMgAjYCBCADIAE2AgAjAEEgayIEJAAgA0EIaiIFAn8gAkUEQCAFQQA6AAFBAQwBCwJAAkACQAJAIAEtAABBK2sOAwECAAILIAJBAUcNAQwCCyACQQFrIgJFDQEgAUEBaiEBCyAEQRhqIQcCQANAIAJFDQEgAS0AAEEwayIGQQpPDQIgBCAJQgBCCkIAEOECIARBEGogCEIAQgpCABDhAiAEKQMIQgBSIAcpAwAiCCAEKQMAfCIKIAhUcgRAIAVBAjoAAUEBDAQLIAFBAWohASACQQFrIQIgBCkDECILIAatfCIIIAtUIgYgCiAKIAatfCIJViAIIAtaG0EBRw0ACyAFQQI6AAFBAQwCCyAFQRBqIAk3AwAgBUEIaiAINwMAQQAMAQsgBUEBOgABQQELOgAAIARBIGokAAJAIAMtAAhBAUcEQCAAQQA2AgAgAEEIaiADKQMQNwMAIABBEGogA0EYaikDADcDAAwBCyADIAMtAAk6ACcgA0HMAGpBAjYCACADQdwAakECNgIAIANCAjcCPCADQeCOwAA2AjggA0EBNgJUIAMgA0HQAGo2AkggAyADQSdqNgJYIAMgAzYCUCADQShqIgEgA0E4aiICEJQCIAJBBHIgARCWAiADQRQ2AjgCQCADKAIsRQ0AIAMoAigiAUUNACABEOsBCyAAIAMpAzg3AgQgAEEBNgIAIABBDGogA0FAaykDADcCAAsgA0HgAGokAAv/AwEEfyMAQdAAayICJAAgAkEQaiABKAIAIgMQwwECQAJAIAItABBBAXFFBEBBAiEBDAELAkACQAJAAkACQCACLQARIgQiBUEsRwRAIAVB/QBGDQMgAS0ABA0BQQkhAQwGCyABLQAEDQAgAxC9ASACQQhqIAMQwwEgAi0ACEEBcUUNBCACLQAJIQQMAQsgAUEAOgAECyAEQf8BcSIBQf0ARwRAIAFBIkcEQEEQIQEMBQsgAiADEMMBIAItAABBAXFFDQMgAi0AAUEiRwRAQQ4hAQwFCyADEL0BIAJBKGogAxDCASACQTRqKAIAIQUgAkEwaigCACEEIAIoAiwhASACKAIoQQFHBEAgBEUgAUUgBUVycg0DIAQQ6wEMAwsgAUEVRg0CIAJBOGooAgAhAwwEC0ETIQEMAwsgAEEAOwEADAMLIAJBKGogAxDBAQJAIAIoAigiAUEVRwRAIAJBJGogAkE0aigCADYCACACIAIpAiw3AhwgAiABNgIYDAELIAJBGGogAxAYIAIoAhhBFUcNACAAQYACOwEADAMLIABBAToAACAAQQRqIAIpAxg3AgAgAEEMaiACQSBqKQMANwIADAILQQQhAQsgAEEBOgAAIABBEGogAzYCACAAQQxqIAU2AgAgAEEIaiAENgIAIABBBGogATYCAAsgAkHQAGokAAv7AQEBfyMAQeAAayIDJAAgAyACNgIEIAMgATYCACADQQhqIAEgAhCdAQJAIAMoAghBAUcEQCAAIAMpAgw3AgQgAEEANgIAIABBDGogA0EUaigCADYCAAwBCyADQdQAakEBNgIAIANCATcCRCADQaCOwAA2AkAgA0EBNgJcIAMgA0HYAGo2AlAgAyADNgJYIANBMGoiASADQUBrIgIQlAIgAkEEciABEJYCIANBFDYCQAJAIAMoAjRFDQAgAygCMCIBRQ0AIAEQ6wELIAAgAykDQDcCBCAAQQE2AgAgAEEMaiADQcgAaikDADcCACADQRBqECgLIANB4ABqJAALwAICA38BfiMAQTBrIgIkACACQQhqIAEoAgAiAxDDAQJAAkAgAi0ACEEBcQRAIAItAAkiBEEsRwRAAkAgBEHdAEcEQCABLQAEDQEgAEEBOgAAIABBBGpBBzYCAAwFCyAAQQA7AQAMBAsgAUEAOgAEDAILIAMQvQEgAiADEMMBIAItAABBAXEEQCACLQABIQQMAgsgAEEBOgAAIABBBGpBBDYCAAwCCyAAQQE6AAAgAEEEakEBNgIADAELIARB3QBGBEAgAEEBOgAAIABBBGpBEzYCAAwBCyACQSBqIAMQGCACKAIgIgFBFUYEQCAAQYACOwEADAELIAJBGGogAkEsaigCACIDNgIAIAIgAikCJCIFNwMQIABBEGogAzYCACAAQQhqIAU3AgAgAEEEaiABNgIAIABBAToAAAsgAkEwaiQAC/QBAQR/IwBBIGsiAiQAIAIgARDDAQJAAkACQCACLQAAQQFxBEAgAi0AAUEiRw0BIAEQvQEgAkEIaiABEMIBIAJBGGooAgAhBCACQRRqKAIAIQMgAkEQaigCACEBIAIoAgwhBSACKAIIQQFGDQIgBUUEQCAAIAEgAxBCDAQLIAAgASAEEEIgA0UgAUVyDQMgARDrAQwDCyAAQQE6AAAgAEEEakEENgIADAILIABBAToAACAAQQRqQQ42AgAMAQsgAEEBOgAAIABBEGogBDYCACAAQQxqIAM2AgAgAEEIaiABNgIAIABBBGogBTYCAAsgAkEgaiQAC6wBAAJAAkACQAJAAkACQCACQQdrDgcBAgMDAwMAAwsgAUGnlcAAQQ0Q4AINAiAAQQE6AAEMBAsgAUGXlcAAQQcQ4AIEQCABQZCVwABBBxDgAg0CIABBAzoAAQwECyAAQQI6AAEMAwsgASkAAEL2ysnL5qzasvIAUQ0BCyAAQQRqIAEgAkG0lcAAQQQQPCAAQQE6AAAPCyAAQQA6AAEgAEEAOgAADwsgAEEAOgAAC/QBAQR/IwBBIGsiAiQAIAIgARDDAQJAAkACQCACLQAAQQFxBEAgAi0AAUEiRw0BIAEQvQEgAkEIaiABEMIBIAJBGGooAgAhBCACQRRqKAIAIQMgAkEQaigCACEBIAIoAgwhBSACKAIIQQFGDQIgBUUEQCAAIAEgAxBEDAQLIAAgASAEEEQgA0UgAUVyDQMgARDrAQwDCyAAQQE6AAAgAEEEakEENgIADAILIABBAToAACAAQQRqQQ42AgAMAQsgAEEBOgAAIABBEGogBDYCACAAQQxqIAM2AgAgAEEIaiABNgIAIABBBGogBTYCAAsgAkEgaiQAC8ECAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACQQVrDhQGAAcCCQkEAQkJCQkJCQkJBQkJCAkLIAFBqZTAAEEGEOACDQggAEEBOgABDAoLIAFBlZTAAEEMEOACRQ0BIAFB/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/AACgAADYAACAKQRBqQoWAgIDQADcDACAKQQxqIAA2AgAgCkEIakEHNgIAIApBATYCACAORSABRXJFBEAgARDrAQsgBgRAIAZBBXQhDyANQRRqIQADQAJAIAAoAgBFDQAgAEEEaygCACIBRQ0AIAEQ6wELIABBIGohACAPQSBrIg8NAAsLIAJFIAJBBXRFckUEQCANEOsBCyAJRSAHRXINHiAHEOsBDB4LIAQoAtQBIRAgBEHQAWogDyAEQdgBaigCABAfQQEhCwJAIAQoAtABQQFHBEAgBEHwAWooAgAhEyAEQewBaigCACEIIARB5AFqKAIAIRYgBEHgAWooAgAhESAEQdgBaigCACEXIAQoAtQBIQsgBEHcAWooAgAgAEYEQCAEQegBaigCACEMIAEgCyAAEOACRQ0CCyAKQQE2AgAgCkEIakENNgIAQQAhAAwgCyAEQdgBaikDACEgIARB4AFqKQMAISEgBEHoAWopAwAhIiAKQSBqIARB8AFqKQMANwMAIApBGGogIjcDACAKQRBqICE3AwAgCkEIaiAgNwMAIApBATYCAAwdCyAEIAw2AqgCIAQgFjYCpAIgBCARNgKgAiAEICE+AtgBIAQgFTYC1AEgBCAFNgLQASAEQZABaiAEQdABaiIAEJwBIARCgICAgBA3A4gBIAAgBEEYaiAEQYgBahAnIAQoAtABQQFHBEAgBEEoaiIAIARB3AFqKAIANgIAIAQgBCkC1AE3AyAgBEGIAWoQMiAEQdAAaiAAKAIAIgA2AgAgBEG4AmogADYCACAEIAQpAyA3A7ACIARB7AFqQgA3AgAgBEHgAWpCADcDACAEQgA3AtQBIARBADYC9AEgBEGEjcAAKAIAIgA2AugBIAQgADYC3AEgBEGMjcAAKAIANgLQASAEQcgAaiAEQdABakH5jsAAQQZB/47AAEEHECogBEEgaiAEQaACahCWAkELQQEQSyIARQ0JIABBB2pBjY/AACgAADYAACAAQYaPwAApAAA3AAAgBEHYAWoiEiAEQShqKAIANgIAIAQgBCkDIDcD0AEgBEG0AWogBEHQAWoQnAEgBEKLgICAsAE3AqwBIAQgADYCqAEgBEHcAGooAgAiACAEQdgAaiIUKAIARgRAIARB1ABqIAAQKyAEKAJcIQALIAQoAlQgAEEYbGoiDCAEKQOoATcCACAMQQhqIARBsAFqKQMANwIAIAxBEGogBEG4AWopAwA3AgAgEiAEQdAAaikDADcDACAEQegBaiAEQeAAaikDADcDACAEQfABaiAEQegAaikDADcDACAEQfgBaiAEQfAAaikDADcDACAEIABBAWo2AlwgBEHgAWogFCkDADcDACAEIAQpA0g3A9ABQQhBARBLIhRFDQogFELowo3blozdt+0ANwAAQfABQQQQSyIARQ0LQQZBARBLIgxFDQwgDEEEakH9jsAALwAAOwAAIAxB+Y7AACgAADYAAEEHQQEQSyISRQ0NIAAgEjYCDCAAQoaAgIDgADcCBCAAIAw2AgAgEkEDakGCj8AAKAAANgAAIBJB/47AACgAADYAACAAQRBqQoeAgIDwADcCACAEQfABaiIYKAIAIgwgBEHsAWooAgBGBEAgBEHoAWogDBArIAQoAvABIQwLIBggDEEBajYCACAEQdAAaiISIARB2AFqIhspAwA3AwAgBEHYAGogBEHgAWopAwA3AwAgBEHgAGoiGSAEQegBaiIcKQMANwMAIARB8ABqIh8gBEH4AWopAwA3AwAgHCgCACAMQRhsaiIMIAA2AgwgDEKIgICAgAE3AgQgDCAUNgIAIARB6ABqIBgpAwA3AwAgDEEQakKKgICAEDcCACAEIAQpA9ABNwNIIBsgBEGoAmooAgA2AgAgBCAEKQOgAjcD0AEgBEH4AGogBEHQAWoQnAEgEigCACIAIAQoAkxGBEAgBEHIAGogABA7IAQoAlAhAAsgEiAAQQFqNgIAIAQoAkggAEHoAGxqIgBCADcDACAAQQM6AGAgAEIANwNQIARB4AFqIARB2ABqKQMANwMAIBwgGSkDADcDACAEQfABaiAEQegAaigCADYCACAAQQhqQgA3AwAgAEEQaiAEKQN4NwIAIABBGGogBEGAAWooAgA2AgAgAEEcaiAEKQOwAjcCACAAQSRqIARBuAJqKAIANgIAIBsgEikDADcDACAEIAQpA0g3A9ABIB8oAgAhEiAEKAJsIQxBA0EBEEsiAEUNDiAAQQJqQZOPwAAtAAA6AAAgAEGRj8AALwAAOwAAIAxFIBJFckUEQCAMEOsBCyAEQegAaiAEQfABaigCACIMNgIAIARB4ABqIARB6AFqKQMAIiA3AwAgBEHYAGogBEHgAWopAwAiITcDACAEQdAAaiAEQdgBaikDACIiNwMAIAQgBCkD0AEiIzcDSCAKQSRqIAw2AgAgCkEcaiAgNwIAIApBFGogITcCACAKQQxqICI3AgAgCiAjNwIEIApBLGpCg4CAgDA3AgAgCkEoaiAANgIAIApBADYCAEEBIQAMHwsgBEEsaiIAIARB4AFqKQMANwIAIARBNGoiDCAEQegBaikDADcCACAEQTxqIhEgBEHwAWopAwA3AgAgBCAEQdgBaikDADcCJCAEQYgBahAyIARB1ABqIAApAgAiIDcCACAEQdwAaiAMKQIAIiE3AgAgBEHkAGogESkCACIiNwIAIAQgBCkCJCIjNwJMIApBIGogIjcCACAKQRhqICE3AgAgCkEQaiAgNwIAIApBCGogIzcCACAKQQE2AgACQCAEKAKkAkUNACAEKAKgAiIARQ0AIAAQ6wELIBdFIAtFckUEQCALEOsBC0EAIQsgE0UgCEVyDRwgCBDrAQwcCyABQQhqKAIAIQAgASgCBCEBQQAhDyAEQegBakEANgIAIARBADoA8AEgBEGEjcAANgLkASAEIAE2AuABIARBBDYC3AEgBEKAgICAgAQ3AtQBIARBhI3AADYC0AEgBEGBJjsA8QEgBCAANgLsASAEQagBaiEVIwBB0AFrIgkkAAJAAkAgBEHQAWoiACgCDCIBRQRAQQ4hBwwBC0EPIQcgAUH///8HSw0AQQwhByAAKAIQIgJBCEkNAEENIQcgAkGAgIABSw0AQQwhByACIAFBA3RJDQAgACgCHCILRQRAQQohBwwBC0EAIQcgACgCCCINQQRJDQAgAiABQQJ0IgduIgatIAetfiIgQiCIUARAIAAtACAhByAAQRhqKAIAIQggAEEUaigCACEFIABBBGooAgAhDCAALQAiIQ4gAC0AISERIAAoAgAhACAJQThqIhhBCTYCACAJQTBqQQg2AgAgCUEYaiAINgIAIAlBoY/AADYCNCAJQZmPwAA2AiwgCSAgPgIoIAkgDjoAIiAJIBE6ACEgCSAHQQBHOgAgIAkgCzYCHCAJIAU2AhQgCSACNgIQIAkgATYCDCAJIA02AgggCSAMNgIEIAkgADYCACAJIAY2AjwgCSAGQQJ0NgIkIAlBQGshFkEAIQIjAEGwCWsiBSQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAlBJGooAgAiDa0iICAJQQxqKAIAIgitfiIhQiCIUARAICGnIgtB////AXEiACALRw0CIAtBCnQiAUEASA0CIAAgC0ZBA3QhAAJAIAFFBEAgACIHDQEMDQsgASAAEEsiB0UNDAsgBUEANgIwIAUgBzYCKCAFIAFBCnYiADYCLCAFQbABakEAQYAIEN8CGiAAIAtJBEAjAEEgayIAJAAgBUEoaiIBQQRqKAIAIgJBAXQiBiALIAYgC0sbIgZBBCAGQQRLGyIGQf///wFxIAZGQQN0IQcgBkEKdCEGAkAgAgRAIABBGGpBCDYCACAAIAJBCnQ2AhQgACABKAIANgIQDAELIABBADYCEAsgACAGIAcgAEEQahA5AkACQCAAKAIAQQFGBEAgAEEIaigCACIBRQ0BIAAoAgQgARCSAgALIAAoAgQhAiABQQRqIABBCGooAgBBCnY2AgAgASACNgIAIABBIGokAAwBCxCTAgALIAUoAighByAFKAIwIQILIAcgAkEKdGohASALQQJPBEAgC0EBayIAQQNxIQwgC0ECa0EDTwRAQQAgAEF8cWshBgNAIAEgBUGwAWoiAEGACBDdAiIBQYAIaiAAQYAIEN0CGiABQYAQaiAAQYAIEN0CGiABQYAYaiAAQYAIEN0CGiABQYAgaiEBIAZBBGoiBg0ACwsgDARAA0AgASAFQbABakGACBDdAkGACGohASAMQQFrIgwNAAsLIAIgC2pBAWshAgsgCwRAIAEgBUGwAWpBgAgQ3QIaIAJBAWohAgsgB0UgBSgCLCIAIAJNcg0BIABBCnQhACACQQp0IgFFBEAgAARAIAcQ6wELQQghBwwCCyAHIABBCCABEEwiBw0BIAFBCBCSAgALQbCdwABBIUGIqsAAEJ0CAAsgBUEkaiACNgIAIAUgBzYCICAFIA02AhwgBSAINgIYIAUgCUEMaiILKAIAIgY2AnQgBSAJQQhqKAIANgJ4IAUgCSgCEDYCfCAFIAkoAhw2AoABIAUgCS0AIjYChAEgBSAJLQAhNgKIASAFIAlBMGooAgAiADYCjAEgCSgCLCEBIAUgCUE4aigCACINNgKsASAJKAI0IQggBSAJQRhqKAIAIgw2ApABIAkoAhQhDiAFIAkoAgQiETYCmAEgCSgCACESIAVBnAJqIBE2AgAgBUGUAmpBBDYCACAFQYwCaiAMNgIAIAVBhAJqQQQ2AgAgBUH8AWogDTYCACAFQfQBakEENgIAIAVB7AFqIAA2AgAgBUHkAWpBBDYCACAFQdwBakEENgIAIAVB1AFqQQQ2AgAgBUHMAWpBBDYCACAFQcQBakEENgIAIAVBvAFqQQQ2AgAgBSASNgKYAiAFIA42AogCIAUgCDYC+AEgBSABNgLoASAFQQQ2ArQBIAUgBUGYAWo2ApACIAUgBUGQAWo2AoACIAUgBUGsAWo2AvABIAUgBUGMAWo2AuABIAUgBUGIAWo2AtgBIAUgBUGEAWo2AtABIAUgBUGAAWo2AsgBIAUgBUH8AGo2AsABIAUgBUH4AGo2ArgBIAUgBUH0AGo2ArABIAVBKGoiAEEAQcgAEN8CGiAAQcAAIAVBsAFqQQ4QZgJAAkACQAJAAkAgBgRAQQAhAQNAIAUgATYAbCAFQQA2AGggAa0gIH4iIUIgiKcNBCAhpyIAIAJPDQMgByAAQQp0akGACCAFQShqQcgAEGcgBUEBNgBoIABBAWoiACACTw0CIAcgAEEKdGpBgAggBUEoakHIABBnIAYgAUEBaiIBRw0ACwsgCS0AIEUgCygCACIAQQFGcg0DIAkoAhwiG0UNBEGoncAAKAIAIQ0gCUEMaiEcQQAhCwNAIAtBAWpBACERA0BBEEEEEEsiAEUEQEEQQQQQkgIACyAAQoGAgIAQNwIAIABCgICAgBA3AgggBSAANgKMAQJ/AkACQAJAAkBBGEEEEEsiAARAIABCADcCECAAIA02AgwgAEEAOgAJIABBADoACCAAQoGAgIAQNwIAIAUgBUGMAWoQbTYClAEgBSAANgKQASAFKAIYIgFB/////wNxIgAgAUcNDSABQQJ0IgJBAEgNDSAAIAFGQQJ0IQAgHCgCACEHAkAgAkUEQCAAIgYNAQwXCyACIAAQSyIGRQ0WCyAFQQA2ArgBIAUgBjYCsAEgBSACQQJ2IgI2ArQBAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUUNACABQQFrIQxBACEBA0AgASACRgRAIAVBsAFqIAIQOiAFKAKwASEGIAUoArgBIQELIAUgAUEBaiIANgK4ASAGIAFBAnRqIAVBGGo2AgAgDARAIAxBAWshDCAFKAK0ASECIAAhAQwBCwsgBSgCtAEhAiAFKAKwASEGIAdFIABFcg0AIAYoAgAiAA0BCyACRSACQQJ0RXJFBEAgBhDrAQsgBSAFKAKUATYCsAEgBUGwAWoQbCAFKAKwASIAIAAoAgAiAEEBazYCACAAQQFGBEAgBSgCsAEQVgsgBSgCjAEhAUEAIQ4jAEEgayIAJAAgACABNgIAIAEtAAghAiABQQE6AAggACACQQFxIgI6AAcCQAJAAkACQAJAAkACQCACRQRAIAFBCGohAgJAAkACQAJAQcSzwQAoAgBB/////wdxBEAQ4AEhByACLQABRQ0BIAdBAXMhDgwKCyACLQABDQkgAkEBaiEMIAFBDGohDiABKAIMQQFGIQYMAQsgAkEBaiEMIAFBDGohDiABKAIMQQFGIQYgB0UNAQtBxLPBACgCAEH/////B3FFDQAQ4AENACACQYACOwAAIAZFDQEMBQsgAkEAOgAAIAYNBAsgASABKAIAIgZBAWo2AgAgBkEASA0BIAAgATYCCCAAQQhqEGwgASABKAIAIgZBAWs2AgAgBkEBRgRAIAAoAggQVgsgAi0AACEGIAJBAToAACAAIAZBAXEiBjoAByAGDQZBACEGQcSzwQAoAgBB/////wdxBEAQ4AFBAXMhBgsgDC0AAA0CIA4oAgBFBEACQCAGDQBBxLPBACgCAEH/////B3FFDQAQ4AENACAMQQE6AAALIAFBADoACCABIAEoAgAiAkEBazYCACACQQFHDQUgARBWDAULQaiMwQBBGkH0jMEAEOwBAAsMBQsACyAAIAY6AAwgACACNgIIQeyrwABBKyAAQQhqQZiswABBvK3AABCvAgALIAAQbCABIAEoAgAiAUEBazYCACABQQFHDQAgACgCABBWCyAAQSBqJAAMAgsgACAOOgAMIAAgAjYCCEHsq8AAQSsgAEEIakGYrMAAQaytwAAQrwIACyAAQRxqQQA2AgAgAEEYakHErsAANgIAIABCATcCDCAAQdCqwAA2AgggAEEHaiAAQQhqEGoACyAFKAKQASIALQAIIQEgAEEBOgAIIAUgAUEBcSIBOgAoIAENBSAAQQhqIRJBACEXQcSzwQAoAgBB/////wdxBEAQ4AFBAXMhFwsgEi0AAQ0EIABBFGoiAigCACEBIAJBADYCACAAKAIMIQIgBSAAQQxqNgI4IAUgAiABQQJ0ajYCNCAFIAI2AjAgBUEANgIsIAUgATYCKCAFQRBqIAVBKGoQTiAFKAIQIgANAyAFKAIwIgwgBSgCNCICRg0CIAUgDEEEajYCMAwBCyAFQbABaiIBQQRqIgJBADYCDCACQQA2AgAgASAFQZABajYCAEEMQQQQSyIIRQ0KIAhCgoCAgBA3AgAgCEEKakEAOgAAIAhBADsBCCAFKAKwASIBKAIAIgcgBygCACICQQFqNgIAIAJBAEgNCSABQQRqEG0hAUEkQQQQSyIGRQ0IIAYgCDYCICAGIAA2AhxBACEOIAZBADYCGCAGIBE2AhQgBkEANgIQIAYgCzYCDCAGIAk2AgggBiABNgIEIAYgBzYCACAFQbgBaikDACEgIAUoArQBIQACfyAFQcABaigCAARAIAVBxAFqKAIADAELAn9BsLPBACgCAEUEQEGws8EAQYEgNgIAQYAgDAELQQALCxogAARAIAUgIDcCLCAFIAA2AiggBUGYAWoiByAFQShqIgMQnAFBACEBQQAhCyMAQSBrIg0kACAHKAIAIQICQCAHQQhqKAIAIgBBCE8EQCANQQhqQQAgAiAAELECIA0oAgwhACANKAIIIQsMAQsgAEUEQEEAIQAMAQsCQCACLQAARQ0AQQEhASAAQQFGDQEgAi0AAUUNAEECIQEgAEECRg0BIAItAAJFDQBBAyEBIABBA0YNASACLQADRQ0AQQQhASAAQQRGDQEgAi0ABEUNAEEFIQEgAEEFRg0BIAItAAVFDQBBBiEBIABBBkYNASACLQAGDQELQQEhCyABIQALIAMCfyALRQRAIA1BGGogB0EIaigCADYCACANIAcpAgA3AxAjAEEgayICJAACQAJAAkACQAJAAkAgDUEQaiIBQQRqKAIAIgcgASgCCCIARgRAIABBAWoiByAASQ0EAkAgAARAIAJBGGpBATYCACACIAA2AhQgAiABKAIANgIQDAELIAJBADYCEAsgAiAHQQEgAkEQahA5IAIoAgBBAUYNASACKAIEIQsgAUEEaiACQQhqKAIAIgc2AgAgASALNgIACyAAIAdGBEAgASAAQQEQDyABQQRqKAIAIQcgASgCCCEACyABIABBAWoiCzYCCCABKAIAIgEgAGpBADoAACAHIAtLDQEgASEADAILIAJBCGooAgAiAEUNAiACKAIEIAAQkgIACyALRQRAQQEhACABEOsBDAELIAEgB0EBIAsQTCIARQ0CCyANIAs2AgQgDSAANgIAIAJBIGokAAwCCxCTAgALIAtBARCSAgALIAMgDSkDADcCBEEADAELIAMgADYCBCADQQhqIAcpAgA3AgAgA0EQaiAHQQhqKAIANgIAQQELNgIAIA1BIGokACAFKAIoQQFGDQggBSgCLCEOIAVBMGooAgAhBwsCfyMAQSBrIgAkAEGo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FEEEEJICAAsgBUGgAWogBUE0aikCADcDACAFIAUpAiw3A5gBQYybwABBLyAFQZgBakGcnMAAQbybwAAQrwIAC0EkQQQQkgIACwALQQxBBBCSAgALQRhBBBCSAgALIAcgACABajYCAAsgBSgCmAEhAiAFKAKcASEMIAUoAqABDAILIAcgACABajYCAAsgDSECQQALIQACQCAXDQBBxLPBACgCAEH/////B3FFDQAQ4AENACASQQE6AAELIBJBADoAAAJAAkAgAARAQQxBBBBLIgZFDQEgBiAANgIIIAYgDDYCBCAGIAI2AgAMAgtBACEGIAxBA3RFIAxFIAJFcnINASACEOsBDAELQQxBBBCSAgALIAUoApABIgAgACgCACIAQQFrNgIAIABBAUYEQCAFQZABahBVCyARQQFqIREgBgRAIAYoAgAhASAGKAIIIgAEQCABIABBA3RqIQADQCABKAIAIAFBBGoiAigCACgCABEEACACKAIAIgIoAgQEQCACKAIIGiABKAIAEOsBCyABQQhqIgEgAEcNAAsgBigCACEBCyAGQQRqKAIAIgBFIAFFciAAQQN0RXJFBEAgARDrAQsgBhDrAQsgEUEERw0ACyILIBtHDQALDAQLIAAgAkH0ocAAEJkCAAsgACACQeShwAAQmQIAC0GwncAAQSFB5KHAABCdAgALIAkoAhwiBkUgAEVyDQBBACEBA0BBACECA0AgBUIANwO4ASAFIAE2ArABIAUgAjYCtAEgCSAFQbABaiAFQRhqEFQgACACQQFqIgJHDQALQQAhAgNAIAVCATcDuAEgBSABNgKwASAFIAI2ArQBIAkgBUGwAWogBUEYahBUIAAgAkEBaiICRw0AC0EAIQIDQCAFQgI3A7gBIAUgATYCsAEgBSACNgK0ASAJIAVBsAFqIAVBGGoQVCAAIAJBAWoiAkcNAAtBACECA0AgBUIDNwO4ASAFIAE2ArABIAUgAjYCtAEgCSAFQbABaiAFQRhqEFQgACACQQFqIgJHDQALIAFBAWoiASAGRw0ACwsgCUEkaigCACIBQQFrIgIgAUsNBiACIAUoAiQiB08NAyAJQQxqKAIAIQ0gCUEIaigCACEAIAVBsAFqIAUoAiAiBiACQQp0akGACBDdAhogDUECTwRAIAFBCnQhCCABQQt0IAZqQYAIayEGIAGtISBBASEO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QgA3AoQGIANBlI3AACgCADYCgAYgACADQYAGakHYhcAAEMACIANBmAVqIAAQsQENAyADQYwEaiADQYgGaigCADYCACADIAMpA4AGNwKEBCADQQE2AoAEIANBmAVqECggEkUgE0VyRQRAIBMQ6wELIA4EQCAOQQV0IQEgEEEUaiECA0ACQCACKAIARQ0AIAJBBGsoAgAiAEUNACAAEOsBCyACQSBqIQIgAUEgayIBDQALCyAPRSAPQQV0RXINACAQEOsBCyAVRSAJRXJFBEAgCRDrAQsgEUUgDEVyDQAgDBDrAQsCQCADKALcBEUNACADKALYBCIARQ0AIAAQ6wELAkAgAygCzARFDQAgAygCyAQiAEUNACAAEOsBCyADKAK8BEUgGkVyDQAgGhDrAQsgA0GYBmogA0GABGoQICADKAKYBkEBRwRAIANBwAVqIANBpAZqKAIAIgA2AgAgAyADKQKcBiIgNwO4BSADQaAGaiAANgIAIAMgIDcDmAYgA0GYBmoQsgECQCADKAKABEUEQCADQYAEakEEchAxDAELIANBiARqKAIARQ0AIAMoAoQEIgFFDQAgARDrAQsgA0GQB2okAA8LIANB0AVqIANBuAZqKQMANwMAIANByAVqIANBsAZqKQMANwMAIANBwAVqIANBqAZqKQMANwMAIAMgA0GgBmopAwA3A7gFQciMwABBKyADQbgFakH0jMAAQbiDwAAQrwIAC0HwhcAAQTcgA0HwBWpBuIzAAEH0hsAAEK8CAAvTdwIYfwR+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/IwBBIGsiAiQAIAEoAgAhBCACIAFBCGooAgAiBUGAAhDSAQJAAkACQCACKAIABEAgAigCBCIBQQBIDQFBASEDIAEEQCABEE0iA0UNAwsgBCAFQYACIAMgARDRASACQQhqIAMgARDPAiACKAIIQQFGDQMgACABNgIIIAAgATYCBCAAIAM2AgAgAkEgaiQADwsjAEEQayIAJAAgAEHEwcAANgIIIABBLTYCBCAAQZTBwAA2AgAgACgCACEBIAAoAgQhAiAAKAIIIQMjAEEQayIAJAAg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IAI2AgggACACNgIEIAAgATYCACAAEAMgABDrAQuaBAICfwF+IwBBQGoiASQAAkACQAJAAkACQAJAAkACQCADQYACTQRAQQxBBBBLIgRFDQUgBCADNgIIIAQgAzYCBCAEIAI2AgAgBBAEIgUNAyADDQFBASEFDAILQSBBARBLIgJFDQUgAEEBNgIAIAJBGGpBoMnAACkAADcAACACQRBqQZjJwAApAAA3AAAgAkEIakGQycAAKQAANwAAIAJBiMnAACkAADcAACAAQRBqQqCAgICABDcDACAAQQxqIAI2AgAgAEEIakEDNgIADAMLIANBARBLIgVFDQULIAUgAiADEN0CIQIgAEEMaiADNgIAIABBCGogAzYCACAAIAI2AgQgAEEANgIAIAQQ6wEMAQsgBSgCACICRQ0EIAUpAgQhBiAFEOsBIAEgBjcCBCABIAI2AgAgAUE8akEBNgIAIAFCATcCLCABQcDJwAA2AiggAUHEADYCJCABIAFBIGo2AjggASABNgIgIAFBEGogAUEoahCUAiAAQQhqQQM2AgAgAEEMaiABKQMQNwIAIABBFGogAUEYaigCADYCACAAQQE2AgACQCABKAIERQ0AIAEoAgAiAEUNACAAEOsBCyAEEOsBCyABQUBrJAAPC0EMQQQQkgIAC0EgQQEQkgIACyADQQEQkgIACyABQTxqQQA2AgAgAUHgt8AANgI4IAFCATcCLCABQazOwAA2AiggAUEoakG0zsAAEKECAAvEBAIBfwF+IwBBQGoiASQAAkACQAJAAkACQAJAAkAgA0GAAk0EQEEMQQQQSyIERQ0DIAQgAzYCCCAEIAM2AgQgBCACNgIAQcAAQQEQSyIDRQ0EQQxBBBBLIgJFDQUgAkLAADcCBCACIAM2AgAgBCACEAUiAw0BIAIoAgAiA0UNByACKQIEIQUgAhDrASAAQQhqIAU3AgAgACADNgIEIABBADYCACAEEOsBDAILQSRBARBLIgJFDQUgAEEBNgIAIAJBIGpB6MnAACgAADYAACACQRhqQeDJwAApAAA3AAAgAkEQakHYycAAKQAANwAAIAJBCGpB0MnAACkAADcAACACQcjJwAApAAA3AAAgAEEQakKkgICAwAQ3AwAgAEEMaiACNgIAIABBCGpBAzYCAAwBCyADKAIAIgJFDQUgAykCBCEFIAMQ6wEgASAF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QThqQbS2wABB9LTAABCvAgALIARBATYC2AIgBEGwA2ogBEH4AmopAwA3AwAgBEGoA2ogBEHwAmopAwA3AwAgBEGgA2ogBEHoAmopAwA3AwAgBCADKQMANwOYAyAEQgA3ArwDIARB4LfAACgCADYCuAMgBiAEQbgDakHYs8AAEMACIARBmANqIAYQsQENASAAQQhqIAQpA7gDNwIAIABBEGogBEHAA2ooAgA2AgAgAEEcaiAVNgIAIABBGGogFDYCACAAQRRqIBM2AgAgAEKBgICAEDcCACAEQZgDahAoCyASEOsBIARB8ANqJAAPC0Hws8AAQTcgBEGAA2pBtLbAAEH0tMAAEK8CAAvZCAEBfyMAQTBrIgIkAAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4MAQIDBAUGBwgJCgsMAAsgAkEsakEBNgIAIAJCATcCHCACQdzUwAA2AhggAkHGADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMDAsgAkEsakEBNgIAIAJCATcCHCACQcDUwAA2AhggAkHHADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMCwsgAkEsakEBNgIAIAJCATcCHCACQaDUwAA2AhggAkHIADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMCgsgAkEsakEBNgIAIAJCATcCHCACQYDUwAA2AhggAkHAADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMCQsgAkEsakEBNgIAIAJCATcCHCACQejTwAA2AhggAkHAADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMCAsgAkEMakHJADYCACACQSxqQQI2AgAgAiAAQQhqNgIQIAJCAjcCHCACQcDTwAA2AhggAkHJADYCBCACIABBEGo2AhQgAiACNgIoIAIgAkEUajYCCCACIAJBEGo2AgAgASACQRhqEMMCDAcLIAJBLGpBATYCACACQgE3AhwgAkGU08AANgIYIAJBwAA2AgQgAiAAQQRqNgIUIAIgAjYCKCACIAJBFGo2AgAgASACQRhqEMMCDAYLIAJBLGpBATYCACACQgI3AhwgAkHc0sAANgIYIAJBwAA2AgQgAiAAQQRqNgIUIAIgAjYCKCACIAJBFGo2AgAgASACQRhqEMMCDAULIAJBDGpBwAA2AgAgAkEsakECNgIAIAIgAEEEajYCECACQgI3AhwgAkHA0sAANgIYIAJBwAA2AgQgAiAAQRBqNgIUIAIgAjYCKCACIAJBFGo2AgggAiACQRBqNgIAIAEgAkEYahDDAgwECyACQQxqQcAANgIAIAJBLGpBAjYCACACIABBBGo2AhAgAkICNwIcIAJBmNLAADYCGCACQcAANgIEIAIgAEEQajYCFCACIAI2AiggAiACQRRqNgIIIAIgAkEQajYCACABIAJBGGoQwwIMAwsgAkEsakEBNgIAIAJCATcCHCACQfTRwAA2AhggAkHKADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMAgsgAkEsakEBNgIAIAJCATcCHCACQeDRwAA2AhggAkHLADYCBCACIABBBGo2AhQgAiACNgIoIAIgAkEUajYCACABIAJBGGoQwwIMAQsgAkEsakEANgIAIAJB4LfAADYCKCACQgE3AhwgAkHI0cAANgIYIAEgAkEYahDDAgsgAkEwaiQAC0ABAn8gAEEIaigCACEBIAAoAgAhAkEMQQQQSyIARQRAQQxBBBCSAgALIAAgATYCCCAAIAE2AgQgACACNgIAIAALoQEBAn8jAEEgayICJAACQCABBEAgASgCACIDDQEgAkEcakEANgIAIAJB4LfAADYCGCACQgE3AgwgAkGszsAANgIIIAJBCGpBtM7AABChAgALIAJBHGpBADYCACACQeC3wAA2AhggAkIBNwIMIAJB9M3AADYCCCACQQhqQfzNwAAQoQIACyAAIAM2AgAgACABKQIENwIEIAEQ6wEgAkEgaiQACz4BAX8jAEEQayICJAAgAiABQcTOwABBBBDHAiACIAA2AgwgAiACQQxqQey4wAAQtQIaIAIQtgIgAkEQaiQACz4BAX8jAEEQayICJAAgAiABQcjOwABBDRDHAiACIAA2AgwgAiACQQxqQdy4wAAQtQIaIAIQtgIgAkEQaiQAC9wGAQF/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAQQFrDgwBAgMEBQYHCAkKCwwA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KAIIIQYLIANBIGogBiACEM8CIAMoAiBBAUcNBCAKRSAGRXJFBEAgBhDrAQtBDyEFDAILQQYhBQsCQCADKAIMIgJFDQAgAygCCCIKRQ0AIAoQ6wELCyAAIAU2AgQgAEEMaiACNgIAIABBCGogCjYCAEEBIQIMBwtBgOPAAEEhQeziwAAQnQIACyAAQRBqIAI2AgAgAEEMaiAKNgIAIABBCGogBjYCACAAQQE2AgRBACECDAULIAIgB0HA5MAAEJsCAAsgBCACQcDkwAAQngIACyACIAdB0OTAABCbAgALIAQgAkHQ5MAAEJ4CAAsgACABNgIEIABBCGogBDYCAAsgACACNgIAIANBMGokAA8LIAFBARCSAgALbQEGfwJAIAEoAggiAiABKAIEIgRPDQAgASgCACEFA0AgAiAFai0AACIGQQlrIgdBF01BAEEBIAd0QZOAgARxG0UEQEEBIQMMAgsgASACQQFqIgI2AgggAiAERw0ACwsgACAGOgABIAAgAzoAAAszAQN/IAAgASgCCCICIAEoAgQiA0kEfyABKAIAIAJqLQAABSAECzoAASAAIAIgA0k6AAALQwAgASgCCCICIAFBBGooAgBGBEAgASACQQEQDyABKAIIIQILIABBADYCACABIAJBAWo2AgggASgCACACakHdADoAAAtDACABKAIIIgIgAUEEaigCAEYEQCABIAJBARAPIAEoAgghAgsgAEEANgIAIAEgAkEBajYCCCABKAIAIAJqQf0AOgAAC4cBAQJ/IAEoAggiAiABQQRqIgMoAgAiBEYEQCABIAJBARAPIAMoAgAhBCABKAIIIQILIAEgAkEBaiIDNgIIIAIgASgCACICakH9ADoAACADIARGBEAgASAEQQEQDyABKAIIIQMgASgCACECCyAAQQA2AgAgASADQQFqNgIIIAIgA2pB/QA6AAALKQEBf0GACEEBEEsiAUUEQEGACEEBEJICAAsgAEKACDcCBCAAIAE2AgAL+wMBBH8jAEEQayIDJABBCCEEIANBCGoiBUEAOgAAIANCADcDACADIAIgAkEKbiIGQQpsa0EwcjoACQJ/IAJBCkkEQCADQQlqIQVBAQwBCyADIAZBCnBBMHI6AAgCQCACQeMATQ0AIAMgAkHkAG5BCnBBMHI6AAcgAkHoB0kEQEEHIQQgA0EHciEFDAELIAMg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aiABQRBqKQIANwMAIAJBIGogAUEIaikCADcDACACIAEpAgA3AxggAkEUakH4gcEAIAJBGGoQogIaIANBCGogAkEQaigCADYCACADIAIpAwg3AgALIABBzIbBADYCBCAAIAM2AgAgAkEwaiQAC0UBAn8gASgCBCECIAEoAgAhA0EIQQQQSyIBRQRAQQhBBBCSAgALIAEgAjYCBCABIAM2AgAgAEHchsEANgIEIAAgATYCAAsTACAAQdyGwQA2AgQgACABNgIAC1UBAn8gASgCACECIAFBADYCAAJAIAIEQCABKAIEIQNBCEEEEEsiAUUNASABIAM2AgQgASACNgIAIABB3IbBADYCBCAAIAE2AgAPCwALQQhBBBCSAgALHQAgASgCAEUEQAALIABB3IbBADYCBCAAIAE2AgALVwEBfyMAQRBrIgIkACACIAFBi4fBAEEIEMcCIAIgADYCDCACIAJBDGoiAUHsgsEAELUCGiACIABBBGo2AgwgAiABQZSHwQAQtQIaIAIQtgIgAkEQaiQACxAAIAAgAWpBAWtBACABa3ELDwAgAEEBdCIAQQAgAGtyCwoAQQAgAGsgAHELEgBBAEEZIABBAXZrIABBH0YbCwoAIAAoAgRBeHELDQAgAC0ABEECcUEBdgsKACAAKAIEQQFxCwsAIAAtAARBA3FFCyoAIAAgACgCBEEBcSABckECcjYCBCAAIAFqQQRqIgAgACgCAEEBcjYCAAshACAAIAFBA3I2AgQgACABakEEaiIAIAAoAgBBAXI2AgALDAAgACABQQNyNgIECxYAIAAgAUEBcjYCBCAAIAFqIAE2AgALIwAgAiACKAIEQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgALBwAgACABagsHACAAIAFrCwcAIABBCGoLBwAgAEEIawsZAQF/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 4e65059f7c..0e98d677df 100644 Binary files a/x/wasm/keeper/testdata/burner.wasm and b/x/wasm/keeper/testdata/burner.wasm differ diff --git a/x/wasm/keeper/testdata/download_releases.sh b/x/wasm/keeper/testdata/download_releases.sh index 2757613968..6d14586c64 100755 --- a/x/wasm/keeper/testdata/download_releases.sh +++ b/x/wasm/keeper/testdata/download_releases.sh @@ -10,7 +10,7 @@ fi tag="$1" for contract in burner hackatom ibc_reflect ibc_reflect_send reflect staking; do - url="https://github.com/CosmWasm/cosmwasm/releases/download/$tag/${contract}.wasm" + url="https://github.com/line/cosmwasm/releases/download/$tag/${contract}.wasm" echo "Downloading $url ..." wget -O "${contract}.wasm" "$url" done @@ -20,4 +20,4 @@ gzip -k hackatom.wasm mv hackatom.wasm.gz hackatom.wasm.gzip rm -f version.txt -echo "$tag" >version.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 183eef304c..cd608004d9 100644 Binary files a/x/wasm/keeper/testdata/hackatom.wasm and b/x/wasm/keeper/testdata/hackatom.wasm differ diff --git a/x/wasm/keeper/testdata/hackatom.wasm.gzip b/x/wasm/keeper/testdata/hackatom.wasm.gzip index 29b10c7d57..5ad6d7fb6f 100644 Binary files a/x/wasm/keeper/testdata/hackatom.wasm.gzip and b/x/wasm/keeper/testdata/hackatom.wasm.gzip differ diff --git a/x/wasm/keeper/testdata/ibc_reflect.wasm b/x/wasm/keeper/testdata/ibc_reflect.wasm index ec1739d898..0dddf5c1e0 100644 Binary files a/x/wasm/keeper/testdata/ibc_reflect.wasm and b/x/wasm/keeper/testdata/ibc_reflect.wasm differ diff --git a/x/wasm/keeper/testdata/ibc_reflect_send.wasm b/x/wasm/keeper/testdata/ibc_reflect_send.wasm index 497ceacac5..0575201251 100644 Binary files a/x/wasm/keeper/testdata/ibc_reflect_send.wasm and b/x/wasm/keeper/testdata/ibc_reflect_send.wasm differ diff --git a/x/wasm/keeper/testdata/reflect.go b/x/wasm/keeper/testdata/reflect.go new file mode 100644 index 0000000000..ad365ce0c2 --- /dev/null +++ b/x/wasm/keeper/testdata/reflect.go @@ -0,0 +1,12 @@ +package testdata + +import ( + _ "embed" +) + +//go:embed reflect.wasm +var reflectContract []byte + +func ReflectContractWasm() []byte { + return reflectContract +} diff --git a/x/wasm/keeper/testdata/reflect.wasm b/x/wasm/keeper/testdata/reflect.wasm index 312f45768d..ef3ecaff84 100644 Binary files a/x/wasm/keeper/testdata/reflect.wasm and b/x/wasm/keeper/testdata/reflect.wasm differ diff --git a/x/wasm/keeper/testdata/staking.wasm b/x/wasm/keeper/testdata/staking.wasm index d73c1b19a8..0e78257da9 100644 Binary files a/x/wasm/keeper/testdata/staking.wasm and b/x/wasm/keeper/testdata/staking.wasm differ 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